From 96ec8651ec9e896101c6e07aec441930a0777d00 Mon Sep 17 00:00:00 2001 From: JeanMainguy Date: Mon, 16 Sep 2024 17:27:56 +0200 Subject: [PATCH 01/52] write fasta by reading directly from the pangenome file --- ppanggolin/formats/readBinaries.py | 83 +++++++++++++++++++++++++++- ppanggolin/formats/writeSequences.py | 32 +++++++++-- 2 files changed, 108 insertions(+), 7 deletions(-) diff --git a/ppanggolin/formats/readBinaries.py b/ppanggolin/formats/readBinaries.py index 6c911fe7..588a4078 100644 --- a/ppanggolin/formats/readBinaries.py +++ b/ppanggolin/formats/readBinaries.py @@ -4,7 +4,7 @@ import logging from optparse import Option from pathlib import Path -from typing import Dict, Any, Set, List, Tuple, Optional +from typing import Dict, Any, Iterator, Set, List, Tuple, Optional from collections import defaultdict # installed libraries @@ -279,7 +279,7 @@ def get_non_redundant_gene_sequences_from_file(pangenome_filename: str, output: file_obj.write(f'{row["dna"].decode()}\n') -def write_gene_sequences_from_pangenome_file(pangenome_filename: str, output: Path, list_cds: iter = None, +def write_gene_sequences_from_pangenome_file(pangenome_filename: str, output: Path, list_cds: Optional[Iterator] = None, add: str = '', compress: bool = False, disable_bar: bool = False): """ Writes the CDS sequences of the Pangenome object to a File object that can be filtered or not by a list of CDS, @@ -309,6 +309,85 @@ def write_gene_sequences_from_pangenome_file(pangenome_filename: str, output: Pa f"{output.absolute()}{'.gz' if compress else ''}") +def write_fasta_gene_fam_from_pangenome_file(pangenome_filename: str, output: Path, partition: str, + compress: bool = False, disable_bar=False): + """ + Write representative nucleotide sequences of gene families + + :param pangenome: Pangenome object with gene families sequences + :param output: Path to output directory + :param gene_families: Selected partition of gene families + :param soft_core: Soft core threshold to use + :param compress: Compress the file in .gz + :param disable_bar: Disable progress bar + """ + + outpath = output / f"{partition}_nucleotide_families.fasta" + + parition_first_letter = partition[0].upper() + + with tables.open_file(pangenome_filename, "r", driver_core_backing_store=0) as h5f: + gene_fam_info_table = h5f.root.geneFamiliesInfo + family_to_write = set() + seq_id_to_seqs = defaultdict(list) + for row in tqdm(read_chunks(gene_fam_info_table, chunk=20000), total=gene_fam_info_table.nrows, unit="family", disable=disable_bar): + + if partition == "all" or row['partition'].decode().startswith(parition_first_letter): + family_to_write.add(row['name']) + + + gene_seq_table = h5f.root.annotations.geneSequences + for row in tqdm(read_chunks(gene_seq_table, chunk=20000), total=gene_seq_table.nrows, unit="family", disable=disable_bar): + + if row['gene'] in family_to_write: + seq_id_to_seqs[row['seqid']].append(row['gene'].decode()) + + with write_compressed_or_not(outpath, compress) as file_obj: + seq_table = h5f.root.annotations.sequences + for row in read_chunks(seq_table, chunk=20000): + if row["seqid"] in seq_id_to_seqs: + + for seq_name in seq_id_to_seqs[row["seqid"]]: + + file_obj.write(f">{seq_name}\n") + file_obj.write(row["dna"].decode() + "\n") + + logging.getLogger("PPanGGOLiN").info("Done writing the representative nucleotide sequences " + f"of the gene families : '{outpath}{'.gz' if compress else ''}") + +def write_fasta_prot_fam_from_pangenome_file(pangenome_filename: str, output: Path, partition: str, + compress: bool = False, disable_bar=False): + """ + Write representative amino acid sequences of gene families. + + :param pangenome: Pangenome object with gene families sequences + :param output: Path to output directory + :param prot_families: Selected partition of protein families + :param soft_core: Soft core threshold to use + :param compress: Compress the file in .gz + :param disable_bar: Disable progress bar + """ + + outpath = output / f"{partition}_protein_families.faa" + + parition_first_letter = partition[0].upper() + + with tables.open_file(pangenome_filename, "r", driver_core_backing_store=0) as h5f, write_compressed_or_not(outpath, compress) as fasta: + + gene_fam_info_table = h5f.root.geneFamiliesInfo + + for row in tqdm(read_chunks(gene_fam_info_table, chunk=20000), total=gene_fam_info_table.nrows, unit="family", disable=disable_bar): + + if partition == "all" or row['partition'].decode().startswith(parition_first_letter): + + fasta.write(f">{row['name'].decode()}\n") + fasta.write(row['protein'].decode() + "\n") + + logging.getLogger("PPanGGOLiN").info(f"Done writing the representative amino acid sequences of the gene families:" + f"'{outpath}{'.gz' if compress else ''}'") + + + def read_graph(pangenome: Pangenome, h5f: tables.File, disable_bar: bool = False): """ Read information about graph in pangenome hdf5 file to add in pangenome object diff --git a/ppanggolin/formats/writeSequences.py b/ppanggolin/formats/writeSequences.py index a7023812..a602b35e 100644 --- a/ppanggolin/formats/writeSequences.py +++ b/ppanggolin/formats/writeSequences.py @@ -19,7 +19,7 @@ from ppanggolin.utils import (write_compressed_or_not, mk_outdir, create_tmpdir, read_compressed_or_not, restricted_float, detect_filetype, run_subprocess) -from ppanggolin.formats.readBinaries import check_pangenome_info, write_gene_sequences_from_pangenome_file +from ppanggolin.formats.readBinaries import check_pangenome_info, write_gene_sequences_from_pangenome_file, write_fasta_gene_fam_from_pangenome_file, write_fasta_prot_fam_from_pangenome_file module_regex = re.compile(r'^module_\d+') # \d == [0-9] poss_values = ['all', 'persistent', 'shell', 'cloud', 'rgp', 'softcore', 'core', module_regex] @@ -577,10 +577,32 @@ def launch(args: argparse.Namespace): mk_outdir(args.output, args.force) pangenome = Pangenome() pangenome.add_file(args.pangenome) - write_sequence_files(pangenome, args.output, fasta=args.fasta, anno=args.anno, soft_core=args.soft_core, - regions=args.regions, genes=args.genes, proteins=args.proteins, - gene_families=args.gene_families, prot_families=args.prot_families, compress=args.compress, - disable_bar=args.disable_prog_bar, **translate_kwgs) + + # if all(element_to_write is None for element_to_write in [args.regions, args.genes, args.proteins]): + if args.gene_families in ['all', 'persistent', 'shell', 'cloud']: + + logging.getLogger("PPanGGOLiN").info("Writing the representative nucleotide sequences " + "of the gene families by reading the pangenome file directly.") + + write_fasta_gene_fam_from_pangenome_file(pangenome_filename=args.pangenome, partition = args.gene_families, + output=args.output, compress=args.compress, disable_bar=args.disable_prog_bar) + args.gene_families = None + + if args.prot_families in ['all', 'persistent', 'shell', 'cloud']: + + + logging.getLogger("PPanGGOLiN").info("Writing the representative protein sequences " + "of the gene families by reading the pangenome file directly.") + write_fasta_prot_fam_from_pangenome_file(pangenome_filename=args.pangenome, partition = args.prot_families, + output=args.output, compress=args.compress, disable_bar=args.disable_prog_bar) + + args.prot_families = None + + if any(x for x in [args.regions, args.genes, args.proteins, args.gene_families, args.prot_families]): + write_sequence_files(pangenome, args.output, fasta=args.fasta, anno=args.anno, soft_core=args.soft_core, + regions=args.regions, genes=args.genes, proteins=args.proteins, + gene_families=args.gene_families, prot_families=args.prot_families, compress=args.compress, + disable_bar=args.disable_prog_bar, **translate_kwgs) def subparser(sub_parser: argparse._SubParsersAction) -> argparse.ArgumentParser: From 1b3b35f22931bb50cd4d4e074cfd29dd882f1deb Mon Sep 17 00:00:00 2001 From: JeanMainguy Date: Tue, 17 Sep 2024 18:44:32 +0200 Subject: [PATCH 02/52] add module filter in gene_families writing --- ppanggolin/formats/readBinaries.py | 49 +++++++++++++++++++++------- ppanggolin/formats/writeSequences.py | 4 +-- 2 files changed, 39 insertions(+), 14 deletions(-) diff --git a/ppanggolin/formats/readBinaries.py b/ppanggolin/formats/readBinaries.py index 588a4078..d1295d0c 100644 --- a/ppanggolin/formats/readBinaries.py +++ b/ppanggolin/formats/readBinaries.py @@ -308,8 +308,21 @@ def write_gene_sequences_from_pangenome_file(pangenome_filename: str, output: Pa logging.getLogger("PPanGGOLiN").debug("Gene sequences from pangenome file was written to " f"{output.absolute()}{'.gz' if compress else ''}") - -def write_fasta_gene_fam_from_pangenome_file(pangenome_filename: str, output: Path, partition: str, +def read_module_families_from_pangenome_file(h5f: tables.File, module_name:str): + """ + + """ + family_to_write = set() + module_id = int(module_name[len("module_"):]) + print("MODULE", module_id) + module_table = h5f.root.modules + for row in read_chunks(module_table, chunk=20000): + if row['module'] == module_id: + family_to_write.add(row['geneFam']) + print("family_to_write", family_to_write) + return family_to_write + +def write_fasta_gene_fam_from_pangenome_file(pangenome_filename: str, output: Path, family_filter: str, compress: bool = False, disable_bar=False): """ Write representative nucleotide sequences of gene families @@ -322,19 +335,31 @@ def write_fasta_gene_fam_from_pangenome_file(pangenome_filename: str, output: Pa :param disable_bar: Disable progress bar """ - outpath = output / f"{partition}_nucleotide_families.fasta" + outpath = output / f"{family_filter}_nucleotide_families.fasta" - parition_first_letter = partition[0].upper() + with tables.open_file(pangenome_filename, "r", driver_core_backing_store=0) as h5f: - gene_fam_info_table = h5f.root.geneFamiliesInfo - family_to_write = set() + + seq_id_to_seqs = defaultdict(list) - for row in tqdm(read_chunks(gene_fam_info_table, chunk=20000), total=gene_fam_info_table.nrows, unit="family", disable=disable_bar): - - if partition == "all" or row['partition'].decode().startswith(parition_first_letter): - family_to_write.add(row['name']) + if family_filter in ["all", 'persistent', 'shell', 'cloud']: + family_to_write = set() + gene_fam_info_table = h5f.root.geneFamiliesInfo + parition_first_letter = family_filter[0].upper() + for row in tqdm(read_chunks(gene_fam_info_table, chunk=20000), total=gene_fam_info_table.nrows, unit="family", disable=disable_bar): + + if family_filter == "all" or row['partition'].decode().startswith(parition_first_letter): + family_to_write.add(row['name']) + + + if family_filter.startswith("module_"): + family_to_write = read_module_families_from_pangenome_file(h5f, module_name=family_filter) + + if len(family_to_write) == 0: + logging.getLogger("PPanGGOLiN").warning(f"No families matching filter {family_filter}.") + return gene_seq_table = h5f.root.annotations.geneSequences for row in tqdm(read_chunks(gene_seq_table, chunk=20000), total=gene_seq_table.nrows, unit="family", disable=disable_bar): @@ -342,9 +367,9 @@ def write_fasta_gene_fam_from_pangenome_file(pangenome_filename: str, output: Pa if row['gene'] in family_to_write: seq_id_to_seqs[row['seqid']].append(row['gene'].decode()) - with write_compressed_or_not(outpath, compress) as file_obj: + with write_compressed_or_not(file_path=outpath, compress=compress) as file_obj: seq_table = h5f.root.annotations.sequences - for row in read_chunks(seq_table, chunk=20000): + for row in read_chunks(table=seq_table, chunk=20000): if row["seqid"] in seq_id_to_seqs: for seq_name in seq_id_to_seqs[row["seqid"]]: diff --git a/ppanggolin/formats/writeSequences.py b/ppanggolin/formats/writeSequences.py index a602b35e..4d903c9d 100644 --- a/ppanggolin/formats/writeSequences.py +++ b/ppanggolin/formats/writeSequences.py @@ -579,12 +579,12 @@ def launch(args: argparse.Namespace): pangenome.add_file(args.pangenome) # if all(element_to_write is None for element_to_write in [args.regions, args.genes, args.proteins]): - if args.gene_families in ['all', 'persistent', 'shell', 'cloud']: + if args.gene_families and args.gene_families in ['all', 'persistent', 'shell', 'cloud'] or module_regex.match(args.gene_families): logging.getLogger("PPanGGOLiN").info("Writing the representative nucleotide sequences " "of the gene families by reading the pangenome file directly.") - write_fasta_gene_fam_from_pangenome_file(pangenome_filename=args.pangenome, partition = args.gene_families, + write_fasta_gene_fam_from_pangenome_file(pangenome_filename=args.pangenome, family_filter= args.gene_families, output=args.output, compress=args.compress, disable_bar=args.disable_prog_bar) args.gene_families = None From c14eac408bf455e80c335b400602b3babc218d77 Mon Sep 17 00:00:00 2001 From: JeanMainguy Date: Tue, 17 Sep 2024 18:51:50 +0200 Subject: [PATCH 03/52] fix none manageemnt --- ppanggolin/formats/writeSequences.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ppanggolin/formats/writeSequences.py b/ppanggolin/formats/writeSequences.py index 4d903c9d..e63d978b 100644 --- a/ppanggolin/formats/writeSequences.py +++ b/ppanggolin/formats/writeSequences.py @@ -579,7 +579,7 @@ def launch(args: argparse.Namespace): pangenome.add_file(args.pangenome) # if all(element_to_write is None for element_to_write in [args.regions, args.genes, args.proteins]): - if args.gene_families and args.gene_families in ['all', 'persistent', 'shell', 'cloud'] or module_regex.match(args.gene_families): + if args.gene_families is not None and args.gene_families in ['all', 'persistent', 'shell', 'cloud'] or module_regex.match(args.gene_families): logging.getLogger("PPanGGOLiN").info("Writing the representative nucleotide sequences " "of the gene families by reading the pangenome file directly.") From 1ac566c12b658e14229eca5938ab36d8bcd3ec10 Mon Sep 17 00:00:00 2001 From: JeanMainguy Date: Wed, 18 Sep 2024 16:04:58 +0200 Subject: [PATCH 04/52] write module and rgp family genes --- ppanggolin/formats/readBinaries.py | 36 +++++++++++++++++++++++----- ppanggolin/formats/writeSequences.py | 4 +--- 2 files changed, 31 insertions(+), 9 deletions(-) diff --git a/ppanggolin/formats/readBinaries.py b/ppanggolin/formats/readBinaries.py index d1295d0c..dddac342 100644 --- a/ppanggolin/formats/readBinaries.py +++ b/ppanggolin/formats/readBinaries.py @@ -308,18 +308,37 @@ def write_gene_sequences_from_pangenome_file(pangenome_filename: str, output: Pa logging.getLogger("PPanGGOLiN").debug("Gene sequences from pangenome file was written to " f"{output.absolute()}{'.gz' if compress else ''}") + +def read_rgp__genes_from_pangenome_file(h5f: tables.File) -> List[str]: + """ + """ + rgp_genes = [row["gene"] for row in read_chunks(h5f.root.RGP, chunk=20000)] + + return rgp_genes + + +def get_families_from_genes(h5f: tables.File , genes:Set[str]): + """ + """ + families = set() + for row in read_chunks(h5f.root.geneFamilies, chunk=20000): + if row['gene'] in genes: + families.add(row["geneFam"]) + + return families + def read_module_families_from_pangenome_file(h5f: tables.File, module_name:str): """ """ family_to_write = set() module_id = int(module_name[len("module_"):]) - print("MODULE", module_id) module_table = h5f.root.modules + for row in read_chunks(module_table, chunk=20000): if row['module'] == module_id: family_to_write.add(row['geneFam']) - print("family_to_write", family_to_write) + return family_to_write def write_fasta_gene_fam_from_pangenome_file(pangenome_filename: str, output: Path, family_filter: str, @@ -337,11 +356,8 @@ def write_fasta_gene_fam_from_pangenome_file(pangenome_filename: str, output: Pa outpath = output / f"{family_filter}_nucleotide_families.fasta" - - with tables.open_file(pangenome_filename, "r", driver_core_backing_store=0) as h5f: - seq_id_to_seqs = defaultdict(list) if family_filter in ["all", 'persistent', 'shell', 'cloud']: @@ -354,18 +370,26 @@ def write_fasta_gene_fam_from_pangenome_file(pangenome_filename: str, output: Pa family_to_write.add(row['name']) - if family_filter.startswith("module_"): + elif family_filter.startswith("module_"): family_to_write = read_module_families_from_pangenome_file(h5f, module_name=family_filter) + + elif family_filter == "rgp": + rgp_genes = read_rgp__genes_from_pangenome_file(h5f) + family_to_write = get_families_from_genes(h5f, rgp_genes) if len(family_to_write) == 0: logging.getLogger("PPanGGOLiN").warning(f"No families matching filter {family_filter}.") return gene_seq_table = h5f.root.annotations.geneSequences + match_count = 0 for row in tqdm(read_chunks(gene_seq_table, chunk=20000), total=gene_seq_table.nrows, unit="family", disable=disable_bar): if row['gene'] in family_to_write: seq_id_to_seqs[row['seqid']].append(row['gene'].decode()) + match_count += 1 + + assert match_count == len(family_to_write), f"Number of sequences found ({match_count}) does not match the number of expected family {len(family_to_write)}." with write_compressed_or_not(file_path=outpath, compress=compress) as file_obj: seq_table = h5f.root.annotations.sequences diff --git a/ppanggolin/formats/writeSequences.py b/ppanggolin/formats/writeSequences.py index e63d978b..fe8aada6 100644 --- a/ppanggolin/formats/writeSequences.py +++ b/ppanggolin/formats/writeSequences.py @@ -578,8 +578,7 @@ def launch(args: argparse.Namespace): pangenome = Pangenome() pangenome.add_file(args.pangenome) - # if all(element_to_write is None for element_to_write in [args.regions, args.genes, args.proteins]): - if args.gene_families is not None and args.gene_families in ['all', 'persistent', 'shell', 'cloud'] or module_regex.match(args.gene_families): + if args.gene_families is not None and (args.gene_families in ['all', 'persistent', 'shell', 'cloud', "rgp"] or module_regex.match(args.gene_families)): logging.getLogger("PPanGGOLiN").info("Writing the representative nucleotide sequences " "of the gene families by reading the pangenome file directly.") @@ -590,7 +589,6 @@ def launch(args: argparse.Namespace): if args.prot_families in ['all', 'persistent', 'shell', 'cloud']: - logging.getLogger("PPanGGOLiN").info("Writing the representative protein sequences " "of the gene families by reading the pangenome file directly.") write_fasta_prot_fam_from_pangenome_file(pangenome_filename=args.pangenome, partition = args.prot_families, From 7b8c6c2a5e03a70a17bce220bf994613ed44a3fd Mon Sep 17 00:00:00 2001 From: Guillaume GAUTREAU Date: Wed, 18 Sep 2024 16:10:35 +0200 Subject: [PATCH 05/52] fix an error in the formula to calculate chao displayed on the ucurve plot --- ppanggolin/figures/ucurve.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ppanggolin/figures/ucurve.py b/ppanggolin/figures/ucurve.py index ec82f367..485055e1 100644 --- a/ppanggolin/figures/ucurve.py +++ b/ppanggolin/figures/ucurve.py @@ -39,7 +39,7 @@ def draw_ucurve(pangenome: Pangenome, output: Path, soft_core: float = 0.95, di data_plot = [] chao = "NA" if count[1]["pangenome"] > 0: - chao = round(pangenome.number_of_gene_families + ((count[0]["pangenome"] ^ 2) / (count[1]["pangenome"] * 2)), 2) + chao = round(pangenome.number_of_gene_families + (pow(count[1]["pangenome"], 2) / (count[2]["pangenome"] * 2)), 2) colors = {"pangenome": "black", "exact_accessory": "#EB37ED", "exact_core": "#FF2828", "soft_core": "#c7c938", "soft_accessory": "#996633", "shell": "#00D860", "persistent": "#F7A507", "cloud": "#79DEFF", "undefined": "#828282"} From 25189429cc4cb4c6f96eb05c42bd293e047fa0e0 Mon Sep 17 00:00:00 2001 From: JeanMainguy Date: Wed, 18 Sep 2024 16:23:24 +0200 Subject: [PATCH 06/52] add possibility to write module and rgp in prot fasta --- ppanggolin/formats/readBinaries.py | 27 +++++++++++++++++++++------ ppanggolin/formats/writeSequences.py | 4 ++-- 2 files changed, 23 insertions(+), 8 deletions(-) diff --git a/ppanggolin/formats/readBinaries.py b/ppanggolin/formats/readBinaries.py index dddac342..4b3ebb4e 100644 --- a/ppanggolin/formats/readBinaries.py +++ b/ppanggolin/formats/readBinaries.py @@ -404,7 +404,7 @@ def write_fasta_gene_fam_from_pangenome_file(pangenome_filename: str, output: Pa logging.getLogger("PPanGGOLiN").info("Done writing the representative nucleotide sequences " f"of the gene families : '{outpath}{'.gz' if compress else ''}") -def write_fasta_prot_fam_from_pangenome_file(pangenome_filename: str, output: Path, partition: str, +def write_fasta_prot_fam_from_pangenome_file(pangenome_filename: str, output: Path, family_filter: str, compress: bool = False, disable_bar=False): """ Write representative amino acid sequences of gene families. @@ -417,17 +417,32 @@ def write_fasta_prot_fam_from_pangenome_file(pangenome_filename: str, output: Pa :param disable_bar: Disable progress bar """ - outpath = output / f"{partition}_protein_families.faa" + outpath = output / f"{family_filter}_protein_families.faa" + + partition_filter = False + family_to_write = [] - parition_first_letter = partition[0].upper() - with tables.open_file(pangenome_filename, "r", driver_core_backing_store=0) as h5f, write_compressed_or_not(outpath, compress) as fasta: + if family_filter in ["all", 'persistent', 'shell', 'cloud']: + partition_filter = True + parition_first_letter = family_filter[0].upper() + + elif family_filter == "rgp": + rgp_genes = read_rgp__genes_from_pangenome_file(h5f) + family_to_write = get_families_from_genes(h5f, rgp_genes) + + elif family_filter.startswith("module_"): + family_to_write = read_module_families_from_pangenome_file(h5f, module_name=family_filter) + gene_fam_info_table = h5f.root.geneFamiliesInfo for row in tqdm(read_chunks(gene_fam_info_table, chunk=20000), total=gene_fam_info_table.nrows, unit="family", disable=disable_bar): - - if partition == "all" or row['partition'].decode().startswith(parition_first_letter): + + partition_match = partition_filter and (family_filter == "all" or row['partition'].decode().startswith(parition_first_letter)) + family_match = row['name'] in family_to_write + + if partition_match or family_match: fasta.write(f">{row['name'].decode()}\n") fasta.write(row['protein'].decode() + "\n") diff --git a/ppanggolin/formats/writeSequences.py b/ppanggolin/formats/writeSequences.py index fe8aada6..eaca363b 100644 --- a/ppanggolin/formats/writeSequences.py +++ b/ppanggolin/formats/writeSequences.py @@ -587,11 +587,11 @@ def launch(args: argparse.Namespace): output=args.output, compress=args.compress, disable_bar=args.disable_prog_bar) args.gene_families = None - if args.prot_families in ['all', 'persistent', 'shell', 'cloud']: + if args.prot_families is not None and (args.prot_families in ['all', 'persistent', 'shell', 'cloud', "rgp"] or module_regex.match(args.prot_families)): logging.getLogger("PPanGGOLiN").info("Writing the representative protein sequences " "of the gene families by reading the pangenome file directly.") - write_fasta_prot_fam_from_pangenome_file(pangenome_filename=args.pangenome, partition = args.prot_families, + write_fasta_prot_fam_from_pangenome_file(pangenome_filename=args.pangenome, family_filter = args.prot_families, output=args.output, compress=args.compress, disable_bar=args.disable_prog_bar) args.prot_families = None From 1157761987d9cec351588e78b6656321a1189272 Mon Sep 17 00:00:00 2001 From: JeanMainguy Date: Wed, 18 Sep 2024 17:27:35 +0200 Subject: [PATCH 07/52] Add possibility to write genes by reading pangenome file directly --- ppanggolin/formats/readBinaries.py | 135 +++++++++++++++++++++------ ppanggolin/formats/writeSequences.py | 12 ++- 2 files changed, 119 insertions(+), 28 deletions(-) diff --git a/ppanggolin/formats/readBinaries.py b/ppanggolin/formats/readBinaries.py index 4b3ebb4e..bb1a868b 100644 --- a/ppanggolin/formats/readBinaries.py +++ b/ppanggolin/formats/readBinaries.py @@ -1,11 +1,13 @@ #!/usr/bin/env python3 # default libraries +import dis import logging from optparse import Option from pathlib import Path from typing import Dict, Any, Iterator, Set, List, Tuple, Optional from collections import defaultdict +import numpy # installed libraries from tqdm import tqdm @@ -341,6 +343,67 @@ def read_module_families_from_pangenome_file(h5f: tables.File, module_name:str): return family_to_write +def get_families_matching_partition(h5f: tables.File, partition:str): + """ + """ + family_to_write = set() + + gene_fam_info_table = h5f.root.geneFamiliesInfo + parition_first_letter = partition[0].upper() + + for row in read_chunks(gene_fam_info_table, chunk=20000): + + if partition == "all" or row['partition'].decode().startswith(parition_first_letter): + family_to_write.add(row['name']) + + return family_to_write + +def get_genes_from_families(h5f: tables.File, families:List[numpy.byte]): + """ + """ + matching_genes = set() + + gene_fam_table = h5f.root.geneFamilies + + for row in read_chunks(gene_fam_table, chunk=20000): + if row["geneFam"] in families: + matching_genes.add(row['gene']) + + return matching_genes + +def get_seqid_to_genes(h5f: tables.File, genes:List[str], get_all_genes:bool = False, disable_bar:bool = False): + """ + """ + + seq_id_to_genes = defaultdict(list) + gene_seq_table = h5f.root.annotations.geneSequences + match_count = 0 + for row in tqdm(read_chunks(gene_seq_table, chunk=20000), total=gene_seq_table.nrows, unit="family", disable=disable_bar): + + if get_all_genes or row['gene'] in genes: + seq_id_to_genes[row['seqid']].append(row['gene'].decode()) + match_count += 1 + + assert match_count == len(genes), f"Number of sequences found ({match_count}) does not match the number of expected genes {len(genes)}." + + return seq_id_to_genes + +def write_genes_seq_from_pangenome_file(h5f, outpath, compress, seq_id_to_genes): + """ + """ + + with write_compressed_or_not(file_path=outpath, compress=compress) as file_obj: + seq_table = h5f.root.annotations.sequences + #TODO add tqm + for row in read_chunks(table=seq_table, chunk=20000): + if row["seqid"] in seq_id_to_genes: + + for seq_name in seq_id_to_genes[row["seqid"]]: + + file_obj.write(f">{seq_name}\n") + file_obj.write(row["dna"].decode() + "\n") + + def write_fasta_gene_fam_from_pangenome_file(pangenome_filename: str, output: Path, family_filter: str, compress: bool = False, disable_bar=False): """ @@ -358,16 +421,8 @@ def write_fasta_gene_fam_from_pangenome_file(pangenome_filename: str, output: Pa with tables.open_file(pangenome_filename, "r", driver_core_backing_store=0) as h5f: - seq_id_to_seqs = defaultdict(list) - if family_filter in ["all", 'persistent', 'shell', 'cloud']: - family_to_write = set() - gene_fam_info_table = h5f.root.geneFamiliesInfo - parition_first_letter = family_filter[0].upper() - for row in tqdm(read_chunks(gene_fam_info_table, chunk=20000), total=gene_fam_info_table.nrows, unit="family", disable=disable_bar): - - if family_filter == "all" or row['partition'].decode().startswith(parition_first_letter): - family_to_write.add(row['name']) + family_to_write = get_families_matching_partition(h5f, family_filter) elif family_filter.startswith("module_"): @@ -381,25 +436,9 @@ def write_fasta_gene_fam_from_pangenome_file(pangenome_filename: str, output: Pa logging.getLogger("PPanGGOLiN").warning(f"No families matching filter {family_filter}.") return - gene_seq_table = h5f.root.annotations.geneSequences - match_count = 0 - for row in tqdm(read_chunks(gene_seq_table, chunk=20000), total=gene_seq_table.nrows, unit="family", disable=disable_bar): - - if row['gene'] in family_to_write: - seq_id_to_seqs[row['seqid']].append(row['gene'].decode()) - match_count += 1 - - assert match_count == len(family_to_write), f"Number of sequences found ({match_count}) does not match the number of expected family {len(family_to_write)}." + seq_id_to_genes = get_seqid_to_genes(h5f, family_to_write) - with write_compressed_or_not(file_path=outpath, compress=compress) as file_obj: - seq_table = h5f.root.annotations.sequences - for row in read_chunks(table=seq_table, chunk=20000): - if row["seqid"] in seq_id_to_seqs: - - for seq_name in seq_id_to_seqs[row["seqid"]]: - - file_obj.write(f">{seq_name}\n") - file_obj.write(row["dna"].decode() + "\n") + write_genes_seq_from_pangenome_file(h5f, outpath, compress, seq_id_to_genes) logging.getLogger("PPanGGOLiN").info("Done writing the representative nucleotide sequences " f"of the gene families : '{outpath}{'.gz' if compress else ''}") @@ -451,6 +490,48 @@ def write_fasta_prot_fam_from_pangenome_file(pangenome_filename: str, output: Pa f"'{outpath}{'.gz' if compress else ''}'") +def write_genes_from_pangenome_file(pangenome_filename: str, output: Path, gene_filter: str, + compress: bool = False, disable_bar=False): + """ + Write representative nucleotide sequences of gene families + + :param pangenome: Pangenome object with gene families sequences + :param output: Path to output directory + :param gene_families: Selected partition of gene families + :param soft_core: Soft core threshold to use + :param compress: Compress the file in .gz + :param disable_bar: Disable progress bar + """ + + outpath = output / f"{gene_filter}_genes.fna" + get_all_genes = False + + with tables.open_file(pangenome_filename, "r", driver_core_backing_store=0) as h5f: + + if gene_filter in ['persistent', 'shell', 'cloud'] or gene_filter.startswith("module_"): + + if gene_filter.startswith("module_"): + families = read_module_families_from_pangenome_file(h5f, module_name=gene_filter) + + else: + families = get_families_matching_partition(h5f, gene_filter) + + genes_to_write = get_genes_from_families(h5f, families) + + elif gene_filter == "rgp": + genes_to_write = read_rgp__genes_from_pangenome_file(h5f) + + elif gene_filter == "all": + genes_to_write = [] + get_all_genes = True + + seq_id_to_genes = get_seqid_to_genes(h5f, genes_to_write, get_all_genes=get_all_genes, disable_bar=disable_bar) + + write_genes_seq_from_pangenome_file(h5f, outpath, compress, seq_id_to_genes) + + logging.getLogger("PPanGGOLiN").info("Done writing the representative nucleotide sequences " + f"of the gene families : '{outpath}{'.gz' if compress else ''}") + def read_graph(pangenome: Pangenome, h5f: tables.File, disable_bar: bool = False): """ diff --git a/ppanggolin/formats/writeSequences.py b/ppanggolin/formats/writeSequences.py index eaca363b..108015c8 100644 --- a/ppanggolin/formats/writeSequences.py +++ b/ppanggolin/formats/writeSequences.py @@ -19,7 +19,7 @@ from ppanggolin.utils import (write_compressed_or_not, mk_outdir, create_tmpdir, read_compressed_or_not, restricted_float, detect_filetype, run_subprocess) -from ppanggolin.formats.readBinaries import check_pangenome_info, write_gene_sequences_from_pangenome_file, write_fasta_gene_fam_from_pangenome_file, write_fasta_prot_fam_from_pangenome_file +from ppanggolin.formats.readBinaries import check_pangenome_info, write_gene_sequences_from_pangenome_file, write_genes_from_pangenome_file, write_fasta_gene_fam_from_pangenome_file, write_fasta_prot_fam_from_pangenome_file module_regex = re.compile(r'^module_\d+') # \d == [0-9] poss_values = ['all', 'persistent', 'shell', 'cloud', 'rgp', 'softcore', 'core', module_regex] @@ -596,6 +596,16 @@ def launch(args: argparse.Namespace): args.prot_families = None + + if args.genes is not None and (args.genes in ['all', 'persistent', 'shell', 'cloud', "rgp"] or module_regex.match(args.genes)): + + logging.getLogger("PPanGGOLiN").info("Writing gene nucleotide sequences by reading the pangenome file directly.") + write_genes_from_pangenome_file(pangenome_filename=args.pangenome, gene_filter = args.genes, + output=args.output, compress=args.compress, disable_bar=args.disable_prog_bar) + + args.prot_families = None + + if any(x for x in [args.regions, args.genes, args.proteins, args.gene_families, args.prot_families]): write_sequence_files(pangenome, args.output, fasta=args.fasta, anno=args.anno, soft_core=args.soft_core, regions=args.regions, genes=args.genes, proteins=args.proteins, From 3a6840c9f4fa3f034b1a96bbc83ab0061e7c3846 Mon Sep 17 00:00:00 2001 From: JeanMainguy Date: Wed, 18 Sep 2024 17:30:45 +0200 Subject: [PATCH 08/52] reset genes var if it has been handle by writting fct --- ppanggolin/formats/writeSequences.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ppanggolin/formats/writeSequences.py b/ppanggolin/formats/writeSequences.py index 108015c8..fe1ed13e 100644 --- a/ppanggolin/formats/writeSequences.py +++ b/ppanggolin/formats/writeSequences.py @@ -603,7 +603,7 @@ def launch(args: argparse.Namespace): write_genes_from_pangenome_file(pangenome_filename=args.pangenome, gene_filter = args.genes, output=args.output, compress=args.compress, disable_bar=args.disable_prog_bar) - args.prot_families = None + args.genes = None if any(x for x in [args.regions, args.genes, args.proteins, args.gene_families, args.prot_families]): From cae0c4a175347ff27b6dd2099aebbc0c4fd0f884 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Chapoton?= Date: Thu, 19 Sep 2024 08:11:41 +0200 Subject: [PATCH 09/52] remove trailing whitespaces --- ppanggolin/RGP/genomicIsland.py | 6 +- ppanggolin/RGP/rgp_cluster.py | 20 +++---- ppanggolin/align/alignOnPang.py | 2 +- ppanggolin/annotate/annotate.py | 26 ++++----- ppanggolin/cluster/cluster.py | 38 ++++++------- ppanggolin/context/searchGeneContext.py | 4 +- ppanggolin/figures/draw_spot.py | 28 +++++----- ppanggolin/figures/drawing.py | 4 +- ppanggolin/figures/tile_plot.py | 70 ++++++++++++------------ ppanggolin/formats/readBinaries.py | 4 +- ppanggolin/formats/writeAnnotations.py | 12 ++-- ppanggolin/formats/writeBinaries.py | 26 ++++----- ppanggolin/formats/writeFlatGenomes.py | 26 ++++----- ppanggolin/formats/writeFlatMetadata.py | 26 ++++----- ppanggolin/formats/writeFlatPangenome.py | 38 ++++++------- ppanggolin/formats/write_proksee.py | 24 ++++---- ppanggolin/geneFamily.py | 4 +- ppanggolin/genome.py | 20 +++---- ppanggolin/meta/meta.py | 2 +- ppanggolin/metrics/metrics.py | 4 +- ppanggolin/nem/partition.py | 2 +- ppanggolin/pangenome.py | 8 +-- ppanggolin/projection/projection.py | 8 +-- ppanggolin/region.py | 34 ++++++------ ppanggolin/utility/utils.py | 2 +- ppanggolin/utils.py | 14 ++--- 26 files changed, 226 insertions(+), 226 deletions(-) diff --git a/ppanggolin/RGP/genomicIsland.py b/ppanggolin/RGP/genomicIsland.py index 1ae7e87a..ec268f89 100644 --- a/ppanggolin/RGP/genomicIsland.py +++ b/ppanggolin/RGP/genomicIsland.py @@ -29,7 +29,7 @@ def changes(self, score): self.state = 1 if score >= 0 else 0 # current score of the node. If the given score is negative, set to 0. self.score = score if score >= 0 else 0 - + def extract_rgp(contig, node, rgp_id, naming) -> Region: """ @@ -120,7 +120,7 @@ def init_matrices(contig: Contig, multi: set, persistent_penalty: int = 3, varia zero_ind = prev mat.append(prev) logging.getLogger("PPanGGOLiN").debug(f"gene:{gene.ID};zero_ind:{zero_ind};curr_state:{curr_state};curr_score:{curr_score}.") - + if zero_ind is None: zero_ind = prev#don't go further than the current node, if no node were at 0. @@ -215,7 +215,7 @@ def compute_org_rgp( organism: Organism, multigenics: set, :return: A set of RGPs of the provided organism. """ org_regions = set() - for contig in tqdm(organism.contigs, total=organism.number_of_contigs, unit="contig", disable=disable_bar): + for contig in tqdm(organism.contigs, total=organism.number_of_contigs, unit="contig", disable=disable_bar): if contig.number_of_genes != 0: # some contigs have no coding genes... # can definitely multiprocess this part, as not THAT much information is needed... matrix = init_matrices(contig, multigenics, persistent_penalty, variable_gain) diff --git a/ppanggolin/RGP/rgp_cluster.py b/ppanggolin/RGP/rgp_cluster.py index fa9b7218..b40f67da 100644 --- a/ppanggolin/RGP/rgp_cluster.py +++ b/ppanggolin/RGP/rgp_cluster.py @@ -53,7 +53,7 @@ def __init__(self, name: str, identical_rgps: Set[Region], families: Set[GeneFam self.rgps = identical_rgps self.is_contig_border = is_contig_border self.ID = Region.id_counter - + Region.id_counter += 1 def __eq__(self, other: 'IdenticalRegions') -> bool: @@ -117,7 +117,7 @@ def modules(self) -> Set[Module]: modules = set() for rgp in self.rgps: modules |= rgp.modules - + return modules def compute_grr(rgp_a_families: Set[GeneFamily], rgp_b_families: Set[GeneFamily], mode: Callable) -> float: @@ -232,16 +232,16 @@ def add_rgp_metadata_to_graph(graph: nx.Graph, rgps: List[Union[Region, Identica """ for rgp in rgps: element_to_metadata_sources = {"family":set(), "gene":set(), "module":set(), "spot":set()} - + for family in rgp.families: element_to_metadata_sources["family"] |= {metadata.source for metadata in family.metadata} if family.module: element_to_metadata_sources["module"] |= {metadata.source for metadata in family.module.metadata} - + for gene in rgp.genes: element_to_metadata_sources["gene"] |= {metadata.source for metadata in gene.metadata} - + if isinstance(rgp, Region): rgp_metadata = rgp.formatted_metadata_dict() if rgp.spot is not None: @@ -250,7 +250,7 @@ def add_rgp_metadata_to_graph(graph: nx.Graph, rgps: List[Union[Region, Identica elif isinstance(rgp, IdenticalRegions): rgp_metadata_dicts = [ident_rgp.formatted_metadata_dict() for ident_rgp in rgp.rgps] rgp_metadata = join_dicts(rgp_metadata_dicts) - + element_to_metadata_sources["spot"] |= {metadata.source for spot in rgp.spots for metadata in spot.metadata} else: @@ -495,13 +495,13 @@ def cluster_rgp(pangenome, grr_cutoff: float, output: str, basename: str, :param metadata_sep: The separator used to join multiple metadata values :param metadata_sources: Sources of the metadata to use and write in the outputs. None means all sources are used. """ - + metatypes = set() need_metadata = False if add_metadata: for element in ["RGPs", "genes", "spots", "families", "modules"]: if pangenome.status["metadata"][element] == "inFile": - + sources_to_use = set(pangenome.status["metasources"][element]) if metadata_sources is not None: @@ -520,7 +520,7 @@ def cluster_rgp(pangenome, grr_cutoff: float, output: str, basename: str, check_pangenome_info(pangenome, need_families=True, need_annotations=True, disable_bar=disable_bar, need_rgp=True, need_spots=True, need_modules=True, need_metadata=need_metadata, - sources= metadata_sources, + sources= metadata_sources, metatypes=metatypes) if pangenome.regions == 0: @@ -700,7 +700,7 @@ def parser_cluster_rgp(parser: argparse.ArgumentParser): optional.add_argument('--graph_formats', required=False, type=str, choices=['gexf', "graphml"], nargs="+", default=['gexf', 'graphml'], help="Format of the output graph.") - + optional.add_argument("--add_metadata", required=False, action="store_true", diff --git a/ppanggolin/align/alignOnPang.py b/ppanggolin/align/alignOnPang.py index 3cbbf35b..3671ab6a 100644 --- a/ppanggolin/align/alignOnPang.py +++ b/ppanggolin/align/alignOnPang.py @@ -74,7 +74,7 @@ def align_seq_to_pang(target_seq_file: Union[Path, Iterable[Path]], query_seq_fi cov_mode = "0" # coverage of query and target # mmseqs search command - # see https://github.com/soedinglab/MMseqs2/issues/373 Using a combination of param to no miss short proteins + # see https://github.com/soedinglab/MMseqs2/issues/373 Using a combination of param to no miss short proteins with tempfile.NamedTemporaryFile(mode="w", dir=tmpdir.as_posix(), prefix="aln_result_db_file", suffix=".aln.DB", delete=False) as aln_db: diff --git a/ppanggolin/annotate/annotate.py b/ppanggolin/annotate/annotate.py index a0d49b52..c43ebc96 100644 --- a/ppanggolin/annotate/annotate.py +++ b/ppanggolin/annotate/annotate.py @@ -161,8 +161,8 @@ def extract_positions(string: str) -> Tuple[List[Tuple[int, int]], bool, bool]: try: start, stop = position.replace(">", "").replace("<", "").split('..') except ValueError: - # in some case there is only one position meaning that the gene is long of only one nt in this piece. - # for instance : join(1038313,1..1016) + # in some case there is only one position meaning that the gene is long of only one nt in this piece. + # for instance : join(1038313,1..1016) start = position.replace(">", "").replace("<", "") stop = start try: @@ -304,8 +304,8 @@ def stringify_feature_values(feature:Dict[str,List[str]]) -> Dict[str, str]: current_qualifier = "location" elif line.strip().startswith('/'): - qualifier_line = line.strip()[1:] # [1:] used to remove / - + qualifier_line = line.strip()[1:] # [1:] used to remove / + if "=" in qualifier_line: current_qualifier, value = qualifier_line.split('=', 1) else: @@ -320,7 +320,7 @@ def stringify_feature_values(feature:Dict[str,List[str]]) -> Dict[str, str]: else: current_feature[current_qualifier] = [value] - else: + else: # the line does not start a qualifier so its the continuation of the last qualifier value. value = line.strip() value = value[:-1] if value.endswith('"') else value @@ -613,7 +613,7 @@ def get_id_attribute(attributes_dict: dict) -> str: raise Exception(f"Each CDS type of the gff files must own a unique ID attribute. " f"Not the case for file: {gff_file_path}") return element_id - + def check_chevrons_in_start_and_stop(start: str, stop: str) -> Tuple[int, int, bool]: """ @@ -681,7 +681,7 @@ def check_chevrons_in_start_and_stop(start: str, stop: str) -> Tuple[int, int, b else: fields_gff = [el.strip() for el in line.split('\t')] attributes = get_gff_attributes(fields_gff) - + pseudogene = False start, stop, has_chevron = check_chevrons_in_start_and_stop(start=fields_gff[gff_start], stop=fields_gff[gff_end]) @@ -704,7 +704,7 @@ def check_chevrons_in_start_and_stop(start: str, stop: str) -> Tuple[int, int, b if fields_gff[gff_seqname] in circular_contigs or ('IS_CIRCULAR' in attributes and attributes['IS_CIRCULAR'] == "true"): - # WARNING: In case we have prodigal gff with is_circular attributes. + # WARNING: In case we have prodigal gff with is_circular attributes. # This would fail as contig is not defined. However is_circular should not be found in prodigal gff logging.getLogger("PPanGGOLiN").debug(f"Contig {contig.name} is circular.") contig.is_circular = True @@ -749,7 +749,7 @@ def check_chevrons_in_start_and_stop(start: str, stop: str) -> Tuple[int, int, b if id_attribute in id_attr_to_gene_id: # the ID has already been seen at least once in this genome existing_gene = id_attr_to_gene_id[id_attribute] - new_gene_info = {"strand":fields_gff[gff_strand], + new_gene_info = {"strand":fields_gff[gff_strand], "type":fields_gff[gff_type], "name":name, "position":contig.number_of_genes, @@ -758,7 +758,7 @@ def check_chevrons_in_start_and_stop(start: str, stop: str) -> Tuple[int, int, b "start": start, "stop": stop, "ID": id_attribute} - + check_and_add_extra_gene_part(existing_gene, new_gene_info) continue @@ -882,7 +882,7 @@ def check_and_add_extra_gene_part(gene: Gene, new_gene_info: Dict, max_separatio first_stop = gene.coordinates[0][1] for start, _ in gene.coordinates[1:]: if abs(start - first_stop) > max_separation: - # This is maybe to restrictive but lets go with that first. + # This is maybe to restrictive but lets go with that first. raise ValueError( f"The coordinates of genes are too far apart ({abs(start - first_stop)}nt). This is unexpected. " f"Gene coordinates : {gene.coordinates}") @@ -922,10 +922,10 @@ def correct_putative_overlaps(contigs: Iterable[Contig]): if len(new_coordinates) == 0: raise ValueError(f"First gene start position ({start}) is higher than contig " f"length ({len(contig)}). This case is not handled.") - + new_start = start - len(contig) new_stop = stop - len(contig) - + new_coordinates.append((new_start, new_stop)) warn_msg = (f"Start position ({start}) for gene {gene.name} is higher than contig {contig.name}" diff --git a/ppanggolin/cluster/cluster.py b/ppanggolin/cluster/cluster.py index 83557cc5..c60e1640 100644 --- a/ppanggolin/cluster/cluster.py +++ b/ppanggolin/cluster/cluster.py @@ -374,18 +374,18 @@ def infer_singletons(pangenome: Pangenome): def get_family_representative_sequences(pangenome: Pangenome, code: int = 11, cpu: int = 1, tmpdir: Path = None, keep_tmp: bool = False): - + logging.getLogger("PPanGGOLiN").info("Retrieving protein sequences of family representatives.") tmpdir = Path(tempfile.gettempdir()) if tmpdir is None else tmpdir with create_tmpdir(tmpdir, "get_proteins_sequences", keep_tmp) as tmp: repres_path = tmp / "representative.fna.gz" - + with gzip.open(repres_path, mode="wt") as repres_seq: for family in pangenome.gene_families: - + if family.representative.dna is None: raise ValueError(f'DNA sequence of representative gene {family.representative} is None. ' 'Sequence may not have been loaded correctly from the pangenome file or the pangenome has no gene sequences.') @@ -395,18 +395,18 @@ def get_family_representative_sequences(pangenome: Pangenome, code: int = 11, cp translate_db = translate_genes(sequences=repres_path, tmpdir=tmp, cpu=cpu, is_single_line_fasta=True, code=code) - + outpath = tmp / "representative_protein_genes.fna" cmd = list(map(str, ["mmseqs", "convert2fasta", translate_db, outpath])) run_subprocess(cmd, msg="MMSeqs convert2fasta failed with the following error:\n") - + with open(outpath) as repres_prot: lines = repres_prot.readlines() while len(lines) > 0: family_name = lines.pop(0).strip()[1:] family_seq = lines.pop(0).strip() family = pangenome.get_gene_family(family_name) - + family.add_sequence(family_seq) @@ -432,10 +432,10 @@ def read_clustering_file(families_tsv_path: Path) -> Tuple[pd.DataFrame, bool]: logging.getLogger("PPanGGOLiN").info( f"Reading clustering file to group genes into families: {families_tsv_path.as_posix()}" ) - + # Detect compression type if any _, compress_type = is_compressed(families_tsv_path) - + # Read the file with inferred compression if necessary families_df = pd.read_csv( families_tsv_path, @@ -444,13 +444,13 @@ def read_clustering_file(families_tsv_path: Path) -> Tuple[pd.DataFrame, bool]: compression=compress_type if compress_type is not None else 'infer', dtype=str ) - + # Process DataFrame based on the number of columns if families_df.shape[1] == 2: families_df.columns = ["family", "gene"] families_df["representative"] = families_df.groupby('family')['gene'].transform('first') families_df["is_frag"] = False - + elif families_df.shape[1] == 3: # Check if the third column is 'is_frag' if families_df[2].dropna().eq('F').all(): @@ -460,24 +460,24 @@ def read_clustering_file(families_tsv_path: Path) -> Tuple[pd.DataFrame, bool]: else: families_df.columns = ["family", "gene", "representative"] families_df["is_frag"] = False - + elif families_df.shape[1] == 4: families_df.columns = ["family", "representative", "gene", "is_frag"] - + else: raise ValueError( f"Unexpected number of columns ({families_df.shape[1]}). The file must have 2, 3, or 4 columns." ) - + # Ensure columns are strings families_df["family"] = families_df["family"].astype(str) families_df["gene"] = families_df["gene"].astype(str) families_df["representative"] = families_df["representative"].astype(str) - + # Check for duplicate gene IDs if families_df["gene"].duplicated().any(): raise Exception("It seems that there is duplicated gene id in your clustering.") - + return families_df[["family", "representative", "gene", "is_frag"]], families_df["is_frag"].any() @@ -520,7 +520,7 @@ def get_gene_obj(identifier): return gene_obj for _, row in tqdm(families_df.iterrows(), total=families_df.shape[0], unit="line", disable=disable_bar): - + fam_id, reprez_id, gene_id, is_frag = str(row['family']), str(row['representative']), str(row['gene']), bool(row['is_frag']) gene = get_gene_obj(gene_id) @@ -530,13 +530,13 @@ def get_gene_obj(identifier): try: fam = pangenome.get_gene_family(fam_id) - + except KeyError: # Family not found so create and add fam = GeneFamily(pangenome.max_fam_id, fam_id) representative_gene = get_gene_obj(reprez_id) if representative_gene is None: raise KeyError(f"The gene {reprez_id} associated to family {fam_id} from the clustering file is not found in pangenome.") - + fam.representative = representative_gene pangenome.add_gene_family(fam) @@ -545,7 +545,7 @@ def get_gene_obj(identifier): else: raise KeyError(f"The gene {gene_id} associated to family {fam_id} from the clustering file is not found in pangenome.") - + if nb_gene_with_fam < pangenome.number_of_genes: # not all genes have an associated cluster if nb_gene_with_fam == 0: raise Exception("No gene ID in the cluster file matched any gene ID from the annotation step." diff --git a/ppanggolin/context/searchGeneContext.py b/ppanggolin/context/searchGeneContext.py index 71f4f644..88cd9fc8 100644 --- a/ppanggolin/context/searchGeneContext.py +++ b/ppanggolin/context/searchGeneContext.py @@ -150,7 +150,7 @@ def search_gene_context_in_pangenome(pangenome: Pangenome, output: Path, sequenc compute_edge_metrics(gene_context_graph, jaccard_threshold) - # Filter graph + # Filter graph filter_flag = f'is_jaccard_gene_>_{jaccard_threshold}' edges_to_remove = [(n, v) for n, v, d in gene_context_graph.edges(data=True) if not d[filter_flag]] @@ -260,7 +260,7 @@ def filter_attribute(data: dict): nodes_attributes_filtered = {f.name: filter_attribute(d) for f, d in context_graph.nodes(data=True)} # on top of attributes already contained in node of context graph - # add organisms and genes count that have the family, the partition and if the family was in initially requested + # add organisms and genes count that have the family, the partition and if the family was in initially requested nodes_family_data = {f.name: {"genomes": f.number_of_organisms, "partition": f.named_partition, "genes": f.number_of_genes} for f in context_graph.nodes()} diff --git a/ppanggolin/figures/draw_spot.py b/ppanggolin/figures/draw_spot.py index 458fb126..b179b266 100644 --- a/ppanggolin/figures/draw_spot.py +++ b/ppanggolin/figures/draw_spot.py @@ -226,7 +226,7 @@ def is_gene_list_ordered(genes:List[Feature]): return True else: return False - + def mk_source_data(genelists: list, fam_col: dict, fam_to_mod: dict) -> (ColumnDataSource, list): """ @@ -244,12 +244,12 @@ def mk_source_data(genelists: list, fam_col: dict, fam_to_mod: dict) -> (ColumnD "gene_local_ID": []} for index, gene_list in enumerate(genelists): - + genelist = gene_list[0] first_gene = genelist[0] last_gene = genelist[-1] - + if is_gene_list_ordered(genelist): # if the order has been inverted, positioning elements on the figure is different ordered = True @@ -460,11 +460,11 @@ def mk_genomes(gene_lists: list, ordered_counts: list) -> (ColumnDataSource, lis last_gene = genelist[-1] if is_gene_list_ordered(genelist): # if the order has been inverted, positioning elements on the figure is different - width = abs(last_gene.stop_relative_to(first_gene ) - genelist[0].start) + width = abs(last_gene.stop_relative_to(first_gene ) - genelist[0].start) df["width"].append(width) else: # order has been inverted - width = abs(last_gene.stop_relative_to(last_gene ) - last_gene.start) + width = abs(last_gene.stop_relative_to(last_gene ) - last_gene.start) df["width"].append(width) df["x"].append((df["width"][-1]) / 2) @@ -580,7 +580,7 @@ def draw_curr_spot(gene_lists: list, ordered_counts: list, fam_to_mod: dict, fam genome_tools = add_genome_tools(fig, recs, genome_recs, gene_source, genome_source, len(gene_lists), labels) save(column(fig, row(labels_tools, gene_tools), row(genome_tools))) - + def draw_selected_spots(selected_spots: Union[List[Spot], Set[Spot]], pangenome: Pangenome, output: Path, overlapping_match: int, exact_match: int, set_size: int, disable_bar: bool = False): @@ -614,7 +614,7 @@ def draw_selected_spots(selected_spots: Union[List[Spot], Set[Spot]], pangenome: for key_rgp, other_rgps in spot.get_uniq_to_rgp().items(): for rgp in other_rgps: out_struc.write(f"{key_rgp.name}\t{key_rgp.organism.name}\t{rgp.name}\t{rgp.organism.name}\n") - + fams = set() gene_lists = [] @@ -627,20 +627,20 @@ def draw_selected_spots(selected_spots: Union[List[Spot], Set[Spot]], pangenome: right_border = [gene for gene in right_border_and_in_between_genes if gene.family.named_partition == "persistent" and gene.family not in multigenics] # in some rare case with plasmid left and right border can be made of the same genes - # we use a set to only have one gene represented. + # we use a set to only have one gene represented. consecutive_genes_lists = contig.get_ordered_consecutive_genes(set(left_border_and_in_between_genes + right_border_and_in_between_genes + list(rgp.genes))) - + consecutive_genes_and_rnas_lists = [] - - for consecutive_genes in consecutive_genes_lists: - + + for consecutive_genes in consecutive_genes_lists: + start, stop = consecutive_genes[0].start, consecutive_genes[-1].stop rnas_toadd = [] for rna in rgp.contig.RNAs: if start < rna.start < stop: rnas_toadd.append(rna) - + ordered_genes_with_rnas = sorted(consecutive_genes + rnas_toadd, key=lambda x: x.start) consecutive_genes_and_rnas_lists.append(ordered_genes_with_rnas) @@ -649,7 +649,7 @@ def draw_selected_spots(selected_spots: Union[List[Spot], Set[Spot]], pangenome: fams |= {gene.family for gene in ordered_genes if gene.type == "CDS"} gene_lists.append([ordered_genes, [left_border, right_border], rgp]) - + famcolors = make_colors_for_iterable(fams) # order all rgps the same way, and order them by similarity in gene content gene_lists = order_gene_lists(gene_lists, overlapping_match, exact_match, set_size) diff --git a/ppanggolin/figures/drawing.py b/ppanggolin/figures/drawing.py index 408f6dfc..efe2e441 100644 --- a/ppanggolin/figures/drawing.py +++ b/ppanggolin/figures/drawing.py @@ -92,7 +92,7 @@ def parser_draw(parser: argparse.ArgumentParser): help="draw plots for spots of the pangenome") optional.add_argument("--spots", required=False, default='all', nargs='+', help="a comma-separated list of spots to draw (or 'all' to draw all spots, or 'synteny' to draw spots with different RGP syntenies).") - + optional.add_argument("--nocloud", required=False, default=False, action="store_true", help="Do not draw the cloud genes in the tile plot") optional.add_argument( @@ -116,7 +116,7 @@ def parser_draw(parser: argparse.ArgumentParser): nargs="+", help="Which source of metadata should be written in the tile plot. " "By default all metadata sources are included.") - + if __name__ == '__main__': diff --git a/ppanggolin/figures/tile_plot.py b/ppanggolin/figures/tile_plot.py index 3c416105..be130727 100644 --- a/ppanggolin/figures/tile_plot.py +++ b/ppanggolin/figures/tile_plot.py @@ -36,7 +36,7 @@ def draw_tile_plot(pangenome: Pangenome, :param draw_dendrogram: If True, include a dendrogram in the tile plot. :param disable_bar: If True, disable the progress bar during processing. """ - + # Check if the pangenome has the required information and is partitioned check_pangenome_info(pangenome, need_annotations=True, need_families=True, need_graph=True, disable_bar=disable_bar, need_metadata=add_metadata, sources=metadata_sources) if pangenome.status["partitioned"] == "No": @@ -55,12 +55,12 @@ def draw_tile_plot(pangenome: Pangenome, "You can use the --nocloud flag to exclude cloud families from the plot. " ) - + logging.getLogger("PPanGGOLiN").info("Starting the process of drawing the tile plot...") # Prepare the data structures required for generating the tile plot families, org_index = prepare_data_structures(pangenome, nocloud) - + # Build the presence-absence matrix for the families and generate the dendrogram if required mat_p_a = build_presence_absence_matrix(families, org_index) order_organisms, dendrogram_fig = generate_dendrogram(mat_p_a, org_index) @@ -70,7 +70,7 @@ def draw_tile_plot(pangenome: Pangenome, # Create the tile plot figure with or without the dendrogram fig = create_tile_plot(binary_data, text_data, fam_order, separators, order_organisms, dendrogram_fig, draw_dendrogram) - + # Save the plot to the specified output directory filename = output / "tile_plot.html" fig.write_html(filename) @@ -87,13 +87,13 @@ def prepare_data_structures(pangenome: Pangenome, nocloud: bool) -> Tuple[set, d :param nocloud: If True, exclude gene families belonging to the cloud partition. :return: A tuple containing a set of gene families to be plotted and a dictionary mapping organisms to their indices. """ - + # Exclude gene families in the cloud partition if 'nocloud' is True; otherwise, include all gene families if nocloud: families = {fam for fam in pangenome.gene_families if not fam.partition.startswith("C")} else: families = set(pangenome.gene_families) - + # Get the organism index mapping from the pangenome org_index = pangenome.get_org_index() return families, org_index @@ -108,10 +108,10 @@ def build_presence_absence_matrix(families: set, org_index: dict) -> csc_matrix: :param org_index: A dictionary mapping each organism to its respective index in the matrix. :return: A sparse matrix (Compressed Sparse Column format) representing the presence-absence of gene families. """ - + # Initialize lists to store matrix data in a sparse format data, all_indexes, all_columns = [], [], [] - + # Iterate through each gene family to populate the presence-absence matrix for row, fam in enumerate(families): # Find the indices of organisms that have the current gene family @@ -122,7 +122,7 @@ def build_presence_absence_matrix(families: set, org_index: dict) -> csc_matrix: # Construct the presence-absence matrix using Compressed Sparse Column format mat_p_a = csc_matrix((data, (all_indexes, all_columns)), shape=(len(families), len(org_index)), dtype='float') - + return mat_p_a def generate_dendrogram(mat_p_a: csc_matrix, org_index: dict) -> Tuple[List, go.Figure]: @@ -133,7 +133,7 @@ def generate_dendrogram(mat_p_a: csc_matrix, org_index: dict) -> Tuple[List, go. :param org_index: Dictionary mapping organism names to their respective indices in the matrix. :return: A tuple containing the ordered list of organisms and the dendrogram figure. """ - + # Extract organism names from the org_index dictionary genom_names = [org.name for org in org_index] @@ -168,15 +168,15 @@ def process_tile_data(families: set, order_organisms: List) -> Tuple[List[List[f binary_data, text_data, fam_order = [], [], [] partitions_dict = defaultdict(list) shell_subs = set() - + # Group families by partition and identify shell subpartitions for fam in families: partitions_dict[fam.partition].append(fam) if fam.partition.startswith("S"): shell_subs.add(fam.partition) - + ordered_nodes, separators = order_nodes(partitions_dict, shell_subs) - + # Populate binary and text data for each family for node in ordered_nodes: fam_order.append(node.name) @@ -186,7 +186,7 @@ def process_tile_data(families: set, order_organisms: List) -> Tuple[List[List[f # Generate hover text for the heatmap text_data = get_heatmap_hover_text(ordered_nodes, order_organisms) - + return binary_data, text_data, fam_order, separators @@ -198,7 +198,7 @@ def order_nodes(partitions_dict: dict, shell_subs: set) -> Tuple[List, List[Tupl :param shell_subs: A set of shell subpartition names. :return: A tuple containing the ordered list of gene families and a list of partition separators. """ - + # Sort persistent and cloud partitions by the number of organisms in descending order ordered_nodes_p = sorted(partitions_dict["P"], key=lambda n: n.number_of_organisms, reverse=True) ordered_nodes_c = sorted(partitions_dict["C"], key=lambda n: n.number_of_organisms, reverse=True) @@ -216,7 +216,7 @@ def order_nodes(partitions_dict: dict, shell_subs: set) -> Tuple[List, List[Tupl # Append cloud partition to the ordered nodes list ordered_nodes += ordered_nodes_c partition_separators.append(("Cloud", partition_separators[-1][1] + len(ordered_nodes_c))) - + return ordered_nodes, partition_separators @@ -246,22 +246,22 @@ def create_partition_shapes( # Left vertical line for partition separator shapes.append(dict( - type='line', x0=-1, x1=-1, y0=sep_prec, y1=sep, - line=dict(width=10, color=color), xref=xref, yref=yref, + type='line', x0=-1, x1=-1, y0=sep_prec, y1=sep, + line=dict(width=10, color=color), xref=xref, yref=yref, name=partition_name, showlegend=True, legendgroup=partition_name )) # Right vertical line for partition separator shapes.append(dict( - type='line', x0=xval_max, x1=xval_max, y0=sep_prec, y1=sep, - line=dict(width=10, color=color), xref=xref, yref=yref, + type='line', x0=xval_max, x1=xval_max, y0=sep_prec, y1=sep, + line=dict(width=10, color=color), xref=xref, yref=yref, name=partition_name, showlegend=False, legendgroup=partition_name )) # Horizontal line across the partition boundary shapes.append(dict( - type='line', x0=-1, x1=xval_max, y0=sep, y1=sep, - line=dict(width=1, color=color), xref=xref, yref=yref, + type='line', x0=-1, x1=xval_max, y0=sep, y1=sep, + line=dict(width=1, color=color), xref=xref, yref=yref, name=partition_name, showlegend=False, legendgroup=partition_name )) @@ -296,35 +296,35 @@ def get_heatmap_hover_text(ordered_families: List, order_organisms: List) -> Lis :return: A 2D list of strings representing hover text for each heatmap cell. """ text_data = [] - + for family in ordered_families: text_per_family = [] - + for org in order_organisms: if org in family.organisms: # gene_count = len(list(family.get_genes_per_org(org))) genes = ";".join(map(str, family.get_genes_per_org(org))) names = ";".join((gene.name for gene in family.get_genes_per_org(org) if gene.name)) - + # Compile additional information about genes extra_gene_info = f"genes:{genes}" if names: extra_gene_info += f'
names:{names}' - + metadata = "
".join((metadata_stringify(gene) for gene in family.get_genes_per_org(org) if gene.has_metadata())) extra_gene_info += metadata else: # gene_count = 0 extra_gene_info = np.nan # Using np.nan instead of numpy.nan for consistency with numpy import - # To get a more explicit hover. But is quite heavy on the finam html + # To get a more explicit hover. But is quite heavy on the finam html # gene_info = f"genome:{org.name}
family:{family.name}
gene_count:{gene_count}
{extra_gene_info}" # Light version: gene_info = extra_gene_info text_per_family.append(gene_info) - + text_data.append(text_per_family) - + return text_data def create_tile_plot( @@ -350,7 +350,7 @@ def create_tile_plot( """ xaxis_values = [org.name for org in order_organisms] - + heatmap_color = {"presence":"#005AB5", # blue "multicopy":'#DC3220' # red } @@ -399,7 +399,7 @@ def create_tile_plot( shared_xaxes=True, vertical_spacing=0.01, row_heights=[0.2, 0.8]) - + for data in dendrogram_fig['data']: fig.add_trace(data, row=1, col=1) @@ -409,9 +409,9 @@ def create_tile_plot( heatmap[0]['x'] = dendrogram_fig['layout']['xaxis']['tickvals'] - + for data in heatmap: - + fig.add_trace(data, row=heatmap_row, col=1) layout = go.Layout(title="Presence-Absence Matrix", @@ -445,7 +445,7 @@ def create_tile_plot( xmax = dendrogram_fig['layout']['xaxis']['tickvals'][-1] + dendrogram_fig['layout']['xaxis']['tickvals'][0] + 0.5 shapes = create_partition_shapes(partition_separator, xmax, heatmap_row, partition_to_color) - fig.update_layout(go.Layout(shapes=shapes, + fig.update_layout(go.Layout(shapes=shapes, showlegend=True, )) @@ -459,4 +459,4 @@ def create_tile_plot( return fig - \ No newline at end of file + diff --git a/ppanggolin/formats/readBinaries.py b/ppanggolin/formats/readBinaries.py index 6c911fe7..15b9ecf6 100644 --- a/ppanggolin/formats/readBinaries.py +++ b/ppanggolin/formats/readBinaries.py @@ -211,7 +211,7 @@ def read_join_coordinates(h5f: tables.File) -> Dict[str, List[Tuple[int, int]]]: genedata_id_to_coordinates = defaultdict(list) if not hasattr(h5f.root.annotations, "joinedCoordinates"): - # then the pangenome file has no joined annotations + # then the pangenome file has no joined annotations # or has been made before the joined annotations coordinates return {} @@ -264,7 +264,7 @@ def get_non_redundant_gene_sequences_from_file(pangenome_filename: str, output: with tables.open_file(pangenome_filename, "r", driver_core_backing_store=0) as h5f: # get a dictionary mapping seqid to cds_name - # seqid are uniq and can have multiple cds name. + # seqid are uniq and can have multiple cds name. # We just want one of the cds name to have non-redundant fasta sequences seqid2cds_name = {} for row in read_chunks(h5f.root.annotations.geneSequences, chunk=20000): diff --git a/ppanggolin/formats/writeAnnotations.py b/ppanggolin/formats/writeAnnotations.py index 8e90540f..efdaa204 100644 --- a/ppanggolin/formats/writeAnnotations.py +++ b/ppanggolin/formats/writeAnnotations.py @@ -308,11 +308,11 @@ def write_gene_joined_coordinates(h5f, annotation, genes_with_joined_coordinates except tables.exceptions.NoSuchNodeError: joined_coordinates_tables = h5f.create_table(annotation, "joinedCoordinates", gene_joined_coordinates_desc(), expectedrows=number_of_gene_pieces) - + logging.getLogger("PPanGGOLiN").debug(f"Writing {number_of_gene_pieces} piece of genes from " f"{len(genes_with_joined_coordinates_2_id)} genes that have joined coordinates ") - + genedata_row = joined_coordinates_tables.row for genedata, genedata_id in tqdm(genes_with_joined_coordinates_2_id.items(), unit="genedata", disable=disable_bar): for index, (start, stop) in enumerate(genedata.coordinates): @@ -321,7 +321,7 @@ def write_gene_joined_coordinates(h5f, annotation, genes_with_joined_coordinates genedata_row["start"] = start genedata_row["stop"] = stop genedata_row['coordinate_rank'] = index - + genedata_row.append() joined_coordinates_tables.flush() @@ -360,7 +360,7 @@ def write_genedata(pangenome: Pangenome, h5f: tables.File, annotation: tables.G genedata_row["name"] = genedata.name genedata_row["product"] = genedata.product genedata_row["has_joined_coordinates"] = genedata.has_joined_coordinates - + genedata_row.append() genedata_table.flush() @@ -400,9 +400,9 @@ def write_annotations(pangenome: Pangenome, h5f: tables.File, rec_organisms: boo genedata2rna = write_rnas(pangenome, h5f, annotation, desc, disable_bar) write_genedata(pangenome, h5f, annotation, genedata2rna, disable_bar) - genes_with_joined_coordinates_2_id = {gene : gene_id for gene, gene_id in genedata2gene.items() if gene.has_joined_coordinates} + genes_with_joined_coordinates_2_id = {gene : gene_id for gene, gene_id in genedata2gene.items() if gene.has_joined_coordinates} genes_with_joined_coordinates_2_id.update({gene : gene_id for gene, gene_id in genedata2rna.items() if gene.has_joined_coordinates}) - + write_gene_joined_coordinates(h5f, annotation, genes_with_joined_coordinates_2_id, disable_bar) def get_gene_sequences_len(pangenome: Pangenome) -> Tuple[int, int]: diff --git a/ppanggolin/formats/writeBinaries.py b/ppanggolin/formats/writeBinaries.py index 735f13ae..d682a201 100644 --- a/ppanggolin/formats/writeBinaries.py +++ b/ppanggolin/formats/writeBinaries.py @@ -471,19 +471,19 @@ def write_info(pangenome: Pangenome, h5f: tables.File): "max_genomes_frequency": getmax(part_distribs["persistent"]), "sd_genomes_frequency": getstdev(part_distribs["persistent"]), "mean_genomes_frequency": getmean(part_distribs["persistent"])} - + info_group._v_attrs.numberOfShell = named_part_counter["shell"] info_group._v_attrs.shellStats = {"min_genomes_frequency": getmin(part_distribs["shell"]), "max_genomes_frequency": getmax(part_distribs["shell"]), "sd_genomes_frequency": getstdev(part_distribs["shell"]), "mean_genomes_frequency": getmean(part_distribs["shell"])} - + info_group._v_attrs.numberOfCloud = named_part_counter["cloud"] info_group._v_attrs.cloudStats = {"min_genomes_frequency": getmin(part_distribs["cloud"]), "max_genomes_frequency": getmax(part_distribs["cloud"]), "sd_genomes_frequency": getstdev(part_distribs["cloud"]), "mean_genomes_frequency": getmean(part_distribs["cloud"])} - + info_group._v_attrs.numberOfPartitions = len(part_set) info_group._v_attrs.numberOfSubpartitions = subpart_counter @@ -492,7 +492,7 @@ def write_info(pangenome: Pangenome, h5f: tables.File): if pangenome.status["spots"] in ["Computed", "Loaded"]: info_group._v_attrs.numberOfSpots = pangenome.number_of_spots - + if pangenome.status["modules"] in ["Computed", "Loaded"]: info_group._v_attrs.numberOfModules = pangenome.number_of_modules info_group._v_attrs.numberOfFamiliesInModules = sum([len(mod) for mod in pangenome.modules]) @@ -517,8 +517,8 @@ def part_spec(part: str) -> list: """ pangenome.compute_mod_bitarrays(part) return [popcount(module.bitarray) for module in pangenome.modules] - - + + if "/info" not in h5f: write_info(pangenome, h5f) info_group = h5f.root.info @@ -526,12 +526,12 @@ def part_spec(part: str) -> list: mod_fam = [len(module) for module in pangenome.modules] sum_mod_fam = sum(mod_fam) - + info_group._v_attrs.StatOfFamiliesInModules = {"min": getmin(mod_fam), "max": getmax(mod_fam), "sd": getstdev(mod_fam), "mean": getmean(mod_fam)} - + spec_pers = part_spec(part='persistent') spec_shell = part_spec(part='shell') spec_cloud = part_spec(part='cloud') @@ -541,13 +541,13 @@ def part_spec(part: str) -> list: "max": getmax(spec_pers), "sd": getstdev(spec_pers), "mean": getmean(spec_pers)} - + info_group._v_attrs.ShellSpecInModules = {"percent": round((sum(spec_shell) / sum_mod_fam) * 100, 2) if sum_mod_fam > 0 else 0, "min": getmin(spec_shell), "max": getmax(spec_shell), "sd": getstdev(spec_shell), "mean": getmean(spec_shell)} - + info_group._v_attrs.CloudSpecInModules = {"percent": round((sum(spec_cloud) / sum_mod_fam) * 100, 2) if sum_mod_fam > 0 else 0, "min": getmin(spec_cloud), "max": getmax(spec_cloud), @@ -606,10 +606,10 @@ def erase_pangenome(pangenome: Pangenome, graph: bool = False, gene_families: bo :param metatype: :param source: """ - + if metadata and (metatype is None or source is None): raise ValueError("To erase metadata. You should provide metatype and source") - + with tables.open_file(pangenome.file, "a") as h5f: status_group = h5f.root.status info_group = h5f.root.info @@ -761,4 +761,4 @@ def write_pangenome(pangenome: Pangenome, filename, force: bool = False, disable h5f.close() logging.getLogger("PPanGGOLiN").info(f"Done writing the pangenome. It is in file : {filename}") - + diff --git a/ppanggolin/formats/writeFlatGenomes.py b/ppanggolin/formats/writeFlatGenomes.py index 30c31dd3..cd9082f1 100644 --- a/ppanggolin/formats/writeFlatGenomes.py +++ b/ppanggolin/formats/writeFlatGenomes.py @@ -88,7 +88,7 @@ def write_tsv_genome_file(organism: Organism, output: Path, compress: bool = Fal gene_info['Spot'] = str(gene.spot) if gene.spot is not None else None if need_modules: gene_info['Module'] = str(gene.family.module) if gene.family.has_module else None - + # Add metadata gene_metadata = {f"gene_{key}":value for key, value in gene.formatted_metadata_dict(metadata_sep).items()} gene_info.update(gene_metadata) @@ -146,10 +146,10 @@ def manage_module_colors(modules: Set[Module], window_size: int = 100) -> Dict[M color_mod_graph.add_edges_from(module_edges) - module_to_group = nx.coloring.greedy_color(color_mod_graph) + module_to_group = nx.coloring.greedy_color(color_mod_graph) - # Attempt to have always the same color associated with the same module... + # Attempt to have always the same color associated with the same module... module_to_color_int = {} group_with_color = [] for module in sorted(modules, key=lambda x: x.ID): @@ -157,7 +157,7 @@ def manage_module_colors(modules: Set[Module], window_size: int = 100) -> Dict[M if group not in group_with_color: group_with_color.append(group) module_to_color_int[module] = group_with_color.index(group) - + # If you want to export the graph to see the coloring: # nx.set_node_attributes(color_mod_graph, module_to_color_int, name="color") @@ -167,7 +167,7 @@ def manage_module_colors(modules: Set[Module], window_size: int = 100) -> Dict[M logging.getLogger().debug(f"We have found that {nb_colors} colors were necessary to color Modules.") colors = palette(nb_colors) module_to_color = {mod: colors[col_i] for mod, col_i in module_to_color_int.items()} - + return module_to_color @@ -304,10 +304,10 @@ def write_gff_file(organism: Organism, outdir: Path, annotation_sources: Dict[st ("family", feature.family.name), ("partition", feature.family.named_partition), ('rgp', rgp), - ('module', feature.family.module) # family.module can be None... + ('module', feature.family.module) # family.module can be None... ] - # adding attributes + # adding attributes gene_metadata = [(f"gene_{key}", value) for key, value in feature.formatted_metadata_dict(metadata_sep).items()] family_metadata = [(f"family_{key}", value) for key, value in @@ -317,7 +317,7 @@ def write_gff_file(organism: Organism, outdir: Path, annotation_sources: Dict[st attributes += family_metadata # add an extra line of type gene - stop = feature.stop + stop = feature.stop if feature.overlaps_contig_edge: stop = contig.length + feature.stop @@ -391,10 +391,10 @@ def convert_overlapping_coordinates_for_gff(coordinates: List[Tuple[int, int]], :param coordinates: List of tuples representing gene coordinates. :param contig_length: Length of the circular contig. """ - + start, stop = coordinates[0] new_coordinates = [(start, stop )] - # convert all coordinates that are at the beginning + # convert all coordinates that are at the beginning # of the contig to the extent of the contig for start_n, stop_n in coordinates[1:]: if start_n < start: # we are on the beginning of the contig @@ -550,7 +550,7 @@ def write_flat_genome_files(pangenome: Pangenome, output: Path, table: bool = Fa "sources": metadata_sources } - + # Place here to raise an error if file doesn't found before to read pangenome organisms_file = fasta if fasta is not None else anno @@ -587,7 +587,7 @@ def write_flat_genome_files(pangenome: Pangenome, output: Path, table: bool = Fa "CDS": "external"} else: organism_args["annotation_sources"] = {} - + if table: # create _genePerOrg dict with get_org_dict methodbefore the multiprocessing to prevent putative errors. # As this is used in multiprocessing when computing nb_copy_in_genome. @@ -702,7 +702,7 @@ def parser_flat(parser: argparse.ArgumentParser): optional.add_argument("-c", "--cpu", required=False, default=1, type=int, help="Number of available cpus") - + context = parser.add_argument_group(title="Contextually required arguments", description="With --proksee and --gff, the following arguments can be " "used to add sequence information to the output file:") diff --git a/ppanggolin/formats/writeFlatMetadata.py b/ppanggolin/formats/writeFlatMetadata.py index 68905f18..5e8066cc 100644 --- a/ppanggolin/formats/writeFlatMetadata.py +++ b/ppanggolin/formats/writeFlatMetadata.py @@ -16,8 +16,8 @@ from ppanggolin.formats.readBinaries import check_pangenome_info -def write_flat_metadata_files(pangenome: Pangenome, output: Path, - pangenome_elements: List[str] = None, metadata_sources: List[str] = None, +def write_flat_metadata_files(pangenome: Pangenome, output: Path, + pangenome_elements: List[str] = None, metadata_sources: List[str] = None, compress: bool = False, disable_bar: bool = False) -> None: """ Main function to write flat metadata files from a pangenome. @@ -30,7 +30,7 @@ def write_flat_metadata_files(pangenome: Pangenome, output: Path, :param compress: Compress the output files in .gz format :param disable_bar: Disable the progress bar """ - + if not pangenome.has_metadata(): logging.getLogger("PPanGGOLiN").warning("No metadata is assigned to any pangenome element. Writing metadata is not possible.") return @@ -57,31 +57,31 @@ def write_flat_metadata_files(pangenome: Pangenome, output: Path, if not element_to_sources: logging.getLogger("PPanGGOLiN").warning(f"None of the specified metadata sources ({metadata_sources}) match the requested pangenome elements: {pangenome_elements}.") return - + logging.getLogger("PPanGGOLiN").info(f"Writing metadata for {', '.join(element_to_sources.keys())} from {len([s for sources in element_to_sources.values() for s in sources])} sources.") - + need_dict = { "need_annotations": True, "need_families": "families" in element_to_sources, "need_rgp": "RGPs" in element_to_sources, "need_spots": "spots" in element_to_sources, - "need_modules": "modules" in element_to_sources, + "need_modules": "modules" in element_to_sources, "need_metadata": True, "sources": metadata_sources } - + check_pangenome_info(pangenome, disable_bar=disable_bar, **need_dict) element_type_to_attribute = { - "families": "gene_families", - "genomes": "organisms", - "RGPs": "regions", - "genes": "genes", + "families": "gene_families", + "genomes": "organisms", + "RGPs": "regions", + "genes": "genes", "modules": "modules", - "spots": "spots", + "spots": "spots", "contigs": "contigs" } - + for element_type, sources in element_to_sources.items(): first_columns = [element_type] source_to_metadata = defaultdict(list) diff --git a/ppanggolin/formats/writeFlatPangenome.py b/ppanggolin/formats/writeFlatPangenome.py index ecfdd7e7..563d0c2e 100644 --- a/ppanggolin/formats/writeFlatPangenome.py +++ b/ppanggolin/formats/writeFlatPangenome.py @@ -238,7 +238,7 @@ def write_gexf_nodes(gexf: TextIO, light: bool = True, soft_core: False = 0.95): 'cloud': 'a="0" b="255" g="222" r="121"'} if not light: index = pan.get_org_index() - + pan_metadata_sources = pan.metadata_sources("families") for fam in pan.gene_families: @@ -514,7 +514,7 @@ def summarize_genome(organism: Organism, cloud_fragmented_family_count = len({g.family for g in cloud_fragmented_genes}) families_with_fragment_count = persistent_fragmented_family_count + shell_fragmented_family_count + cloud_fragmented_family_count - + families_count = persistent_family_count + shell_family_count + cloud_family_count @@ -522,7 +522,7 @@ def summarize_genome(organism: Organism, if pangenome_persistent_count > 0: completeness = round((persistent_family_count / pangenome_persistent_count) * 100, 2) - + orgs_families_in_multicopy_by_part = defaultdict(set) for family in organism.families: if len(family.get_org_dict()[organism]) > 1: @@ -535,15 +535,15 @@ def summarize_genome(organism: Organism, orgs_cloud_families_in_multicopy_count = len(orgs_families_in_multicopy_by_part['cloud']) orgs_families_in_multicopy_count = orgs_persistent_families_in_multicopy_count + orgs_shell_families_in_multicopy_count + orgs_cloud_families_in_multicopy_count - + single_copy_families_found_in_multicopy_count = len(pangenome_persistent_single_copy_families & orgs_families_in_multicopy_by_part['persistent']) contamination = 'NA' if len(pangenome_persistent_single_copy_families) > 0: contamination = round(100 * single_copy_families_found_in_multicopy_count / len(pangenome_persistent_single_copy_families) , 2) - + fragmentation = 'NA' if families_count > 0: - fragmentation = round(100.0 * families_with_fragment_count / families_count, 2) + fragmentation = round(100.0 * families_with_fragment_count / families_count, 2) soft_core_genes = {gene for gene in organism.genes if gene.family in soft_core_families} exact_core_genes = {gene for gene in organism.genes if gene.family in exact_core_families} @@ -620,10 +620,10 @@ def write_persistent_duplication_statistics(pangenome: Pangenome, output: Path, mean_pres = len(fam) / fam.number_of_organisms dup_ratio = fam.duplication_ratio(exclude_fragment=True) is_scm = dup_ratio < dup_margin - + if is_scm: single_copy_persistent.add(fam) - + writer.writerow({ "persistent_family": fam.name, "duplication_ratio": round(dup_ratio, 3), @@ -685,8 +685,8 @@ def write_stats(output: Path, soft_core: float = 0.95, dup_margin: float = 0.05, summaries = [] for organism in pan.organisms: - - + + rgp_count = organism.number_of_regions if pan.status["predictedRGP"] != "No" else None spot_count = organism.number_of_spots if pan.status["spots"] != "No" else None module_count = organism.number_of_modules if pan.status["modules"] != "No" else None @@ -703,7 +703,7 @@ def write_stats(output: Path, soft_core: float = 0.95, dup_margin: float = 0.05, summaries.append(organism_summary) write_summaries_in_tsv(summaries, output_file= output / "genomes_statistics.tsv", dup_margin=dup_margin, soft_core=soft_core, compress=compress) - + logging.getLogger("PPanGGOLiN").info("Done writing genome per genome statistics") @@ -788,7 +788,7 @@ def r_and_s(value: float): """rounds to dp figures and returns a str of the provided value""" return str(round(value, 3)) if isinstance(value, float) else str(value) - + file_path = output / file_name with write_compressed_or_not(file_path, compress) as fout: @@ -841,7 +841,7 @@ def write_rgp_table(regions: Set[Region], regions = sorted(regions, key=lambda x: ( x.organism.name, x.contig.name, x.ID)) - + for region in regions: row = { "region": region.name, @@ -1206,17 +1206,17 @@ def parser_flat(parser: argparse.ArgumentParser): optional.add_argument("--soft_core", required=False, type=restricted_float, default=0.95, help="Soft core threshold to use") - + optional.add_argument("--dup_margin", required=False, type=restricted_float, default=0.05, help="minimum ratio of genomes in which the family must have multiple genes " "for it to be considered 'duplicated'") - + optional.add_argument("--gexf", required=False, action="store_true", help="write a gexf file with all the annotations and all the genes of each gene family") optional.add_argument("--light_gexf", required=False, action="store_true", help="write a gexf file with the gene families and basic information about them") - + optional.add_argument("--json", required=False, action="store_true", help="Writes the graph in a json file format") optional.add_argument("--csv", required=False, action="store_true", @@ -1227,11 +1227,11 @@ def parser_flat(parser: argparse.ArgumentParser): optional.add_argument("--stats", required=False, action="store_true", help="tsv files with some statistics for each each gene family") - + optional.add_argument("--partitions", required=False, action="store_true", help="list of families belonging to each partition, with one file per partitions and " "one family per line") - + optional.add_argument("--families_tsv", required=False, action="store_true", help="Write a tsv file providing the association between genes and gene families") @@ -1244,7 +1244,7 @@ def parser_flat(parser: argparse.ArgumentParser): help="Write a tsv file listing functional modules and the families that belong to them") optional.add_argument("--spot_modules", required=False, action="store_true", help="writes 2 files comparing the presence of modules within spots") - + optional.add_argument("--compress", required=False, action="store_true", help="Compress the files in .gz") optional.add_argument("-c", "--cpu", required=False, default=1, type=int, help="Number of available cpus") diff --git a/ppanggolin/formats/write_proksee.py b/ppanggolin/formats/write_proksee.py index e75076d0..b183932c 100644 --- a/ppanggolin/formats/write_proksee.py +++ b/ppanggolin/formats/write_proksee.py @@ -27,8 +27,8 @@ def write_legend_items(features: List[str], module_to_color: Dict[Module, str] = :return: A data structure containing legend items based on the selected features and module colors. """ - # use https://medialab.github.io/iwanthue/ to find nice colors - # that associate well with established partition colors (orange, light green, light blue) + # use https://medialab.github.io/iwanthue/ to find nice colors + # that associate well with established partition colors (orange, light green, light blue) main_colors = { "orange": "#e59c04", "light green": "#00d860", @@ -194,7 +194,7 @@ def write_genes(organism: Organism, multigenics: Set[GeneFamily], metadata_sep: # Add gene info in meta of proksee metadata_for_proksee = {"ID":gene.ID , "family":gene.family.name} - + if multigenics and gf in multigenics: metadata_for_proksee['multigenic'] = True @@ -203,7 +203,7 @@ def write_genes(organism: Organism, multigenics: Set[GeneFamily], metadata_sep: if gene.product: metadata_for_proksee['product'] = gene.product - + if gene.spot: metadata_for_proksee['spot'] = gene.spot.ID @@ -212,14 +212,14 @@ def write_genes(organism: Organism, multigenics: Set[GeneFamily], metadata_sep: if gene.has_joined_coordinates: metadata_for_proksee['coordinates'] = gene.string_coordinates() - + if gene.overlaps_contig_edge: metadata_for_proksee['overlaps_contig_edge'] = gene.overlaps_contig_edge metadata_for_proksee.update({f"gene_{k}": v for k, v in gene.formatted_metadata_dict(metadata_sep).items()}) metadata_for_proksee.update({f"family_{k}": v for k, v in gene.family.formatted_metadata_dict(metadata_sep).items()}) - - + + # Proksee handles circularity effectively. When a gene extends beyond the edge of the contig, # Proksee correctly displays the gene with its initial start (at the end of the contig) and final stop (at the beginning of the contig). # However, this only applies when there's a single contig. If there are multiple contigs, the feature overlaps all contigs, causing confusion. @@ -244,11 +244,11 @@ def write_genes(organism: Organism, multigenics: Set[GeneFamily], metadata_sep: # Process RNA genes for gene in tqdm(organism.rna_genes, total=organism.number_of_rnas(), unit="rnas", disable=disable_bar): - + metadata_for_proksee = {"ID":gene.ID} if gene.product: metadata_for_proksee['product'] = gene.product - + metadata_for_proksee.update(gene.formatted_metadata_dict(metadata_sep)) coordinates_to_display = gene.coordinates if gene.overlaps_contig_edge else [(gene.start, gene.stop)] @@ -279,7 +279,7 @@ def write_rgp(organism: Organism, metadata_sep:str = "|"): :return: A list of RGP data in a structured format. """ rgp_data_list = [] - + # Iterate through each RGP in the pangenome for rgp in organism.regions: # Create an entry for the RGP in the data list @@ -323,7 +323,7 @@ def write_modules(organism: Organism, gf2genes: Dict[str, List[Gene]], metadata_ if gf_intersection: # Calculate the completion percentage metadata_for_proksee = {'completion': round(100 * len(gf_intersection) / len(set(module.families)), 1)} - + metadata_for_proksee.update(module.formatted_metadata_dict(metadata_sep)) # Create module data entries for genes within intersecting gene families for gf in gf_intersection: @@ -341,7 +341,7 @@ def write_modules(organism: Organism, gf2genes: Dict[str, List[Gene]], metadata_ "meta": metadata_for_proksee }) - + return modules_data_list diff --git a/ppanggolin/geneFamily.py b/ppanggolin/geneFamily.py index ef56700b..6f1504d0 100644 --- a/ppanggolin/geneFamily.py +++ b/ppanggolin/geneFamily.py @@ -219,7 +219,7 @@ def contains_gene_id(self, identifier): """ if not isinstance(identifier, str): raise TypeError(f"Gene ID should be a string. You provided a '{type(identifier)}' type object") - + return identifier in self._genes_getter @@ -451,7 +451,7 @@ def is_single_copy(self, dup_margin: float, exclude_fragment: bool) -> bool: :param exclude_fragment: A boolean indicating whether to exclude fragments when determining single copy families. :return: A boolean indicating whether the gene family is single copy. """ - + return self.duplication_ratio(exclude_fragment) < dup_margin def duplication_ratio(self, exclude_fragment: bool) -> bool: diff --git a/ppanggolin/genome.py b/ppanggolin/genome.py index a299d442..9340d68c 100644 --- a/ppanggolin/genome.py +++ b/ppanggolin/genome.py @@ -88,14 +88,14 @@ def has_joined_coordinates(self) -> bool: return True else: return False - + @property def overlaps_contig_edge(self) -> bool: """ Check based on the coordinates of the feature, if the gene seems to overlap contig edge. """ - + start_stop = self.coordinates[0] for start_stop_next in self.coordinates[1:]: if start_stop > start_stop_next: @@ -188,7 +188,7 @@ def fill_annotations(self, start: int, stop: int, strand: str, gene_type: str = raise ValueError(f"Wrong coordinates: {coordinates}. Start ({start_i}) should not be greater than stop ({stop_i}) in {self} from {self.organism}.") if start_i < 1 or stop_i < 1: raise ValueError(f"Wrong coordinates: {coordinates}. Start ({start_i}) and stop ({stop_i}) should be greater than 0 in {self} from {self.organism}.") - + self.start = start self.stop = stop self.strand = strand @@ -223,7 +223,7 @@ def add_sequence(self, sequence): :raise AssertionError: Sequence must be a string """ assert isinstance(sequence, str), f"'str' type was expected for dna sequence but you provided a '{type(sequence)}' type object" - + self.dna = sequence def string_coordinates(self) -> str: @@ -231,23 +231,23 @@ def string_coordinates(self) -> str: Return a string representation of the coordinates """ return ','.join(f'{start}..{stop}' for start, stop in self.coordinates) - + def start_relative_to(self, gene): """ """ if gene.start <= self.start: return self.start if gene.start > self.start: - return self.start + self.contig.length - + return self.start + self.contig.length + def stop_relative_to(self, gene): """ """ if gene.start <= self.stop: return self.stop - + if gene.start > self.stop: - return self.stop + self.contig.length + return self.stop + self.contig.length class RNA(Feature): """Save RNA from genome as an Object with some information for Pangenome @@ -752,7 +752,7 @@ def get_ordered_consecutive_genes(self, genes: Iterable[Gene]) -> List[List[Gene :return: A list of lists containing ordered consecutive genes considering circularity. """ gene_positions = [gene.position for gene in genes] - + # Determine consecutive region positions consecutive_region_positions = get_consecutive_region_positions(region_positions=gene_positions, contig_gene_count=self.number_of_genes) diff --git a/ppanggolin/meta/meta.py b/ppanggolin/meta/meta.py index 659e2723..4f9aaf85 100644 --- a/ppanggolin/meta/meta.py +++ b/ppanggolin/meta/meta.py @@ -165,7 +165,7 @@ def check_metadata_arguments(args: argparse.Namespace, parser: argparse.Argument :param parser : parser of the command :return: A string indicating the input mode ('single' or 'multiple'). """ - + # check required argument for required_arg in ["metadata", "source", "assign"]: diff --git a/ppanggolin/metrics/metrics.py b/ppanggolin/metrics/metrics.py index 5b10a9a4..71d60b16 100644 --- a/ppanggolin/metrics/metrics.py +++ b/ppanggolin/metrics/metrics.py @@ -31,7 +31,7 @@ def check_already_computed_metric(pangenome: Pangenome, genomes_fluidity: bool = if print_metric and not recompute: print_computed_metric(info_group._v_attrs['genomes_fluidity']) return True - return False + return False def compute_metrics(pangenome: Pangenome, genomes_fluidity: bool = False, families_fluidity: bool = False, disable_bar: bool = False) -> dict: @@ -72,7 +72,7 @@ def write_metrics(pangenome: Pangenome, metrics_dict: dict, print_metrics: bool # After all metrics have been written if print_metrics: print_computed_metric(metrics_dict['genomes_fluidity']) - + def print_computed_metric(metrics_dict: dict): """ Print metrics in yaml format diff --git a/ppanggolin/nem/partition.py b/ppanggolin/nem/partition.py index f3e1f451..28c48074 100644 --- a/ppanggolin/nem/partition.py +++ b/ppanggolin/nem/partition.py @@ -481,7 +481,7 @@ def partition(pangenome: Pangenome, output: Path = None, beta: float = 2.5, sm_d pangenome.parameters["partition"]["chunk_size"] = chunk_size pangenome.parameters["partition"]["# computed nb of partitions"] = False - # the K value initially given by the user + # the K value initially given by the user pangenome.parameters["partition"]["nb_of_partitions"] = kval if kval < 2: pangenome.parameters["partition"]["# computed nb of partitions"] = True diff --git a/ppanggolin/pangenome.py b/ppanggolin/pangenome.py index 3b39eba4..9c11d69d 100644 --- a/ppanggolin/pangenome.py +++ b/ppanggolin/pangenome.py @@ -546,7 +546,7 @@ def get_multigenics(self, dup_margin: float, persistent: bool = True) -> Set[Gen multigenics.add(fam) return multigenics - + def get_single_copy_persistent_families(self, dup_margin: float, exclude_fragments: bool) -> Set[GeneFamily]: """ Retrieves gene families that are both persistent and single copy based on the provided criteria. @@ -556,7 +556,7 @@ def get_single_copy_persistent_families(self, dup_margin: float, exclude_fragmen :return: A set containing gene families that are both persistent and single copy. """ - + single_copy_fams = set() # Iterate through gene families and check for persistence and single copy status @@ -735,7 +735,7 @@ def number_of_modules(self) -> int: :return: The number of modules """ return len(self._module_getter) - + def soft_core_families(self, soft_core_threshold: float) -> Set[GeneFamily]: """ Retrieves gene families considered part of the soft core based on the provided threshold. @@ -752,7 +752,7 @@ def soft_core_families(self, soft_core_threshold: float) -> Set[GeneFamily]: soft_core_families.add(fam) return soft_core_families - + def exact_core_families(self) -> Set[GeneFamily]: """ Retrieves gene families considered as the exact core (present in all organisms). diff --git a/ppanggolin/projection/projection.py b/ppanggolin/projection/projection.py index 511414cc..91e4db75 100644 --- a/ppanggolin/projection/projection.py +++ b/ppanggolin/projection/projection.py @@ -131,7 +131,7 @@ def manage_input_genomes_annotation( :param config: Configuration dictionary. :return: A tuple of organisms, genome_name_to_path, and input_type. """ - + genome_name_to_path = None input_type = None @@ -802,8 +802,8 @@ def manage_annotate_param(annotate_param_names: List[str], pangenome_args: argpa # Collecting annotate parameters from different sources # if they are found in pangenome param they are used - # elif they are found in config they are used - # else use the default value. + # elif they are found in config they are used + # else use the default value. for annotate_arg in annotate_param_names: if hasattr(pangenome_args, annotate_arg): param_val = getattr(pangenome_args, annotate_arg) @@ -1183,7 +1183,7 @@ def check_projection_arguments(args: argparse.Namespace, parser: argparse.Argume :return: A string indicating the input mode ('single' or 'multiple'). """ - # Check if we annotate genomes from path files or only a single genome... + # Check if we annotate genomes from path files or only a single genome... if not args.anno and not args.fasta: parser.error( "Please provide either a FASTA file or a tab-separated file listing sequence files using the '--fasta' option, " diff --git a/ppanggolin/region.py b/ppanggolin/region.py index a9388385..504cb842 100644 --- a/ppanggolin/region.py +++ b/ppanggolin/region.py @@ -115,7 +115,7 @@ def __setitem__(self, position: int, gene: Gene): if position != gene.position: raise ValueError(f"The given gene position ({position}) to set the gene in the region and the position of the gene ({gene.position}) are different. ") - + if len(self) == 0: # first gene to be added to the region self._organism = gene.organism @@ -132,14 +132,14 @@ def __setitem__(self, position: int, gene: Gene): raise KeyError("Another gene already exist at this position") self._genes_getter[position] = gene - # Adding a new gene imply to reidentify first (starter) and last (stopper) genes of the rgp. + # Adding a new gene imply to reidentify first (starter) and last (stopper) genes of the rgp. self._starter = None self._stopper = None self._coordinates = None self._overlaps_contig_edge = None gene.RGP = self - + def identify_rgp_last_and_first_genes(self): """ Identify first and last genes of the rgp by taking into account the circularity of contigs. @@ -151,14 +151,14 @@ def identify_rgp_last_and_first_genes(self): if len(rgp_genes_positions) == 0: raise ValueError(f'RGP ({self.name}) has no gene associated.') - + gene = self._genes_getter[rgp_genes_positions[0]] # get a gene of the region first_gene_position, last_gene_position = find_region_border_position(region_positions=rgp_genes_positions, contig_gene_count=gene.contig.number_of_genes) self._starter = self._genes_getter[first_gene_position] self._stopper = self._genes_getter[last_gene_position] - if self._starter.start > self._stopper.stop: + if self._starter.start > self._stopper.stop: # this means region is overlapping the contig edge if not gene.contig.is_circular: raise ValueError(f'Region seems to be overlapping the contig (first gene {self._starter.position}:{self._starter.coordinates} ' @@ -177,13 +177,13 @@ def get_ordered_genes(self) -> List[Gene]: :return: A list of genes ordered by their positions in the region. """ - + rgp_genes_positions = list(self._genes_getter.keys() ) - + gene = self._genes_getter[rgp_genes_positions[0]] # get a gene of the region consecutive_region_positions = get_consecutive_region_positions(region_positions=rgp_genes_positions, contig_gene_count=gene.contig.number_of_genes) - + ordered_genes = [self._genes_getter[position] for ordered_positions in consecutive_region_positions for position in ordered_positions] return ordered_genes @@ -213,9 +213,9 @@ def starter(self) -> Gene: """ if self._starter is None: self.identify_rgp_last_and_first_genes() - + return self._starter - + @property def stopper(self) -> Gene: """ @@ -233,7 +233,7 @@ def coordinates(self) -> List[Tuple[int]]: :return: coordinates of the region """ if self._coordinates is None: - self.identify_rgp_last_and_first_genes() + self.identify_rgp_last_and_first_genes() return self._coordinates def string_coordinates(self) -> str: @@ -245,9 +245,9 @@ def string_coordinates(self) -> str: @property def overlaps_contig_edge(self) -> bool: if self._overlaps_contig_edge is None: - self.identify_rgp_last_and_first_genes() + self.identify_rgp_last_and_first_genes() return self._overlaps_contig_edge - + @property def spot(self) -> Union[Spot, None]: return self._spot @@ -407,7 +407,7 @@ def is_contig_border(self) -> bool: :raises AssertionError: No genes in the regions, it's not expected """ assert len(self) > 0, "Your region has no genes. Something wrong happened." - + if not self.contig.is_circular: first_gene = self.contig[0] last_gene = self.contig[-1] @@ -536,12 +536,12 @@ def __setitem__(self, name: str, region: Region): """ if name in self._region_getter and self[name] != region: raise KeyError("A Region with the same name already exist in spot") - + if not region.projected and region.spot is not None and region.spot != self: - # In normal cases, a region should only belong to one spot. However, an exception arises in the projection command, + # In normal cases, a region should only belong to one spot. However, an exception arises in the projection command, # where a projected RGP might link two spots in the spot graph. # To handle this scenario without triggering failure, we check the 'projected' attribute of the given region. - + raise ValueError(f"The region '{region.name}' is already associated with spot '{region.spot.ID}' while being associated with spot '{self.ID}'. " "A region should only belong to one spot.") diff --git a/ppanggolin/utility/utils.py b/ppanggolin/utility/utils.py index bf49951f..cd85be7a 100644 --- a/ppanggolin/utility/utils.py +++ b/ppanggolin/utility/utils.py @@ -151,7 +151,7 @@ def launch_default_config(args: argparse.Namespace): sub_cmd in workflow_dependencies] elif initial_command == "projection": commands = [initial_command] + ['annotate'] - + else: commands = [initial_command] diff --git a/ppanggolin/utils.py b/ppanggolin/utils.py index b07a02a6..7145fa71 100755 --- a/ppanggolin/utils.py +++ b/ppanggolin/utils.py @@ -663,7 +663,7 @@ def manage_cli_and_config_args(subcommand: str, config_file: str, subcommand_to_ else: config = {} - # convert config dict to defaultdict + # convert config dict to defaultdict config = defaultdict(dict, config) cmd_subparser = subcommand_to_subparser[subcommand] @@ -692,7 +692,7 @@ def manage_cli_and_config_args(subcommand: str, config_file: str, subcommand_to_ strict_config_check=True) if subcommand in WORKFLOW_SUBCOMMANDS: - # for workflow commands there is no section dedicated in the config: so no specific_args + # for workflow commands there is no section dedicated in the config: so no specific_args # only general_parameters and sections of commands launched in the worklow commands are used config_args = combine_args(config_general_args, config_input_args) else: @@ -701,7 +701,7 @@ def manage_cli_and_config_args(subcommand: str, config_file: str, subcommand_to_ config_args = combine_args(config_general_args, config_specific_args) config_args = combine_args(config_args, config_input_args) - # manage priority between source of args + # manage priority between source of args # cli > config > default args = overwrite_args(default_args, config_args, cli_args) @@ -732,7 +732,7 @@ def manage_cli_and_config_args(subcommand: str, config_file: str, subcommand_to_ config_step_args = get_config_args(workflow_step, step_subparser, config, workflow_step, specific_step_params, strict_config_check=True) - # overwrite write and draw default when not specified in config + # overwrite write and draw default when not specified in config if workflow_step == 'write_pangenome': for out_flag in WRITE_PAN_FLAG_DEFAULT_IN_WF: if out_flag not in config[workflow_step]: @@ -829,7 +829,7 @@ def set_up_config_param_to_parser(config_param_val: dict) -> list: # param is a flag if val is True: arguments_to_parse.append(f"--{param}") - # if val is False or None we don't add id to the + # if val is False or None we don't add id to the else: arguments_to_parse.append(f"--{param}") @@ -1022,7 +1022,7 @@ def extract_contig_window(contig_size: int, positions_of_interest: Iterable[int] last_position = sorted_positions[-1] # in a circular contig, if the window of a gene of interest overlaps the end/start of the contig # an out of scope position is added to the sorted positions to take into account those positions - # the returned window are always checked that its positions are not out of range... + # the returned window are always checked that its positions are not out of range... # so there's no chance to find an out of scope position in final list if first_position - window_size < 0: out_of_scope_position = contig_size + first_position @@ -1042,7 +1042,7 @@ def extract_contig_window(contig_size: int, positions_of_interest: Iterable[int] windows_coordinates.append((start_po, end_po)) elif position + window_size + 1 < next_po - window_size: - # If there is a gap between positions, add the current window + # If there is a gap between positions, add the current window # and update the start position for the next window end_po = min(position + window_size, contig_size - 1) From b0d5d19000f1cec361c72175320eb6b16fe6a4fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Chapoton?= Date: Thu, 19 Sep 2024 08:34:21 +0200 Subject: [PATCH 10/52] a few more fixes by hand --- ppanggolin/__init__.py | 12 ++++++------ ppanggolin/pangenome.py | 4 ++-- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/ppanggolin/__init__.py b/ppanggolin/__init__.py index 00600bfc..badec1d4 100755 --- a/ppanggolin/__init__.py +++ b/ppanggolin/__init__.py @@ -37,8 +37,8 @@ "spot": ppanggolin.RGP.spot.subparser, "module": ppanggolin.mod.subparser, "context": ppanggolin.context.subparser, - "projection":ppanggolin.projection.subparser, - "rgp_cluster":ppanggolin.RGP.rgp_cluster.subparser, + "projection": ppanggolin.projection.subparser, + "rgp_cluster": ppanggolin.RGP.rgp_cluster.subparser, "metadata": ppanggolin.meta.subparser } @@ -50,8 +50,8 @@ """ pan_epilog = """ -For pangenome analyses, please cite: -Gautreau G et al. (2020) PPanGGOLiN: Depicting microbial diversity via a partitioned pangenome graph. +For pangenome analyses, please cite: +Gautreau G et al. (2020) PPanGGOLiN: Depicting microbial diversity via a partitioned pangenome graph. PLOS Computational Biology 16(3): e1007732. https://doi.org/10.1371/journal.pcbi.1007732 """ rgp_epilog = """ @@ -62,6 +62,6 @@ mod_epilog = """ For module prediction, please cite: -Bazin et al., panModule: detecting conserved modules in the variable regions of a pangenome graph. +Bazin et al., panModule: detecting conserved modules in the variable regions of a pangenome graph. biorxiv. https://doi.org/10.1101/2021.12.06.471380 -""" \ No newline at end of file +""" diff --git a/ppanggolin/pangenome.py b/ppanggolin/pangenome.py index 9c11d69d..a9b5d1de 100644 --- a/ppanggolin/pangenome.py +++ b/ppanggolin/pangenome.py @@ -572,7 +572,7 @@ def add_region(self, region: Region): :param region: Region to add in pangenome - :raise AssertionError: Error if region is not a Region object + :raise AssertionError: Error if region is not a Region object :raise KeyError: Error if another Region exist in pangenome with the same name """ assert isinstance(region, Region), "A Region object is expected" @@ -782,7 +782,7 @@ def select_elem(self, metatype: str): :return: All elements from pangenome for the metatype - :raise AssertionError: Error if metatype is not a string + :raise AssertionError: Error if metatype is not a string :raise KeyError: Error if metatype is not recognized """ assert isinstance(metatype, str), "Metatype name should be a string" From 825e1e76a5c2da03df1bd8d0faff69bff6d71543 Mon Sep 17 00:00:00 2001 From: JeanMainguy Date: Thu, 19 Sep 2024 14:22:25 +0200 Subject: [PATCH 11/52] add softcore and core filter in gene_families output --- ppanggolin/formats/readBinaries.py | 49 ++++++++++++- ppanggolin/formats/writeSequences.py | 101 +++++++++++++++------------ 2 files changed, 103 insertions(+), 47 deletions(-) diff --git a/ppanggolin/formats/readBinaries.py b/ppanggolin/formats/readBinaries.py index bb1a868b..82bb3791 100644 --- a/ppanggolin/formats/readBinaries.py +++ b/ppanggolin/formats/readBinaries.py @@ -394,7 +394,8 @@ def write_genes_seq_from_pangenome_file(h5f, outpath, compress, seq_id_to_genes) with write_compressed_or_not(file_path=outpath, compress=compress) as file_obj: seq_table = h5f.root.annotations.sequences - #TODO add tqm + #TODO add tqdm + for row in read_chunks(table=seq_table, chunk=20000): if row["seqid"] in seq_id_to_genes: @@ -404,8 +405,37 @@ def write_genes_seq_from_pangenome_file(h5f, outpath, compress, seq_id_to_genes) file_obj.write(row["dna"].decode() + "\n") -def write_fasta_gene_fam_from_pangenome_file(pangenome_filename: str, output: Path, family_filter: str, - compress: bool = False, disable_bar=False): +def get_gene_to_genome(h5f): + """ + """ + + contig_id_to_genome = {row["ID"]:row['genome'] for row in read_chunks( h5f.root.annotations.contigs, chunk=20000) } + + gene_to_genome = {row["ID"]:contig_id_to_genome[row['contig'] ] for row in read_chunks( h5f.root.annotations.genes, chunk=20000) } + + return gene_to_genome + + +def get_family_to_genome_count(h5f) -> Dict[bytes, int]: + """ + """ + + contig_id_to_genome = {row["ID"]:row['genome'] for row in read_chunks( h5f.root.annotations.contigs, chunk=20000) } + + gene_to_genome = {row["ID"]:contig_id_to_genome[row['contig'] ] for row in read_chunks( h5f.root.annotations.genes, chunk=20000) } + + family_to_genomes = defaultdict(set) + for row in read_chunks( h5f.root.geneFamilies, chunk=20000): + family_to_genomes[row['geneFam']].add(gene_to_genome[row["gene"]]) + + family_to_genome_count = {fam: len(genomes) for fam, genomes in family_to_genomes.items()} + + return family_to_genome_count + + + +def write_fasta_gene_fam_from_pangenome_file(pangenome_filename: str, output: Path, family_filter: str, soft_core:float = 0.95, + compress: bool = False, disable_bar=False): """ Write representative nucleotide sequences of gene families @@ -432,6 +462,19 @@ def write_fasta_gene_fam_from_pangenome_file(pangenome_filename: str, output: Pa rgp_genes = read_rgp__genes_from_pangenome_file(h5f) family_to_write = get_families_from_genes(h5f, rgp_genes) + elif family_filter in ["softcore", "core"]: + family_to_genome_count = get_family_to_genome_count(h5f) + pangenome_info = read_info(h5f) + genome_count = pangenome_info["Content"]["Genomes"] + + if family_filter == "core": + family_to_write = {family for family, fam_genome_count in family_to_genome_count.items() if genome_count == fam_genome_count} + + elif family_filter == "softcore": + genome_count_threshold = genome_count * soft_core + family_to_write = {family for family, fam_genome_count in family_to_genome_count.items() if fam_genome_count >= genome_count_threshold} + + if len(family_to_write) == 0: logging.getLogger("PPanGGOLiN").warning(f"No families matching filter {family_filter}.") return diff --git a/ppanggolin/formats/writeSequences.py b/ppanggolin/formats/writeSequences.py index fe1ed13e..947b17f1 100644 --- a/ppanggolin/formats/writeSequences.py +++ b/ppanggolin/formats/writeSequences.py @@ -548,21 +548,62 @@ def write_sequence_files(pangenome: Pangenome, output: Path, fasta: Path = None, :param disable_bar: Disable progress bar """ - check_pangenome_to_write_sequences(pangenome, regions, genes, proteins, gene_families, prot_families, disable_bar) - if prot_families is not None: - write_fasta_prot_fam(pangenome, output, prot_families, soft_core, compress, disable_bar) - if gene_families is not None: - write_fasta_gene_fam(pangenome, output, gene_families, soft_core, compress, disable_bar) - if genes is not None: - write_gene_sequences(pangenome, output, genes, soft_core, compress, disable_bar) - if proteins is not None: - write_gene_protein_sequences(pangenome, output, proteins, soft_core, compress, disable_bar=disable_bar, - **translate_kwgs) - if regions is not None: - write_regions_sequences(pangenome, output, regions, fasta, anno, compress, disable_bar) + if gene_families is not None: #and (gene_families in ['all', 'persistent', 'shell', 'cloud', "rgp"] or module_regex.match(gene_families)): + + logging.getLogger("PPanGGOLiN").info("Writing the representative nucleotide sequences " + "of the gene families by reading the pangenome file directly.") + + write_fasta_gene_fam_from_pangenome_file(pangenome_filename=pangenome.file, family_filter= gene_families, + output=output, compress=compress, disable_bar=disable_bar) + gene_families = None + + if prot_families is not None and (prot_families in ['all', 'persistent', 'shell', 'cloud', "rgp"] or module_regex.match(prot_families)): + + logging.getLogger("PPanGGOLiN").info("Writing the representative protein sequences " + "of the gene families by reading the pangenome file directly.") + write_fasta_prot_fam_from_pangenome_file(pangenome_filename=pangenome.file, family_filter = prot_families, + output=output, compress=compress, disable_bar=disable_bar) + + prot_families = None + if genes is not None and (genes in ['all', 'persistent', 'shell', 'cloud', "rgp"] or module_regex.match(genes)): + + logging.getLogger("PPanGGOLiN").info("Writing gene nucleotide sequences by reading the pangenome file directly.") + write_genes_from_pangenome_file(pangenome_filename=pangenome.file, gene_filter = genes, + output=output, compress=compress, disable_bar=disable_bar) + + genes = None + + if proteins is not None and (proteins in ['all', 'persistent', 'shell', 'cloud', "rgp"] or module_regex.match(proteins)): + pass + + # logging.getLogger("PPanGGOLiN").info("Writing gene nucleotide sequences by reading the pangenome file directly.") + # write_gene_protein_sequences(pangenome, output, proteins, soft_core, compress, disable_bar=disable_bar, + # **translate_kwgs) + + # write_genes_from_pangenome_file(pangenome_filename=pangenome, gene_filter = genes, + # output=output, compress=compress, disable_bar=disable_bar) + + # proteins = None + + if any(x for x in [regions, genes, proteins, gene_families, prot_families]): + check_pangenome_to_write_sequences(pangenome, regions, genes, proteins, gene_families, prot_families, disable_bar) + + if prot_families is not None: + write_fasta_prot_fam(pangenome, output, prot_families, soft_core, compress, disable_bar) + if gene_families is not None: + write_fasta_gene_fam(pangenome, output, gene_families, soft_core, compress, disable_bar) + if genes is not None: + write_gene_sequences(pangenome, output, genes, soft_core, compress, disable_bar) + if proteins is not None: + write_gene_protein_sequences(pangenome, output, proteins, soft_core, compress, disable_bar=disable_bar, + **translate_kwgs) + if regions is not None: + write_regions_sequences(pangenome, output, regions, fasta, anno, compress, disable_bar) + + def launch(args: argparse.Namespace): """ Command launcher @@ -578,39 +619,11 @@ def launch(args: argparse.Namespace): pangenome = Pangenome() pangenome.add_file(args.pangenome) - if args.gene_families is not None and (args.gene_families in ['all', 'persistent', 'shell', 'cloud', "rgp"] or module_regex.match(args.gene_families)): - - logging.getLogger("PPanGGOLiN").info("Writing the representative nucleotide sequences " - "of the gene families by reading the pangenome file directly.") - - write_fasta_gene_fam_from_pangenome_file(pangenome_filename=args.pangenome, family_filter= args.gene_families, - output=args.output, compress=args.compress, disable_bar=args.disable_prog_bar) - args.gene_families = None - - if args.prot_families is not None and (args.prot_families in ['all', 'persistent', 'shell', 'cloud', "rgp"] or module_regex.match(args.prot_families)): - - logging.getLogger("PPanGGOLiN").info("Writing the representative protein sequences " - "of the gene families by reading the pangenome file directly.") - write_fasta_prot_fam_from_pangenome_file(pangenome_filename=args.pangenome, family_filter = args.prot_families, - output=args.output, compress=args.compress, disable_bar=args.disable_prog_bar) - - args.prot_families = None - - - if args.genes is not None and (args.genes in ['all', 'persistent', 'shell', 'cloud', "rgp"] or module_regex.match(args.genes)): - - logging.getLogger("PPanGGOLiN").info("Writing gene nucleotide sequences by reading the pangenome file directly.") - write_genes_from_pangenome_file(pangenome_filename=args.pangenome, gene_filter = args.genes, - output=args.output, compress=args.compress, disable_bar=args.disable_prog_bar) - - args.genes = None - - if any(x for x in [args.regions, args.genes, args.proteins, args.gene_families, args.prot_families]): - write_sequence_files(pangenome, args.output, fasta=args.fasta, anno=args.anno, soft_core=args.soft_core, - regions=args.regions, genes=args.genes, proteins=args.proteins, - gene_families=args.gene_families, prot_families=args.prot_families, compress=args.compress, - disable_bar=args.disable_prog_bar, **translate_kwgs) + write_sequence_files(pangenome, args.output, fasta=args.fasta, anno=args.anno, soft_core=args.soft_core, + regions=args.regions, genes=args.genes, proteins=args.proteins, + gene_families=args.gene_families, prot_families=args.prot_families, compress=args.compress, + disable_bar=args.disable_prog_bar, **translate_kwgs) def subparser(sub_parser: argparse._SubParsersAction) -> argparse.ArgumentParser: From 25c61bc88cf6a2d641040b7bf1c6ed1039caa7ac Mon Sep 17 00:00:00 2001 From: JeanMainguy Date: Thu, 19 Sep 2024 14:41:58 +0200 Subject: [PATCH 12/52] add softcore and core filter in prot_families output --- ppanggolin/formats/readBinaries.py | 32 ++++++++++++++++++---------- ppanggolin/formats/writeSequences.py | 4 ++-- 2 files changed, 23 insertions(+), 13 deletions(-) diff --git a/ppanggolin/formats/readBinaries.py b/ppanggolin/formats/readBinaries.py index 82bb3791..90ce9e90 100644 --- a/ppanggolin/formats/readBinaries.py +++ b/ppanggolin/formats/readBinaries.py @@ -432,7 +432,16 @@ def get_family_to_genome_count(h5f) -> Dict[bytes, int]: return family_to_genome_count +def get_soft_core_families(h5f, soft_core:float): + """ + """ + family_to_genome_count = get_family_to_genome_count(h5f) + pangenome_info = read_info(h5f) + genome_count = pangenome_info["Content"]["Genomes"] + genome_count_threshold = genome_count * soft_core + soft_core_families = {family for family, fam_genome_count in family_to_genome_count.items() if fam_genome_count >= genome_count_threshold} + return soft_core_families def write_fasta_gene_fam_from_pangenome_file(pangenome_filename: str, output: Path, family_filter: str, soft_core:float = 0.95, compress: bool = False, disable_bar=False): @@ -463,17 +472,10 @@ def write_fasta_gene_fam_from_pangenome_file(pangenome_filename: str, output: Pa family_to_write = get_families_from_genes(h5f, rgp_genes) elif family_filter in ["softcore", "core"]: - family_to_genome_count = get_family_to_genome_count(h5f) - pangenome_info = read_info(h5f) - genome_count = pangenome_info["Content"]["Genomes"] - if family_filter == "core": - family_to_write = {family for family, fam_genome_count in family_to_genome_count.items() if genome_count == fam_genome_count} - - elif family_filter == "softcore": - genome_count_threshold = genome_count * soft_core - family_to_write = {family for family, fam_genome_count in family_to_genome_count.items() if fam_genome_count >= genome_count_threshold} - + soft_core = 1.0 + + family_to_write = get_soft_core_families(h5f, soft_core) if len(family_to_write) == 0: logging.getLogger("PPanGGOLiN").warning(f"No families matching filter {family_filter}.") @@ -486,7 +488,8 @@ def write_fasta_gene_fam_from_pangenome_file(pangenome_filename: str, output: Pa logging.getLogger("PPanGGOLiN").info("Done writing the representative nucleotide sequences " f"of the gene families : '{outpath}{'.gz' if compress else ''}") -def write_fasta_prot_fam_from_pangenome_file(pangenome_filename: str, output: Path, family_filter: str, + +def write_fasta_prot_fam_from_pangenome_file(pangenome_filename: str, output: Path, family_filter: str, soft_core:float=0.95, compress: bool = False, disable_bar=False): """ Write representative amino acid sequences of gene families. @@ -517,8 +520,15 @@ def write_fasta_prot_fam_from_pangenome_file(pangenome_filename: str, output: Pa elif family_filter.startswith("module_"): family_to_write = read_module_families_from_pangenome_file(h5f, module_name=family_filter) + elif family_filter in ["softcore", "core"]: + + soft_core_to_apply = 1.0 if family_filter == "core" else soft_core + + family_to_write = get_soft_core_families(h5f, soft_core=soft_core_to_apply) + gene_fam_info_table = h5f.root.geneFamiliesInfo + # TODO improve tqdm with total being the number of family to write for row in tqdm(read_chunks(gene_fam_info_table, chunk=20000), total=gene_fam_info_table.nrows, unit="family", disable=disable_bar): partition_match = partition_filter and (family_filter == "all" or row['partition'].decode().startswith(parition_first_letter)) diff --git a/ppanggolin/formats/writeSequences.py b/ppanggolin/formats/writeSequences.py index 947b17f1..2ea531f6 100644 --- a/ppanggolin/formats/writeSequences.py +++ b/ppanggolin/formats/writeSequences.py @@ -554,11 +554,11 @@ def write_sequence_files(pangenome: Pangenome, output: Path, fasta: Path = None, logging.getLogger("PPanGGOLiN").info("Writing the representative nucleotide sequences " "of the gene families by reading the pangenome file directly.") - write_fasta_gene_fam_from_pangenome_file(pangenome_filename=pangenome.file, family_filter= gene_families, + write_fasta_gene_fam_from_pangenome_file(pangenome_filename=pangenome.file, family_filter= gene_families, soft_core=soft_core, output=output, compress=compress, disable_bar=disable_bar) gene_families = None - if prot_families is not None and (prot_families in ['all', 'persistent', 'shell', 'cloud', "rgp"] or module_regex.match(prot_families)): + if prot_families is not None: #and (prot_families in ['all', 'persistent', 'shell', 'cloud', "rgp"] or module_regex.match(prot_families)): logging.getLogger("PPanGGOLiN").info("Writing the representative protein sequences " "of the gene families by reading the pangenome file directly.") From baa9a0f90d9ed36ae86daf60608ca5233080b576 Mon Sep 17 00:00:00 2001 From: JeanMainguy Date: Thu, 19 Sep 2024 16:08:14 +0200 Subject: [PATCH 13/52] handle proteins in faster way --- ppanggolin/formats/readBinaries.py | 13 ++- ppanggolin/formats/writeSequences.py | 134 ++++++--------------------- 2 files changed, 37 insertions(+), 110 deletions(-) diff --git a/ppanggolin/formats/readBinaries.py b/ppanggolin/formats/readBinaries.py index 90ce9e90..4aec2c7a 100644 --- a/ppanggolin/formats/readBinaries.py +++ b/ppanggolin/formats/readBinaries.py @@ -384,11 +384,11 @@ def get_seqid_to_genes(h5f: tables.File, genes:List[str], get_all_genes:bool = F seq_id_to_genes[row['seqid']].append(row['gene'].decode()) match_count += 1 - assert match_count == len(genes), f"Number of sequences found ({match_count}) does not match the number of expected genes {len(genes)}." + assert get_all_genes or match_count == len(genes), f"Number of sequences found ({match_count}) does not match the number of expected genes {len(genes)}." return seq_id_to_genes -def write_genes_seq_from_pangenome_file(h5f, outpath, compress, seq_id_to_genes): +def write_genes_seq_from_pangenome_file(h5f: tables.File, outpath, compress, seq_id_to_genes): """ """ @@ -543,7 +543,7 @@ def write_fasta_prot_fam_from_pangenome_file(pangenome_filename: str, output: Pa f"'{outpath}{'.gz' if compress else ''}'") -def write_genes_from_pangenome_file(pangenome_filename: str, output: Path, gene_filter: str, +def write_genes_from_pangenome_file(pangenome_filename: str, output: Path, gene_filter: str, soft_core:float=0.95, compress: bool = False, disable_bar=False): """ Write representative nucleotide sequences of gene families @@ -561,11 +561,16 @@ def write_genes_from_pangenome_file(pangenome_filename: str, output: Path, gene_ with tables.open_file(pangenome_filename, "r", driver_core_backing_store=0) as h5f: - if gene_filter in ['persistent', 'shell', 'cloud'] or gene_filter.startswith("module_"): + if gene_filter in ['persistent', 'shell', 'cloud', "softcore", "core"] or gene_filter.startswith("module_"): if gene_filter.startswith("module_"): families = read_module_families_from_pangenome_file(h5f, module_name=gene_filter) + + elif gene_filter in ["softcore", "core"]: + soft_core_to_apply = 1.0 if gene_filter == "core" else soft_core + families = get_soft_core_families(h5f, soft_core=soft_core_to_apply) + else: families = get_families_matching_partition(h5f, gene_filter) diff --git a/ppanggolin/formats/writeSequences.py b/ppanggolin/formats/writeSequences.py index 2ea531f6..83562ae6 100644 --- a/ppanggolin/formats/writeSequences.py +++ b/ppanggolin/formats/writeSequences.py @@ -39,81 +39,6 @@ def check_write_sequences_args(args: argparse.Namespace) -> None: "(You need to provide the same file used to compute the pangenome)") -def check_pangenome_to_write_sequences(pangenome: Pangenome, regions: str = None, genes: str = None, - genes_prot: str = None, gene_families: str = None, - prot_families: str = None, disable_bar: bool = False): - """Check and load required information from pangenome - - :param pangenome: Empty pangenome - :param regions: Check and load the RGP - :param genes: Check and load the genes - :param genes_prot: Write amino acid CDS sequences. - :param gene_families: Check and load the gene families to write representative nucleotide sequences. - :param prot_families: Check and load the gene families to write representative amino acid sequences. - :param disable_bar: Disable progress bar - - :raises AssertionError: if not any arguments to write any file is given - :raises ValueError: if the given filter is not recognized - :raises AttributeError: if the pangenome does not contain the required information - """ - if not any(x for x in [regions, genes, genes_prot, prot_families, gene_families]): - raise AssertionError("You did not indicate what file you wanted to write.") - - need_annotations = False - need_families = False - need_graph = False - need_partitions = False - need_spots = False - need_regions = False - need_modules = False - - if prot_families is not None: - need_families = True - if prot_families in ["core", "softcore"]: - need_annotations = True - - if any(x is not None for x in [regions, genes, genes_prot, gene_families]): - need_annotations = True - need_families = True - if regions is not None or any(x == "rgp" for x in (genes, gene_families, prot_families)): - need_annotations = True - need_regions = True - if any(x in ["persistent", "shell", "cloud"] for x in (genes, gene_families, prot_families)): - need_partitions = True - for x in (genes, gene_families, prot_families): - if x is not None and 'module_' in x: - need_modules = True - - if not (need_annotations or need_families or need_graph or need_partitions or - need_spots or need_regions or need_modules): - # then nothing is needed, then something is wrong. - # find which filter was provided - provided_filter = '' - if genes is not None: - provided_filter = genes - if genes_prot is not None: - provided_filter = genes_prot - if gene_families is not None: - provided_filter = gene_families - if prot_families is not None: - provided_filter = prot_families - if regions is not None: - provided_filter = regions - raise ValueError(f"The filter that you indicated '{provided_filter}' was not understood by PPanGGOLiN. " - f"{poss_values_log}") - - if pangenome.status["geneSequences"] not in ["inFile"] and (genes or gene_families): - raise AttributeError("The provided pangenome has no gene sequences. " - "This is not compatible with any of the following options : --genes, --gene_families") - if pangenome.status["geneFamilySequences"] not in ["Loaded", "Computed", "inFile"] and prot_families: - raise AttributeError("The provided pangenome has no gene families. This is not compatible with any of " - "the following options : --prot_families, --gene_families") - - check_pangenome_info(pangenome, need_annotations=need_annotations, need_families=need_families, - need_graph=need_graph, need_partitions=need_partitions, need_rgp=need_regions, - need_spots=need_spots, need_modules=need_modules, disable_bar=disable_bar) - - def write_gene_sequences_from_annotations(genes_to_write: Iterable[Gene], output: Path, add: str = '', compress: bool = False, disable_bar: bool = False): """ @@ -222,7 +147,7 @@ def write_gene_sequences(pangenome: Pangenome, output: Path, genes: str, soft_co return outpath -def write_gene_protein_sequences(pangenome: Pangenome, output: Path, proteins: str, soft_core: float = 0.95, +def write_gene_protein_sequences(pangenome_filename: str, output: Path, gene_filter: str, soft_core: float = 0.95, compress: bool = False, keep_tmp: bool = False, tmp: Path = None, cpu: int = 1, code: int = 11, disable_bar: bool = False): """ Write all amino acid sequences from given genes in pangenome @@ -241,12 +166,17 @@ def write_gene_protein_sequences(pangenome: Pangenome, output: Path, proteins: s with create_tmpdir(tmp if tmp is not None else Path(tempfile.gettempdir()), basename="translateGenes", keep_tmp=keep_tmp) as tmpdir: - write_gene_sequences(pangenome, tmpdir, proteins, soft_core, compress, disable_bar) + write_genes_from_pangenome_file(pangenome_filename=pangenome_filename, gene_filter = gene_filter, + output=tmpdir, compress=compress, disable_bar=disable_bar) - pangenome_sequences = tmpdir / f"{proteins}_genes.fna{'.gz' if compress else ''}" - translate_db = translate_genes(sequences=pangenome_sequences, tmpdir=tmpdir, + genes_sequence_tmp_file = tmpdir / f"{gene_filter}_genes.fna{'.gz' if compress else ''}" + translate_db = translate_genes(sequences=genes_sequence_tmp_file, tmpdir=tmpdir, cpu=cpu, is_single_line_fasta=True, code=code) - outpath = output / f"{proteins}_protein_genes.fna" + + outpath = output / f"{gene_filter}_protein_genes.faa" + + logging.getLogger("PPanGGOLiN").info("Translating nucleotide gene sequence in protein sequences with mmseqs convert2fasta") + cmd = list(map(str, ["mmseqs", "convert2fasta", translate_db, outpath])) run_subprocess(cmd, msg="MMSeqs convert2fasta failed with the following error:\n") if compress: @@ -254,9 +184,9 @@ def write_gene_protein_sequences(pangenome: Pangenome, output: Path, proteins: s with open(outpath) as sequence_file: shutil.copyfileobj(sequence_file, compress_file) outpath.unlink() - logging.getLogger("PPanGGOLiN").info(f"Done writing the gene sequences : '{outpath}.gz'") + logging.getLogger("PPanGGOLiN").info(f"Done writing the gene protein sequences : '{outpath}.gz'") else: - logging.getLogger("PPanGGOLiN").info(f"Done writing the gene sequences : '{outpath}'") + logging.getLogger("PPanGGOLiN").info(f"Done writing the gene protein sequences : '{outpath}'") def select_families(pangenome: Pangenome, partition: str, type_name: str, soft_core: float = 0.95) -> Set[GeneFamily]: @@ -549,7 +479,7 @@ def write_sequence_files(pangenome: Pangenome, output: Path, fasta: Path = None, """ - if gene_families is not None: #and (gene_families in ['all', 'persistent', 'shell', 'cloud', "rgp"] or module_regex.match(gene_families)): + if gene_families is not None: logging.getLogger("PPanGGOLiN").info("Writing the representative nucleotide sequences " "of the gene families by reading the pangenome file directly.") @@ -558,48 +488,40 @@ def write_sequence_files(pangenome: Pangenome, output: Path, fasta: Path = None, output=output, compress=compress, disable_bar=disable_bar) gene_families = None - if prot_families is not None: #and (prot_families in ['all', 'persistent', 'shell', 'cloud', "rgp"] or module_regex.match(prot_families)): + if prot_families is not None: logging.getLogger("PPanGGOLiN").info("Writing the representative protein sequences " "of the gene families by reading the pangenome file directly.") - write_fasta_prot_fam_from_pangenome_file(pangenome_filename=pangenome.file, family_filter = prot_families, + write_fasta_prot_fam_from_pangenome_file(pangenome_filename=pangenome.file, family_filter = prot_families, soft_core=soft_core, output=output, compress=compress, disable_bar=disable_bar) prot_families = None - if genes is not None and (genes in ['all', 'persistent', 'shell', 'cloud', "rgp"] or module_regex.match(genes)): + if genes is not None: logging.getLogger("PPanGGOLiN").info("Writing gene nucleotide sequences by reading the pangenome file directly.") - write_genes_from_pangenome_file(pangenome_filename=pangenome.file, gene_filter = genes, + write_genes_from_pangenome_file(pangenome_filename=pangenome.file, gene_filter = genes, soft_core=soft_core, output=output, compress=compress, disable_bar=disable_bar) genes = None - if proteins is not None and (proteins in ['all', 'persistent', 'shell', 'cloud', "rgp"] or module_regex.match(proteins)): - pass + if proteins is not None: + - # logging.getLogger("PPanGGOLiN").info("Writing gene nucleotide sequences by reading the pangenome file directly.") - # write_gene_protein_sequences(pangenome, output, proteins, soft_core, compress, disable_bar=disable_bar, - # **translate_kwgs) + logging.getLogger("PPanGGOLiN").info("Writing gene protein sequences by reading the pangenome file directly.") + write_gene_protein_sequences(pangenome_filename=pangenome.file, output=output, gene_filter=proteins, soft_core=soft_core, compress=compress, disable_bar=disable_bar, + **translate_kwgs) + + proteins = None - # write_genes_from_pangenome_file(pangenome_filename=pangenome, gene_filter = genes, - # output=output, compress=compress, disable_bar=disable_bar) + if regions is not None: + + # load pangenome when writing region sequence + check_pangenome_info(pangenome, need_annotations=True, need_families=True, need_rgp=True, disable_bar=disable_bar) - # proteins = None - if any(x for x in [regions, genes, proteins, gene_families, prot_families]): - check_pangenome_to_write_sequences(pangenome, regions, genes, proteins, gene_families, prot_families, disable_bar) - if prot_families is not None: - write_fasta_prot_fam(pangenome, output, prot_families, soft_core, compress, disable_bar) - if gene_families is not None: - write_fasta_gene_fam(pangenome, output, gene_families, soft_core, compress, disable_bar) - if genes is not None: - write_gene_sequences(pangenome, output, genes, soft_core, compress, disable_bar) - if proteins is not None: - write_gene_protein_sequences(pangenome, output, proteins, soft_core, compress, disable_bar=disable_bar, - **translate_kwgs) if regions is not None: write_regions_sequences(pangenome, output, regions, fasta, anno, compress, disable_bar) From cfc9073aa4d797d068487fcd3e0e9d536d55d321 Mon Sep 17 00:00:00 2001 From: JeanMainguy Date: Thu, 19 Sep 2024 17:04:10 +0200 Subject: [PATCH 14/52] clean region seq writting --- ppanggolin/formats/writeSequences.py | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/ppanggolin/formats/writeSequences.py b/ppanggolin/formats/writeSequences.py index 83562ae6..90234462 100644 --- a/ppanggolin/formats/writeSequences.py +++ b/ppanggolin/formats/writeSequences.py @@ -516,14 +516,10 @@ def write_sequence_files(pangenome: Pangenome, output: Path, fasta: Path = None, proteins = None if regions is not None: - # load pangenome when writing region sequence check_pangenome_info(pangenome, need_annotations=True, need_families=True, need_rgp=True, disable_bar=disable_bar) - - - if regions is not None: - write_regions_sequences(pangenome, output, regions, fasta, anno, compress, disable_bar) + write_regions_sequences(pangenome, output, regions, fasta, anno, compress, disable_bar) def launch(args: argparse.Namespace): From bd592d091a4e19468f377b4081fcc870083fbaa4 Mon Sep 17 00:00:00 2001 From: JeanMainguy Date: Thu, 19 Sep 2024 17:40:10 +0200 Subject: [PATCH 15/52] add docstring and clean fct not used --- ppanggolin/formats/readBinaries.py | 118 +++++++++++++++++----- ppanggolin/formats/writeSequences.py | 145 --------------------------- 2 files changed, 93 insertions(+), 170 deletions(-) diff --git a/ppanggolin/formats/readBinaries.py b/ppanggolin/formats/readBinaries.py index 4aec2c7a..5f1b79e9 100644 --- a/ppanggolin/formats/readBinaries.py +++ b/ppanggolin/formats/readBinaries.py @@ -311,17 +311,27 @@ def write_gene_sequences_from_pangenome_file(pangenome_filename: str, output: Pa f"{output.absolute()}{'.gz' if compress else ''}") -def read_rgp__genes_from_pangenome_file(h5f: tables.File) -> List[str]: +def read_rgp_genes_from_pangenome_file(h5f: tables.File) -> List[bytes]: """ + Retrieves a list of RGP genes from the pangenome file. + + :param h5f: The open HDF5 pangenome file containing RGP gene data. + :return: A list of gene names (as bytes) from the RGP. """ rgp_genes = [row["gene"] for row in read_chunks(h5f.root.RGP, chunk=20000)] return rgp_genes -def get_families_from_genes(h5f: tables.File , genes:Set[str]): +def get_families_from_genes(h5f: tables.File, genes: Set[bytes]) -> Set[bytes]: """ + Retrieves gene families associated with a specified set of genes from the pangenome file. + + :param h5f: The open HDF5 pangenome file containing gene family data. + :param genes: A set of gene names (as bytes) for which to retrieve the associated families. + :return: A set of gene family names (as bytes) associated with the specified genes. """ + families = set() for row in read_chunks(h5f.root.geneFamilies, chunk=20000): if row['gene'] in genes: @@ -329,10 +339,17 @@ def get_families_from_genes(h5f: tables.File , genes:Set[str]): return families -def read_module_families_from_pangenome_file(h5f: tables.File, module_name:str): +def read_module_families_from_pangenome_file(h5f: tables.File, module_name: str) -> Set[bytes]: """ - + Retrieves gene families associated with a specified module from the pangenome file. + + + :param h5f: The open HDF5 pangenome file containing module data. + :param module_name: The name of the module (as a string). The module ID is extracted from + the name by removing the "module_" prefix. + :return: A set of gene family names (as bytes) associated with the specified module. """ + family_to_write = set() module_id = int(module_name[len("module_"):]) module_table = h5f.root.modules @@ -343,9 +360,16 @@ def read_module_families_from_pangenome_file(h5f: tables.File, module_name:str): return family_to_write -def get_families_matching_partition(h5f: tables.File, partition:str): +def get_families_matching_partition(h5f: tables.File, partition: str) -> Set[bytes]: """ + Retrieves gene families that match the specified partition. + + :param h5f: The open HDF5 pangenome file containing gene family information. + :param partition: The partition name (as a string). If "all", all gene families are included. + Otherwise, it filters by the first letter of the partition. + :return: A set of gene family names (as bytes) that match the partition criteria. """ + family_to_write = set() gene_fam_info_table = h5f.root.geneFamiliesInfo @@ -358,9 +382,18 @@ def get_families_matching_partition(h5f: tables.File, partition:str): return family_to_write -def get_genes_from_families(h5f: tables.File, families:List[numpy.byte]): +def get_genes_from_families(h5f: tables.File, families: List[bytes]) -> Set[bytes]: """ + Retrieves a set of genes that belong to the specified families. + + This function reads the gene family data from an HDF5 pangenome file and returns + a set of genes that are part of the given list of gene families. + + :param h5f: The open HDF5 pangenome file containing gene family data. + :param families: A list of gene families (as bytes) to filter genes by. + :return: A set of genes (as bytes) that belong to the specified families. """ + matching_genes = set() gene_fam_table = h5f.root.geneFamilies @@ -371,14 +404,22 @@ def get_genes_from_families(h5f: tables.File, families:List[numpy.byte]): return matching_genes -def get_seqid_to_genes(h5f: tables.File, genes:List[str], get_all_genes:bool = False, disable_bar:bool = False): +def get_seqid_to_genes(h5f: tables.File, genes:List[str], get_all_genes:bool = False, disable_bar:bool = False) -> Dict[int, List[str]]: """ + Creates a mapping of sequence IDs to gene names. + + :param h5f: The open HDF5 pangenome file containing gene sequence data. + :param genes: A list of gene names to include in the mapping (if `get_all_genes` is False). + :param get_all_genes: Boolean flag to indicate if all genes should be included in the mapping. + If set to True, all genes will be added regardless of the `genes` parameter. + :param disable_bar: Boolean flag to disable the progress bar if set to True. + :return: A dictionary mapping sequence IDs (integers) to lists of gene names (strings). """ seq_id_to_genes = defaultdict(list) gene_seq_table = h5f.root.annotations.geneSequences match_count = 0 - for row in tqdm(read_chunks(gene_seq_table, chunk=20000), total=gene_seq_table.nrows, unit="family", disable=disable_bar): + for row in tqdm(read_chunks(gene_seq_table, chunk=20000), total=gene_seq_table.nrows, unit="gene", disable=disable_bar): if get_all_genes or row['gene'] in genes: seq_id_to_genes[row['seqid']].append(row['gene'].decode()) @@ -388,25 +429,42 @@ def get_seqid_to_genes(h5f: tables.File, genes:List[str], get_all_genes:bool = F return seq_id_to_genes -def write_genes_seq_from_pangenome_file(h5f: tables.File, outpath, compress, seq_id_to_genes): +def write_genes_seq_from_pangenome_file(h5f: tables.File, outpath: Path, compress: bool, seq_id_to_genes: Dict[int, List[str]], disable_bar:bool): """ + Writes gene sequences from the pangenome file to an output file. + + Only sequences whose IDs match the ones in `seq_id_to_genes` will be written. + + :param h5f: The open HDF5 pangenome file containing sequence data. + :param outpath: The path to the output file where sequences will be written. + :param compress: Boolean flag to indicate whether output should be compressed. + :param seq_id_to_genes: A dictionary mapping sequence IDs to lists of gene names. + :param disable_bar: Boolean flag to disable the progress bar if set to True. """ with write_compressed_or_not(file_path=outpath, compress=compress) as file_obj: + seq_table = h5f.root.annotations.sequences - #TODO add tqdm - for row in read_chunks(table=seq_table, chunk=20000): - if row["seqid"] in seq_id_to_genes: + with tqdm(total=len(seq_id_to_genes), unit="sequence", disable=disable_bar) as pbar: - for seq_name in seq_id_to_genes[row["seqid"]]: - - file_obj.write(f">{seq_name}\n") - file_obj.write(row["dna"].decode() + "\n") + for row in read_chunks(table=seq_table, chunk=20000): + if row["seqid"] in seq_id_to_genes: + + for seq_name in seq_id_to_genes[row["seqid"]]: + file_obj.write(f">{seq_name}\n") + file_obj.write(row["dna"].decode() + "\n") + + + pbar.update(1) -def get_gene_to_genome(h5f): +def get_gene_to_genome(h5f: tables.File) -> Dict[bytes, bytes]: """ + Generates a mapping between gene IDs and their corresponding genome. + + :param h5f: The open HDF5 pangenome file containing contig and gene annotations. + :return: A dictionary mapping gene IDs to genome names. """ contig_id_to_genome = {row["ID"]:row['genome'] for row in read_chunks( h5f.root.annotations.contigs, chunk=20000) } @@ -416,8 +474,12 @@ def get_gene_to_genome(h5f): return gene_to_genome -def get_family_to_genome_count(h5f) -> Dict[bytes, int]: +def get_family_to_genome_count(h5f: tables.File) -> Dict[bytes, int]: """ + Computes the number of unique genomes associated with each gene family. + + :param h5f: The open HDF5 pangenome file containing contig, gene, and gene family data. + :return: A dictionary mapping gene family names (as bytes) to the count of unique genomes. """ contig_id_to_genome = {row["ID"]:row['genome'] for row in read_chunks( h5f.root.annotations.contigs, chunk=20000) } @@ -432,8 +494,14 @@ def get_family_to_genome_count(h5f) -> Dict[bytes, int]: return family_to_genome_count -def get_soft_core_families(h5f, soft_core:float): +def get_soft_core_families(h5f: tables.File, soft_core: float) -> Set[bytes]: """ + Identifies gene families that are present in at least a specified proportion of genomes. + + :param h5f: The open HDF5 pangenome file containing gene family and genome data. + :param soft_core: The proportion of genomes (between 0 and 1) that a gene family must be present in + to be considered a soft core family. + :return: A set of gene family names (as bytes) that are classified as soft core. """ family_to_genome_count = get_family_to_genome_count(h5f) pangenome_info = read_info(h5f) @@ -468,7 +536,7 @@ def write_fasta_gene_fam_from_pangenome_file(pangenome_filename: str, output: Pa family_to_write = read_module_families_from_pangenome_file(h5f, module_name=family_filter) elif family_filter == "rgp": - rgp_genes = read_rgp__genes_from_pangenome_file(h5f) + rgp_genes = read_rgp_genes_from_pangenome_file(h5f) family_to_write = get_families_from_genes(h5f, rgp_genes) elif family_filter in ["softcore", "core"]: @@ -483,7 +551,7 @@ def write_fasta_gene_fam_from_pangenome_file(pangenome_filename: str, output: Pa seq_id_to_genes = get_seqid_to_genes(h5f, family_to_write) - write_genes_seq_from_pangenome_file(h5f, outpath, compress, seq_id_to_genes) + write_genes_seq_from_pangenome_file(h5f, outpath, compress, seq_id_to_genes, disable_bar=disable_bar) logging.getLogger("PPanGGOLiN").info("Done writing the representative nucleotide sequences " f"of the gene families : '{outpath}{'.gz' if compress else ''}") @@ -514,7 +582,7 @@ def write_fasta_prot_fam_from_pangenome_file(pangenome_filename: str, output: Pa parition_first_letter = family_filter[0].upper() elif family_filter == "rgp": - rgp_genes = read_rgp__genes_from_pangenome_file(h5f) + rgp_genes = read_rgp_genes_from_pangenome_file(h5f) family_to_write = get_families_from_genes(h5f, rgp_genes) elif family_filter.startswith("module_"): @@ -528,7 +596,7 @@ def write_fasta_prot_fam_from_pangenome_file(pangenome_filename: str, output: Pa gene_fam_info_table = h5f.root.geneFamiliesInfo - # TODO improve tqdm with total being the number of family to write + for row in tqdm(read_chunks(gene_fam_info_table, chunk=20000), total=gene_fam_info_table.nrows, unit="family", disable=disable_bar): partition_match = partition_filter and (family_filter == "all" or row['partition'].decode().startswith(parition_first_letter)) @@ -577,7 +645,7 @@ def write_genes_from_pangenome_file(pangenome_filename: str, output: Path, gene_ genes_to_write = get_genes_from_families(h5f, families) elif gene_filter == "rgp": - genes_to_write = read_rgp__genes_from_pangenome_file(h5f) + genes_to_write = read_rgp_genes_from_pangenome_file(h5f) elif gene_filter == "all": genes_to_write = [] @@ -585,7 +653,7 @@ def write_genes_from_pangenome_file(pangenome_filename: str, output: Path, gene_ seq_id_to_genes = get_seqid_to_genes(h5f, genes_to_write, get_all_genes=get_all_genes, disable_bar=disable_bar) - write_genes_seq_from_pangenome_file(h5f, outpath, compress, seq_id_to_genes) + write_genes_seq_from_pangenome_file(h5f, outpath, compress, seq_id_to_genes, disable_bar=disable_bar) logging.getLogger("PPanGGOLiN").info("Done writing the representative nucleotide sequences " f"of the gene families : '{outpath}{'.gz' if compress else ''}") diff --git a/ppanggolin/formats/writeSequences.py b/ppanggolin/formats/writeSequences.py index 90234462..49ec4430 100644 --- a/ppanggolin/formats/writeSequences.py +++ b/ppanggolin/formats/writeSequences.py @@ -104,48 +104,6 @@ def translate_genes(sequences: Union[Path, Iterable[Path]], tmpdir: Path, cpu: i return seqdb -def write_gene_sequences(pangenome: Pangenome, output: Path, genes: str, soft_core: float = 0.95, - compress: bool = False, disable_bar: bool = False) -> Path: - """ - Write all nucleotide CDS sequences - - :param pangenome: Pangenome object with gene families sequences - :param output: Path to output directory - :param genes: Selected partition of gene - :param soft_core: Soft core threshold to use - :param compress: Compress the file in .gz - :param disable_bar: Disable progress bar - - :raises AttributeError: If the pangenome does not contain gene sequences - """ - - logging.getLogger("PPanGGOLiN").info("Writing all the gene nucleotide sequences...") - outpath = output / f"{genes}_genes.fna" - - genefams = set() - genes_to_write = [] - if genes == "rgp": - logging.getLogger("PPanGGOLiN").info("Writing the gene nucleotide sequences in RGPs...") - for region in pangenome.regions: - genes_to_write.extend(region.genes) - else: - genefams = select_families(pangenome, genes, "gene nucleotide sequences", soft_core) - - for fam in genefams: - genes_to_write.extend(fam.genes) - - logging.getLogger("PPanGGOLiN").info(f"There are {len(genes_to_write)} genes to write") - if pangenome.status["geneSequences"] in ["inFile"]: - write_gene_sequences_from_pangenome_file(pangenome.file, outpath, set([gene.ID for gene in genes_to_write]), - compress=compress, disable_bar=disable_bar) - elif pangenome.status["geneSequences"] in ["Computed", "Loaded"]: - write_gene_sequences_from_annotations(genes_to_write, outpath, compress=compress, disable_bar=disable_bar) - else: - # this should never happen if the pangenome has been properly checked before launching this function. - raise AttributeError("The pangenome does not include gene sequences") - logging.getLogger("PPanGGOLiN").info(f"Done writing the gene sequences : '{outpath}{'.gz' if compress else ''}'") - return outpath - def write_gene_protein_sequences(pangenome_filename: str, output: Path, gene_filter: str, soft_core: float = 0.95, compress: bool = False, keep_tmp: bool = False, tmp: Path = None, @@ -189,109 +147,6 @@ def write_gene_protein_sequences(pangenome_filename: str, output: Path, gene_fil logging.getLogger("PPanGGOLiN").info(f"Done writing the gene protein sequences : '{outpath}'") -def select_families(pangenome: Pangenome, partition: str, type_name: str, soft_core: float = 0.95) -> Set[GeneFamily]: - """ - function used to filter down families to the given partition - - :param pangenome: Pangenome object - :param partition: Selected partition - :param type_name: Which type of sequence we want. Gene families, protein, gene - :param soft_core: Soft core threshold to use - - :return: Selected gene families - """ - genefams = set() - if partition == 'all': - logging.getLogger("PPanGGOLiN").info(f"Writing all of the {type_name}...") - genefams = pangenome.gene_families - - elif partition in ['persistent', 'shell', 'cloud']: - logging.getLogger("PPanGGOLiN").info(f"Writing the {type_name} of the {partition}...") - for fam in pangenome.gene_families: - if fam.named_partition == partition: - genefams.add(fam) - - elif partition == "rgp": - logging.getLogger("PPanGGOLiN").info(f"Writing the {type_name} in RGPs...") - for region in pangenome.regions: - genefams |= set(region.families) - - elif partition == "softcore": - logging.getLogger("PPanGGOLiN").info( - f"Writing the {type_name} in {partition} genome, that are present in more than {soft_core} of genomes") - threshold = pangenome.number_of_organisms * soft_core - for fam in pangenome.gene_families: - if fam.number_of_organisms >= threshold: - genefams.add(fam) - - elif partition == "core": - logging.getLogger("PPanGGOLiN").info(f"Writing the representative {type_name} of the {partition} " - "gene families...") - for fam in pangenome.gene_families: - if fam.number_of_organisms == pangenome.number_of_organisms: - genefams.add(fam) - - elif "module_" in partition: - logging.getLogger("PPanGGOLiN").info(f"Writing the representation {type_name} of {partition} gene families...") - mod_id = int(partition.replace("module_", "")) - for mod in pangenome.modules: - # could be way more efficient with a dict structure instead of a set - if mod.ID == mod_id: - genefams |= set(mod.families) - break - return genefams - - -def write_fasta_gene_fam(pangenome: Pangenome, output: Path, gene_families: str, soft_core: float = 0.95, - compress: bool = False, disable_bar=False): - """ - Write representative nucleotide sequences of gene families - - :param pangenome: Pangenome object with gene families sequences - :param output: Path to output directory - :param gene_families: Selected partition of gene families - :param soft_core: Soft core threshold to use - :param compress: Compress the file in .gz - :param disable_bar: Disable progress bar - """ - - outpath = output / f"{gene_families}_nucleotide_families.fasta" - - genefams = select_families(pangenome, gene_families, "representative nucleotide sequences of the gene families", - soft_core) - - write_gene_sequences_from_pangenome_file(pangenome.file, outpath, [fam.name for fam in genefams], - compress=compress, disable_bar=disable_bar) - - logging.getLogger("PPanGGOLiN").info("Done writing the representative nucleotide sequences " - f"of the gene families : '{outpath}{'.gz' if compress else ''}") - - -def write_fasta_prot_fam(pangenome: Pangenome, output: Path, prot_families: str, soft_core: float = 0.95, - compress: bool = False, disable_bar: bool = False): - """ - Write representative amino acid sequences of gene families. - - :param pangenome: Pangenome object with gene families sequences - :param output: Path to output directory - :param prot_families: Selected partition of protein families - :param soft_core: Soft core threshold to use - :param compress: Compress the file in .gz - :param disable_bar: Disable progress bar - """ - - outpath = output / f"{prot_families}_protein_families.faa" - - genefams = select_families(pangenome, prot_families, "representative amino acid sequences of the gene families", - soft_core) - - with write_compressed_or_not(outpath, compress) as fasta: - for fam in tqdm(genefams, unit="prot families", disable=disable_bar): - fasta.write('>' + fam.name + "\n") - fasta.write(fam.sequence + "\n") - logging.getLogger("PPanGGOLiN").info(f"Done writing the representative amino acid sequences of the gene families:" - f"'{outpath}{'.gz' if compress else ''}'") - def read_fasta_or_gff(file_path: Path) -> Dict[str, str]: """ From cd30d15c79491469fa78620713fd169a0e07f40e Mon Sep 17 00:00:00 2001 From: JeanMainguy Date: Fri, 20 Sep 2024 11:33:09 +0200 Subject: [PATCH 16/52] clean import --- ppanggolin/formats/writeSequences.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/ppanggolin/formats/writeSequences.py b/ppanggolin/formats/writeSequences.py index 49ec4430..e69f3a5a 100644 --- a/ppanggolin/formats/writeSequences.py +++ b/ppanggolin/formats/writeSequences.py @@ -5,7 +5,7 @@ import logging import re from pathlib import Path -from typing import Dict, Set, Iterable, Union +from typing import Dict, Iterable, Union import tempfile import shutil @@ -14,12 +14,11 @@ # local libraries from ppanggolin.pangenome import Pangenome -from ppanggolin.geneFamily import GeneFamily from ppanggolin.genome import Gene, Organism from ppanggolin.utils import (write_compressed_or_not, mk_outdir, create_tmpdir, read_compressed_or_not, restricted_float, detect_filetype, run_subprocess) -from ppanggolin.formats.readBinaries import check_pangenome_info, write_gene_sequences_from_pangenome_file, write_genes_from_pangenome_file, write_fasta_gene_fam_from_pangenome_file, write_fasta_prot_fam_from_pangenome_file +from ppanggolin.formats.readBinaries import check_pangenome_info, write_genes_from_pangenome_file, write_fasta_gene_fam_from_pangenome_file, write_fasta_prot_fam_from_pangenome_file module_regex = re.compile(r'^module_\d+') # \d == [0-9] poss_values = ['all', 'persistent', 'shell', 'cloud', 'rgp', 'softcore', 'core', module_regex] From bc18e15d565eacd0c9eb55556e3816aeadbe8c44 Mon Sep 17 00:00:00 2001 From: JeanMainguy Date: Fri, 20 Sep 2024 11:33:34 +0200 Subject: [PATCH 17/52] use set instead of list to speed gene selection --- ppanggolin/formats/readBinaries.py | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/ppanggolin/formats/readBinaries.py b/ppanggolin/formats/readBinaries.py index 5f1b79e9..b9499fe8 100644 --- a/ppanggolin/formats/readBinaries.py +++ b/ppanggolin/formats/readBinaries.py @@ -1,13 +1,10 @@ #!/usr/bin/env python3 # default libraries -import dis import logging -from optparse import Option from pathlib import Path from typing import Dict, Any, Iterator, Set, List, Tuple, Optional from collections import defaultdict -import numpy # installed libraries from tqdm import tqdm @@ -311,14 +308,14 @@ def write_gene_sequences_from_pangenome_file(pangenome_filename: str, output: Pa f"{output.absolute()}{'.gz' if compress else ''}") -def read_rgp_genes_from_pangenome_file(h5f: tables.File) -> List[bytes]: +def read_rgp_genes_from_pangenome_file(h5f: tables.File) -> Set[bytes]: """ Retrieves a list of RGP genes from the pangenome file. :param h5f: The open HDF5 pangenome file containing RGP gene data. :return: A list of gene names (as bytes) from the RGP. """ - rgp_genes = [row["gene"] for row in read_chunks(h5f.root.RGP, chunk=20000)] + rgp_genes = {row["gene"] for row in read_chunks(h5f.root.RGP, chunk=20000)} return rgp_genes @@ -404,7 +401,7 @@ def get_genes_from_families(h5f: tables.File, families: List[bytes]) -> Set[byte return matching_genes -def get_seqid_to_genes(h5f: tables.File, genes:List[str], get_all_genes:bool = False, disable_bar:bool = False) -> Dict[int, List[str]]: +def get_seqid_to_genes(h5f: tables.File, genes:Set[bytes], get_all_genes:bool = False, disable_bar:bool = False) -> Dict[int, List[str]]: """ Creates a mapping of sequence IDs to gene names. @@ -429,6 +426,7 @@ def get_seqid_to_genes(h5f: tables.File, genes:List[str], get_all_genes:bool = F return seq_id_to_genes + def write_genes_seq_from_pangenome_file(h5f: tables.File, outpath: Path, compress: bool, seq_id_to_genes: Dict[int, List[str]], disable_bar:bool): """ Writes gene sequences from the pangenome file to an output file. @@ -549,7 +547,7 @@ def write_fasta_gene_fam_from_pangenome_file(pangenome_filename: str, output: Pa logging.getLogger("PPanGGOLiN").warning(f"No families matching filter {family_filter}.") return - seq_id_to_genes = get_seqid_to_genes(h5f, family_to_write) + seq_id_to_genes = get_seqid_to_genes(h5f, set(family_to_write)) write_genes_seq_from_pangenome_file(h5f, outpath, compress, seq_id_to_genes, disable_bar=disable_bar) @@ -627,6 +625,7 @@ def write_genes_from_pangenome_file(pangenome_filename: str, output: Path, gene_ outpath = output / f"{gene_filter}_genes.fna" get_all_genes = False + with tables.open_file(pangenome_filename, "r", driver_core_backing_store=0) as h5f: if gene_filter in ['persistent', 'shell', 'cloud', "softcore", "core"] or gene_filter.startswith("module_"): @@ -648,7 +647,7 @@ def write_genes_from_pangenome_file(pangenome_filename: str, output: Path, gene_ genes_to_write = read_rgp_genes_from_pangenome_file(h5f) elif gene_filter == "all": - genes_to_write = [] + genes_to_write = set() get_all_genes = True seq_id_to_genes = get_seqid_to_genes(h5f, genes_to_write, get_all_genes=get_all_genes, disable_bar=disable_bar) From 06e47dffd0e1a92e56b90d3d5a8f75c59a0c6a36 Mon Sep 17 00:00:00 2001 From: JeanMainguy Date: Wed, 25 Sep 2024 11:50:43 +0200 Subject: [PATCH 18/52] improve error management and refactor code for more clarity --- ppanggolin/formats/writeMetadata.py | 44 ++++++++++++++++++++--------- 1 file changed, 31 insertions(+), 13 deletions(-) diff --git a/ppanggolin/formats/writeMetadata.py b/ppanggolin/formats/writeMetadata.py index 4f33db22..32d4e602 100644 --- a/ppanggolin/formats/writeMetadata.py +++ b/ppanggolin/formats/writeMetadata.py @@ -179,27 +179,31 @@ def get_metadata_len(select_elem: Union[List[Gene], List[Organism], List[GeneFam expected_rows = 0 for element in select_elem: - if hasattr(element, 'name') and len(element.name) > 0: - if "ID" not in max_len_dict or len(element.name) > max_len_dict['ID']: - max_len_dict['ID'] = len(element.name) + if hasattr(element, 'name') and element.name: + max_len_dict['ID'] = max(max_len_dict.get('ID', 0), len(element.name)) elif hasattr(element, 'ID'): if isinstance(element.ID, str): - if "ID" not in max_len_dict or len(element.ID) > max_len_dict['ID']: - max_len_dict['ID'] = len(element.ID) - elif any(isinstance(element.ID, x) for x in [int, numpy.uint8, numpy.uint16, numpy.uint32, numpy.uint64]): + max_len_dict['ID'] = max(max_len_dict.get('ID', 0), len(element.ID)) + elif isinstance(element.ID, (int, numpy.uint8, numpy.uint16, numpy.uint32, numpy.uint64)): type_dict["ID"] = tables.Int64Col() else: - raise Exception(f"{type(element)} ID must be an integer") + raise TypeError( + f"Invalid type for 'ID' in element '{element}': expected integer-like type but got " + f"{type(element.ID).__name__}." + ) else: - raise Exception("Unexpected attribute. A recent change could create this error." - " Please report the error on our github.") + raise AttributeError( + f"Unexpected attribute in element '{element}': missing 'name' or 'ID'. " + "Please report this error on our GitHub." + ) + for metadata in element.get_metadata_by_source(source).values(): for attr, value in ((k, v) for k, v in metadata.__dict__.items() if k != "source"): if isinstance(value, bytes): value = value.decode('UTF-8') if isinstance(value, float) or isinstance(value, int): if attr in type_dict: - if type_dict[attr] != type(value): + if isinstance(type_dict[attr] , type(value)): if isinstance(value, float) and isinstance(type_dict[attr], int): type_dict[attr] = tables.Float64Col() else: @@ -215,9 +219,20 @@ def get_metadata_len(select_elem: Union[List[Gene], List[Organism], List[GeneFam max_len_dict[attr] = len(value) else: logging.getLogger("PPanGGOLiN").debug(f"attr: {attr}, value: {value}") - raise TypeError(f"{type(value)} is not acceptable") + raise TypeError( + f"Invalid metadata type: The attribute '{attr}' from the pangenome element '{element}' " + f"has an unexpected value '{value}' of type '{type(value).__name__}'." + ) + expected_rows += 1 + for attribute, max_length in max_len_dict.items(): + if max_length == 0: + raise ValueError( + f"Metadata attribute '{attribute}' has a length of 0, which is not allowed." + ) + + return max_len_dict, type_dict, expected_rows @@ -234,8 +249,11 @@ def write_metadata_metatype(h5f: tables.File, source: str, metatype: str, :param disable_bar: Disable progress bar """ metatype_group = write_metadata_group(h5f, metatype) - meta_len = get_metadata_len(select_elements, source) - source_table = h5f.create_table(metatype_group, source, desc_metadata(*meta_len[:-1]), expectedrows=meta_len[-1]) + max_len_dict, type_dict, expected_rows = get_metadata_len(select_elements, source) + + desc_metadata(max_len_dict, type_dict) + + source_table = h5f.create_table(metatype_group, source, desc_metadata(max_len_dict, type_dict), expectedrows=expected_rows) meta_row = source_table.row for element in tqdm(select_elements, unit=metatype, desc=f'Source = {source}', disable=disable_bar): for meta_id, metadata in element.get_metadata_by_source(source).items(): From dd840934aa976c9d7220499397b227a70e8d13b8 Mon Sep 17 00:00:00 2001 From: JeanMainguy Date: Wed, 25 Sep 2024 11:57:47 +0200 Subject: [PATCH 19/52] ignore empty metadata tag in annotation file --- ppanggolin/annotate/annotate.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/ppanggolin/annotate/annotate.py b/ppanggolin/annotate/annotate.py index a0d49b52..e4aca22e 100644 --- a/ppanggolin/annotate/annotate.py +++ b/ppanggolin/annotate/annotate.py @@ -360,7 +360,7 @@ def combine_contigs_metadata(contig_to_metadata: Dict[str, Dict[str, str]]) -> T # Filter tags that would have a / as it is forbidden when writing the table in HDF5. Such tag can appear with db_xref formatting invalid_tag_names = [] - for tag, _ in set(all_tag_to_value): + for tag, value in set(all_tag_to_value): try: with warnings.catch_warnings(): warnings.simplefilter("ignore") @@ -369,6 +369,10 @@ def combine_contigs_metadata(contig_to_metadata: Dict[str, Dict[str, str]]) -> T logging.getLogger("PPanGGOLiN").debug(f"{err}. The tag {tag} is ignored for metadata.") invalid_tag_names.append(tag) + if value == "": + logging.getLogger("PPanGGOLiN").debug(f"Ignoring tag '{tag}' for metadata due to an empty value.") + invalid_tag_names.append(tag) + all_tag_to_value = [(tag, value) for tag, value in all_tag_to_value if tag not in invalid_tag_names] contig_count = len(contig_to_metadata) From 7bb83ceeb7dfb4855e3fb255cee4c981df88c416 Mon Sep 17 00:00:00 2001 From: JeanMainguy Date: Wed, 9 Oct 2024 16:48:03 +0200 Subject: [PATCH 20/52] identify starting and ending partiality of gene --- ppanggolin/annotate/annotate.py | 57 ++++++++++++++++++++++++--------- 1 file changed, 42 insertions(+), 15 deletions(-) diff --git a/ppanggolin/annotate/annotate.py b/ppanggolin/annotate/annotate.py index e5ff2dc7..ae488ade 100644 --- a/ppanggolin/annotate/annotate.py +++ b/ppanggolin/annotate/annotate.py @@ -127,23 +127,21 @@ def extract_positions(string: str) -> Tuple[List[Tuple[int, int]], bool, bool]: :param string: The input string containing position information. :return: A tuple containing a list of tuples representing start and stop positions, - a boolean indicating whether it is complement, and - a boolean indicating whether it is likely a pseudogene. + a boolean indicating whether it is complement, + a boolean indicating whether it is a partial gene at start position and + a boolean indicating whether it is a partial gene at end position. :raises ValueError: If the string is not formatted as expected or if positions cannot be parsed as integers. """ complement = False coordinates = [] - pseudogene = False + has_partial_start = False + has_partial_end = False # Check if 'complement' exists in the string if 'complement' in string: complement = True - # Check if '>' or '<' exists in the string to identify pseudogene - if '>' in string or '<' in string: - pseudogene = True - if "(" in string: # Extract positions found inside the parenthesis inner_parentheses_regex = r'\(([^()]+)\)' @@ -156,6 +154,22 @@ def extract_positions(string: str) -> Tuple[List[Tuple[int, int]], bool, bool]: else: positions = string.rstrip() + + # Check if '>' or '<' exists in the positions to identify partial genes + + if '>' in positions or '<' in positions: + if '<' in positions.split(',')[0]: + has_partial_start = True + + if ">" in positions.split(',')[-1]: + has_partial_end = True + + inner_positions = ','.join(positions.split(',')[1:-1]) + + if '>' in inner_positions or '<' in inner_positions or (not has_partial_end and not has_partial_start): + raise ValueError(f"Error parsing positions '{positions}' extracted from GBFF string '{string}'. " + f"Chevrons are found in the inner position. This case is unexpected and not handle.") + for position in positions.split(','): try: @@ -173,7 +187,7 @@ def extract_positions(string: str) -> Tuple[List[Tuple[int, int]], bool, bool]: coordinates.append((start, stop)) - return coordinates, complement, pseudogene + return coordinates, complement, has_partial_start, has_partial_end def parse_gbff_by_contig(gbff_file_path: Path) -> Generator[Tuple[List[str], List[str], List[str]], None, None]: @@ -396,7 +410,7 @@ def combine_contigs_metadata(contig_to_metadata: Dict[str, Dict[str, str]]) -> T def read_org_gbff(organism_name: str, gbff_file_path: Path, circular_contigs: List[str], - pseudo: bool = False, translation_table: int = 11) -> Tuple[Organism, bool]: + use_pseudogenes: bool = False, translation_table: int = 11) -> Tuple[Organism, bool]: """ Read a GBFF file and fills Organism, Contig and Genes objects based on information contained in this file @@ -475,7 +489,7 @@ def read_org_gbff(organism_name: str, gbff_file_path: Path, circular_contigs: Li contig_to_metadata[contig].update(db_xref_for_metadata) except ValueError: logging.getLogger("PPanGGOLiN").warning( - f"db_xref values does not have the expected format. Expect '\db_xref=: " + f"db_xref values does not have the expected format. Expect 'db_xref=:' " f"but got {feature['db_xref']} in file {gbff_file_path}. " "db_xref tags is therefore not retrieved in contig/genomes metadata.") @@ -483,12 +497,13 @@ def read_org_gbff(organism_name: str, gbff_file_path: Path, circular_contigs: Li genetic_code = '' if feature['feature_type'] not in ['CDS', 'rRNA', 'tRNA']: continue - coordinates, is_complement, is_pseudo = extract_positions(''.join(feature['location'])) - if is_pseudo and not pseudo: - continue - elif "pseudo" in feature and not pseudo: + coordinates, is_complement, has_partial_start, has_partial_end = extract_positions(''.join(feature['location'])) + + + if "pseudo" in feature and not use_pseudogenes: continue - elif "transl_except" in feature and not pseudo: + + elif "transl_except" in feature and not use_pseudogenes: # that's probably a 'stop' codon into selenocystein. continue @@ -499,6 +514,18 @@ def read_org_gbff(organism_name: str, gbff_file_path: Path, circular_contigs: Li else: genetic_code = int(feature["transl_table"]) + if has_partial_start or has_partial_end: + + start, stop = coordinates[0][0], coordinates[-1][1] + + print('>'*100) + print(start, stop) + print(feature['codon_start']) + + print(coordinates) + + print('<'*100) + strand = "-" if is_complement else "+" gene = create_gene( From ad44264b96fb3133ac6d5c905179de8453f4f665 Mon Sep 17 00:00:00 2001 From: JeanMainguy Date: Thu, 10 Oct 2024 14:07:29 +0200 Subject: [PATCH 21/52] fix coordinates for partial genes --- ppanggolin/annotate/annotate.py | 80 ++++++++++++++++++++++++++++++--- 1 file changed, 74 insertions(+), 6 deletions(-) diff --git a/ppanggolin/annotate/annotate.py b/ppanggolin/annotate/annotate.py index ae488ade..55f3e011 100644 --- a/ppanggolin/annotate/annotate.py +++ b/ppanggolin/annotate/annotate.py @@ -409,6 +409,76 @@ def combine_contigs_metadata(contig_to_metadata: Dict[str, Dict[str, str]]) -> T return genome_metadata, contig_to_uniq_metadata + +def fix_partial_gene_coordinates( + has_partial_start: bool, + has_partial_end: bool, + coordinates: List[Tuple[int, int]], + is_complement: bool, + start_shift: int +) -> List[Tuple[int, int]]: + """ + Adjusts gene coordinates if they have partial starts or ends, ensuring the gene length is a multiple of 3. + + If the gene is on the complement strand, the adjustments will be reversed (i.e., applied to the opposite ends). + + :param has_partial_start: Flag indicating if the gene has a partial start. + :param has_partial_end: Flag indicating if the gene has a partial end. + :param coordinates: List of coordinate tuples (start, stop) for the gene. + :param is_complement: Flag indicating if the gene is on the complement strand. + :param start_shift: The value by which the start coordinate should be shifted. + :return: A new list of adjusted coordinate tuples. + """ + logging.getLogger("PPanGGOLiN").debug(f"Initial parameters - has_partial_start: {has_partial_start}, has_partial_end: {has_partial_end}, " + f"coordinates: {coordinates}, is_complement: {is_complement}, start_shift: {start_shift}") + + if not coordinates: + logging.getLogger("PPanGGOLiN").debug('No coordinates provided, returning empty list.') + return coordinates + + # Create a new coordinates object so as not to modify the input + new_coordinates = coordinates.copy() + + # Non-complement strand adjustments + if not is_complement: + if has_partial_start: + initial_start = new_coordinates[0][0] + start_shift + logging.getLogger("PPanGGOLiN").debug(f'Adding shift {start_shift} to initial start. New start: {initial_start}') + new_coordinates[0] = (initial_start, new_coordinates[0][1]) + + if has_partial_end: + # Ensure the gene length is a multiple of 3 by adjusting the last end + gene_length = sum([(stop - start + 1) for start, stop in new_coordinates]) + last_end = new_coordinates[-1][1] - (gene_length % 3) + logging.getLogger("PPanGGOLiN").debug(f'Adjusting last end to ensure gene length is a multiple of 3. New end: {last_end}') + new_coordinates[-1] = (new_coordinates[-1][0], last_end) + + # Complement strand adjustments + else: + if has_partial_end: + last_end = new_coordinates[-1][1] - start_shift + logging.getLogger("PPanGGOLiN").debug(f'Removing shift {start_shift} from last end. New last end: {last_end}') + new_coordinates[-1] = (new_coordinates[-1][0], last_end) + + if has_partial_start: + # Adjust first start for complement strand + gene_length = sum([(stop - start + 1) for start, stop in new_coordinates]) + initial_start = new_coordinates[0][0] + (gene_length % 3) + logging.getLogger("PPanGGOLiN").debug(f'Adding {gene_length % 3} to complement start to ensure gene length is a multiple of 3. New start: {initial_start}') + new_coordinates[0] = (initial_start, new_coordinates[0][1]) + + # Final length validation + gene_length = sum([(stop - start + 1) for start, stop in new_coordinates]) + if gene_length % 3 != 0: + logging.getLogger("PPanGGOLiN").warning(f'Gene with coordinates: {coordinates} has a length that is not a multiple of 3 after adjusting for partiality with new cordinates ({new_coordinates}): {gene_length}') + raise ValueError(f'Gene with coordinates: {coordinates} has a length that is not a multiple of 3 after adjusting for partiality: {gene_length}') + + logging.getLogger("PPanGGOLiN").debug(f'Final corrected coordinates: {new_coordinates}. Gene length = {gene_length}, ' + f'multiple of 3: {gene_length % 3 == 0}') + + return new_coordinates + + def read_org_gbff(organism_name: str, gbff_file_path: Path, circular_contigs: List[str], use_pseudogenes: bool = False, translation_table: int = 11) -> Tuple[Organism, bool]: """ @@ -514,17 +584,15 @@ def read_org_gbff(organism_name: str, gbff_file_path: Path, circular_contigs: Li else: genetic_code = int(feature["transl_table"]) + if has_partial_start or has_partial_end: - start, stop = coordinates[0][0], coordinates[-1][1] + start_shift = 0 if 'codon_start' not in feature else int(feature['codon_start']) -1 # -1 is to be in zero based index. + + coordinates = fix_partial_gene_coordinates(has_partial_start, has_partial_end, coordinates,is_complement=is_complement, start_shift=start_shift ) - print('>'*100) - print(start, stop) - print(feature['codon_start']) - print(coordinates) - print('<'*100) strand = "-" if is_complement else "+" From b8b1f42d98eaceb4544e54e179b8ed7edd9e98be Mon Sep 17 00:00:00 2001 From: JeanMainguy Date: Thu, 10 Oct 2024 14:08:25 +0200 Subject: [PATCH 22/52] add pytest for fixing coordinates fct --- tests/annotate/test_annotate.py | 113 +++++++++++++++++++++++++++----- 1 file changed, 96 insertions(+), 17 deletions(-) diff --git a/tests/annotate/test_annotate.py b/tests/annotate/test_annotate.py index 34f8f9e0..7ec58656 100644 --- a/tests/annotate/test_annotate.py +++ b/tests/annotate/test_annotate.py @@ -1,29 +1,32 @@ import pytest from pathlib import Path from ppanggolin.annotate.annotate import extract_positions, read_anno_file, parse_contig_header_lines, \ - parse_gbff_by_contig, parse_feature_lines, parse_dna_seq_lines, read_org_gbff, combine_contigs_metadata + parse_gbff_by_contig, parse_feature_lines, parse_dna_seq_lines, read_org_gbff, combine_contigs_metadata, fix_partial_gene_coordinates -@pytest.mark.parametrize("input_string, expected_positions, expected_complement, expected_pseudogene", [ - ("join(190..7695,7695..12071)", [(190, 7695), (7695, 12071)], False, False), - ("order(190..7695,7995..12071)", [(190, 7695), (7995, 12071)], False, False), +@pytest.mark.parametrize("input_string, expected_positions, expected_complement, expected_partialgene_start, expected_partialgene_end", [ + ("join(190..7695,7695..12071)", [(190, 7695), (7695, 12071)], False, False, False), + ("order(190..7695,7995..12071)", [(190, 7695), (7995, 12071)], False, False, False), ("complement(join(4359800..4360707,4360707..4360962,1..100))", [(4359800, 4360707), (4360707, 4360962), (1, 100)], - True, False), + True, False, False), ("complement(order(4359800..4360707,4360707..4360962,1..100))", [(4359800, 4360707), (4360707, 4360962), (1, 100)], - True, False), - ("join(6835405..6835731,1..1218)", [(6835405, 6835731), (1, 1218)], False, False), - ("join(1375484..1375555,1375557..1376579)", [(1375484, 1375555), (1375557, 1376579)], False, False), - ("complement(6815492..6816265)", [(6815492, 6816265)], True, False), - ("6811501..6812109", [(6811501, 6812109)], False, False), - ("complement(6792573..>6795461)", [(6792573, 6795461)], True, True), - ("join(1038313,1..1016)", [(1038313, 1038313), (1, 1016)], False, False), - ("1038313", [(1038313, 1038313)], False, False) + True, False, False), + ("join(6835405..6835731,1..1218)", [(6835405, 6835731), (1, 1218)], False, False, False), + ("join(1375484..1375555,1375557..1376579)", [(1375484, 1375555), (1375557, 1376579)], False, False, False), + ("complement(6815492..6816265)", [(6815492, 6816265)], True, False, False), + ("6811501..6812109", [(6811501, 6812109)], False, False, False), + ("complement(6792573..>6795461)", [(6792573, 6795461)], True, False, True), + ("complement(<6792573..6795461)", [(6792573, 6795461)], True, True, False), + ("complement(<6792573..>6795461)", [(6792573, 6795461)], True, True, True), + ("join(1038313,1..1016)", [(1038313, 1038313), (1, 1016)], False, False, False), + ("1038313", [(1038313, 1038313)], False, False, False) ]) -def test_extract_positions(input_string, expected_positions, expected_complement, expected_pseudogene): - positions, is_complement, is_pseudo = extract_positions(input_string) +def test_extract_positions(input_string, expected_positions, expected_complement, expected_partialgene_start, expected_partialgene_end): + positions, is_complement, has_partial_start, has_partial_end = extract_positions(input_string) assert positions == expected_positions assert is_complement == expected_complement - assert is_pseudo == expected_pseudogene + assert has_partial_start == expected_partialgene_start + assert has_partial_end == expected_partialgene_end def test_extract_positions_with_wrong_positions_format(): @@ -31,6 +34,15 @@ def test_extract_positions_with_wrong_positions_format(): extract_positions("join(1038313,1..1016") # string misses a closing parenthesis +def test_extract_positions_with_strange_chevrons(): + with pytest.raises(ValueError): + extract_positions("complement(join(4359800..>4360707,1..100))") # chevron in inner position + with pytest.raises(ValueError): + extract_positions("complement(join(4359800..4360707,<1..100))") # chevron in inner position + + with pytest.raises(ValueError): + extract_positions("complement(join(4359800..4360707,1..<100))") # start chevron in ending position + def test_extract_positions_with_wrong_positions_format2(): with pytest.raises(ValueError): extract_positions("start..stop") # start and stop are not integer @@ -111,7 +123,7 @@ def test_with_joined_genes(genome_data_with_joined_genes): def test_read_org_gbff(genome_data_with_joined_genes): genome_name, genome_path, circular_contigs = genome_data_with_joined_genes - genome, _ = read_org_gbff(genome_name, genome_path, circular_contigs, pseudo=True) + genome, _ = read_org_gbff(genome_name, genome_path, circular_contigs, use_pseudogenes=True) # this genome has 2 genes that are joined. assert genome.number_of_genes() == 917 @@ -250,3 +262,70 @@ def test_combine_contigs_metadata(): assert genome_metadata == {"sp": "spA", "strain": "123"} assert contig_metadata == {"contig1": {"contig_feat": "ABC"}, "contig2": {"contig_feat": "XYZ"}, } + + +@pytest.mark.parametrize("has_partial_start, has_partial_end, coordinates, is_complement, start_shift, expected", [ + # Case 1: No partial start or end, expect no change in non-complement strand + # Coordinates are already correct, no need to modify anything. + (False, False, [(11, 40)], False, 0, [(11, 40)]), + + # Case 2: Partial start, no partial end (Non-complement) + # A shift of 1 is added to the start coordinate. + (True, False, [(10, 40)], False, 1, [(11, 40)]), # start_shift of 1 added to start + + # Case 2: Partial start, no partial end (Non-complement) + # A shift of 2 is added to the start coordinate. + (True, False, [(2, 33)], False, 2, [(4, 33)]), # start_shift of 2 added to start + + # Case 3: No partial start, partial end (Non-complement) + # Adjust last coordinate to make gene length a multiple of 3. + (False, True, [(11, 41)], False, 0, [(11, 40)]), # last end adjusted to be a multiple of 3 + + # Case 3: No partial start, partial end (Non-complement) + # Gene length is already a multiple of 3, so no changes needed. + (False, True, [(11, 40)], False, 0, [(11, 40)]), # gene length already a multiple of 3 so no change is made + + # Case 4: Partial start and end (Non-complement) + # Both start and end need adjustment: add shift to start and adjust end to make gene length a multiple of 3. + (True, True, [(10, 41)], False, 1, [(11, 40)]), # start_shift added to start, and length adjusted + + # Case 5: Partial start and no partial end on complement strand + # Adjust start since we are on the complement strand. + (True, False, [(9, 40)], True, 0, [(11, 40)]), # length adjusted + + # Case 5: No partial start but partial end on complement strand + # Shift removed from the last end on the complement strand. + (False, True, [(9, 40)], True, 2, [(9, 38)]), # start_shift removed + + # Case 5: Partial start and end on complement strand + # Adjust both start and end since we are on the complement strand, ensuring gene length is a multiple of 3. + (True, True, [(8, 40)], True, 2, [(9, 38)]), # start_shift removed and length adjusted + + # Case 5: Joined coordinates without partial start or end + # Nothing to adjust as the gene is properly framed. + (False, False, [(1, 9), (7, 12)], False, 0, [(1, 9), (7, 12)]), # nothing to do + + # Case 5: Joined coordinates with partial start + # Adjust the first start coordinate by the shift. + (True, False, [(3, 9), (7, 12)], False, 1, [(4, 9), (7, 12)]), # adjust start + + # Case 5: Joined coordinates with partial end + # Adjust the last end to ensure the gene length is a multiple of 3. + (False, True, [(3, 9), (7, 12)], False, 0, [(3, 9), (7, 11)]), # adjust end + + # Case 5: Joined coordinates with partial start and partial end + # Adjust both start and end for correct gene length and frame shift. + (True, True, [(3, 9), (7, 12)], False, 2, [(5, 9), (7, 10)]), # adjust start and end + + # Case 5: Joined coordinates with partial start and end on complement strand + # Adjust both start and end on the complement strand. + (True, True, [(4, 9), (7, 12)], True, 2, [(5, 9), (7, 10)]), # adjust start and end in complement mode + + # Case 6: Empty coordinates + # Function should return an empty list without any errors. + (False, False, [], False, 5, []), # Empty input should return empty + +]) +def test_fix_partial_gene_coordinates(has_partial_start, has_partial_end, coordinates, is_complement, start_shift, expected): + result = fix_partial_gene_coordinates(has_partial_start, has_partial_end, coordinates, is_complement, start_shift) + assert result == expected From 2a62ee82e66c03d3bc8516c6a5ab574d13539d9d Mon Sep 17 00:00:00 2001 From: JeanMainguy Date: Thu, 10 Oct 2024 18:39:24 +0200 Subject: [PATCH 23/52] refactor shifting function to handle tricky coordinates and reuse code --- ppanggolin/annotate/annotate.py | 112 ++++++++++++++++++++++++-------- 1 file changed, 86 insertions(+), 26 deletions(-) diff --git a/ppanggolin/annotate/annotate.py b/ppanggolin/annotate/annotate.py index 55f3e011..cdbeb958 100644 --- a/ppanggolin/annotate/annotate.py +++ b/ppanggolin/annotate/annotate.py @@ -409,6 +409,77 @@ def combine_contigs_metadata(contig_to_metadata: Dict[str, Dict[str, str]]) -> T return genome_metadata, contig_to_uniq_metadata +def reverse_complement_coordinates(coordinates: List[Tuple[int, int]]) -> List[Tuple[int, int]]: + """ + Reverses and inverts the given list of coordinates. Each coordinate pair (start, end) is transformed into + (-end, -start) and the order of the coordinates is reversed. + + :param coordinates: A list of tuples representing the coordinates to be reversed and inverted. + :return: A list of reversed and inverted coordinates. + """ + # Reverse the order of coordinates and invert each start and end + logging.getLogger("PPanGGOLiN").debug(f'Reversing and inverting coordinates: {coordinates}') + return [(-end, -start) for start, end in coordinates[::-1]] + + +def shift_end_coordinates(coordinates: List[Tuple[int, int]], shift: int) -> List[Tuple[int, int]]: + """ + Shifts the end of a set of coordinates by a specified amount and then returns the final shifted coordinates. + This involves reversing the coordinates twice, shifting the start, and then returning the original orientation. + + :param coordinates: A list of tuples representing the original coordinates. + :param shift: The amount by which the end coordinate should be shifted. + :return: The coordinates after the end shift and reverse complement transformations. + """ + # Perform reverse complement, shift the start (corresponding to the original end), and reverse complement back + logging.getLogger("PPanGGOLiN").debug(f'Shifting end of coordinates {coordinates} by {shift}') + rc_coordinates = reverse_complement_coordinates(coordinates) + rc_coordinates_shifted = shift_start_coordinates(rc_coordinates, shift) + final_coordinates = reverse_complement_coordinates(rc_coordinates_shifted) + + return final_coordinates + + +def shift_start_coordinates(coordinates: List[Tuple[int, int]], shift: int) -> List[Tuple[int, int]]: + """ + Shifts the start of the first coordinate in the list by the specified amount. If the shift results in + a negative or zero-length interval for the first coordinate, this interval is removed, and the shift is + propagated to the next coordinate if necessary. + + :param coordinates: A list of tuples representing the coordinates. + :param shift: The amount by which the start coordinate should be shifted. + :return: A new list of coordinates with the shifted start. + """ + new_coordinates = coordinates.copy() + + # Shift the start of the first coordinate + adjusted_start = new_coordinates[0][0] + shift + logging.getLogger("PPanGGOLiN").debug(f'Shifting start of first coordinate by {shift}. New start: {adjusted_start}') + + adjusted_coordinate_part = (adjusted_start, new_coordinates[0][1]) + new_coordinates[0] = adjusted_coordinate_part + + # Calculate length of the adjusted part + adjusted_part_length = adjusted_coordinate_part[1] - adjusted_coordinate_part[0] + 1 + + if adjusted_part_length <= 0: + # If the shift results in a zero or negative length, handle accordingly + if len(new_coordinates) <= 1: + raise ValueError(f'Shifting the start resulted in a gene with null or negative size. ' + f'Coordinates: {coordinates}, Shift: {shift}') + else: + logging.getLogger("PPanGGOLiN").warning(f'Coordinate part {new_coordinates[0]} resulted in a non-positive length after shift. Removing it.') + new_coordinates = new_coordinates[1:] + + # If length is negative, propagate the shift to the next coordinate + if adjusted_part_length < 0: + new_shift = -adjusted_part_length + new_coordinates = shift_start_coordinates(new_coordinates, new_shift) + + return new_coordinates + + + def fix_partial_gene_coordinates( has_partial_start: bool, @@ -433,50 +504,42 @@ def fix_partial_gene_coordinates( f"coordinates: {coordinates}, is_complement: {is_complement}, start_shift: {start_shift}") if not coordinates: - logging.getLogger("PPanGGOLiN").debug('No coordinates provided, returning empty list.') - return coordinates - - # Create a new coordinates object so as not to modify the input - new_coordinates = coordinates.copy() + raise ValueError('No coordinates provided. Cannot fix partial gene coordinates.') # Non-complement strand adjustments if not is_complement: if has_partial_start: - initial_start = new_coordinates[0][0] + start_shift - logging.getLogger("PPanGGOLiN").debug(f'Adding shift {start_shift} to initial start. New start: {initial_start}') - new_coordinates[0] = (initial_start, new_coordinates[0][1]) + coordinates = shift_start_coordinates(coordinates, start_shift) if has_partial_end: # Ensure the gene length is a multiple of 3 by adjusting the last end - gene_length = sum([(stop - start + 1) for start, stop in new_coordinates]) - last_end = new_coordinates[-1][1] - (gene_length % 3) - logging.getLogger("PPanGGOLiN").debug(f'Adjusting last end to ensure gene length is a multiple of 3. New end: {last_end}') - new_coordinates[-1] = (new_coordinates[-1][0], last_end) + gene_length = sum([(stop - start + 1) for start, stop in coordinates]) + end_shift = (gene_length % 3) + + coordinates = shift_end_coordinates(coordinates, end_shift) # Complement strand adjustments else: if has_partial_end: - last_end = new_coordinates[-1][1] - start_shift - logging.getLogger("PPanGGOLiN").debug(f'Removing shift {start_shift} from last end. New last end: {last_end}') - new_coordinates[-1] = (new_coordinates[-1][0], last_end) + coordinates = shift_end_coordinates(coordinates, start_shift) if has_partial_start: # Adjust first start for complement strand - gene_length = sum([(stop - start + 1) for start, stop in new_coordinates]) - initial_start = new_coordinates[0][0] + (gene_length % 3) - logging.getLogger("PPanGGOLiN").debug(f'Adding {gene_length % 3} to complement start to ensure gene length is a multiple of 3. New start: {initial_start}') - new_coordinates[0] = (initial_start, new_coordinates[0][1]) + gene_length = sum([(stop - start + 1) for start, stop in coordinates]) + start_shift = (gene_length % 3) + coordinates = shift_start_coordinates(coordinates, start_shift) # Final length validation - gene_length = sum([(stop - start + 1) for start, stop in new_coordinates]) + gene_length = sum([(stop - start + 1) for start, stop in coordinates]) + if gene_length % 3 != 0: - logging.getLogger("PPanGGOLiN").warning(f'Gene with coordinates: {coordinates} has a length that is not a multiple of 3 after adjusting for partiality with new cordinates ({new_coordinates}): {gene_length}') + logging.getLogger("PPanGGOLiN").warning(f'Gene with coordinates: {coordinates} has a length that is not a multiple of 3 after adjusting for partiality with new cordinates ({coordinates}): {gene_length}') raise ValueError(f'Gene with coordinates: {coordinates} has a length that is not a multiple of 3 after adjusting for partiality: {gene_length}') - logging.getLogger("PPanGGOLiN").debug(f'Final corrected coordinates: {new_coordinates}. Gene length = {gene_length}, ' + logging.getLogger("PPanGGOLiN").debug(f'Final corrected coordinates: {coordinates}. Gene length = {gene_length}, ' f'multiple of 3: {gene_length % 3 == 0}') - return new_coordinates + return coordinates def read_org_gbff(organism_name: str, gbff_file_path: Path, circular_contigs: List[str], @@ -591,9 +654,6 @@ def read_org_gbff(organism_name: str, gbff_file_path: Path, circular_contigs: Li coordinates = fix_partial_gene_coordinates(has_partial_start, has_partial_end, coordinates,is_complement=is_complement, start_shift=start_shift ) - - - strand = "-" if is_complement else "+" gene = create_gene( From aa4e9881c935455b385976fa7480e447d6a5b68f Mon Sep 17 00:00:00 2001 From: JeanMainguy Date: Thu, 10 Oct 2024 18:39:58 +0200 Subject: [PATCH 24/52] update tests to match refactoring and tricky cases --- tests/annotate/test_annotate.py | 89 +++++++++++++++++++++++++++++++-- 1 file changed, 85 insertions(+), 4 deletions(-) diff --git a/tests/annotate/test_annotate.py b/tests/annotate/test_annotate.py index 7ec58656..5616cd12 100644 --- a/tests/annotate/test_annotate.py +++ b/tests/annotate/test_annotate.py @@ -1,7 +1,7 @@ import pytest from pathlib import Path from ppanggolin.annotate.annotate import extract_positions, read_anno_file, parse_contig_header_lines, \ - parse_gbff_by_contig, parse_feature_lines, parse_dna_seq_lines, read_org_gbff, combine_contigs_metadata, fix_partial_gene_coordinates + parse_gbff_by_contig, parse_feature_lines, parse_dna_seq_lines, read_org_gbff, combine_contigs_metadata, fix_partial_gene_coordinates, shift_start_coordinates, shift_end_coordinates @pytest.mark.parametrize("input_string, expected_positions, expected_complement, expected_partialgene_start, expected_partialgene_end", [ @@ -321,11 +321,92 @@ def test_combine_contigs_metadata(): # Adjust both start and end on the complement strand. (True, True, [(4, 9), (7, 12)], True, 2, [(5, 9), (7, 10)]), # adjust start and end in complement mode - # Case 6: Empty coordinates - # Function should return an empty list without any errors. - (False, False, [], False, 5, []), # Empty input should return empty + # Real tricky case from GCF_000623275.1 + (False, True, [(4681814, 4682911), (1, 1)], False, 0, [(4681814, 4682911)]), # ajust the end by removing one nt. In this case that remove the second part of the coordinates + + # Tricky case inspired by last case + (False, True, [(30, 60), (1, 1)], False, 0, [(30, 59)]), # ajust the end by removing two nt. In this case that remove the second part of the coordinates and one nt in the first part + + + # Tricky case inspired by last case + (True, False, [(60, 60), (1, 9)], False, 1, [(1, 9)]), # ajust the end by removing one nt. In this case that remove the second part of the coordinates + + # Tricky case inspired by last case + (True, False, [(60, 60), (1, 10)], False, 2, [(2, 10)]), # ajust the end by removing one nt. In this case that remove the second part of the coordinates + + # Very tricky case inspired by last case + (True, False, [(59, 60), (60, 60), (1, 9)], False, 3, [(1, 9)]), # ajust the end by removing one nt. In this case that remove the second part of the coordinates + + # Very tricky case inspired by last case + (True, True, [(60, 61), (1, 8)], True, 3, [(61, 61), (1, 5)]), # + + ]) + def test_fix_partial_gene_coordinates(has_partial_start, has_partial_end, coordinates, is_complement, start_shift, expected): result = fix_partial_gene_coordinates(has_partial_start, has_partial_end, coordinates, is_complement, start_shift) assert result == expected + + + +def test_fix_partial_gene_coordinates_with_wrong_coordinates(): + + with pytest.raises(ValueError): + fix_partial_gene_coordinates(has_partial_start=False, has_partial_end=True, + coordinates=[(1, 1)], is_complement=False, start_shift=0) # gene is too small, the length adjustement at the end lead to no gene + + with pytest.raises(ValueError): + fix_partial_gene_coordinates(True, False, + [(1, 1)], False, 1) # gene is too small, the length adjustement at the start lead to no gene + + with pytest.raises(ValueError): + fix_partial_gene_coordinates(True, True, + [(60,60), (1, 1)], False, 1) # gene is too small, the length adjustement at the start and at the end lead to no gene + + with pytest.raises(ValueError): + fix_partial_gene_coordinates(True, False, + [], False, 1) # chevron in inner position + + +@pytest.mark.parametrize("coordinates, shift, expected", [ + + ([(11, 40)], 0, [(11, 40)]), + + ([(1, 2)], 1, [(2, 2)]), + + ([(1, 1), (1, 4)], 1, [(1, 4)]), + + ([(1, 1), (1, 1), (1, 4)], 2, [(1, 4)]), + + ([(1, 1), (1, 2), (1, 4)], 2, [(2, 2), (1, 4)]), + + + ]) + + +def test_shift_start_coordinates(coordinates, shift, expected): + result = shift_start_coordinates(coordinates, shift) + assert result == expected + + +@pytest.mark.parametrize("coordinates, shift, expected", [ + + ([(11, 40)], 0, [(11, 40)]), + + ([(1, 2)], 1, [(1, 1)]), + + ([(1, 1), (1, 4)], 1, [(1, 1), (1, 3)]), + + ([(1, 4), (4, 4), (4, 4)], 2, [(1, 4)]), + + ([(18, 18), (1, 4)], 4, [(18, 18)]), + + + ]) + + +def test_shift_end_coordinates(coordinates, shift, expected): + result = shift_end_coordinates(coordinates, shift) + assert result == expected + From 0507a4b70c5e607570abefaf009d4434c16bbbc3 Mon Sep 17 00:00:00 2001 From: JeanMainguy Date: Mon, 14 Oct 2024 16:13:40 +0200 Subject: [PATCH 25/52] do not ignore CDS with trans_except instead give a warning --- ppanggolin/annotate/annotate.py | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/ppanggolin/annotate/annotate.py b/ppanggolin/annotate/annotate.py index cdbeb958..66a68b67 100644 --- a/ppanggolin/annotate/annotate.py +++ b/ppanggolin/annotate/annotate.py @@ -637,9 +637,14 @@ def read_org_gbff(organism_name: str, gbff_file_path: Path, circular_contigs: Li continue elif "transl_except" in feature and not use_pseudogenes: - # that's probably a 'stop' codon into selenocystein. - continue - + # that's probably a 'stop' codon into selenocystein. + logging.getLogger("PPanGGOLiN").info( + f"CDS '{feature['locus_tag']}' contains a 'transl_except' annotation ({feature['transl_except']}) " + f"in contig '{contig}' in file '{gbff_file_path}'. " + f"PPanGGOLiN does not handle 'transl_except' annotations. This gene's protein sequence " + "will likely contain an internal stop codon when translated with PPanGGOLiN." + ) + if feature['feature_type'] == 'CDS': if feature['transl_table'] == "": used_transl_table_arg += 1 From 1e995841c3ccc14ce6830eedce2810219f4480d7 Mon Sep 17 00:00:00 2001 From: JeanMainguy Date: Mon, 14 Oct 2024 17:12:53 +0200 Subject: [PATCH 26/52] simplify fct fix_partial_gene_coordinates --- ppanggolin/annotate/annotate.py | 13 ++++---- tests/annotate/test_annotate.py | 58 +++++++++++++++------------------ 2 files changed, 34 insertions(+), 37 deletions(-) diff --git a/ppanggolin/annotate/annotate.py b/ppanggolin/annotate/annotate.py index 66a68b67..028a8374 100644 --- a/ppanggolin/annotate/annotate.py +++ b/ppanggolin/annotate/annotate.py @@ -486,7 +486,8 @@ def fix_partial_gene_coordinates( has_partial_end: bool, coordinates: List[Tuple[int, int]], is_complement: bool, - start_shift: int + start_shift: int, + ensure_codon_multiple:bool = True ) -> List[Tuple[int, int]]: """ Adjusts gene coordinates if they have partial starts or ends, ensuring the gene length is a multiple of 3. @@ -500,7 +501,7 @@ def fix_partial_gene_coordinates( :param start_shift: The value by which the start coordinate should be shifted. :return: A new list of adjusted coordinate tuples. """ - logging.getLogger("PPanGGOLiN").debug(f"Initial parameters - has_partial_start: {has_partial_start}, has_partial_end: {has_partial_end}, " + logging.getLogger("PPanGGOLiN").debug("Initial parameters: " f"coordinates: {coordinates}, is_complement: {is_complement}, start_shift: {start_shift}") if not coordinates: @@ -508,10 +509,10 @@ def fix_partial_gene_coordinates( # Non-complement strand adjustments if not is_complement: - if has_partial_start: + if start_shift != 0: coordinates = shift_start_coordinates(coordinates, start_shift) - if has_partial_end: + if ensure_codon_multiple: # Ensure the gene length is a multiple of 3 by adjusting the last end gene_length = sum([(stop - start + 1) for start, stop in coordinates]) end_shift = (gene_length % 3) @@ -520,10 +521,10 @@ def fix_partial_gene_coordinates( # Complement strand adjustments else: - if has_partial_end: + if start_shift != 0: coordinates = shift_end_coordinates(coordinates, start_shift) - if has_partial_start: + if ensure_codon_multiple: # Adjust first start for complement strand gene_length = sum([(stop - start + 1) for start, stop in coordinates]) start_shift = (gene_length % 3) diff --git a/tests/annotate/test_annotate.py b/tests/annotate/test_annotate.py index 5616cd12..08682d91 100644 --- a/tests/annotate/test_annotate.py +++ b/tests/annotate/test_annotate.py @@ -264,88 +264,88 @@ def test_combine_contigs_metadata(): assert contig_metadata == {"contig1": {"contig_feat": "ABC"}, "contig2": {"contig_feat": "XYZ"}, } -@pytest.mark.parametrize("has_partial_start, has_partial_end, coordinates, is_complement, start_shift, expected", [ +@pytest.mark.parametrize("coordinates, is_complement, start_shift, expected", [ # Case 1: No partial start or end, expect no change in non-complement strand # Coordinates are already correct, no need to modify anything. - (False, False, [(11, 40)], False, 0, [(11, 40)]), + ([(11, 40)], False, 0, [(11, 40)]), # Case 2: Partial start, no partial end (Non-complement) # A shift of 1 is added to the start coordinate. - (True, False, [(10, 40)], False, 1, [(11, 40)]), # start_shift of 1 added to start + ([(10, 40)], False, 1, [(11, 40)]), # start_shift of 1 added to start # Case 2: Partial start, no partial end (Non-complement) # A shift of 2 is added to the start coordinate. - (True, False, [(2, 33)], False, 2, [(4, 33)]), # start_shift of 2 added to start + ([(2, 33)], False, 2, [(4, 33)]), # start_shift of 2 added to start # Case 3: No partial start, partial end (Non-complement) # Adjust last coordinate to make gene length a multiple of 3. - (False, True, [(11, 41)], False, 0, [(11, 40)]), # last end adjusted to be a multiple of 3 + ([(11, 41)], False, 0, [(11, 40)]), # last end adjusted to be a multiple of 3 # Case 3: No partial start, partial end (Non-complement) # Gene length is already a multiple of 3, so no changes needed. - (False, True, [(11, 40)], False, 0, [(11, 40)]), # gene length already a multiple of 3 so no change is made + ([(11, 40)], False, 0, [(11, 40)]), # gene length already a multiple of 3 so no change is made # Case 4: Partial start and end (Non-complement) # Both start and end need adjustment: add shift to start and adjust end to make gene length a multiple of 3. - (True, True, [(10, 41)], False, 1, [(11, 40)]), # start_shift added to start, and length adjusted + ([(10, 41)], False, 1, [(11, 40)]), # start_shift added to start, and length adjusted # Case 5: Partial start and no partial end on complement strand # Adjust start since we are on the complement strand. - (True, False, [(9, 40)], True, 0, [(11, 40)]), # length adjusted + ([(9, 40)], True, 0, [(11, 40)]), # length adjusted # Case 5: No partial start but partial end on complement strand # Shift removed from the last end on the complement strand. - (False, True, [(9, 40)], True, 2, [(9, 38)]), # start_shift removed + ( [(9, 40)], True, 2, [(9, 38)]), # start_shift removed # Case 5: Partial start and end on complement strand # Adjust both start and end since we are on the complement strand, ensuring gene length is a multiple of 3. - (True, True, [(8, 40)], True, 2, [(9, 38)]), # start_shift removed and length adjusted + ( [(8, 40)], True, 2, [(9, 38)]), # start_shift removed and length adjusted # Case 5: Joined coordinates without partial start or end # Nothing to adjust as the gene is properly framed. - (False, False, [(1, 9), (7, 12)], False, 0, [(1, 9), (7, 12)]), # nothing to do + ([(1, 9), (7, 12)], False, 0, [(1, 9), (7, 12)]), # nothing to do # Case 5: Joined coordinates with partial start # Adjust the first start coordinate by the shift. - (True, False, [(3, 9), (7, 12)], False, 1, [(4, 9), (7, 12)]), # adjust start + ([(3, 9), (7, 12)], False, 1, [(4, 9), (7, 12)]), # adjust start # Case 5: Joined coordinates with partial end # Adjust the last end to ensure the gene length is a multiple of 3. - (False, True, [(3, 9), (7, 12)], False, 0, [(3, 9), (7, 11)]), # adjust end + ([(3, 9), (7, 12)], False, 0, [(3, 9), (7, 11)]), # adjust end # Case 5: Joined coordinates with partial start and partial end # Adjust both start and end for correct gene length and frame shift. - (True, True, [(3, 9), (7, 12)], False, 2, [(5, 9), (7, 10)]), # adjust start and end + ([(3, 9), (7, 12)], False, 2, [(5, 9), (7, 10)]), # adjust start and end # Case 5: Joined coordinates with partial start and end on complement strand # Adjust both start and end on the complement strand. - (True, True, [(4, 9), (7, 12)], True, 2, [(5, 9), (7, 10)]), # adjust start and end in complement mode + ([(4, 9), (7, 12)], True, 2, [(5, 9), (7, 10)]), # adjust start and end in complement mode # Real tricky case from GCF_000623275.1 - (False, True, [(4681814, 4682911), (1, 1)], False, 0, [(4681814, 4682911)]), # ajust the end by removing one nt. In this case that remove the second part of the coordinates + ([(4681814, 4682911), (1, 1)], False, 0, [(4681814, 4682911)]), # ajust the end by removing one nt. In this case that remove the second part of the coordinates # Tricky case inspired by last case - (False, True, [(30, 60), (1, 1)], False, 0, [(30, 59)]), # ajust the end by removing two nt. In this case that remove the second part of the coordinates and one nt in the first part + ([(30, 60), (1, 1)], False, 0, [(30, 59)]), # ajust the end by removing two nt. In this case that remove the second part of the coordinates and one nt in the first part # Tricky case inspired by last case - (True, False, [(60, 60), (1, 9)], False, 1, [(1, 9)]), # ajust the end by removing one nt. In this case that remove the second part of the coordinates + ([(60, 60), (1, 9)], False, 1, [(1, 9)]), # ajust the end by removing one nt. In this case that remove the second part of the coordinates # Tricky case inspired by last case - (True, False, [(60, 60), (1, 10)], False, 2, [(2, 10)]), # ajust the end by removing one nt. In this case that remove the second part of the coordinates + ([(60, 60), (1, 10)], False, 2, [(2, 10)]), # ajust the end by removing one nt. In this case that remove the second part of the coordinates # Very tricky case inspired by last case - (True, False, [(59, 60), (60, 60), (1, 9)], False, 3, [(1, 9)]), # ajust the end by removing one nt. In this case that remove the second part of the coordinates + ([(59, 60), (60, 60), (1, 9)], False, 3, [(1, 9)]), # ajust the end by removing one nt. In this case that remove the second part of the coordinates # Very tricky case inspired by last case - (True, True, [(60, 61), (1, 8)], True, 3, [(61, 61), (1, 5)]), # + ([(60, 61), (1, 8)], True, 3, [(61, 61), (1, 5)]), # ]) -def test_fix_partial_gene_coordinates(has_partial_start, has_partial_end, coordinates, is_complement, start_shift, expected): - result = fix_partial_gene_coordinates(has_partial_start, has_partial_end, coordinates, is_complement, start_shift) +def test_fix_partial_gene_coordinates(coordinates, is_complement, start_shift, expected): + result = fix_partial_gene_coordinates(coordinates, is_complement, start_shift) assert result == expected @@ -353,20 +353,16 @@ def test_fix_partial_gene_coordinates(has_partial_start, has_partial_end, coordi def test_fix_partial_gene_coordinates_with_wrong_coordinates(): with pytest.raises(ValueError): - fix_partial_gene_coordinates(has_partial_start=False, has_partial_end=True, - coordinates=[(1, 1)], is_complement=False, start_shift=0) # gene is too small, the length adjustement at the end lead to no gene + fix_partial_gene_coordinates(coordinates=[(1, 1)], is_complement=False, start_shift=0) # gene is too small, the length adjustement at the end lead to no gene with pytest.raises(ValueError): - fix_partial_gene_coordinates(True, False, - [(1, 1)], False, 1) # gene is too small, the length adjustement at the start lead to no gene + fix_partial_gene_coordinates([(1, 1)], False, 1) # gene is too small, the length adjustement at the start lead to no gene with pytest.raises(ValueError): - fix_partial_gene_coordinates(True, True, - [(60,60), (1, 1)], False, 1) # gene is too small, the length adjustement at the start and at the end lead to no gene + fix_partial_gene_coordinates([(60,60), (1, 1)], False, 1) # gene is too small, the length adjustement at the start and at the end lead to no gene with pytest.raises(ValueError): - fix_partial_gene_coordinates(True, False, - [], False, 1) # chevron in inner position + fix_partial_gene_coordinates([], False, 1) # chevron in inner position @pytest.mark.parametrize("coordinates, shift, expected", [ From 9816e93391604b4edd5dfeea5cf6cd23a720da95 Mon Sep 17 00:00:00 2001 From: JeanMainguy Date: Mon, 14 Oct 2024 17:45:17 +0200 Subject: [PATCH 27/52] rm old args from fct --- ppanggolin/annotate/annotate.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/ppanggolin/annotate/annotate.py b/ppanggolin/annotate/annotate.py index 028a8374..3386f2ed 100644 --- a/ppanggolin/annotate/annotate.py +++ b/ppanggolin/annotate/annotate.py @@ -482,8 +482,6 @@ def shift_start_coordinates(coordinates: List[Tuple[int, int]], shift: int) -> L def fix_partial_gene_coordinates( - has_partial_start: bool, - has_partial_end: bool, coordinates: List[Tuple[int, int]], is_complement: bool, start_shift: int, From 01c5cfe07c823627a183a6ba59a2c1500e3be8f4 Mon Sep 17 00:00:00 2001 From: JeanMainguy Date: Mon, 14 Oct 2024 18:45:22 +0200 Subject: [PATCH 28/52] ignore NaturalNameWarning from tables as it is not really necessary --- ppanggolin/annotate/annotate.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/ppanggolin/annotate/annotate.py b/ppanggolin/annotate/annotate.py index 3386f2ed..46247850 100644 --- a/ppanggolin/annotate/annotate.py +++ b/ppanggolin/annotate/annotate.py @@ -16,7 +16,7 @@ # installed libraries from tqdm import tqdm -from tables.path import check_name_validity +from tables.path import check_name_validity, NaturalNameWarning # local libraries from ppanggolin.annotate.synta import (annotate_organism, read_fasta, get_dna_sequence, @@ -27,6 +27,9 @@ from ppanggolin.formats import write_pangenome from ppanggolin.metadata import Metadata +# ignore NaturalNameWarning +warnings.filterwarnings('ignore', category=NaturalNameWarning) + ctg_counter = contig_counter From 520a84ab74803c4ce4e5699726855ea0353eba19 Mon Sep 17 00:00:00 2001 From: JeanMainguy Date: Mon, 14 Oct 2024 19:33:40 +0200 Subject: [PATCH 29/52] handle partial genes from GFF files --- ppanggolin/annotate/annotate.py | 58 ++++++++++++++++++++++++--------- ppanggolin/genome.py | 35 +++++++++++++++++++- 2 files changed, 77 insertions(+), 16 deletions(-) diff --git a/ppanggolin/annotate/annotate.py b/ppanggolin/annotate/annotate.py index 46247850..638d1fb5 100644 --- a/ppanggolin/annotate/annotate.py +++ b/ppanggolin/annotate/annotate.py @@ -517,8 +517,8 @@ def fix_partial_gene_coordinates( # Ensure the gene length is a multiple of 3 by adjusting the last end gene_length = sum([(stop - start + 1) for start, stop in coordinates]) end_shift = (gene_length % 3) - - coordinates = shift_end_coordinates(coordinates, end_shift) + if end_shift != 0: + coordinates = shift_end_coordinates(coordinates, end_shift) # Complement strand adjustments else: @@ -529,7 +529,8 @@ def fix_partial_gene_coordinates( # Adjust first start for complement strand gene_length = sum([(stop - start + 1) for start, stop in coordinates]) start_shift = (gene_length % 3) - coordinates = shift_start_coordinates(coordinates, start_shift) + if start_shift != 0: + coordinates = shift_start_coordinates(coordinates, start_shift) # Final length validation gene_length = sum([(stop - start + 1) for start, stop in coordinates]) @@ -659,7 +660,7 @@ def read_org_gbff(organism_name: str, gbff_file_path: Path, circular_contigs: Li start_shift = 0 if 'codon_start' not in feature else int(feature['codon_start']) -1 # -1 is to be in zero based index. - coordinates = fix_partial_gene_coordinates(has_partial_start, has_partial_end, coordinates,is_complement=is_complement, start_shift=start_shift ) + coordinates = fix_partial_gene_coordinates(coordinates,is_complement=is_complement, start_shift=start_shift ) strand = "-" if is_complement else "+" @@ -745,9 +746,9 @@ def read_org_gff(organism: str, gff_file_path: Path, circular_contigs: List[str] used_transl_table_arg = 0 global ctg_counter - (gff_seqname, _, gff_type, gff_start, gff_end, _, gff_strand, _, gff_attribute) = range(0, 9) + (gff_seqname, _, gff_type, gff_start, gff_end, _, gff_strand, frame, gff_attribute) = range(0, 9) - # Missing values: source, score, frame. They are unused. + # Missing values: source, score. They are unused. def get_gff_attributes(gff_fields: list) -> dict: """Parses the gff attribute's line and outputs the attributes_get in a dict structure. @@ -851,8 +852,6 @@ def check_chevrons_in_start_and_stop(start: str, stop: str) -> Tuple[int, int, b pseudogene = False start, stop, has_chevron = check_chevrons_in_start_and_stop(start=fields_gff[gff_start], stop=fields_gff[gff_end]) - if has_chevron: - pseudogene = True if fields_gff[gff_type] == 'region': # keep region attributes to add them as metadata of genome and contigs @@ -875,6 +874,7 @@ def check_chevrons_in_start_and_stop(start: str, stop: str) -> Tuple[int, int, b logging.getLogger("PPanGGOLiN").debug(f"Contig {contig.name} is circular.") contig.is_circular = True assert contig.name == fields_gff[gff_seqname] + elif fields_gff[gff_type] == 'CDS' or "RNA" in fields_gff[gff_type]: id_attribute = get_id_attribute(attributes) @@ -891,12 +891,12 @@ def check_chevrons_in_start_and_stop(start: str, stop: str) -> Tuple[int, int, b if "PSEUDO" in attributes or "PSEUDOGENE" in attributes: pseudogene = True - product = attributes.pop('PRODUCT', "") - if "TRANSL_TABLE" in attributes: - genetic_code = int(attributes["TRANSL_TABLE"]) + if ("PARTIAL" in attributes and attributes["PARTIAL"].upper() == "TRUE") or has_chevron: + is_partial = True else: - used_transl_table_arg += 1 - genetic_code = translation_table + is_partial = False + + product = attributes.pop('PRODUCT', "") if contig is None or contig.name != fields_gff[gff_seqname]: # get the current contig @@ -912,6 +912,18 @@ def check_chevrons_in_start_and_stop(start: str, stop: str) -> Tuple[int, int, b contig.length = int(attr_prodigal["seqlen"]) if fields_gff[gff_type] == "CDS" and (not pseudogene or (pseudogene and pseudo)): + + if "TRANSL_TABLE" in attributes: + genetic_code = int(attributes["TRANSL_TABLE"]) + else: + used_transl_table_arg += 1 + genetic_code = translation_table + + gene_frame = 0 + # Get value of frame if valid + if fields_gff[frame] in ['1', "2", "0"]: + gene_frame = int(fields_gff[frame]) + if id_attribute in id_attr_to_gene_id: # the ID has already been seen at least once in this genome existing_gene = id_attr_to_gene_id[id_attribute] @@ -923,7 +935,8 @@ def check_chevrons_in_start_and_stop(start: str, stop: str) -> Tuple[int, int, b "local_identifier":gene_id, "start": start, "stop": stop, - "ID": id_attribute} + "ID": id_attribute, + "frame":gene_frame} check_and_add_extra_gene_part(existing_gene, new_gene_info) @@ -938,7 +951,7 @@ def check_chevrons_in_start_and_stop(start: str, stop: str) -> Tuple[int, int, b strand=fields_gff[gff_strand], gene_type=fields_gff[gff_type], name=name, position=contig.number_of_genes, product=product, local_identifier=gene_id, - genetic_code=genetic_code) + genetic_code=genetic_code, is_partial=is_partial, frame=gene_frame) gene.fill_parents(org, contig) gene_counter += 1 contig.add(gene) @@ -958,6 +971,15 @@ def check_chevrons_in_start_and_stop(start: str, stop: str) -> Tuple[int, int, b # Correct coordinates of genes that overlap the edge of circulars contig correct_putative_overlaps(org.contigs) + # First partial genes coordinates + for contig in org.contigs: + for gene in contig.genes: + if gene.is_partial: + is_complement = gene.strand == '-' + if len(gene.coordinates) > 1: + print("!!!"*15) + gene.coordinates = fix_partial_gene_coordinates(gene.coordinates, is_complement=is_complement, start_shift=gene.frame ) + # GET THE FASTA SEQUENCES OF THE GENES if fasta_string == "": has_fasta = False @@ -1041,6 +1063,12 @@ def check_and_add_extra_gene_part(gene: Gene, new_gene_info: Dict, max_separatio # The new gene info seems concordant with the gene object. We can try to merge them assert new_gene_info['start'] <= new_gene_info['stop'], "Start is greater than stop. Incorrect coordinates." + new_gene_is_before = (gene.strand == "+" and new_gene_info['start'] < gene.start) or (gene.strand == "-" and new_gene_info['start'] > gene.start) + if new_gene_is_before: + # new gene start if before the current gene + # so its frame if used + gene.frame = new_gene_info['frame'] + # Add new coordinates to gene's coordinates gene.coordinates = sorted(gene.coordinates + [(new_gene_info['start'], new_gene_info['stop'])]) diff --git a/ppanggolin/genome.py b/ppanggolin/genome.py index 9340d68c..eba6e423 100644 --- a/ppanggolin/genome.py +++ b/ppanggolin/genome.py @@ -286,6 +286,8 @@ def __init__(self, gene_id: str): self._RGP = None self.genetic_code = None self.protein = None + self.is_partial = False # is the gene a partial gene ? + self.frame = 0 # One of '0', '1' or '2'. '0' indicates that the first base of the feature is the first base of a codon, '1' that the second base is the first base of a codon, and so on.. @property def family(self): @@ -349,11 +351,14 @@ def module(self): """ return self.family.module - def fill_annotations(self, position: int = None, genetic_code: int = 11, **kwargs): + def fill_annotations(self, position: int = None, genetic_code: int = 11, is_partial:bool = False, frame:int = 0, **kwargs): """Fill Gene annotation provide by PPanGGOLiN dependencies :param position: Gene localization in genome :param genetic_code: Genetic code associated to gene + :param is_partial: is the gene a partial gene + :param frame: One of '0', '1' or '2'. '0' indicates that the first base of the feature is the first base of a codon, + '1' that the second base is the first base of a codon, and so on.. :param kwargs: look at Feature.fill_annotations methods :raises TypeError: If position or genetic code value is not instance integers @@ -363,8 +368,17 @@ def fill_annotations(self, position: int = None, genetic_code: int = 11, **kwarg raise TypeError("position should be an integer") if not isinstance(genetic_code, int): raise TypeError("Genetic code should be an integer") + + if frame not in [0,1,2]: + raise ValueError("Frame should be equal to 0, 1 or 2.") + + if not isinstance(is_partial, bool): + raise TypeError("partial code should be an boolean") + self.position = position self.genetic_code = genetic_code + self.is_partial = is_partial + self._frame = frame def add_protein(self, protein: str): """Add a protein sequence corresponding to translated gene @@ -377,6 +391,25 @@ def add_protein(self, protein: str): raise TypeError(f"'str' type was expected but you provided a '{type(protein)}' type object") self.protein = protein + @property + def frame(self) -> int: + """ + Get the frame of the gene + + """ + + return self._frame + + @frame.setter + def frame(self, frame: int): + """Set the length of the contig + + :param contig_len: length of the contig + """ + if frame not in [0,1,2]: + raise ValueError("Frame should be equal to 0, 1 or 2.") + + self._frame = frame class Contig(MetaFeatures): """ From a79076b9e863ef08a82d4e2542dd5acdde7c11aa Mon Sep 17 00:00:00 2001 From: JeanMainguy Date: Tue, 15 Oct 2024 10:20:48 +0200 Subject: [PATCH 30/52] rm debug log --- ppanggolin/annotate/annotate.py | 19 ++++++------------- 1 file changed, 6 insertions(+), 13 deletions(-) diff --git a/ppanggolin/annotate/annotate.py b/ppanggolin/annotate/annotate.py index 638d1fb5..23c6d8e3 100644 --- a/ppanggolin/annotate/annotate.py +++ b/ppanggolin/annotate/annotate.py @@ -421,7 +421,6 @@ def reverse_complement_coordinates(coordinates: List[Tuple[int, int]]) -> List[T :return: A list of reversed and inverted coordinates. """ # Reverse the order of coordinates and invert each start and end - logging.getLogger("PPanGGOLiN").debug(f'Reversing and inverting coordinates: {coordinates}') return [(-end, -start) for start, end in coordinates[::-1]] @@ -435,7 +434,6 @@ def shift_end_coordinates(coordinates: List[Tuple[int, int]], shift: int) -> Lis :return: The coordinates after the end shift and reverse complement transformations. """ # Perform reverse complement, shift the start (corresponding to the original end), and reverse complement back - logging.getLogger("PPanGGOLiN").debug(f'Shifting end of coordinates {coordinates} by {shift}') rc_coordinates = reverse_complement_coordinates(coordinates) rc_coordinates_shifted = shift_start_coordinates(rc_coordinates, shift) final_coordinates = reverse_complement_coordinates(rc_coordinates_shifted) @@ -457,7 +455,6 @@ def shift_start_coordinates(coordinates: List[Tuple[int, int]], shift: int) -> L # Shift the start of the first coordinate adjusted_start = new_coordinates[0][0] + shift - logging.getLogger("PPanGGOLiN").debug(f'Shifting start of first coordinate by {shift}. New start: {adjusted_start}') adjusted_coordinate_part = (adjusted_start, new_coordinates[0][1]) new_coordinates[0] = adjusted_coordinate_part @@ -502,8 +499,6 @@ def fix_partial_gene_coordinates( :param start_shift: The value by which the start coordinate should be shifted. :return: A new list of adjusted coordinate tuples. """ - logging.getLogger("PPanGGOLiN").debug("Initial parameters: " - f"coordinates: {coordinates}, is_complement: {is_complement}, start_shift: {start_shift}") if not coordinates: raise ValueError('No coordinates provided. Cannot fix partial gene coordinates.') @@ -537,10 +532,6 @@ def fix_partial_gene_coordinates( if gene_length % 3 != 0: logging.getLogger("PPanGGOLiN").warning(f'Gene with coordinates: {coordinates} has a length that is not a multiple of 3 after adjusting for partiality with new cordinates ({coordinates}): {gene_length}') - raise ValueError(f'Gene with coordinates: {coordinates} has a length that is not a multiple of 3 after adjusting for partiality: {gene_length}') - - logging.getLogger("PPanGGOLiN").debug(f'Final corrected coordinates: {coordinates}. Gene length = {gene_length}, ' - f'multiple of 3: {gene_length % 3 == 0}') return coordinates @@ -921,7 +912,7 @@ def check_chevrons_in_start_and_stop(start: str, stop: str) -> Tuple[int, int, b gene_frame = 0 # Get value of frame if valid - if fields_gff[frame] in ['1', "2", "0"]: + if fields_gff[frame] in ["1", "2", "0"]: gene_frame = int(fields_gff[frame]) if id_attribute in id_attr_to_gene_id: # the ID has already been seen at least once in this genome @@ -971,13 +962,11 @@ def check_chevrons_in_start_and_stop(start: str, stop: str) -> Tuple[int, int, b # Correct coordinates of genes that overlap the edge of circulars contig correct_putative_overlaps(org.contigs) - # First partial genes coordinates + # Fix partial genes coordinates for contig in org.contigs: for gene in contig.genes: if gene.is_partial: is_complement = gene.strand == '-' - if len(gene.coordinates) > 1: - print("!!!"*15) gene.coordinates = fix_partial_gene_coordinates(gene.coordinates, is_complement=is_complement, start_shift=gene.frame ) # GET THE FASTA SEQUENCES OF THE GENES @@ -1218,6 +1207,10 @@ def local_identifiers_are_unique(genes: Iterable[Gene]) -> bool: gene_id_2_local = {} local_to_gene_id = {} for gene in genes: + if gene.local_identifier in local_to_gene_id: + print(gene.local_identifier, "DUP") + if gene.ID in gene_id_2_local: + print(gene.ID, "DUP") gene_id_2_local[gene.ID] = gene.local_identifier local_to_gene_id[gene.local_identifier] = gene.ID if len(local_to_gene_id) != len(gene_id_2_local): From d99404cab2de476e0b70e5ab9cf4a814ee5c49b5 Mon Sep 17 00:00:00 2001 From: JeanMainguy Date: Tue, 15 Oct 2024 10:21:17 +0200 Subject: [PATCH 31/52] rm debug --- ppanggolin/annotate/annotate.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/ppanggolin/annotate/annotate.py b/ppanggolin/annotate/annotate.py index 23c6d8e3..900d8b8b 100644 --- a/ppanggolin/annotate/annotate.py +++ b/ppanggolin/annotate/annotate.py @@ -1207,10 +1207,6 @@ def local_identifiers_are_unique(genes: Iterable[Gene]) -> bool: gene_id_2_local = {} local_to_gene_id = {} for gene in genes: - if gene.local_identifier in local_to_gene_id: - print(gene.local_identifier, "DUP") - if gene.ID in gene_id_2_local: - print(gene.ID, "DUP") gene_id_2_local[gene.ID] = gene.local_identifier local_to_gene_id[gene.local_identifier] = gene.ID if len(local_to_gene_id) != len(gene_id_2_local): From e802d5ef718f50ba12a91e306d5f102832cbc16b Mon Sep 17 00:00:00 2001 From: JeanMainguy Date: Tue, 15 Oct 2024 11:31:48 +0200 Subject: [PATCH 32/52] use locus_tag in GFF parsing --- ppanggolin/annotate/annotate.py | 39 ++++++++++++++++++++++----------- 1 file changed, 26 insertions(+), 13 deletions(-) diff --git a/ppanggolin/annotate/annotate.py b/ppanggolin/annotate/annotate.py index 900d8b8b..f3f79756 100644 --- a/ppanggolin/annotate/annotate.py +++ b/ppanggolin/annotate/annotate.py @@ -4,6 +4,7 @@ import argparse import logging from concurrent.futures import ProcessPoolExecutor +from math import e from multiprocessing import get_context import os from pathlib import Path @@ -651,7 +652,7 @@ def read_org_gbff(organism_name: str, gbff_file_path: Path, circular_contigs: Li start_shift = 0 if 'codon_start' not in feature else int(feature['codon_start']) -1 # -1 is to be in zero based index. - coordinates = fix_partial_gene_coordinates(coordinates,is_complement=is_complement, start_shift=start_shift ) + coordinates = fix_partial_gene_coordinates(coordinates, is_complement=is_complement, start_shift=start_shift) strand = "-" if is_complement else "+" @@ -869,12 +870,16 @@ def check_chevrons_in_start_and_stop(start: str, stop: str) -> Tuple[int, int, b elif fields_gff[gff_type] == 'CDS' or "RNA" in fields_gff[gff_type]: id_attribute = get_id_attribute(attributes) + locus_tag = attributes.get("LOCUS_TAG") + protein_id = attributes.get("PROTEIN_ID") + + if locus_tag is not None: + gene_id = locus_tag - gene_id = attributes.get("PROTEIN_ID") - # if there is a 'PROTEIN_ID' attribute, it's where the ncbi stores the actual gene ids, so we use that. - if gene_id is None: - # if it's not found, we get the one under the 'ID' field which must exist - # (otherwise not a gff3 compliant file) + elif protein_id is not None: + gene_id = protein_id + + else: gene_id = id_attribute name = attributes.pop('NAME', attributes.pop('GENE', "")) @@ -915,9 +920,8 @@ def check_chevrons_in_start_and_stop(start: str, stop: str) -> Tuple[int, int, b if fields_gff[frame] in ["1", "2", "0"]: gene_frame = int(fields_gff[frame]) - if id_attribute in id_attr_to_gene_id: # the ID has already been seen at least once in this genome - - existing_gene = id_attr_to_gene_id[id_attribute] + if gene_id in id_attr_to_gene_id: # the ID has already been seen at least once in this genome + existing_gene = id_attr_to_gene_id[gene_id] new_gene_info = {"strand":fields_gff[gff_strand], "type":fields_gff[gff_type], "name":name, @@ -926,7 +930,6 @@ def check_chevrons_in_start_and_stop(start: str, stop: str) -> Tuple[int, int, b "local_identifier":gene_id, "start": start, "stop": stop, - "ID": id_attribute, "frame":gene_frame} check_and_add_extra_gene_part(existing_gene, new_gene_info) @@ -935,7 +938,7 @@ def check_chevrons_in_start_and_stop(start: str, stop: str) -> Tuple[int, int, b gene = Gene(org.name + "_CDS_" + str(gene_counter).zfill(4)) - id_attr_to_gene_id[id_attribute] = gene + id_attr_to_gene_id[gene_id] = gene # here contig is filled in order, so position is the number of genes already stored in the contig. gene.fill_annotations(start=start, stop=stop, @@ -943,6 +946,7 @@ def check_chevrons_in_start_and_stop(start: str, stop: str) -> Tuple[int, int, b position=contig.number_of_genes, product=product, local_identifier=gene_id, genetic_code=genetic_code, is_partial=is_partial, frame=gene_frame) + gene.fill_parents(org, contig) gene_counter += 1 contig.add(gene) @@ -1074,13 +1078,22 @@ def check_and_add_extra_gene_part(gene: Gene, new_gene_info: Dict, max_separatio gene.start, gene.stop = gene.coordinates[0][0], gene.coordinates[-1][1] logging.getLogger("PPanGGOLiN").debug( - f"Gene {new_gene_info['ID']} is found in multiple parts. " + f"Gene {new_gene_info['local_identifier']} is found in multiple parts. " "These parts are merged into one gene. " f"New gene coordinates: {gene.coordinates}") else: + detailed_comparison = { + "same strand": f"{gene.strand} == {new_gene_info['strand']}: {gene.strand == new_gene_info['strand']}", + "same type": f"{gene.type} == {new_gene_info['type']}: {gene.type == new_gene_info['type']}", + "same product": f"{gene.product} == {new_gene_info['product']}: {gene.product == new_gene_info['product']}", + "same name": f"{gene.name} == {new_gene_info['name']}: {gene.name == new_gene_info['name']}", + "same local identifier": f"{gene.local_identifier} == {new_gene_info['local_identifier']}: {gene.local_identifier == new_gene_info['local_identifier']}", + } + + raise ValueError( - f"Two genes have the same ID attributes but different info in some key attribute. {comparison}") + f"Two genes have the same id attributes but different info in some key attribute. {detailed_comparison}") def correct_putative_overlaps(contigs: Iterable[Contig]): From 7cb227c24876e21c1507bbad88125a45efaa0180 Mon Sep 17 00:00:00 2001 From: JeanMainguy Date: Tue, 15 Oct 2024 11:56:43 +0200 Subject: [PATCH 33/52] update CI --- .github/workflows/main.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index bcc3ef9c..8bce437f 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -121,7 +121,7 @@ jobs: ppanggolin info --pangenome stepbystep/pangenome.h5 > info_to_test/stepbystep_info.yaml cat info_to_test/stepbystep_info.yaml gzip -d stepbystep/gene_families.tsv.gz - echo "$(grep 'stepbystep/gene_families.tsv' expected_info_files/checksum.txt | cut -d' ' -f1) stepbystep/gene_families.tsv" | shasum -a 256 -c - || { echo 'Checksum verification failed.' >&2; exit 1; } + echo "$(grep 'stepbystep/gene_families.tsv' expected_info_files/checksum.txt | cut -d' ' -f1) stepbystep/gene_families.tsv" | shasum -a 256 -c - || { echo 'Checksum verification failed.' >&2; } shasum -a 256 stepbystep/gene_families.tsv >> info_to_test/checksum.txt cd - - name: gbff parsing and MSA computing @@ -132,7 +132,7 @@ jobs: ppanggolin msa --pangenome myannopang/pangenome.h5 --source dna --partition core -o myannopang/ -f --use_gene_id --phylo --single_copy --cpu $NUM_CPUS ppanggolin info --pangenome myannopang/pangenome.h5 > info_to_test/myannopang_info.yaml cat info_to_test/myannopang_info.yaml - echo "$(grep 'myannopang/gene_families.tsv' expected_info_files/checksum.txt | cut -d' ' -f1) myannopang/gene_families.tsv" | shasum -a 256 -c - || { echo 'Checksum verification failed.' >&2; exit 1; } + echo "$(grep 'myannopang/gene_families.tsv' expected_info_files/checksum.txt | cut -d' ' -f1) myannopang/gene_families.tsv" | shasum -a 256 -c - || { echo 'Checksum verification failed.' >&2; } shasum -a 256 myannopang/gene_families.tsv >> info_to_test/checksum.txt cd - - name: clusters reading from external file @@ -144,7 +144,7 @@ jobs: awk 'BEGIN{FS=OFS="\t"} {$1 = $1 OFS $1} 1' clusters.tsv > clusters_with_reprez.tsv; ppanggolin cluster --clusters clusters_with_reprez.tsv -p readclusters/pangenome.h5 --cpu $NUM_CPUS ppanggolin msa --pangenome readclusterpang/pangenome.h5 --partition persistent --phylo -o readclusterpang/msa/ -f --cpu $NUM_CPUS - echo "$(grep 'readclusterpang/gene_families.tsv' expected_info_files/checksum.txt | cut -d' ' -f1) readclusterpang/gene_families.tsv" | shasum -a 256 -c - || { echo 'Checksum verification failed.' >&2; exit 1; } + echo "$(grep 'readclusterpang/gene_families.tsv' expected_info_files/checksum.txt | cut -d' ' -f1) readclusterpang/gene_families.tsv" | shasum -a 256 -c - || { echo 'Checksum verification failed.' >&2; } shasum -a 256 readclusterpang/gene_families.tsv >> info_to_test/checksum.txt cd - - name: testing rgp_cluster command @@ -195,7 +195,7 @@ jobs: ppanggolin utils --default_config panrgp -o panrgp_default_config.yaml cut -f1,2 clusters.tsv > clusters_without_frag.tsv ppanggolin panrgp --anno genomes.gbff.list --cluster clusters_without_frag.tsv -o test_config --config panrgp_default_config.yaml --cpu $NUM_CPUS - echo "$(grep 'test_config/gene_families.tsv' expected_info_files/checksum.txt | cut -d' ' -f1) test_config/gene_families.tsv" | shasum -a 256 -c - || { echo 'Checksum verification failed.' >&2; exit 1; } + echo "$(grep 'test_config/gene_families.tsv' expected_info_files/checksum.txt | cut -d' ' -f1) test_config/gene_families.tsv" | shasum -a 256 -c - || { echo 'Checksum verification failed.' >&2; } shasum -a 256 test_config/gene_families.tsv >> info_to_test/checksum.txt cd - - name: testing projection cmd From 6507c57b669f9a480b8352c3b6b944f7035d36fc Mon Sep 17 00:00:00 2001 From: JeanMainguy Date: Tue, 15 Oct 2024 17:03:34 +0200 Subject: [PATCH 34/52] update expected files with new genes and cluster --- ppanggolin/cluster/cluster.py | 7 +++++-- testingDataset/expected_info_files/checksum.txt | 4 ++-- testingDataset/expected_info_files/myannopang_info.yaml | 8 ++++---- 3 files changed, 11 insertions(+), 8 deletions(-) diff --git a/ppanggolin/cluster/cluster.py b/ppanggolin/cluster/cluster.py index c60e1640..a740890d 100644 --- a/ppanggolin/cluster/cluster.py +++ b/ppanggolin/cluster/cluster.py @@ -475,8 +475,11 @@ def read_clustering_file(families_tsv_path: Path) -> Tuple[pd.DataFrame, bool]: families_df["representative"] = families_df["representative"].astype(str) # Check for duplicate gene IDs - if families_df["gene"].duplicated().any(): - raise Exception("It seems that there is duplicated gene id in your clustering.") + duplicates = families_df[families_df["gene"].duplicated()]["gene"].unique() + + if len(duplicates) > 0: + raise ValueError(f"Duplicate gene IDs found in your clustering: {', '.join(duplicates)}") + return families_df[["family", "representative", "gene", "is_frag"]], families_df["is_frag"].any() diff --git a/testingDataset/expected_info_files/checksum.txt b/testingDataset/expected_info_files/checksum.txt index 2291de3d..c725b1a8 100644 --- a/testingDataset/expected_info_files/checksum.txt +++ b/testingDataset/expected_info_files/checksum.txt @@ -1,5 +1,5 @@ 9d6219523e890b08c467c936590b37436e915840a797ea161c9707041c3b821c mybasicpangenome/gene_families.tsv 9d6219523e890b08c467c936590b37436e915840a797ea161c9707041c3b821c stepbystep/gene_families.tsv -bd71918de23737aec5a262c883c1154a507ae616bdc47a152db0e76319e7484d readclusterpang/gene_families.tsv -b893343f249102dff23a9542752f83cdee93efd34bc951b48a0c986fcb5d26a4 myannopang/gene_families.tsv +5cb88afbc1a49e7d21531d36d5ee3471a87834f4bb82578347dc92231ba0a452 readclusterpang/gene_families.tsv +5cb88afbc1a49e7d21531d36d5ee3471a87834f4bb82578347dc92231ba0a452 myannopang/gene_families.tsv 41511d7c482c0c400a504d5c564605427081917e54aee1e5f37ffda220d2cdb9 test_config/gene_families.tsv diff --git a/testingDataset/expected_info_files/myannopang_info.yaml b/testingDataset/expected_info_files/myannopang_info.yaml index 03a04408..045c6205 100644 --- a/testingDataset/expected_info_files/myannopang_info.yaml +++ b/testingDataset/expected_info_files/myannopang_info.yaml @@ -11,10 +11,10 @@ Status: PPanGGOLiN_Version: 2.1.2 Content: - Genes: 47961 + Genes: 47986 Genomes: 53 - Families: 1084 - Edges: 1318 + Families: 1086 + Edges: 1315 Persistent: Family_count: 871 min_genomes_frequency: 0.89 @@ -28,7 +28,7 @@ Content: sd_genomes_frequency: 0.18 mean_genomes_frequency: 0.52 Cloud: - Family_count: 157 + Family_count: 159 min_genomes_frequency: 0.02 max_genomes_frequency: 0.23 sd_genomes_frequency: 0.04 From 498b0337d2ac8617ac235696b21a755b1ddcea9a Mon Sep 17 00:00:00 2001 From: JeanMainguy Date: Tue, 15 Oct 2024 17:32:15 +0200 Subject: [PATCH 35/52] Revert "update CI" This reverts commit 7cb227c24876e21c1507bbad88125a45efaa0180. --- .github/workflows/main.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 8bce437f..bcc3ef9c 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -121,7 +121,7 @@ jobs: ppanggolin info --pangenome stepbystep/pangenome.h5 > info_to_test/stepbystep_info.yaml cat info_to_test/stepbystep_info.yaml gzip -d stepbystep/gene_families.tsv.gz - echo "$(grep 'stepbystep/gene_families.tsv' expected_info_files/checksum.txt | cut -d' ' -f1) stepbystep/gene_families.tsv" | shasum -a 256 -c - || { echo 'Checksum verification failed.' >&2; } + echo "$(grep 'stepbystep/gene_families.tsv' expected_info_files/checksum.txt | cut -d' ' -f1) stepbystep/gene_families.tsv" | shasum -a 256 -c - || { echo 'Checksum verification failed.' >&2; exit 1; } shasum -a 256 stepbystep/gene_families.tsv >> info_to_test/checksum.txt cd - - name: gbff parsing and MSA computing @@ -132,7 +132,7 @@ jobs: ppanggolin msa --pangenome myannopang/pangenome.h5 --source dna --partition core -o myannopang/ -f --use_gene_id --phylo --single_copy --cpu $NUM_CPUS ppanggolin info --pangenome myannopang/pangenome.h5 > info_to_test/myannopang_info.yaml cat info_to_test/myannopang_info.yaml - echo "$(grep 'myannopang/gene_families.tsv' expected_info_files/checksum.txt | cut -d' ' -f1) myannopang/gene_families.tsv" | shasum -a 256 -c - || { echo 'Checksum verification failed.' >&2; } + echo "$(grep 'myannopang/gene_families.tsv' expected_info_files/checksum.txt | cut -d' ' -f1) myannopang/gene_families.tsv" | shasum -a 256 -c - || { echo 'Checksum verification failed.' >&2; exit 1; } shasum -a 256 myannopang/gene_families.tsv >> info_to_test/checksum.txt cd - - name: clusters reading from external file @@ -144,7 +144,7 @@ jobs: awk 'BEGIN{FS=OFS="\t"} {$1 = $1 OFS $1} 1' clusters.tsv > clusters_with_reprez.tsv; ppanggolin cluster --clusters clusters_with_reprez.tsv -p readclusters/pangenome.h5 --cpu $NUM_CPUS ppanggolin msa --pangenome readclusterpang/pangenome.h5 --partition persistent --phylo -o readclusterpang/msa/ -f --cpu $NUM_CPUS - echo "$(grep 'readclusterpang/gene_families.tsv' expected_info_files/checksum.txt | cut -d' ' -f1) readclusterpang/gene_families.tsv" | shasum -a 256 -c - || { echo 'Checksum verification failed.' >&2; } + echo "$(grep 'readclusterpang/gene_families.tsv' expected_info_files/checksum.txt | cut -d' ' -f1) readclusterpang/gene_families.tsv" | shasum -a 256 -c - || { echo 'Checksum verification failed.' >&2; exit 1; } shasum -a 256 readclusterpang/gene_families.tsv >> info_to_test/checksum.txt cd - - name: testing rgp_cluster command @@ -195,7 +195,7 @@ jobs: ppanggolin utils --default_config panrgp -o panrgp_default_config.yaml cut -f1,2 clusters.tsv > clusters_without_frag.tsv ppanggolin panrgp --anno genomes.gbff.list --cluster clusters_without_frag.tsv -o test_config --config panrgp_default_config.yaml --cpu $NUM_CPUS - echo "$(grep 'test_config/gene_families.tsv' expected_info_files/checksum.txt | cut -d' ' -f1) test_config/gene_families.tsv" | shasum -a 256 -c - || { echo 'Checksum verification failed.' >&2; } + echo "$(grep 'test_config/gene_families.tsv' expected_info_files/checksum.txt | cut -d' ' -f1) test_config/gene_families.tsv" | shasum -a 256 -c - || { echo 'Checksum verification failed.' >&2; exit 1; } shasum -a 256 test_config/gene_families.tsv >> info_to_test/checksum.txt cd - - name: testing projection cmd From 0ed382a0c1f1e0ebfb6b4b66495d76d068176660 Mon Sep 17 00:00:00 2001 From: JeanMainguy Date: Tue, 15 Oct 2024 17:44:07 +0200 Subject: [PATCH 36/52] update CI --- .github/workflows/main.yml | 1 + testingDataset/expected_info_files/checksum.txt | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index bcc3ef9c..2bef38c7 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -139,6 +139,7 @@ jobs: shell: bash -l {0} run: | cd testingDataset + cat myannopang/gene_families.tsv | cut -f1,2,4 > clusters.tsv ppanggolin panrgp --anno genomes.gbff.list --cluster clusters.tsv --output readclusterpang --cpu $NUM_CPUS ppanggolin annotate --anno genomes.gbff.list --output readclusters --cpu $NUM_CPUS awk 'BEGIN{FS=OFS="\t"} {$1 = $1 OFS $1} 1' clusters.tsv > clusters_with_reprez.tsv; diff --git a/testingDataset/expected_info_files/checksum.txt b/testingDataset/expected_info_files/checksum.txt index c725b1a8..0c375ada 100644 --- a/testingDataset/expected_info_files/checksum.txt +++ b/testingDataset/expected_info_files/checksum.txt @@ -2,4 +2,4 @@ 9d6219523e890b08c467c936590b37436e915840a797ea161c9707041c3b821c stepbystep/gene_families.tsv 5cb88afbc1a49e7d21531d36d5ee3471a87834f4bb82578347dc92231ba0a452 readclusterpang/gene_families.tsv 5cb88afbc1a49e7d21531d36d5ee3471a87834f4bb82578347dc92231ba0a452 myannopang/gene_families.tsv -41511d7c482c0c400a504d5c564605427081917e54aee1e5f37ffda220d2cdb9 test_config/gene_families.tsv +d9698f054a14d8fcea35542c7d8338ea73f6d128bd287adfa01e99be40c80dc4 test_config/gene_families.tsv From 760b0f0c9639927afd4de7f80c177b54a988b505 Mon Sep 17 00:00:00 2001 From: JeanMainguy Date: Tue, 15 Oct 2024 17:49:49 +0200 Subject: [PATCH 37/52] rm cluster file not used in CI anymore --- testingDataset/clusters.tsv | 47961 ---------------------------------- 1 file changed, 47961 deletions(-) delete mode 100644 testingDataset/clusters.tsv diff --git a/testingDataset/clusters.tsv b/testingDataset/clusters.tsv deleted file mode 100644 index 04d929c4..00000000 --- a/testingDataset/clusters.tsv +++ /dev/null @@ -1,47961 +0,0 @@ -CTB_RS00165 CTB_RS00165 -CTB_RS00165 CTL2C_RS01530 -CTB_RS00165 CBP42_RS01560 -CTB_RS00165 L1224_RS00165 -CTB_RS00165 BKB96_RS00170 -CTB_RS00165 BKB99_RS00170 -CTB_RS00165 CTO_RS00165 -CTB_RS00165 SOTONIA3_RS00165 -CTB_RS00165 L1440_RS00165 -CTB_RS00165 BKB92_RS00170 -CTB_RS00165 119233 -CTB_RS00165 CBP44_RS01565 -CTB_RS00165 E150_RS00165 -CTB_RS00165 L2BUCH2_RS00165 -CTB_RS00165 BKB93_RS00170 -CTB_RS00165 FCS84708_RS00165 -CTB_RS00165 AP288_RS03235 -CTB_RS00165 BBV13_RS00170 -CTB_RS00165 G9768_RS00165 -CTB_RS00165 AOT15_RS00790 -CTB_RS00165 AQ199_RS00860 -CTB_RS00165 BW688_RS01560 -CTB_RS00165 L2BLST_RS00165 -CTB_RS00165 BKC02_RS00170 -CTB_RS00165 BBV16_RS00170 -CTB_RS00165 BKC01_RS00170 -CTB_RS00165 gnl|Prokka|PADJNBJD_00034 -CTB_RS00165 LJHENM_00170 -CTB_RS00165 A5291_RS00165 -CTB_RS00165 SOTONK1_RS00165 -CTB_RS00165 JIEJKO_00165 -CTB_RS00165 7618373 -CTB_RS00165 NILJEPDF_00034 -CTB_RS00165 L3404_RS00165 -CTB_RS00165 IaCS19096_RS00165 -CTB_RS00165 AKW53_RS01655 -CTB_RS00165 BKC03_RS00170 -CTB_RS00165 C15_RS0100165 -CTB_RS00165 QSDFRQ_00034 -CTB_RS00165 CTJTET1_RS00165 -CTB_RS00165 DU10_RS00170 -CTB_RS00165 CTRC943_RS00165 -CTB_RS00165 O169_RS00165 -CTB_RS00165 CBP48_RS01560 -CTB_RS00165 ECS88FINAL_RS0100170 -CTB_RS00165 DU13_RS00170 -CTB_RS00165 KW39_RS00165 -CTB_RS00165 KW36_RS00165 -CTB_RS00165 BKB95_RS00170 -CTB_RS00165 SW2_RS00165 -CTB_RS00165 AQ193_RS03840 -CTB_RS00165 ECS102511_RS00165 -CTB_RS00165 AQ244_RS01825 -CTB_RS00670 CTB_RS00670 -CTB_RS00670 AQ193_RS03330 -CTB_RS00670 L1224_RS00665 -CTB_RS00670 AQ244_RS02840 -CTB_RS00670 BKB96_RS00675 -CTB_RS00670 CBP42_RS02065 -CTB_RS00670 BKB99_RS00675 -CTB_RS00670 L1440_RS00665 -CTB_RS00670 BKB92_RS00675 -CTB_RS00670 CTO_RS00670 -CTB_RS00670 SOTONIA3_RS00665 -CTB_RS00670 E150_RS00665 -CTB_RS00670 L2BUCH2_RS00665 -CTB_RS00670 CBP44_RS02070 -CTB_RS00670 FCS84708_RS00665 -CTB_RS00670 AP288_RS03735 -CTB_RS00670 BKB93_RS00675 -CTB_RS00670 119307 -CTB_RS00670 AQ199_RS01360 -CTB_RS00670 BBV13_RS00675 -CTB_RS00670 G9768_RS00665 -CTB_RS00670 L2BLST_RS00665 -CTB_RS00670 BW688_RS02065 -CTB_RS00670 AOT15_RS00290 -CTB_RS00670 BBV16_RS00675 -CTB_RS00670 BKC02_RS00675 -CTB_RS00670 gnl|Prokka|PADJNBJD_00131 -CTB_RS00670 LJHENM_00655 -CTB_RS00670 AKW53_RS02160 -CTB_RS00670 BKC01_RS00675 -CTB_RS00670 NILJEPDF_00131 -CTB_RS00670 A5291_RS00670 -CTB_RS00670 L3404_RS00665 -CTB_RS00670 SOTONK1_RS00665 -CTB_RS00670 JIEJKO_00660 -CTB_RS00670 QSDFRQ_00131 -CTB_RS00670 IaCS19096_RS00665 -CTB_RS00670 BKC03_RS00675 -CTB_RS00670 C15_RS0100690 -CTB_RS00670 CTRC943_RS00665 -CTB_RS00670 CTJTET1_RS00665 -CTB_RS00670 KW39_RS00665 -CTB_RS00670 DU10_RS00675 -CTB_RS00670 ECS88FINAL_RS0100690 -CTB_RS00670 O169_RS00665 -CTB_RS00670 DU13_RS00680 -CTB_RS00670 7618421 -CTB_RS00670 KW36_RS00665 -CTB_RS00670 CBP48_RS02065 -CTB_RS00670 SW2_RS00665 -CTB_RS00670 BKB95_RS00675 -CTB_RS00670 ECS102511_RS00665 -CTB_RS00670 CTL2C_RS02030 -CTB_RS01025 CTB_RS01025 -CTB_RS01025 L2BUCH2_RS00985 -CTB_RS01025 CTO_RS01025 -CTB_RS01025 FCS84708_RS00995 -CTB_RS01025 AP288_RS04065 -CTB_RS01025 BKB93_RS01000 -CTB_RS01025 CBP44_RS02395 -CTB_RS01025 AQ199_RS01690 -CTB_RS01025 L2BLST_RS00985 -CTB_RS01025 BW688_RS02395 -CTB_RS01025 AQ193_RS02995 -CTB_RS01025 BBV13_RS01030 -CTB_RS01025 G9768_RS01005 -CTB_RS01025 BKC02_RS01000 -CTB_RS01025 L3404_RS00980 -CTB_RS01025 AKW53_RS02490 -CTB_RS01025 120519 -CTB_RS01025 BBV16_RS01030 -CTB_RS01025 BKC01_RS01000 -CTB_RS01025 DU10_RS01010 -CTB_RS01025 gnl|Prokka|PADJNBJD_00196 -CTB_RS01025 BKC03_RS01000 -CTB_RS01025 NILJEPDF_00196 -CTB_RS01025 LJHENM_00985 -CTB_RS01025 CTRC943_RS00985 -CTB_RS01025 CTJTET1_RS01015 -CTB_RS01025 C15_RS0101035 -CTB_RS01025 SOTONK1_RS01000 -CTB_RS01025 ECS88FINAL_RS0101020 -CTB_RS01025 KW39_RS01005 -CTB_RS01025 JIEJKO_00985 -CTB_RS01025 7618867 -CTB_RS01025 A5291_RS01025 -CTB_RS01025 IaCS19096_RS01000 -CTB_RS01025 QSDFRQ_00196 -CTB_RS01025 O169_RS01005 -CTB_RS01025 DU13_RS01010 -CTB_RS01025 SW2_RS00995 -CTB_RS01025 BKB95_RS01015 -CTB_RS01025 CBP48_RS02390 -CTB_RS01025 KW36_RS01000 -CTB_RS01025 ECS102511_RS00995 -CTB_RS01025 BKB96_RS01000 -CTB_RS01025 CTL2C_RS02350 -CTB_RS01025 BKB99_RS01000 -CTB_RS01025 L1224_RS00980 -CTB_RS01025 AOT15_RS01365 -CTB_RS01025 L1440_RS00980 -CTB_RS01025 AQ244_RS03180 -CTB_RS01025 BKB92_RS01000 -CTB_RS01025 CBP42_RS02390 -CTB_RS01025 SOTONIA3_RS01015 -CTB_RS01025 E150_RS00995 -CTB_RS01370 CTB_RS01370 -CTB_RS01370 E150_RS01340 -CTB_RS01370 L2BUCH2_RS01330 -CTB_RS01370 CTO_RS01370 -CTB_RS01370 FCS84708_RS01340 -CTB_RS01370 AP288_RS04410 -CTB_RS01370 BKB93_RS01350 -CTB_RS01370 CBP44_RS02745 -CTB_RS01370 AQ193_RS02650 -CTB_RS01370 AQ199_RS02035 -CTB_RS01370 L2BLST_RS01330 -CTB_RS01370 BBV13_RS01380 -CTB_RS01370 BW688_RS02745 -CTB_RS01370 G9768_RS01350 -CTB_RS01370 BKC02_RS01350 -CTB_RS01370 BBV16_RS01380 -CTB_RS01370 L3404_RS01325 -CTB_RS01370 AKW53_RS02835 -CTB_RS01370 BKC01_RS01350 -CTB_RS01370 gnl|Prokka|PADJNBJD_00264 -CTB_RS01370 DU10_RS01360 -CTB_RS01370 NILJEPDF_00264 -CTB_RS01370 LJHENM_01330 -CTB_RS01370 BKC03_RS01350 -CTB_RS01370 CTRC943_RS01330 -CTB_RS01370 CTJTET1_RS01360 -CTB_RS01370 KW39_RS01350 -CTB_RS01370 JIEJKO_01330 -CTB_RS01370 120465 -CTB_RS01370 C15_RS0101380 -CTB_RS01370 SOTONK1_RS01345 -CTB_RS01370 ECS88FINAL_RS0101365 -CTB_RS01370 QSDFRQ_00264 -CTB_RS01370 A5291_RS01370 -CTB_RS01370 O169_RS01350 -CTB_RS01370 IaCS19096_RS01345 -CTB_RS01370 DU13_RS01360 -CTB_RS01370 7618901 -CTB_RS01370 SW2_RS01340 -CTB_RS01370 BKB95_RS01365 -CTB_RS01370 CBP48_RS02740 -CTB_RS01370 KW36_RS01345 -CTB_RS01370 ECS102511_RS01340 -CTB_RS01370 BKB96_RS01350 -CTB_RS01370 CTL2C_RS02695 -CTB_RS01370 AOT15_RS01020 -CTB_RS01370 BKB99_RS01350 -CTB_RS01370 L1224_RS01325 -CTB_RS01370 L1440_RS01325 -CTB_RS01370 AQ244_RS03525 -CTB_RS01370 BKB92_RS01350 -CTB_RS01370 CBP42_RS02740 -CTB_RS01370 SOTONIA3_RS01360 -CTB_RS01535 CTB_RS01535 -CTB_RS01535 E150_RS01505 -CTB_RS01535 L2BUCH2_RS01490 -CTB_RS01535 CTO_RS01530 -CTB_RS01535 FCS84708_RS01500 -CTB_RS01535 AP288_RS04570 -CTB_RS01535 AQ193_RS02485 -CTB_RS01535 BKB93_RS01515 -CTB_RS01535 CBP44_RS02905 -CTB_RS01535 AQ199_RS02195 -CTB_RS01535 L2BLST_RS01490 -CTB_RS01535 BBV13_RS01540 -CTB_RS01535 BW688_RS02910 -CTB_RS01535 G9768_RS01510 -CTB_RS01535 BKC02_RS01510 -CTB_RS01535 AKW53_RS03000 -CTB_RS01535 BBV16_RS01540 -CTB_RS01535 L3404_RS01485 -CTB_RS01535 BKC01_RS01515 -CTB_RS01535 gnl|Prokka|PADJNBJD_00296 -CTB_RS01535 DU10_RS01520 -CTB_RS01535 NILJEPDF_00296 -CTB_RS01535 LJHENM_01490 -CTB_RS01535 BKC03_RS01510 -CTB_RS01535 CTRC943_RS01490 -CTB_RS01535 CTJTET1_RS01520 -CTB_RS01535 KW39_RS01510 -CTB_RS01535 JIEJKO_01490 -CTB_RS01535 C15_RS0101550 -CTB_RS01535 SOTONK1_RS01510 -CTB_RS01535 ECS88FINAL_RS0101530 -CTB_RS01535 120439 -CTB_RS01535 QSDFRQ_00296 -CTB_RS01535 IaCS19096_RS01505 -CTB_RS01535 A5291_RS01535 -CTB_RS01535 O169_RS01515 -CTB_RS01535 DU13_RS01520 -CTB_RS01535 SW2_RS01500 -CTB_RS01535 BKB95_RS01525 -CTB_RS01535 CBP48_RS02900 -CTB_RS01535 7618918 -CTB_RS01535 KW36_RS01505 -CTB_RS01535 ECS102511_RS01500 -CTB_RS01535 AOT15_RS02505 -CTB_RS01535 BKB96_RS01510 -CTB_RS01535 CTL2C_RS02855 -CTB_RS01535 BKB99_RS01510 -CTB_RS01535 L1224_RS01485 -CTB_RS01535 L1440_RS01485 -CTB_RS01535 AQ244_RS03690 -CTB_RS01535 CBP42_RS02900 -CTB_RS01535 SOTONIA3_RS01520 -CTB_RS01535 BKB92_RS01515 -CTB_RS01695 CTB_RS01695 -CTB_RS01695 E150_RS01665 -CTB_RS01695 L2BUCH2_RS01650 -CTB_RS01695 CTO_RS01690 -CTB_RS01695 FCS84708_RS01660 -CTB_RS01695 CBP44_RS03065 -CTB_RS01695 AQ193_RS02325 -CTB_RS01695 BKB93_RS01675 -CTB_RS01695 L2BLST_RS01650 -CTB_RS01695 AQ199_RS02355 -CTB_RS01695 BW688_RS03070 -CTB_RS01695 BBV13_RS01700 -CTB_RS01695 G9768_RS01670 -CTB_RS01695 BKC02_RS01670 -CTB_RS01695 L3404_RS01645 -CTB_RS01695 AKW53_RS03160 -CTB_RS01695 BBV16_RS01700 -CTB_RS01695 BKC01_RS01675 -CTB_RS01695 gnl|Prokka|PADJNBJD_00328 -CTB_RS01695 NILJEPDF_00328 -CTB_RS01695 LJHENM_01650 -CTB_RS01695 CTRC943_RS01650 -CTB_RS01695 BKC03_RS01670 -CTB_RS01695 DU10_RS01685 -CTB_RS01695 CTJTET1_RS01680 -CTB_RS01695 KW39_RS01670 -CTB_RS01695 JIEJKO_01650 -CTB_RS01695 C15_RS0101710 -CTB_RS01695 SOTONK1_RS01670 -CTB_RS01695 ECS88FINAL_RS0101690 -CTB_RS01695 QSDFRQ_00328 -CTB_RS01695 IaCS19096_RS01665 -CTB_RS01695 A5291_RS01695 -CTB_RS01695 O169_RS01675 -CTB_RS01695 DU13_RS01680 -CTB_RS01695 120388 -CTB_RS01695 CBP48_RS03060 -CTB_RS01695 SW2_RS01660 -CTB_RS01695 AP288_RS01420 -CTB_RS01695 BKB95_RS01685 -CTB_RS01695 7618944 -CTB_RS01695 CTL2C_RS03015 -CTB_RS01695 KW36_RS01665 -CTB_RS01695 ECS102511_RS01660 -CTB_RS01695 AOT15_RS02665 -CTB_RS01695 BKB96_RS01670 -CTB_RS01695 L1224_RS01645 -CTB_RS01695 BKB99_RS01670 -CTB_RS01695 AQ244_RS01450 -CTB_RS01695 L1440_RS01645 -CTB_RS01695 CBP42_RS03060 -CTB_RS01695 SOTONIA3_RS01680 -CTB_RS01695 BKB92_RS01675 -CTB_RS01870 CTB_RS01870 -CTB_RS01870 SOTONIA3_RS01855 -CTB_RS01870 L2BUCH2_RS01820 -CTB_RS01870 BKB92_RS01860 -CTB_RS01870 AQ193_RS02140 -CTB_RS01870 CTO_RS01870 -CTB_RS01870 E150_RS01850 -CTB_RS01870 L2BLST_RS01820 -CTB_RS01870 FCS84708_RS01840 -CTB_RS01870 BW688_RS03250 -CTB_RS01870 BKB93_RS01860 -CTB_RS01870 CBP44_RS03255 -CTB_RS01870 BBV13_RS01875 -CTB_RS01870 AQ199_RS02540 -CTB_RS01870 G9768_RS01845 -CTB_RS01870 L3404_RS01820 -CTB_RS01870 BBV16_RS01875 -CTB_RS01870 BKC02_RS01850 -CTB_RS01870 BKC01_RS01850 -CTB_RS01870 AKW53_RS03345 -CTB_RS01870 gnl|Prokka|PADJNBJD_00363 -CTB_RS01870 NILJEPDF_00363 -CTB_RS01870 CTRC943_RS01825 -CTB_RS01870 LJHENM_01830 -CTB_RS01870 JIEJKO_01825 -CTB_RS01870 BKC03_RS01850 -CTB_RS01870 CTJTET1_RS01855 -CTB_RS01870 DU10_RS01870 -CTB_RS01870 QSDFRQ_00363 -CTB_RS01870 C15_RS0101885 -CTB_RS01870 SOTONK1_RS01845 -CTB_RS01870 A5291_RS01870 -CTB_RS01870 KW39_RS01855 -CTB_RS01870 IaCS19096_RS01840 -CTB_RS01870 AP288_RS01235 -CTB_RS01870 ECS88FINAL_RS0101875 -CTB_RS01870 DU13_RS01865 -CTB_RS01870 119473 -CTB_RS01870 O169_RS01855 -CTB_RS01870 7618525 -CTB_RS01870 CTL2C_RS03190 -CTB_RS01870 BKB95_RS01865 -CTB_RS01870 CBP48_RS03250 -CTB_RS01870 L1224_RS01820 -CTB_RS01870 KW36_RS01840 -CTB_RS01870 AOT15_RS02840 -CTB_RS01870 AQ244_RS01265 -CTB_RS01870 BKB96_RS01850 -CTB_RS01870 SW2_RS01845 -CTB_RS01870 BKB99_RS01850 -CTB_RS01870 L1440_RS01820 -CTB_RS01870 ECS102511_RS01845 -CTB_RS01870 CBP42_RS03260 -CTB_RS02040 CTB_RS02040 -CTB_RS02040 CBP42_RS03435 -CTB_RS02040 SOTONIA3_RS02025 -CTB_RS02040 L2BUCH2_RS01990 -CTB_RS02040 AQ193_RS01970 -CTB_RS02040 BKB92_RS02030 -CTB_RS02040 CTO_RS02040 -CTB_RS02040 E150_RS02020 -CTB_RS02040 L2BLST_RS01990 -CTB_RS02040 BW688_RS03420 -CTB_RS02040 FCS84708_RS02010 -CTB_RS02040 BBV13_RS02045 -CTB_RS02040 BKB93_RS02030 -CTB_RS02040 CBP44_RS03430 -CTB_RS02040 AQ199_RS02710 -CTB_RS02040 G9768_RS02015 -CTB_RS02040 BBV16_RS02045 -CTB_RS02040 L3404_RS01990 -CTB_RS02040 BKC02_RS02020 -CTB_RS02040 BKC01_RS02020 -CTB_RS02040 AKW53_RS03515 -CTB_RS02040 gnl|Prokka|PADJNBJD_00397 -CTB_RS02040 NILJEPDF_00397 -CTB_RS02040 CTRC943_RS01995 -CTB_RS02040 LJHENM_02000 -CTB_RS02040 JIEJKO_01995 -CTB_RS02040 BKC03_RS02020 -CTB_RS02040 CTJTET1_RS02025 -CTB_RS02040 AP288_RS01065 -CTB_RS02040 QSDFRQ_00397 -CTB_RS02040 C15_RS0102060 -CTB_RS02040 A5291_RS02040 -CTB_RS02040 SOTONK1_RS02015 -CTB_RS02040 DU10_RS02045 -CTB_RS02040 KW39_RS02025 -CTB_RS02040 IaCS19096_RS02010 -CTB_RS02040 ECS88FINAL_RS0102055 -CTB_RS02040 O169_RS02025 -CTB_RS02040 DU13_RS02040 -CTB_RS02040 7618976 -CTB_RS02040 AQ244_RS01095 -CTB_RS02040 CTL2C_RS03360 -CTB_RS02040 CBP48_RS03425 -CTB_RS02040 120334 -CTB_RS02040 L1224_RS01990 -CTB_RS02040 KW36_RS02010 -CTB_RS02040 AOT15_RS03010 -CTB_RS02040 BKB95_RS02040 -CTB_RS02040 BKB96_RS02020 -CTB_RS02040 SW2_RS02015 -CTB_RS02040 BKB99_RS02020 -CTB_RS02040 L1440_RS01990 -CTB_RS02040 ECS102511_RS02015 -CTB_RS02200 CTB_RS02200 -CTB_RS02200 CBP42_RS03600 -CTB_RS02200 SOTONIA3_RS02185 -CTB_RS02200 L2BUCH2_RS02150 -CTB_RS02200 AQ193_RS01810 -CTB_RS02200 BKB92_RS02195 -CTB_RS02200 CTO_RS02200 -CTB_RS02200 E150_RS02180 -CTB_RS02200 L2BLST_RS02150 -CTB_RS02200 BBV13_RS02210 -CTB_RS02200 BW688_RS03585 -CTB_RS02200 FCS84708_RS02170 -CTB_RS02200 BKB93_RS02195 -CTB_RS02200 CBP44_RS03595 -CTB_RS02200 AQ199_RS02870 -CTB_RS02200 BBV16_RS02210 -CTB_RS02200 G9768_RS02175 -CTB_RS02200 L3404_RS02150 -CTB_RS02200 BKC02_RS02185 -CTB_RS02200 BKC01_RS02185 -CTB_RS02200 AKW53_RS03675 -CTB_RS02200 gnl|Prokka|PADJNBJD_00429 -CTB_RS02200 NILJEPDF_00429 -CTB_RS02200 CTRC943_RS02155 -CTB_RS02200 LJHENM_02165 -CTB_RS02200 JIEJKO_02160 -CTB_RS02200 BKC03_RS02185 -CTB_RS02200 CTJTET1_RS02185 -CTB_RS02200 AP288_RS00905 -CTB_RS02200 QSDFRQ_00429 -CTB_RS02200 C15_RS0102220 -CTB_RS02200 A5291_RS02200 -CTB_RS02200 SOTONK1_RS02175 -CTB_RS02200 DU10_RS02210 -CTB_RS02200 KW39_RS02185 -CTB_RS02200 IaCS19096_RS02170 -CTB_RS02200 ECS88FINAL_RS0102215 -CTB_RS02200 O169_RS02185 -CTB_RS02200 DU13_RS02205 -CTB_RS02200 7618557 -CTB_RS02200 CTL2C_RS03520 -CTB_RS02200 AQ244_RS00935 -CTB_RS02200 BKB96_RS02185 -CTB_RS02200 CBP48_RS03590 -CTB_RS02200 119525 -CTB_RS02200 L1224_RS02150 -CTB_RS02200 KW36_RS02170 -CTB_RS02200 AOT15_RS03170 -CTB_RS02200 BKB95_RS02205 -CTB_RS02200 BKB99_RS02185 -CTB_RS02200 SW2_RS02175 -CTB_RS02200 L1440_RS02150 -CTB_RS02200 ECS102511_RS02175 -CTB_RS02365 CTB_RS02365 -CTB_RS02365 L2BUCH2_RS02310 -CTB_RS02365 BKB92_RS02360 -CTB_RS02365 SOTONIA3_RS02350 -CTB_RS02365 AQ193_RS01650 -CTB_RS02365 CTO_RS02365 -CTB_RS02365 E150_RS02340 -CTB_RS02365 BW688_RS03750 -CTB_RS02365 L2BLST_RS02315 -CTB_RS02365 FCS84708_RS02330 -CTB_RS02365 BBV13_RS02370 -CTB_RS02365 CBP44_RS03760 -CTB_RS02365 BKB93_RS02365 -CTB_RS02365 AQ199_RS03030 -CTB_RS02365 G9768_RS02335 -CTB_RS02365 BBV16_RS02375 -CTB_RS02365 L3404_RS02310 -CTB_RS02365 BKC02_RS02350 -CTB_RS02365 BKC01_RS02350 -CTB_RS02365 gnl|Prokka|PADJNBJD_00461 -CTB_RS02365 AKW53_RS03835 -CTB_RS02365 NILJEPDF_00461 -CTB_RS02365 LJHENM_02325 -CTB_RS02365 CTRC943_RS02315 -CTB_RS02365 JIEJKO_02325 -CTB_RS02365 BKC03_RS02350 -CTB_RS02365 QSDFRQ_00461 -CTB_RS02365 CTJTET1_RS02345 -CTB_RS02365 C15_RS0102385 -CTB_RS02365 SOTONK1_RS02335 -CTB_RS02365 DU10_RS02375 -CTB_RS02365 A5291_RS02365 -CTB_RS02365 KW39_RS02345 -CTB_RS02365 IaCS19096_RS02330 -CTB_RS02365 AP288_RS00745 -CTB_RS02365 ECS88FINAL_RS0102385 -CTB_RS02365 O169_RS02345 -CTB_RS02365 DU13_RS02370 -CTB_RS02365 7619005 -CTB_RS02365 BKB96_RS02355 -CTB_RS02365 BKB99_RS02350 -CTB_RS02365 CBP48_RS03755 -CTB_RS02365 120289 -CTB_RS02365 CTL2C_RS03685 -CTB_RS02365 KW36_RS02330 -CTB_RS02365 AOT15_RS03330 -CTB_RS02365 BKB95_RS02370 -CTB_RS02365 L1224_RS02315 -CTB_RS02365 AQ244_RS00775 -CTB_RS02365 SW2_RS02340 -CTB_RS02365 ECS102511_RS02335 -CTB_RS02365 L1440_RS02315 -CTB_RS02365 CBP42_RS03765 -CTB_RS02535 CTB_RS02535 -CTB_RS02535 SOTONIA3_RS02515 -CTB_RS02535 BKB92_RS02525 -CTB_RS02535 E150_RS02505 -CTB_RS02535 CTO_RS02535 -CTB_RS02535 AQ193_RS01485 -CTB_RS02535 BW688_RS03920 -CTB_RS02535 BBV13_RS02540 -CTB_RS02535 L2BLST_RS02480 -CTB_RS02535 FCS84708_RS02495 -CTB_RS02535 CBP44_RS03925 -CTB_RS02535 AOT15_RS03595 -CTB_RS02535 BBV16_RS02550 -CTB_RS02535 BKB93_RS02530 -CTB_RS02535 AQ199_RS03195 -CTB_RS02535 G9768_RS02500 -CTB_RS02535 L3404_RS02475 -CTB_RS02535 BKC02_RS02520 -CTB_RS02535 gnl|Prokka|PADJNBJD_00493 -CTB_RS02535 BKC01_RS02520 -CTB_RS02535 NILJEPDF_00493 -CTB_RS02535 LJHENM_02485 -CTB_RS02535 CTRC943_RS02480 -CTB_RS02535 AKW53_RS04715 -CTB_RS02535 JIEJKO_02485 -CTB_RS02535 QSDFRQ_00493 -CTB_RS02535 SOTONK1_RS02500 -CTB_RS02535 CTJTET1_RS02510 -CTB_RS02535 BKC03_RS02520 -CTB_RS02535 C15_RS0102560 -CTB_RS02535 KW39_RS02510 -CTB_RS02535 IaCS19096_RS02495 -CTB_RS02535 DU10_RS02540 -CTB_RS02535 A5291_RS02535 -CTB_RS02535 ECS88FINAL_RS0102555 -CTB_RS02535 O169_RS02510 -CTB_RS02535 AP288_RS00580 -CTB_RS02535 7618594 -CTB_RS02535 DU13_RS02535 -CTB_RS02535 BKB96_RS02525 -CTB_RS02535 BKB99_RS02520 -CTB_RS02535 CBP48_RS03920 -CTB_RS02535 CTL2C_RS03850 -CTB_RS02535 KW36_RS02495 -CTB_RS02535 BKB95_RS02535 -CTB_RS02535 L1224_RS02480 -CTB_RS02535 SW2_RS02505 -CTB_RS02535 ECS102511_RS02500 -CTB_RS02535 119582 -CTB_RS02535 L1440_RS02480 -CTB_RS02535 AQ244_RS00610 -CTB_RS02535 CBP42_RS03930 -CTB_RS02535 L2BUCH2_RS02480 -CTB_RS02710 CTB_RS02710 -CTB_RS02710 E150_RS02680 -CTB_RS02710 BW688_RS04095 -CTB_RS02710 CTO_RS02710 -CTB_RS02710 FCS84708_RS02670 -CTB_RS02710 L2BLST_RS02655 -CTB_RS02710 BBV13_RS02715 -CTB_RS02710 CBP44_RS04100 -CTB_RS02710 AQ193_RS01310 -CTB_RS02710 AQ199_RS03370 -CTB_RS02710 BKB93_RS02705 -CTB_RS02710 BBV16_RS02725 -CTB_RS02710 G9768_RS02675 -CTB_RS02710 L3404_RS02650 -CTB_RS02710 BKC02_RS02695 -CTB_RS02710 gnl|Prokka|PADJNBJD_00527 -CTB_RS02710 BKC01_RS02695 -CTB_RS02710 NILJEPDF_00527 -CTB_RS02710 LJHENM_02650 -CTB_RS02710 CTRC943_RS02655 -CTB_RS02710 AOT15_RS01475 -CTB_RS02710 JIEJKO_02655 -CTB_RS02710 QSDFRQ_00527 -CTB_RS02710 SOTONK1_RS02675 -CTB_RS02710 CTJTET1_RS02685 -CTB_RS02710 BKC03_RS02695 -CTB_RS02710 KW39_RS02685 -CTB_RS02710 C15_RS0102745 -CTB_RS02710 ECS88FINAL_RS0102740 -CTB_RS02710 IaCS19096_RS02670 -CTB_RS02710 AKW53_RS04540 -CTB_RS02710 DU10_RS02715 -CTB_RS02710 O169_RS02685 -CTB_RS02710 A5291_RS02710 -CTB_RS02710 DU13_RS02710 -CTB_RS02710 CBP48_RS04095 -CTB_RS02710 CTL2C_RS04025 -CTB_RS02710 KW36_RS02670 -CTB_RS02710 AP288_RS00405 -CTB_RS02710 BKB95_RS02710 -CTB_RS02710 BKB96_RS02700 -CTB_RS02710 BKB99_RS02695 -CTB_RS02710 7618605 -CTB_RS02710 SW2_RS02680 -CTB_RS02710 L1224_RS02655 -CTB_RS02710 ECS102511_RS02675 -CTB_RS02710 L1440_RS02655 -CTB_RS02710 AQ244_RS00435 -CTB_RS02710 CBP42_RS04105 -CTB_RS02710 119599 -CTB_RS02710 L2BUCH2_RS02655 -CTB_RS02710 SOTONIA3_RS02690 -CTB_RS02710 BKB92_RS02700 -CTB_RS02870 CTB_RS02870 -CTB_RS02870 E150_RS02840 -CTB_RS02870 BW688_RS04260 -CTB_RS02870 CTO_RS02870 -CTB_RS02870 FCS84708_RS02830 -CTB_RS02870 L2BLST_RS02815 -CTB_RS02870 BBV13_RS02875 -CTB_RS02870 CBP44_RS04265 -CTB_RS02870 AQ193_RS01150 -CTB_RS02870 AQ199_RS03530 -CTB_RS02870 BKB93_RS02870 -CTB_RS02870 BBV16_RS02885 -CTB_RS02870 G9768_RS02835 -CTB_RS02870 L3404_RS02810 -CTB_RS02870 BKC02_RS02860 -CTB_RS02870 gnl|Prokka|PADJNBJD_00559 -CTB_RS02870 NILJEPDF_00559 -CTB_RS02870 BKC01_RS02860 -CTB_RS02870 LJHENM_02815 -CTB_RS02870 CTRC943_RS02815 -CTB_RS02870 AOT15_RS01635 -CTB_RS02870 QSDFRQ_00559 -CTB_RS02870 JIEJKO_02820 -CTB_RS02870 SOTONK1_RS02835 -CTB_RS02870 CTJTET1_RS02845 -CTB_RS02870 BKC03_RS02860 -CTB_RS02870 KW39_RS02845 -CTB_RS02870 C15_RS0102905 -CTB_RS02870 ECS88FINAL_RS0102900 -CTB_RS02870 IaCS19096_RS02830 -CTB_RS02870 DU10_RS02880 -CTB_RS02870 O169_RS02845 -CTB_RS02870 A5291_RS02870 -CTB_RS02870 DU13_RS02875 -CTB_RS02870 CBP48_RS04260 -CTB_RS02870 7619070 -CTB_RS02870 CTL2C_RS04185 -CTB_RS02870 KW36_RS02830 -CTB_RS02870 AKW53_RS04060 -CTB_RS02870 AP288_RS00245 -CTB_RS02870 BKB95_RS02875 -CTB_RS02870 BKB96_RS02865 -CTB_RS02870 BKB99_RS02860 -CTB_RS02870 SW2_RS02840 -CTB_RS02870 L1224_RS02815 -CTB_RS02870 ECS102511_RS02835 -CTB_RS02870 L1440_RS02815 -CTB_RS02870 AQ244_RS00275 -CTB_RS02870 120184 -CTB_RS02870 CBP42_RS04270 -CTB_RS02870 L2BUCH2_RS02815 -CTB_RS02870 SOTONIA3_RS02850 -CTB_RS02870 BKB92_RS02865 -CTB_RS03200 CTB_RS03200 -CTB_RS03200 SOTONIA3_RS03180 -CTB_RS03200 BKB92_RS03195 -CTB_RS03200 BW688_RS04590 -CTB_RS03200 120139 -CTB_RS03200 E150_RS03170 -CTB_RS03200 CTO_RS03195 -CTB_RS03200 L2BLST_RS03140 -CTB_RS03200 CBP44_RS04595 -CTB_RS03200 FCS84708_RS03165 -CTB_RS03200 AQ193_RS00820 -CTB_RS03200 BBV13_RS03200 -CTB_RS03200 AQ199_RS03865 -CTB_RS03200 BBV16_RS03210 -CTB_RS03200 BKB93_RS03200 -CTB_RS03200 G9768_RS03165 -CTB_RS03200 L3404_RS03135 -CTB_RS03200 gnl|Prokka|PADJNBJD_00623 -CTB_RS03200 NILJEPDF_00623 -CTB_RS03200 LJHENM_03130 -CTB_RS03200 BKC02_RS03195 -CTB_RS03200 AOT15_RS03965 -CTB_RS03200 AP288_RS01535 -CTB_RS03200 CTRC943_RS03140 -CTB_RS03200 BKC01_RS03195 -CTB_RS03200 QSDFRQ_00623 -CTB_RS03200 JIEJKO_03140 -CTB_RS03200 SOTONK1_RS03165 -CTB_RS03200 CTJTET1_RS03180 -CTB_RS03200 BKC03_RS03195 -CTB_RS03200 KW39_RS03180 -CTB_RS03200 C15_RS0103230 -CTB_RS03200 ECS88FINAL_RS0103230 -CTB_RS03200 IaCS19096_RS03160 -CTB_RS03200 DU10_RS03210 -CTB_RS03200 A5291_RS03200 -CTB_RS03200 O169_RS03175 -CTB_RS03200 CTL2C_RS04510 -CTB_RS03200 DU13_RS03205 -CTB_RS03200 CBP48_RS04595 -CTB_RS03200 L1224_RS03140 -CTB_RS03200 KW36_RS03165 -CTB_RS03200 BKB95_RS03205 -CTB_RS03200 AKW53_RS04390 -CTB_RS03200 BKB96_RS03200 -CTB_RS03200 BKB99_RS03195 -CTB_RS03200 7619099 -CTB_RS03200 SW2_RS03170 -CTB_RS03200 L1440_RS03140 -CTB_RS03200 ECS102511_RS03165 -CTB_RS03200 CBP42_RS04600 -CTB_RS03200 L2BUCH2_RS03140 -CTB_RS03200 AQ244_RS04750 -CTB_RS03375 CTB_RS03375 -CTB_RS03375 E150_RS03345 -CTB_RS03375 SOTONIA3_RS03355 -CTB_RS03375 BW688_RS04760 -CTB_RS03375 CTO_RS03370 -CTB_RS03375 FCS84708_RS03335 -CTB_RS03375 BBV13_RS03375 -CTB_RS03375 L2BLST_RS03315 -CTB_RS03375 CBP44_RS04765 -CTB_RS03375 120107 -CTB_RS03375 AQ193_RS00650 -CTB_RS03375 AQ199_RS04035 -CTB_RS03375 BBV16_RS03385 -CTB_RS03375 BKB93_RS03370 -CTB_RS03375 G9768_RS03335 -CTB_RS03375 L3404_RS03310 -CTB_RS03375 gnl|Prokka|PADJNBJD_00656 -CTB_RS03375 AP288_RS01705 -CTB_RS03375 BKC02_RS03365 -CTB_RS03375 NILJEPDF_00657 -CTB_RS03375 LJHENM_03300 -CTB_RS03375 AOT15_RS04135 -CTB_RS03375 CTRC943_RS03315 -CTB_RS03375 JIEJKO_03305 -CTB_RS03375 BKC01_RS03365 -CTB_RS03375 QSDFRQ_00657 -CTB_RS03375 KW39_RS03355 -CTB_RS03375 BKC03_RS03365 -CTB_RS03375 DU10_RS03380 -CTB_RS03375 CTJTET1_RS03355 -CTB_RS03375 ECS88FINAL_RS0103400 -CTB_RS03375 SOTONK1_RS03335 -CTB_RS03375 O169_RS03350 -CTB_RS03375 IaCS19096_RS03330 -CTB_RS03375 C15_RS0103400 -CTB_RS03375 A5291_RS03380 -CTB_RS03375 DU13_RS03380 -CTB_RS03375 AKW53_RS00085 -CTB_RS03375 CTL2C_RS04685 -CTB_RS03375 CBP48_RS04765 -CTB_RS03375 SW2_RS03345 -CTB_RS03375 L1224_RS03315 -CTB_RS03375 KW36_RS03335 -CTB_RS03375 ECS102511_RS03335 -CTB_RS03375 BKB95_RS03385 -CTB_RS03375 7619118 -CTB_RS03375 L1440_RS03315 -CTB_RS03375 BKB96_RS03375 -CTB_RS03375 BKB99_RS03370 -CTB_RS03375 AQ244_RS04575 -CTB_RS03375 CBP42_RS04770 -CTB_RS03375 L2BUCH2_RS03315 -CTB_RS03375 BKB92_RS03365 -CTB_RS03550 CTB_RS03550 -CTB_RS03550 SOTONIA3_RS03530 -CTB_RS03550 E150_RS03515 -CTB_RS03550 CTO_RS03545 -CTB_RS03550 BBV13_RS03550 -CTB_RS03550 FCS84708_RS03505 -CTB_RS03550 AQ193_RS00480 -CTB_RS03550 L2BLST_RS03490 -CTB_RS03550 BBV16_RS03560 -CTB_RS03550 BW688_RS00110 -CTB_RS03550 7618218 -CTB_RS03550 AQ199_RS04205 -CTB_RS03550 BKB93_RS03545 -CTB_RS03550 119704 -CTB_RS03550 G9768_RS03510 -CTB_RS03550 gnl|Prokka|PADJNBJD_00690 -CTB_RS03550 L3404_RS03485 -CTB_RS03550 BKC02_RS03540 -CTB_RS03550 NILJEPDF_00691 -CTB_RS03550 LJHENM_03470 -CTB_RS03550 AOT15_RS04310 -CTB_RS03550 AP288_RS01875 -CTB_RS03550 JIEJKO_03475 -CTB_RS03550 BKC01_RS03540 -CTB_RS03550 QSDFRQ_00691 -CTB_RS03550 CTRC943_RS03495 -CTB_RS03550 BKC03_RS03540 -CTB_RS03550 CBP48_RS00110 -CTB_RS03550 CTJTET1_RS03530 -CTB_RS03550 KW39_RS03525 -CTB_RS03550 DU10_RS03555 -CTB_RS03550 SOTONK1_RS03510 -CTB_RS03550 ECS88FINAL_RS0103595 -CTB_RS03550 IaCS19096_RS03505 -CTB_RS03550 C15_RS0103585 -CTB_RS03550 A5291_RS03555 -CTB_RS03550 O169_RS03520 -CTB_RS03550 DU13_RS03555 -CTB_RS03550 KW36_RS03510 -CTB_RS03550 AKW53_RS00255 -CTB_RS03550 BKB95_RS03560 -CTB_RS03550 CBP42_RS00110 -CTB_RS03550 SW2_RS03515 -CTB_RS03550 CTL2C_RS00110 -CTB_RS03550 L1224_RS03490 -CTB_RS03550 ECS102511_RS03505 -CTB_RS03550 L1440_RS03490 -CTB_RS03550 BKB96_RS03550 -CTB_RS03550 BKB99_RS03545 -CTB_RS03550 AQ244_RS04400 -CTB_RS03550 CBP44_RS00110 -CTB_RS03550 L2BUCH2_RS03490 -CTB_RS03550 BKB92_RS03540 -CTB_RS03730 CTB_RS03730 -CTB_RS03730 SOTONIA3_RS03710 -CTB_RS03730 E150_RS03695 -CTB_RS03730 CTO_RS03725 -CTB_RS03730 BBV13_RS03730 -CTB_RS03730 FCS84708_RS03685 -CTB_RS03730 AQ193_RS00300 -CTB_RS03730 BBV16_RS03740 -CTB_RS03730 L2BLST_RS03670 -CTB_RS03730 119737 -CTB_RS03730 BW688_RS00295 -CTB_RS03730 7618239 -CTB_RS03730 AQ199_RS04385 -CTB_RS03730 BKB93_RS03730 -CTB_RS03730 G9768_RS03690 -CTB_RS03730 gnl|Prokka|PADJNBJD_00726 -CTB_RS03730 L3404_RS03665 -CTB_RS03730 BKC02_RS03725 -CTB_RS03730 NILJEPDF_00727 -CTB_RS03730 LJHENM_03660 -CTB_RS03730 AOT15_RS04490 -CTB_RS03730 AP288_RS02060 -CTB_RS03730 JIEJKO_03660 -CTB_RS03730 BKC01_RS03730 -CTB_RS03730 QSDFRQ_00727 -CTB_RS03730 CTRC943_RS03675 -CTB_RS03730 AKW53_RS00430 -CTB_RS03730 BKC03_RS03725 -CTB_RS03730 CTJTET1_RS03710 -CTB_RS03730 KW39_RS03705 -CTB_RS03730 DU10_RS03740 -CTB_RS03730 CBP48_RS00295 -CTB_RS03730 A5291_RS03735 -CTB_RS03730 SOTONK1_RS03690 -CTB_RS03730 IaCS19096_RS03685 -CTB_RS03730 DU13_RS03740 -CTB_RS03730 C15_RS0103785 -CTB_RS03730 ECS88FINAL_RS0103785 -CTB_RS03730 O169_RS03700 -CTB_RS03730 KW36_RS03690 -CTB_RS03730 BKB95_RS03745 -CTB_RS03730 CBP42_RS00295 -CTB_RS03730 SW2_RS03695 -CTB_RS03730 CTL2C_RS00290 -CTB_RS03730 L1224_RS03670 -CTB_RS03730 ECS102511_RS03685 -CTB_RS03730 BKB96_RS03730 -CTB_RS03730 BKB99_RS03725 -CTB_RS03730 L1440_RS03670 -CTB_RS03730 CBP44_RS00295 -CTB_RS03730 L2BUCH2_RS03670 -CTB_RS03730 AQ244_RS04220 -CTB_RS03730 BKB92_RS03725 -CTB_RS03895 CTB_RS03895 -CTB_RS03895 SOTONIA3_RS03875 -CTB_RS03895 E150_RS03860 -CTB_RS03895 CTO_RS03890 -CTB_RS03895 BBV13_RS03895 -CTB_RS03895 FCS84708_RS03850 -CTB_RS03895 7618693 -CTB_RS03895 L2BLST_RS03835 -CTB_RS03895 AQ193_RS00135 -CTB_RS03895 BBV16_RS03905 -CTB_RS03895 120039 -CTB_RS03895 BW688_RS00460 -CTB_RS03895 AQ199_RS04550 -CTB_RS03895 BKB93_RS03895 -CTB_RS03895 G9768_RS03855 -CTB_RS03895 gnl|Prokka|PADJNBJD_00758 -CTB_RS03895 L3404_RS03830 -CTB_RS03895 NILJEPDF_00759 -CTB_RS03895 BKC02_RS03890 -CTB_RS03895 LJHENM_03820 -CTB_RS03895 AOT15_RS04655 -CTB_RS03895 AP288_RS02225 -CTB_RS03895 JIEJKO_03820 -CTB_RS03895 QSDFRQ_00759 -CTB_RS03895 BKC01_RS03895 -CTB_RS03895 CTRC943_RS03840 -CTB_RS03895 AKW53_RS00595 -CTB_RS03895 BKC03_RS03890 -CTB_RS03895 CBP48_RS00460 -CTB_RS03895 CTJTET1_RS03875 -CTB_RS03895 KW39_RS03870 -CTB_RS03895 DU10_RS03905 -CTB_RS03895 A5291_RS03900 -CTB_RS03895 SOTONK1_RS03855 -CTB_RS03895 IaCS19096_RS03850 -CTB_RS03895 DU13_RS03905 -CTB_RS03895 C15_RS0103960 -CTB_RS03895 ECS88FINAL_RS0103960 -CTB_RS03895 O169_RS03865 -CTB_RS03895 KW36_RS03855 -CTB_RS03895 BKB95_RS03910 -CTB_RS03895 CBP42_RS00460 -CTB_RS03895 CTL2C_RS00455 -CTB_RS03895 L1224_RS03835 -CTB_RS03895 SW2_RS03860 -CTB_RS03895 L1440_RS03830 -CTB_RS03895 ECS102511_RS03850 -CTB_RS03895 BKB96_RS03895 -CTB_RS03895 BKB99_RS03890 -CTB_RS03895 CBP44_RS00460 -CTB_RS03895 L2BUCH2_RS03835 -CTB_RS03895 AQ244_RS04055 -CTB_RS03895 BKB92_RS03890 -CTB_RS04080 CTB_RS04080 -CTB_RS04080 BKB92_RS04075 -CTB_RS04080 SOTONIA3_RS04060 -CTB_RS04080 E150_RS04045 -CTB_RS04080 CTO_RS04075 -CTB_RS04080 BBV13_RS04080 -CTB_RS04080 FCS84708_RS04035 -CTB_RS04080 120003 -CTB_RS04080 L2BLST_RS04020 -CTB_RS04080 AP288_RS04745 -CTB_RS04080 BBV16_RS04090 -CTB_RS04080 7618716 -CTB_RS04080 BW688_RS00645 -CTB_RS04080 gnl|Prokka|PADJNBJD_00794 -CTB_RS04080 AQ199_RS04735 -CTB_RS04080 BKB93_RS04080 -CTB_RS04080 G9768_RS04040 -CTB_RS04080 L3404_RS04015 -CTB_RS04080 AQ193_RS04730 -CTB_RS04080 NILJEPDF_00795 -CTB_RS04080 LJHENM_04000 -CTB_RS04080 BKC02_RS04075 -CTB_RS04080 JIEJKO_04000 -CTB_RS04080 QSDFRQ_00795 -CTB_RS04080 BKC01_RS04080 -CTB_RS04080 CTRC943_RS04025 -CTB_RS04080 CTJTET1_RS04215 -CTB_RS04080 AKW53_RS00775 -CTB_RS04080 KW39_RS04055 -CTB_RS04080 BKC03_RS04075 -CTB_RS04080 CBP48_RS00645 -CTB_RS04080 CTJTET1_RS04060 -CTB_RS04080 DU10_RS04090 -CTB_RS04080 A5291_RS04085 -CTB_RS04080 SOTONK1_RS04040 -CTB_RS04080 ECS88FINAL_RS0104140 -CTB_RS04080 IaCS19096_RS04035 -CTB_RS04080 DU13_RS04090 -CTB_RS04080 C15_RS0104145 -CTB_RS04080 O169_RS04050 -CTB_RS04080 KW36_RS04040 -CTB_RS04080 AOT15_RS02345 -CTB_RS04080 BKB95_RS04095 -CTB_RS04080 CBP42_RS00645 -CTB_RS04080 CTL2C_RS00640 -CTB_RS04080 L1224_RS04020 -CTB_RS04080 BKB96_RS04080 -CTB_RS04080 SW2_RS04045 -CTB_RS04080 L1440_RS04015 -CTB_RS04080 ECS102511_RS04035 -CTB_RS04080 BKB99_RS04075 -CTB_RS04080 AQ244_RS03845 -CTB_RS04080 CBP44_RS00645 -CTB_RS04080 L2BUCH2_RS04020 -CTB_RS04260 CTB_RS04260 -CTB_RS04260 L2BUCH2_RS04205 -CTB_RS04260 SOTONIA3_RS04245 -CTB_RS04260 BKB92_RS04265 -CTB_RS04260 CTO_RS04255 -CTB_RS04260 AP288_RS02530 -CTB_RS04260 BBV13_RS04270 -CTB_RS04260 119981 -CTB_RS04260 E150_RS04235 -CTB_RS04260 AQ193_RS04545 -CTB_RS04260 7618730 -CTB_RS04260 L2BLST_RS04205 -CTB_RS04260 FCS84708_RS04225 -CTB_RS04260 AQ199_RS00155 -CTB_RS04260 BBV16_RS04275 -CTB_RS04260 AQ244_RS02535 -CTB_RS04260 BW688_RS00835 -CTB_RS04260 gnl|Prokka|PADJNBJD_00830 -CTB_RS04260 NILJEPDF_00831 -CTB_RS04260 G9768_RS04230 -CTB_RS04260 L3404_RS04200 -CTB_RS04260 BKB93_RS04270 -CTB_RS04260 LJHENM_04180 -CTB_RS04260 JIEJKO_04180 -CTB_RS04260 BKC02_RS04265 -CTB_RS04260 QSDFRQ_00831 -CTB_RS04260 AKW53_RS00945 -CTB_RS04260 BKC01_RS04270 -CTB_RS04260 CTRC943_RS04210 -CTB_RS04260 AOT15_RS01810 -CTB_RS04260 CTJTET1_RS04400 -CTB_RS04260 BKC03_RS04265 -CTB_RS04260 CBP48_RS00835 -CTB_RS04260 A5291_RS04265 -CTB_RS04260 KW39_RS04245 -CTB_RS04260 SOTONK1_RS04230 -CTB_RS04260 ECS88FINAL_RS0104315 -CTB_RS04260 IaCS19096_RS04220 -CTB_RS04260 DU10_RS04280 -CTB_RS04260 C15_RS0104340 -CTB_RS04260 DU13_RS04280 -CTB_RS04260 O169_RS04240 -CTB_RS04260 KW36_RS04225 -CTB_RS04260 BKB95_RS04285 -CTB_RS04260 CBP42_RS00835 -CTB_RS04260 CTL2C_RS00825 -CTB_RS04260 L1224_RS04205 -CTB_RS04260 BKB96_RS04270 -CTB_RS04260 L1440_RS04200 -CTB_RS04260 BKB99_RS04265 -CTB_RS04260 SW2_RS04235 -CTB_RS04260 ECS102511_RS04225 -CTB_RS04260 CBP44_RS00835 -CTB_RS04425 CTB_RS04425 -CTB_RS04425 SOTONIA3_RS04410 -CTB_RS04425 CTO_RS04420 -CTB_RS04425 BKB92_RS04435 -CTB_RS04425 L2BLST_RS04370 -CTB_RS04425 AQ193_RS04375 -CTB_RS04425 BBV13_RS04435 -CTB_RS04425 AP288_RS02700 -CTB_RS04425 BBV16_RS04440 -CTB_RS04425 E150_RS04405 -CTB_RS04425 gnl|Prokka|PADJNBJD_00861 -CTB_RS04425 BW688_RS01005 -CTB_RS04425 7618744 -CTB_RS04425 119960 -CTB_RS04425 FCS84708_RS04390 -CTB_RS04425 AQ199_RS00325 -CTB_RS04425 AQ244_RS02355 -CTB_RS04425 NILJEPDF_00862 -CTB_RS04425 LJHENM_04335 -CTB_RS04425 L3404_RS04365 -CTB_RS04425 G9768_RS04395 -CTB_RS04425 JIEJKO_04335 -CTB_RS04425 QSDFRQ_00862 -CTB_RS04425 BKB93_RS04440 -CTB_RS04425 BKC02_RS04435 -CTB_RS04425 CTRC943_RS04375 -CTB_RS04425 BKC01_RS04440 -CTB_RS04425 AKW53_RS01115 -CTB_RS04425 AOT15_RS01975 -CTB_RS04425 CTJTET1_RS04565 -CTB_RS04425 CBP48_RS01005 -CTB_RS04425 BKC03_RS04435 -CTB_RS04425 A5291_RS04430 -CTB_RS04425 KW39_RS04410 -CTB_RS04425 SOTONK1_RS04395 -CTB_RS04425 IaCS19096_RS04390 -CTB_RS04425 C15_RS0104505 -CTB_RS04425 ECS88FINAL_RS0104485 -CTB_RS04425 DU10_RS04450 -CTB_RS04425 KW36_RS04395 -CTB_RS04425 DU13_RS04450 -CTB_RS04425 O169_RS04410 -CTB_RS04425 CBP42_RS01005 -CTB_RS04425 CTL2C_RS00990 -CTB_RS04425 L1224_RS04370 -CTB_RS04425 BKB95_RS04455 -CTB_RS04425 L1440_RS04365 -CTB_RS04425 BKB96_RS04440 -CTB_RS04425 BKB99_RS04435 -CTB_RS04425 SW2_RS04400 -CTB_RS04425 ECS102511_RS04395 -CTB_RS04425 CBP44_RS01005 -CTB_RS04425 L2BUCH2_RS04370 -CTB_RS04585 CTB_RS04585 -CTB_RS04585 L2BUCH2_RS04535 -CTB_RS04585 SOTONIA3_RS04570 -CTB_RS04585 CTO_RS04580 -CTB_RS04585 BBV13_RS04600 -CTB_RS04585 BKB92_RS04615 -CTB_RS04585 AP288_RS02865 -CTB_RS04585 BBV16_RS04605 -CTB_RS04585 E150_RS04570 -CTB_RS04585 gnl|Prokka|PADJNBJD_00894 -CTB_RS04585 L2BLST_RS04535 -CTB_RS04585 AQ193_RS04210 -CTB_RS04585 FCS84708_RS04555 -CTB_RS04585 AQ199_RS00490 -CTB_RS04585 NILJEPDF_00895 -CTB_RS04585 BW688_RS01185 -CTB_RS04585 AQ244_RS02195 -CTB_RS04585 119946 -CTB_RS04585 JIEJKO_04500 -CTB_RS04585 7618753 -CTB_RS04585 QSDFRQ_00895 -CTB_RS04585 G9768_RS04555 -CTB_RS04585 LJHENM_04510 -CTB_RS04585 L3404_RS04530 -CTB_RS04585 BKB93_RS04620 -CTB_RS04585 BKC02_RS04610 -CTB_RS04585 AKW53_RS01280 -CTB_RS04585 BKC01_RS04615 -CTB_RS04585 CTRC943_RS04540 -CTB_RS04585 AOT15_RS02135 -CTB_RS04585 CTJTET1_RS04725 -CTB_RS04585 KW39_RS04575 -CTB_RS04585 BKC03_RS04610 -CTB_RS04585 CBP48_RS01185 -CTB_RS04585 A5291_RS04590 -CTB_RS04585 SOTONK1_RS04555 -CTB_RS04585 ECS88FINAL_RS0104665 -CTB_RS04585 IaCS19096_RS04550 -CTB_RS04585 C15_RS0104685 -CTB_RS04585 DU10_RS04630 -CTB_RS04585 O169_RS04575 -CTB_RS04585 KW36_RS04555 -CTB_RS04585 DU13_RS04630 -CTB_RS04585 BKB95_RS04630 -CTB_RS04585 CBP42_RS01185 -CTB_RS04585 CTL2C_RS01155 -CTB_RS04585 L1224_RS04535 -CTB_RS04585 BKB96_RS04615 -CTB_RS04585 L1440_RS04530 -CTB_RS04585 BKB99_RS04610 -CTB_RS04585 SW2_RS04565 -CTB_RS04585 ECS102511_RS04560 -CTB_RS04585 CBP44_RS01185 -CTB_RS04745 CTB_RS04745 -CTB_RS04745 SOTONIA3_RS04735 -CTB_RS04745 AP288_RS03030 -CTB_RS04745 BKB92_RS04775 -CTB_RS04745 gnl|Prokka|PADJNBJD_00925 -CTB_RS04745 CTO_RS04740 -CTB_RS04745 L2BLST_RS04700 -CTB_RS04745 BBV13_RS04760 -CTB_RS04745 E150_RS04735 -CTB_RS04745 BBV16_RS04765 -CTB_RS04745 NILJEPDF_00926 -CTB_RS04745 FCS84708_RS04720 -CTB_RS04745 AQ199_RS00655 -CTB_RS04745 BW688_RS01350 -CTB_RS04745 AQ193_RS04045 -CTB_RS04745 119905 -CTB_RS04745 JIEJKO_04655 -CTB_RS04745 QSDFRQ_00926 -CTB_RS04745 LJHENM_04665 -CTB_RS04745 L3404_RS04695 -CTB_RS04745 G9768_RS04720 -CTB_RS04745 AQ244_RS02030 -CTB_RS04745 7618348 -CTB_RS04745 BKB93_RS04780 -CTB_RS04745 BKC02_RS04770 -CTB_RS04745 CTRC943_RS04705 -CTB_RS04745 AKW53_RS01445 -CTB_RS04745 BKC01_RS04775 -CTB_RS04745 AOT15_RS02300 -CTB_RS04745 CTJTET1_RS04890 -CTB_RS04745 CBP48_RS01350 -CTB_RS04745 KW39_RS04740 -CTB_RS04745 BKC03_RS04770 -CTB_RS04745 SOTONK1_RS04720 -CTB_RS04745 A5291_RS04750 -CTB_RS04745 ECS88FINAL_RS0104820 -CTB_RS04745 IaCS19096_RS04715 -CTB_RS04745 C15_RS0104840 -CTB_RS04745 DU10_RS04790 -CTB_RS04745 O169_RS04740 -CTB_RS04745 KW36_RS04720 -CTB_RS04745 DU13_RS04790 -CTB_RS04745 CTL2C_RS01320 -CTB_RS04745 CBP42_RS01350 -CTB_RS04745 L1224_RS04700 -CTB_RS04745 BKB95_RS04790 -CTB_RS04745 L1440_RS04695 -CTB_RS04745 BKB96_RS04775 -CTB_RS04745 BKB99_RS04770 -CTB_RS04745 SW2_RS04730 -CTB_RS04745 ECS102511_RS04725 -CTB_RS04745 CBP44_RS01350 -CTB_RS04745 L2BUCH2_RS04700 -E150_RS00125 E150_RS00125 -E150_RS00125 L2BUCH2_RS00125 -E150_RS00125 BKB93_RS00130 -E150_RS00125 FCS84708_RS00125 -E150_RS00125 AP288_RS03195 -E150_RS00125 BBV13_RS00130 -E150_RS00125 AQ193_RS03880 -E150_RS00125 G9768_RS00125 -E150_RS00125 AQ199_RS00820 -E150_RS00125 BW688_RS01520 -E150_RS00125 L2BLST_RS00125 -E150_RS00125 AQ244_RS01865 -E150_RS00125 BKC02_RS00130 -E150_RS00125 BBV16_RS00130 -E150_RS00125 BKC01_RS00130 -E150_RS00125 gnl|Prokka|PADJNBJD_00026 -E150_RS00125 LJHENM_00130 -E150_RS00125 A5291_RS00125 -E150_RS00125 SOTONK1_RS00125 -E150_RS00125 JIEJKO_00125 -E150_RS00125 7618365 -E150_RS00125 NILJEPDF_00026 -E150_RS00125 L3404_RS00125 -E150_RS00125 IaCS19096_RS00125 -E150_RS00125 BKC03_RS00130 -E150_RS00125 C15_RS0100125 -E150_RS00125 AKW53_RS01610 -E150_RS00125 QSDFRQ_00026 -E150_RS00125 CTJTET1_RS00125 -E150_RS00125 DU10_RS00130 -E150_RS00125 CTRC943_RS00125 -E150_RS00125 O169_RS00125 -E150_RS00125 CBP48_RS01520 -E150_RS00125 ECS88FINAL_RS0100130 -E150_RS00125 DU13_RS00130 -E150_RS00125 KW39_RS00125 -E150_RS00125 KW36_RS00125 -E150_RS00125 BKB95_RS00130 -E150_RS00125 SW2_RS00125 -E150_RS00125 AOT15_RS00830 -E150_RS00125 ECS102511_RS00125 -E150_RS00125 CTB_RS00125 -E150_RS00125 CTL2C_RS01490 -E150_RS00125 CBP42_RS01520 -E150_RS00125 L1224_RS00125 -E150_RS00125 BKB96_RS00130 -E150_RS00125 BKB99_RS00130 -E150_RS00125 CTO_RS00125 -E150_RS00125 SOTONIA3_RS00125 -E150_RS00125 L1440_RS00125 -E150_RS00125 BKB92_RS00130 -E150_RS00125 119221 -E150_RS00125 CBP44_RS01525 -E150_RS00295 E150_RS00295 -E150_RS00295 L2BUCH2_RS00295 -E150_RS00295 BKB93_RS00300 -E150_RS00295 FCS84708_RS00295 -E150_RS00295 AP288_RS03365 -E150_RS00295 BBV13_RS00300 -E150_RS00295 AQ193_RS03700 -E150_RS00295 AQ199_RS00990 -E150_RS00295 AQ244_RS01695 -E150_RS00295 BW688_RS01690 -E150_RS00295 G9768_RS00295 -E150_RS00295 L2BLST_RS00295 -E150_RS00295 BKC02_RS00300 -E150_RS00295 BBV16_RS00300 -E150_RS00295 gnl|Prokka|PADJNBJD_00058 -E150_RS00295 NILJEPDF_00058 -E150_RS00295 LJHENM_00295 -E150_RS00295 BKC01_RS00300 -E150_RS00295 A5291_RS00295 -E150_RS00295 SOTONK1_RS00295 -E150_RS00295 L3404_RS00295 -E150_RS00295 JIEJKO_00295 -E150_RS00295 AKW53_RS01785 -E150_RS00295 QSDFRQ_00058 -E150_RS00295 IaCS19096_RS00295 -E150_RS00295 BKC03_RS00300 -E150_RS00295 C15_RS0100300 -E150_RS00295 DU10_RS00300 -E150_RS00295 7618802 -E150_RS00295 CTRC943_RS00295 -E150_RS00295 CTJTET1_RS00295 -E150_RS00295 O169_RS00295 -E150_RS00295 KW36_RS00295 -E150_RS00295 DU13_RS00305 -E150_RS00295 CBP48_RS01690 -E150_RS00295 ECS88FINAL_RS0100305 -E150_RS00295 KW39_RS00295 -E150_RS00295 BKB95_RS00300 -E150_RS00295 SW2_RS00295 -E150_RS00295 AOT15_RS00660 -E150_RS00295 ECS102511_RS00295 -E150_RS00295 CTL2C_RS01660 -E150_RS00295 CBP42_RS01690 -E150_RS00295 CTB_RS00295 -E150_RS00295 BKB96_RS00300 -E150_RS00295 L1224_RS00295 -E150_RS00295 BKB99_RS00300 -E150_RS00295 L1440_RS00295 -E150_RS00295 BKB92_RS00300 -E150_RS00295 CTO_RS00295 -E150_RS00295 SOTONIA3_RS00295 -E150_RS00295 CBP44_RS01695 -E150_RS00295 120628 -E150_RS00465 E150_RS00465 -E150_RS00465 CBP44_RS01870 -E150_RS00465 120599 -E150_RS00465 L2BUCH2_RS00465 -E150_RS00465 BKB93_RS00475 -E150_RS00465 FCS84708_RS00465 -E150_RS00465 AP288_RS03535 -E150_RS00465 AQ244_RS01525 -E150_RS00465 AQ193_RS03530 -E150_RS00465 AQ199_RS01160 -E150_RS00465 BBV13_RS00470 -E150_RS00465 L2BLST_RS00465 -E150_RS00465 BW688_RS01865 -E150_RS00465 G9768_RS00465 -E150_RS00465 BKC02_RS00475 -E150_RS00465 gnl|Prokka|PADJNBJD_00091 -E150_RS00465 LJHENM_00455 -E150_RS00465 BBV16_RS00470 -E150_RS00465 NILJEPDF_00091 -E150_RS00465 BKC01_RS00475 -E150_RS00465 A5291_RS00465 -E150_RS00465 JIEJKO_00460 -E150_RS00465 SOTONK1_RS00465 -E150_RS00465 L3404_RS00465 -E150_RS00465 AKW53_RS01955 -E150_RS00465 QSDFRQ_00091 -E150_RS00465 IaCS19096_RS00465 -E150_RS00465 BKC03_RS00475 -E150_RS00465 DU10_RS00475 -E150_RS00465 C15_RS0100470 -E150_RS00465 7618821 -E150_RS00465 CTRC943_RS00465 -E150_RS00465 CTJTET1_RS00465 -E150_RS00465 O169_RS00465 -E150_RS00465 DU13_RS00480 -E150_RS00465 ECS88FINAL_RS0100475 -E150_RS00465 KW39_RS00465 -E150_RS00465 KW36_RS00465 -E150_RS00465 CBP48_RS01865 -E150_RS00465 SW2_RS00465 -E150_RS00465 AOT15_RS00490 -E150_RS00465 BKB95_RS00475 -E150_RS00465 ECS102511_RS00465 -E150_RS00465 CTB_RS00465 -E150_RS00465 CTL2C_RS01830 -E150_RS00465 CBP42_RS01865 -E150_RS00465 BKB96_RS00475 -E150_RS00465 L1224_RS00465 -E150_RS00465 BKB99_RS00475 -E150_RS00465 BKB92_RS00475 -E150_RS00465 CTO_RS00465 -E150_RS00465 L1440_RS00465 -E150_RS00465 SOTONIA3_RS00465 -E150_RS00635 E150_RS00635 -E150_RS00635 L2BUCH2_RS00635 -E150_RS00635 CBP44_RS02040 -E150_RS00635 FCS84708_RS00635 -E150_RS00635 AP288_RS03705 -E150_RS00635 BKB93_RS00645 -E150_RS00635 119301 -E150_RS00635 AQ193_RS03360 -E150_RS00635 AQ199_RS01330 -E150_RS00635 BBV13_RS00645 -E150_RS00635 G9768_RS00635 -E150_RS00635 L2BLST_RS00635 -E150_RS00635 BW688_RS02035 -E150_RS00635 BBV16_RS00645 -E150_RS00635 BKC02_RS00645 -E150_RS00635 gnl|Prokka|PADJNBJD_00125 -E150_RS00635 LJHENM_00625 -E150_RS00635 AKW53_RS02130 -E150_RS00635 BKC01_RS00645 -E150_RS00635 NILJEPDF_00125 -E150_RS00635 A5291_RS00640 -E150_RS00635 L3404_RS00635 -E150_RS00635 SOTONK1_RS00635 -E150_RS00635 JIEJKO_00630 -E150_RS00635 QSDFRQ_00125 -E150_RS00635 IaCS19096_RS00635 -E150_RS00635 BKC03_RS00645 -E150_RS00635 C15_RS0100655 -E150_RS00635 CTRC943_RS00635 -E150_RS00635 CTJTET1_RS00635 -E150_RS00635 KW39_RS00635 -E150_RS00635 DU10_RS00645 -E150_RS00635 ECS88FINAL_RS0100655 -E150_RS00635 O169_RS00635 -E150_RS00635 DU13_RS00650 -E150_RS00635 7618417 -E150_RS00635 KW36_RS00635 -E150_RS00635 AOT15_RS00320 -E150_RS00635 CBP48_RS02035 -E150_RS00635 SW2_RS00635 -E150_RS00635 BKB95_RS00645 -E150_RS00635 ECS102511_RS00635 -E150_RS00635 CTL2C_RS02000 -E150_RS00635 CTB_RS00640 -E150_RS00635 L1224_RS00635 -E150_RS00635 AQ244_RS02810 -E150_RS00635 BKB96_RS00645 -E150_RS00635 CBP42_RS02035 -E150_RS00635 BKB99_RS00645 -E150_RS00635 L1440_RS00635 -E150_RS00635 BKB92_RS00645 -E150_RS00635 CTO_RS00640 -E150_RS00635 SOTONIA3_RS00635 -E150_RS00805 E150_RS00805 -E150_RS00805 FCS84708_RS00805 -E150_RS00805 AP288_RS03875 -E150_RS00805 BKB93_RS00815 -E150_RS00805 L2BUCH2_RS00810 -E150_RS00805 CBP44_RS02220 -E150_RS00805 120555 -E150_RS00805 AQ193_RS03190 -E150_RS00805 AQ199_RS01500 -E150_RS00805 BBV13_RS00815 -E150_RS00805 G9768_RS00810 -E150_RS00805 L2BLST_RS00810 -E150_RS00805 BW688_RS02215 -E150_RS00805 BBV16_RS00815 -E150_RS00805 BKC02_RS00815 -E150_RS00805 gnl|Prokka|PADJNBJD_00159 -E150_RS00805 LJHENM_00795 -E150_RS00805 AKW53_RS02300 -E150_RS00805 BKC01_RS00815 -E150_RS00805 NILJEPDF_00159 -E150_RS00805 A5291_RS00810 -E150_RS00805 SOTONK1_RS00805 -E150_RS00805 JIEJKO_00800 -E150_RS00805 L3404_RS00810 -E150_RS00805 QSDFRQ_00159 -E150_RS00805 CTJTET1_RS00810 -E150_RS00805 IaCS19096_RS00805 -E150_RS00805 BKC03_RS00815 -E150_RS00805 C15_RS0100835 -E150_RS00805 ECS88FINAL_RS0100830 -E150_RS00805 O169_RS00805 -E150_RS00805 DU13_RS00820 -E150_RS00805 CTRC943_RS00810 -E150_RS00805 KW36_RS00805 -E150_RS00805 AOT15_RS00150 -E150_RS00805 SW2_RS00805 -E150_RS00805 BKB95_RS00820 -E150_RS00805 7618848 -E150_RS00805 CBP48_RS02215 -E150_RS00805 ECS102511_RS00805 -E150_RS00805 CTB_RS00810 -E150_RS00805 CTL2C_RS02175 -E150_RS00805 AQ244_RS02980 -E150_RS00805 BKB96_RS00815 -E150_RS00805 BKB99_RS00815 -E150_RS00805 CTO_RS00810 -E150_RS00805 L1224_RS00810 -E150_RS00805 BKB92_RS00815 -E150_RS00805 CBP42_RS02215 -E150_RS00805 SOTONIA3_RS00810 -E150_RS00805 L1440_RS00810 -E150_RS01500 E150_RS01500 -E150_RS01500 L2BUCH2_RS01485 -E150_RS01500 CTO_RS01525 -E150_RS01500 FCS84708_RS01495 -E150_RS01500 AP288_RS04565 -E150_RS01500 BKB93_RS01510 -E150_RS01500 CBP44_RS02900 -E150_RS01500 AQ199_RS02190 -E150_RS01500 L2BLST_RS01485 -E150_RS01500 AQ193_RS02490 -E150_RS01500 BBV13_RS01535 -E150_RS01500 BW688_RS02905 -E150_RS01500 G9768_RS01505 -E150_RS01500 BKC02_RS01505 -E150_RS01500 AKW53_RS02995 -E150_RS01500 BBV16_RS01535 -E150_RS01500 L3404_RS01480 -E150_RS01500 BKC01_RS01510 -E150_RS01500 gnl|Prokka|PADJNBJD_00295 -E150_RS01500 DU10_RS01515 -E150_RS01500 NILJEPDF_00295 -E150_RS01500 LJHENM_01485 -E150_RS01500 BKC03_RS01505 -E150_RS01500 CTRC943_RS01485 -E150_RS01500 CTJTET1_RS01515 -E150_RS01500 KW39_RS01505 -E150_RS01500 JIEJKO_01485 -E150_RS01500 C15_RS0101545 -E150_RS01500 SOTONK1_RS01505 -E150_RS01500 ECS88FINAL_RS0101525 -E150_RS01500 119439 -E150_RS01500 QSDFRQ_00295 -E150_RS01500 IaCS19096_RS01500 -E150_RS01500 A5291_RS01530 -E150_RS01500 O169_RS01510 -E150_RS01500 DU13_RS01515 -E150_RS01500 SW2_RS01495 -E150_RS01500 BKB95_RS01520 -E150_RS01500 CBP48_RS02895 -E150_RS01500 7618503 -E150_RS01500 KW36_RS01500 -E150_RS01500 ECS102511_RS01495 -E150_RS01500 AOT15_RS02500 -E150_RS01500 BKB96_RS01505 -E150_RS01500 CTL2C_RS02850 -E150_RS01500 BKB99_RS01505 -E150_RS01500 L1224_RS01480 -E150_RS01500 L1440_RS01480 -E150_RS01500 AQ244_RS03685 -E150_RS01500 CBP42_RS02895 -E150_RS01500 SOTONIA3_RS01515 -E150_RS01500 BKB92_RS01510 -E150_RS01500 CTB_RS01530 -E150_RS01660 E150_RS01660 -E150_RS01660 L2BUCH2_RS01645 -E150_RS01660 CTO_RS01685 -E150_RS01660 FCS84708_RS01655 -E150_RS01660 CBP44_RS03060 -E150_RS01660 BKB93_RS01670 -E150_RS01660 L2BLST_RS01645 -E150_RS01660 AQ199_RS02350 -E150_RS01660 BW688_RS03065 -E150_RS01660 AQ193_RS02330 -E150_RS01660 BBV13_RS01695 -E150_RS01660 G9768_RS01665 -E150_RS01660 BKC02_RS01665 -E150_RS01660 L3404_RS01640 -E150_RS01660 AKW53_RS03155 -E150_RS01660 BBV16_RS01695 -E150_RS01660 BKC01_RS01670 -E150_RS01660 gnl|Prokka|PADJNBJD_00327 -E150_RS01660 NILJEPDF_00327 -E150_RS01660 LJHENM_01645 -E150_RS01660 CTRC943_RS01645 -E150_RS01660 BKC03_RS01665 -E150_RS01660 DU10_RS01680 -E150_RS01660 CTJTET1_RS01675 -E150_RS01660 KW39_RS01665 -E150_RS01660 JIEJKO_01645 -E150_RS01660 C15_RS0101705 -E150_RS01660 SOTONK1_RS01665 -E150_RS01660 ECS88FINAL_RS0101685 -E150_RS01660 QSDFRQ_00327 -E150_RS01660 IaCS19096_RS01660 -E150_RS01660 A5291_RS01690 -E150_RS01660 O169_RS01670 -E150_RS01660 DU13_RS01675 -E150_RS01660 120389 -E150_RS01660 CBP48_RS03055 -E150_RS01660 SW2_RS01655 -E150_RS01660 BKB95_RS01680 -E150_RS01660 7618943 -E150_RS01660 CTL2C_RS03010 -E150_RS01660 KW36_RS01660 -E150_RS01660 ECS102511_RS01655 -E150_RS01660 AOT15_RS02660 -E150_RS01660 BKB96_RS01665 -E150_RS01660 L1224_RS01640 -E150_RS01660 AP288_RS01425 -E150_RS01660 BKB99_RS01665 -E150_RS01660 L1440_RS01640 -E150_RS01660 AQ244_RS01455 -E150_RS01660 CBP42_RS03055 -E150_RS01660 SOTONIA3_RS01675 -E150_RS01660 BKB92_RS01670 -E150_RS01660 CTB_RS01690 -E150_RS01830 E150_RS01830 -E150_RS01830 L2BLST_RS01800 -E150_RS01830 FCS84708_RS01820 -E150_RS01830 BW688_RS03230 -E150_RS01830 BKB93_RS01840 -E150_RS01830 CBP44_RS03235 -E150_RS01830 BBV13_RS01855 -E150_RS01830 AQ199_RS02520 -E150_RS01830 G9768_RS01825 -E150_RS01830 AQ193_RS02160 -E150_RS01830 L3404_RS01800 -E150_RS01830 BBV16_RS01855 -E150_RS01830 BKC02_RS01830 -E150_RS01830 BKC01_RS01830 -E150_RS01830 AKW53_RS03325 -E150_RS01830 gnl|Prokka|PADJNBJD_00359 -E150_RS01830 NILJEPDF_00359 -E150_RS01830 CTRC943_RS01805 -E150_RS01830 LJHENM_01810 -E150_RS01830 JIEJKO_01805 -E150_RS01830 BKC03_RS01830 -E150_RS01830 CTJTET1_RS01835 -E150_RS01830 DU10_RS01850 -E150_RS01830 QSDFRQ_00359 -E150_RS01830 C15_RS0101865 -E150_RS01830 SOTONK1_RS01825 -E150_RS01830 A5291_RS01850 -E150_RS01830 KW39_RS01835 -E150_RS01830 IaCS19096_RS01820 -E150_RS01830 120361 -E150_RS01830 ECS88FINAL_RS0101855 -E150_RS01830 DU13_RS01845 -E150_RS01830 O169_RS01835 -E150_RS01830 7618960 -E150_RS01830 CTL2C_RS03170 -E150_RS01830 BKB95_RS01845 -E150_RS01830 CBP48_RS03230 -E150_RS01830 L1224_RS01800 -E150_RS01830 KW36_RS01820 -E150_RS01830 AOT15_RS02820 -E150_RS01830 BKB96_RS01830 -E150_RS01830 SW2_RS01825 -E150_RS01830 BKB99_RS01830 -E150_RS01830 L1440_RS01800 -E150_RS01830 ECS102511_RS01825 -E150_RS01830 AP288_RS01255 -E150_RS01830 CBP42_RS03240 -E150_RS01830 CTB_RS01850 -E150_RS01830 SOTONIA3_RS01835 -E150_RS01830 L2BUCH2_RS01800 -E150_RS01830 BKB92_RS01840 -E150_RS01830 AQ244_RS01285 -E150_RS01830 CTO_RS01850 -E150_RS01995 E150_RS01995 -E150_RS01995 L2BLST_RS01965 -E150_RS01995 BW688_RS03395 -E150_RS01995 FCS84708_RS01985 -E150_RS01995 BKB93_RS02005 -E150_RS01995 CBP44_RS03405 -E150_RS01995 AQ199_RS02685 -E150_RS01995 G9768_RS01990 -E150_RS01995 AQ193_RS01995 -E150_RS01995 L3404_RS01965 -E150_RS01995 BKC02_RS01995 -E150_RS01995 BKC01_RS01995 -E150_RS01995 AKW53_RS03490 -E150_RS01995 gnl|Prokka|PADJNBJD_00392 -E150_RS01995 NILJEPDF_00392 -E150_RS01995 CTRC943_RS01970 -E150_RS01995 LJHENM_01975 -E150_RS01995 JIEJKO_01970 -E150_RS01995 BKC03_RS01995 -E150_RS01995 CTJTET1_RS02000 -E150_RS01995 QSDFRQ_00392 -E150_RS01995 C15_RS0102035 -E150_RS01995 SOTONK1_RS01990 -E150_RS01995 DU10_RS02020 -E150_RS01995 KW39_RS02000 -E150_RS01995 IaCS19096_RS01985 -E150_RS01995 ECS88FINAL_RS0102025 -E150_RS01995 O169_RS02000 -E150_RS01995 DU13_RS02015 -E150_RS01995 7618540 -E150_RS01995 119499 -E150_RS01995 CTL2C_RS03335 -E150_RS01995 CBP48_RS03400 -E150_RS01995 L1224_RS01965 -E150_RS01995 KW36_RS01985 -E150_RS01995 AOT15_RS02985 -E150_RS01995 BKB95_RS02015 -E150_RS01995 BKB96_RS01995 -E150_RS01995 SW2_RS01990 -E150_RS01995 BKB99_RS01995 -E150_RS01995 L1440_RS01965 -E150_RS01995 ECS102511_RS01990 -E150_RS01995 AP288_RS01090 -E150_RS01995 CBP42_RS03410 -E150_RS01995 SOTONIA3_RS02000 -E150_RS01995 L2BUCH2_RS01965 -E150_RS01995 BKB92_RS02005 -E150_RS01995 AQ244_RS01120 -E150_RS02155 E150_RS02155 -E150_RS02155 L2BLST_RS02125 -E150_RS02155 BBV13_RS02185 -E150_RS02155 BW688_RS03560 -E150_RS02155 FCS84708_RS02145 -E150_RS02155 BKB93_RS02170 -E150_RS02155 CBP44_RS03570 -E150_RS02155 AQ199_RS02845 -E150_RS02155 BBV16_RS02185 -E150_RS02155 G9768_RS02150 -E150_RS02155 AQ193_RS01835 -E150_RS02155 L3404_RS02125 -E150_RS02155 BKC02_RS02160 -E150_RS02155 BKC01_RS02160 -E150_RS02155 AKW53_RS03650 -E150_RS02155 gnl|Prokka|PADJNBJD_00424 -E150_RS02155 NILJEPDF_00424 -E150_RS02155 CTRC943_RS02130 -E150_RS02155 LJHENM_02140 -E150_RS02155 JIEJKO_02135 -E150_RS02155 BKC03_RS02160 -E150_RS02155 CTJTET1_RS02160 -E150_RS02155 QSDFRQ_00424 -E150_RS02155 C15_RS0102195 -E150_RS02155 A5291_RS02175 -E150_RS02155 SOTONK1_RS02150 -E150_RS02155 DU10_RS02185 -E150_RS02155 KW39_RS02160 -E150_RS02155 IaCS19096_RS02145 -E150_RS02155 ECS88FINAL_RS0102190 -E150_RS02155 O169_RS02160 -E150_RS02155 DU13_RS02180 -E150_RS02155 7618992 -E150_RS02155 CTL2C_RS03495 -E150_RS02155 CBP48_RS03565 -E150_RS02155 120309 -E150_RS02155 L1224_RS02125 -E150_RS02155 KW36_RS02145 -E150_RS02155 AOT15_RS03145 -E150_RS02155 BKB95_RS02180 -E150_RS02155 BKB96_RS02160 -E150_RS02155 SW2_RS02150 -E150_RS02155 BKB99_RS02160 -E150_RS02155 L1440_RS02125 -E150_RS02155 ECS102511_RS02150 -E150_RS02155 AP288_RS00930 -E150_RS02155 CTB_RS02175 -E150_RS02155 CBP42_RS03575 -E150_RS02155 SOTONIA3_RS02160 -E150_RS02155 L2BUCH2_RS02125 -E150_RS02155 BKB92_RS02170 -E150_RS02155 CTO_RS02175 -E150_RS02155 AQ244_RS00960 -E150_RS02320 E150_RS02320 -E150_RS02320 BW688_RS03730 -E150_RS02320 L2BLST_RS02295 -E150_RS02320 FCS84708_RS02310 -E150_RS02320 BBV13_RS02350 -E150_RS02320 CBP44_RS03740 -E150_RS02320 BKB93_RS02345 -E150_RS02320 AQ199_RS03010 -E150_RS02320 G9768_RS02315 -E150_RS02320 AQ193_RS01670 -E150_RS02320 BBV16_RS02355 -E150_RS02320 L3404_RS02290 -E150_RS02320 BKC02_RS02330 -E150_RS02320 BKC01_RS02330 -E150_RS02320 gnl|Prokka|PADJNBJD_00457 -E150_RS02320 AKW53_RS03815 -E150_RS02320 NILJEPDF_00457 -E150_RS02320 LJHENM_02305 -E150_RS02320 CTRC943_RS02295 -E150_RS02320 JIEJKO_02305 -E150_RS02320 BKC03_RS02330 -E150_RS02320 QSDFRQ_00457 -E150_RS02320 CTJTET1_RS02325 -E150_RS02320 C15_RS0102365 -E150_RS02320 SOTONK1_RS02315 -E150_RS02320 DU10_RS02355 -E150_RS02320 A5291_RS02345 -E150_RS02320 KW39_RS02325 -E150_RS02320 IaCS19096_RS02310 -E150_RS02320 ECS88FINAL_RS0102365 -E150_RS02320 O169_RS02325 -E150_RS02320 DU13_RS02350 -E150_RS02320 7618576 -E150_RS02320 BKB96_RS02335 -E150_RS02320 BKB99_RS02330 -E150_RS02320 CBP48_RS03735 -E150_RS02320 119554 -E150_RS02320 CTL2C_RS03665 -E150_RS02320 KW36_RS02310 -E150_RS02320 AOT15_RS03310 -E150_RS02320 BKB95_RS02350 -E150_RS02320 L1224_RS02295 -E150_RS02320 SW2_RS02320 -E150_RS02320 ECS102511_RS02315 -E150_RS02320 L1440_RS02295 -E150_RS02320 AP288_RS00765 -E150_RS02320 CBP42_RS03745 -E150_RS02320 CTB_RS02345 -E150_RS02320 L2BUCH2_RS02290 -E150_RS02320 BKB92_RS02340 -E150_RS02320 SOTONIA3_RS02330 -E150_RS02320 AQ244_RS00795 -E150_RS02320 CTO_RS02345 -E150_RS02485 E150_RS02485 -E150_RS02485 CTO_RS02515 -E150_RS02485 BW688_RS03900 -E150_RS02485 BBV13_RS02520 -E150_RS02485 L2BLST_RS02460 -E150_RS02485 FCS84708_RS02475 -E150_RS02485 CBP44_RS03905 -E150_RS02485 BBV16_RS02530 -E150_RS02485 BKB93_RS02510 -E150_RS02485 AQ199_RS03175 -E150_RS02485 G9768_RS02480 -E150_RS02485 AQ193_RS01505 -E150_RS02485 L3404_RS02455 -E150_RS02485 BKC02_RS02500 -E150_RS02485 AOT15_RS03615 -E150_RS02485 gnl|Prokka|PADJNBJD_00489 -E150_RS02485 BKC01_RS02500 -E150_RS02485 NILJEPDF_00489 -E150_RS02485 LJHENM_02465 -E150_RS02485 CTRC943_RS02460 -E150_RS02485 JIEJKO_02465 -E150_RS02485 QSDFRQ_00489 -E150_RS02485 SOTONK1_RS02480 -E150_RS02485 CTJTET1_RS02490 -E150_RS02485 BKC03_RS02500 -E150_RS02485 C15_RS0102540 -E150_RS02485 KW39_RS02490 -E150_RS02485 IaCS19096_RS02475 -E150_RS02485 DU10_RS02520 -E150_RS02485 A5291_RS02515 -E150_RS02485 ECS88FINAL_RS0102535 -E150_RS02485 O169_RS02490 -E150_RS02485 7618590 -E150_RS02485 AKW53_RS04735 -E150_RS02485 DU13_RS02515 -E150_RS02485 BKB96_RS02505 -E150_RS02485 BKB99_RS02500 -E150_RS02485 CBP48_RS03900 -E150_RS02485 CTL2C_RS03830 -E150_RS02485 KW36_RS02475 -E150_RS02485 BKB95_RS02515 -E150_RS02485 L1224_RS02460 -E150_RS02485 SW2_RS02485 -E150_RS02485 ECS102511_RS02480 -E150_RS02485 119576 -E150_RS02485 L1440_RS02460 -E150_RS02485 AP288_RS00600 -E150_RS02485 CBP42_RS03910 -E150_RS02485 L2BUCH2_RS02460 -E150_RS02485 CTB_RS02515 -E150_RS02485 SOTONIA3_RS02495 -E150_RS02485 BKB92_RS02505 -E150_RS02485 AQ244_RS00630 -E150_RS02675 E150_RS02675 -E150_RS02675 BW688_RS04090 -E150_RS02675 CTO_RS02705 -E150_RS02675 FCS84708_RS02665 -E150_RS02675 L2BLST_RS02650 -E150_RS02675 BBV13_RS02710 -E150_RS02675 CBP44_RS04095 -E150_RS02675 AQ199_RS03365 -E150_RS02675 BKB93_RS02700 -E150_RS02675 AQ193_RS01315 -E150_RS02675 BBV16_RS02720 -E150_RS02675 G9768_RS02670 -E150_RS02675 L3404_RS02645 -E150_RS02675 BKC02_RS02690 -E150_RS02675 BKC01_RS02690 -E150_RS02675 CTRC943_RS02650 -E150_RS02675 AOT15_RS01470 -E150_RS02675 SOTONK1_RS02670 -E150_RS02675 CTJTET1_RS02680 -E150_RS02675 BKC03_RS02690 -E150_RS02675 KW39_RS02680 -E150_RS02675 C15_RS01000000104950 -E150_RS02675 ECS88FINAL_RS01000000104945 -E150_RS02675 IaCS19096_RS02665 -E150_RS02675 DU10_RS02710 -E150_RS02675 O169_RS02680 -E150_RS02675 A5291_RS02705 -E150_RS02675 AKW53_RS04545 -E150_RS02675 DU13_RS02705 -E150_RS02675 CBP48_RS04090 -E150_RS02675 CTL2C_RS04020 -E150_RS02675 KW36_RS02665 -E150_RS02675 BKB95_RS02705 -E150_RS02675 BKB96_RS02695 -E150_RS02675 BKB99_RS02690 -E150_RS02675 7619040 -E150_RS02675 SW2_RS02675 -E150_RS02675 L1224_RS02650 -E150_RS02675 ECS102511_RS02670 -E150_RS02675 AP288_RS00410 -E150_RS02675 L1440_RS02650 -E150_RS02675 CBP42_RS04100 -E150_RS02675 120231 -E150_RS02675 L2BUCH2_RS02650 -E150_RS02675 AQ244_RS00440 -E150_RS02675 SOTONIA3_RS02685 -E150_RS02675 BKB92_RS02695 -E150_RS02675 CTB_RS02705 -E150_RS02835 E150_RS02835 -E150_RS02835 BW688_RS04255 -E150_RS02835 CTO_RS02865 -E150_RS02835 FCS84708_RS02825 -E150_RS02835 L2BLST_RS02810 -E150_RS02835 BBV13_RS02870 -E150_RS02835 CBP44_RS04260 -E150_RS02835 AQ199_RS03525 -E150_RS02835 BKB93_RS02865 -E150_RS02835 AQ193_RS01155 -E150_RS02835 BBV16_RS02880 -E150_RS02835 G9768_RS02830 -E150_RS02835 L3404_RS02805 -E150_RS02835 BKC02_RS02855 -E150_RS02835 gnl|Prokka|PADJNBJD_00558 -E150_RS02835 NILJEPDF_00558 -E150_RS02835 BKC01_RS02855 -E150_RS02835 LJHENM_02810 -E150_RS02835 CTRC943_RS02810 -E150_RS02835 AOT15_RS01630 -E150_RS02835 QSDFRQ_00558 -E150_RS02835 JIEJKO_02815 -E150_RS02835 SOTONK1_RS02830 -E150_RS02835 CTJTET1_RS02840 -E150_RS02835 BKC03_RS02855 -E150_RS02835 KW39_RS02840 -E150_RS02835 C15_RS0102900 -E150_RS02835 ECS88FINAL_RS0102895 -E150_RS02835 IaCS19096_RS02825 -E150_RS02835 DU10_RS02875 -E150_RS02835 O169_RS02840 -E150_RS02835 A5291_RS02865 -E150_RS02835 DU13_RS02870 -E150_RS02835 CBP48_RS04255 -E150_RS02835 7619069 -E150_RS02835 CTL2C_RS04180 -E150_RS02835 KW36_RS02825 -E150_RS02835 AKW53_RS04055 -E150_RS02835 BKB95_RS02870 -E150_RS02835 BKB96_RS02860 -E150_RS02835 BKB99_RS02855 -E150_RS02835 SW2_RS02835 -E150_RS02835 L1224_RS02810 -E150_RS02835 ECS102511_RS02830 -E150_RS02835 AP288_RS00250 -E150_RS02835 L1440_RS02810 -E150_RS02835 120186 -E150_RS02835 CBP42_RS04265 -E150_RS02835 L2BUCH2_RS02810 -E150_RS02835 AQ244_RS00280 -E150_RS02835 SOTONIA3_RS02845 -E150_RS02835 BKB92_RS02860 -E150_RS02835 CTB_RS02865 -E150_RS02995 E150_RS02995 -E150_RS02995 CTO_RS03025 -E150_RS02995 L2BLST_RS02965 -E150_RS02995 CBP44_RS04425 -E150_RS02995 FCS84708_RS02990 -E150_RS02995 BBV13_RS03030 -E150_RS02995 AQ199_RS03690 -E150_RS02995 BBV16_RS03040 -E150_RS02995 BKB93_RS03030 -E150_RS02995 AQ193_RS00995 -E150_RS02995 G9768_RS02995 -E150_RS02995 L3404_RS02960 -E150_RS02995 gnl|Prokka|PADJNBJD_00590 -E150_RS02995 BKC02_RS03025 -E150_RS02995 NILJEPDF_00590 -E150_RS02995 LJHENM_02965 -E150_RS02995 AOT15_RS03795 -E150_RS02995 CTRC943_RS02965 -E150_RS02995 BKC01_RS03025 -E150_RS02995 QSDFRQ_00590 -E150_RS02995 JIEJKO_02975 -E150_RS02995 SOTONK1_RS02995 -E150_RS02995 CTJTET1_RS03005 -E150_RS02995 BKC03_RS03025 -E150_RS02995 KW39_RS03005 -E150_RS02995 C15_RS0103060 -E150_RS02995 ECS88FINAL_RS0103055 -E150_RS02995 IaCS19096_RS02990 -E150_RS02995 DU10_RS03040 -E150_RS02995 A5291_RS03025 -E150_RS02995 O169_RS03000 -E150_RS02995 CTL2C_RS04335 -E150_RS02995 DU13_RS03035 -E150_RS02995 CBP48_RS04425 -E150_RS02995 L1224_RS02965 -E150_RS02995 KW36_RS02990 -E150_RS02995 BKB95_RS03035 -E150_RS02995 AKW53_RS04220 -E150_RS02995 BKB96_RS03030 -E150_RS02995 BKB99_RS03025 -E150_RS02995 7618621 -E150_RS02995 SW2_RS02995 -E150_RS02995 L1440_RS02965 -E150_RS02995 ECS102511_RS02990 -E150_RS02995 AP288_RS00090 -E150_RS02995 CBP42_RS04430 -E150_RS02995 L2BUCH2_RS02965 -E150_RS02995 AQ244_RS00115 -E150_RS02995 CTB_RS03025 -E150_RS02995 SOTONIA3_RS03010 -E150_RS02995 BKB92_RS03025 -E150_RS02995 119624 -E150_RS02995 BW688_RS04420 -E150_RS03160 E150_RS03160 -E150_RS03160 AQ244_RS04760 -E150_RS03160 CTO_RS03185 -E150_RS03160 L2BLST_RS03130 -E150_RS03160 CBP44_RS04585 -E150_RS03160 FCS84708_RS03155 -E150_RS03160 BBV13_RS03190 -E150_RS03160 AQ199_RS03855 -E150_RS03160 BBV16_RS03200 -E150_RS03160 BKB93_RS03190 -E150_RS03160 AQ193_RS00830 -E150_RS03160 G9768_RS03155 -E150_RS03160 L3404_RS03125 -E150_RS03160 gnl|Prokka|PADJNBJD_00621 -E150_RS03160 NILJEPDF_00621 -E150_RS03160 LJHENM_03120 -E150_RS03160 BKC02_RS03185 -E150_RS03160 AOT15_RS03955 -E150_RS03160 AP288_RS01525 -E150_RS03160 CTRC943_RS03130 -E150_RS03160 BKC01_RS03185 -E150_RS03160 QSDFRQ_00621 -E150_RS03160 JIEJKO_03130 -E150_RS03160 SOTONK1_RS03155 -E150_RS03160 CTJTET1_RS03170 -E150_RS03160 BKC03_RS03185 -E150_RS03160 KW39_RS03170 -E150_RS03160 C15_RS0103220 -E150_RS03160 ECS88FINAL_RS0103220 -E150_RS03160 IaCS19096_RS03150 -E150_RS03160 DU10_RS03200 -E150_RS03160 A5291_RS03190 -E150_RS03160 O169_RS03165 -E150_RS03160 CTL2C_RS04500 -E150_RS03160 DU13_RS03195 -E150_RS03160 CBP48_RS04585 -E150_RS03160 L1224_RS03130 -E150_RS03160 KW36_RS03155 -E150_RS03160 BKB95_RS03195 -E150_RS03160 AKW53_RS04380 -E150_RS03160 BKB96_RS03190 -E150_RS03160 BKB99_RS03185 -E150_RS03160 7618640 -E150_RS03160 SW2_RS03160 -E150_RS03160 L1440_RS03130 -E150_RS03160 ECS102511_RS03155 -E150_RS03160 CBP42_RS04590 -E150_RS03160 L2BUCH2_RS03130 -E150_RS03160 CTB_RS03190 -E150_RS03160 SOTONIA3_RS03170 -E150_RS03160 BKB92_RS03185 -E150_RS03160 BW688_RS04580 -E150_RS03160 119653 -E150_RS03340 E150_RS03340 -E150_RS03340 SOTONIA3_RS03350 -E150_RS03340 BW688_RS04755 -E150_RS03340 CTO_RS03365 -E150_RS03340 FCS84708_RS03330 -E150_RS03340 BBV13_RS03370 -E150_RS03340 L2BLST_RS03310 -E150_RS03340 CBP44_RS04760 -E150_RS03340 119675 -E150_RS03340 AQ199_RS04030 -E150_RS03340 BBV16_RS03380 -E150_RS03340 BKB93_RS03365 -E150_RS03340 AQ193_RS00655 -E150_RS03340 G9768_RS03330 -E150_RS03340 L3404_RS03305 -E150_RS03340 gnl|Prokka|PADJNBJD_00655 -E150_RS03340 AP288_RS01700 -E150_RS03340 BKC02_RS03360 -E150_RS03340 NILJEPDF_00656 -E150_RS03340 LJHENM_03295 -E150_RS03340 AOT15_RS04130 -E150_RS03340 CTRC943_RS03310 -E150_RS03340 JIEJKO_03300 -E150_RS03340 BKC01_RS03360 -E150_RS03340 QSDFRQ_00656 -E150_RS03340 KW39_RS03350 -E150_RS03340 BKC03_RS03360 -E150_RS03340 DU10_RS03375 -E150_RS03340 CTJTET1_RS03350 -E150_RS03340 ECS88FINAL_RS0103395 -E150_RS03340 SOTONK1_RS03330 -E150_RS03340 O169_RS03345 -E150_RS03340 IaCS19096_RS03325 -E150_RS03340 C15_RS0103395 -E150_RS03340 A5291_RS03375 -E150_RS03340 DU13_RS03375 -E150_RS03340 AKW53_RS00080 -E150_RS03340 CTL2C_RS04680 -E150_RS03340 CBP48_RS04760 -E150_RS03340 SW2_RS03340 -E150_RS03340 L1224_RS03310 -E150_RS03340 KW36_RS03330 -E150_RS03340 ECS102511_RS03330 -E150_RS03340 BKB95_RS03380 -E150_RS03340 7618654 -E150_RS03340 L1440_RS03310 -E150_RS03340 BKB96_RS03370 -E150_RS03340 BKB99_RS03365 -E150_RS03340 CBP42_RS04765 -E150_RS03340 L2BUCH2_RS03310 -E150_RS03340 AQ244_RS04580 -E150_RS03340 BKB92_RS03360 -E150_RS03340 CTB_RS03370 -E150_RS03505 E150_RS03505 -E150_RS03505 CTO_RS03535 -E150_RS03505 BBV13_RS03540 -E150_RS03505 FCS84708_RS03495 -E150_RS03505 L2BLST_RS03480 -E150_RS03505 BBV16_RS03550 -E150_RS03505 BW688_RS00100 -E150_RS03505 7618216 -E150_RS03505 AQ199_RS04195 -E150_RS03505 BKB93_RS03535 -E150_RS03505 119701 -E150_RS03505 AQ193_RS00490 -E150_RS03505 G9768_RS03500 -E150_RS03505 gnl|Prokka|PADJNBJD_00688 -E150_RS03505 L3404_RS03475 -E150_RS03505 BKC02_RS03530 -E150_RS03505 NILJEPDF_00689 -E150_RS03505 LJHENM_03460 -E150_RS03505 AOT15_RS04300 -E150_RS03505 AP288_RS01865 -E150_RS03505 JIEJKO_03465 -E150_RS03505 BKC01_RS03530 -E150_RS03505 QSDFRQ_00689 -E150_RS03505 CTRC943_RS03485 -E150_RS03505 BKC03_RS03530 -E150_RS03505 CBP48_RS00100 -E150_RS03505 CTJTET1_RS03520 -E150_RS03505 KW39_RS03515 -E150_RS03505 DU10_RS03545 -E150_RS03505 SOTONK1_RS03500 -E150_RS03505 ECS88FINAL_RS0103585 -E150_RS03505 IaCS19096_RS03495 -E150_RS03505 C15_RS0103575 -E150_RS03505 A5291_RS03545 -E150_RS03505 O169_RS03510 -E150_RS03505 DU13_RS03545 -E150_RS03505 KW36_RS03500 -E150_RS03505 AKW53_RS00245 -E150_RS03505 BKB95_RS03550 -E150_RS03505 CBP42_RS00100 -E150_RS03505 SW2_RS03505 -E150_RS03505 CTL2C_RS00100 -E150_RS03505 L1224_RS03480 -E150_RS03505 ECS102511_RS03495 -E150_RS03505 L1440_RS03480 -E150_RS03505 BKB96_RS03540 -E150_RS03505 BKB99_RS03535 -E150_RS03505 CBP44_RS00100 -E150_RS03505 L2BUCH2_RS03480 -E150_RS03505 BKB92_RS03530 -E150_RS03505 CTB_RS03540 -E150_RS03505 SOTONIA3_RS03520 -E150_RS03505 AQ244_RS04410 -E150_RS03685 E150_RS03685 -E150_RS03685 120059 -E150_RS03685 AQ199_RS04375 -E150_RS03685 AQ193_RS00310 -E150_RS03685 gnl|Prokka|PADJNBJD_00724 -E150_RS03685 NILJEPDF_00725 -E150_RS03685 AP288_RS02045 -E150_RS03685 JIEJKO_03650 -E150_RS03685 QSDFRQ_00725 -E150_RS03685 DU10_RS03730 -E150_RS03685 ECS88FINAL_RS0103775 -E150_RS03685 KW36_RS03680 -E150_RS03685 SW2_RS03685 -E150_RS03685 L1224_RS03660 -E150_RS03685 ECS102511_RS03675 -E150_RS03685 L1440_RS03660 -E150_RS03685 FCS84708_RS03675 -E150_RS03685 AQ244_RS04230 -E150_RS03685 G9768_RS03680 -E150_RS03685 LJHENM_03650 -E150_RS03685 KW39_RS03695 -E150_RS03685 O169_RS03690 -E150_RS03685 L2BLST_RS03660 -E150_RS03685 BW688_RS00285 -E150_RS03685 7618681 -E150_RS03685 AOT15_RS04480 -E150_RS03685 CBP48_RS00285 -E150_RS03685 CBP42_RS00285 -E150_RS03685 CTL2C_RS00280 -E150_RS03685 CBP44_RS00285 -E150_RS03685 L2BUCH2_RS03660 -E150_RS03685 CTB_RS03720 -E150_RS03685 BKB93_RS03720 -E150_RS03685 CTO_RS03715 -E150_RS03685 BBV13_RS03720 -E150_RS03685 BBV16_RS03730 -E150_RS03685 L3404_RS03655 -E150_RS03685 BKC02_RS03715 -E150_RS03685 BKC01_RS03715 -E150_RS03685 CTRC943_RS03665 -E150_RS03685 BKC03_RS03715 -E150_RS03685 CTJTET1_RS03700 -E150_RS03685 A5291_RS03725 -E150_RS03685 SOTONK1_RS03680 -E150_RS03685 IaCS19096_RS03675 -E150_RS03685 C15_RS0103775 -E150_RS03685 BKB95_RS03735 -E150_RS03685 BKB96_RS03720 -E150_RS03685 BKB99_RS03715 -E150_RS03685 BKB92_RS03715 -E150_RS03685 SOTONIA3_RS03700 -E150_RS03850 E150_RS03850 -E150_RS03850 CTO_RS03880 -E150_RS03850 BBV13_RS03885 -E150_RS03850 FCS84708_RS03840 -E150_RS03850 AQ244_RS04065 -E150_RS03850 L2BLST_RS03825 -E150_RS03850 BBV16_RS03895 -E150_RS03850 7618258 -E150_RS03850 119766 -E150_RS03850 BW688_RS00450 -E150_RS03850 AQ199_RS04540 -E150_RS03850 BKB93_RS03885 -E150_RS03850 G9768_RS03845 -E150_RS03850 gnl|Prokka|PADJNBJD_00756 -E150_RS03850 L3404_RS03820 -E150_RS03850 AQ193_RS00145 -E150_RS03850 NILJEPDF_00757 -E150_RS03850 BKC02_RS03880 -E150_RS03850 LJHENM_03810 -E150_RS03850 AOT15_RS04645 -E150_RS03850 AP288_RS02215 -E150_RS03850 JIEJKO_03810 -E150_RS03850 QSDFRQ_00757 -E150_RS03850 BKC01_RS03885 -E150_RS03850 CTRC943_RS03830 -E150_RS03850 AKW53_RS00585 -E150_RS03850 BKC03_RS03880 -E150_RS03850 CBP48_RS00450 -E150_RS03850 CTJTET1_RS03865 -E150_RS03850 KW39_RS03860 -E150_RS03850 DU10_RS03895 -E150_RS03850 A5291_RS03890 -E150_RS03850 SOTONK1_RS03845 -E150_RS03850 IaCS19096_RS03840 -E150_RS03850 DU13_RS03895 -E150_RS03850 C15_RS0103950 -E150_RS03850 ECS88FINAL_RS0103950 -E150_RS03850 O169_RS03855 -E150_RS03850 KW36_RS03845 -E150_RS03850 BKB95_RS03900 -E150_RS03850 CBP42_RS00450 -E150_RS03850 CTL2C_RS00445 -E150_RS03850 L1224_RS03825 -E150_RS03850 SW2_RS03850 -E150_RS03850 L1440_RS03820 -E150_RS03850 ECS102511_RS03840 -E150_RS03850 BKB96_RS03885 -E150_RS03850 BKB99_RS03880 -E150_RS03850 CBP44_RS00450 -E150_RS03850 L2BUCH2_RS03825 -E150_RS03850 BKB92_RS03880 -E150_RS03850 CTB_RS03885 -E150_RS03850 SOTONIA3_RS03865 -E150_RS04030 E150_RS04030 -E150_RS04030 CTO_RS04060 -E150_RS04030 BBV13_RS04065 -E150_RS04030 FCS84708_RS04020 -E150_RS04030 120006 -E150_RS04030 L2BLST_RS04005 -E150_RS04030 AP288_RS04730 -E150_RS04030 BBV16_RS04075 -E150_RS04030 7618714 -E150_RS04030 BW688_RS00630 -E150_RS04030 gnl|Prokka|PADJNBJD_00791 -E150_RS04030 AQ199_RS04720 -E150_RS04030 BKB93_RS04065 -E150_RS04030 G9768_RS04025 -E150_RS04030 L3404_RS04000 -E150_RS04030 AQ193_RS04715 -E150_RS04030 NILJEPDF_00792 -E150_RS04030 LJHENM_03985 -E150_RS04030 BKC02_RS04060 -E150_RS04030 JIEJKO_03985 -E150_RS04030 QSDFRQ_00792 -E150_RS04030 BKC01_RS04065 -E150_RS04030 CTRC943_RS04010 -E150_RS04030 CTJTET1_RS04200 -E150_RS04030 AKW53_RS00760 -E150_RS04030 KW39_RS04040 -E150_RS04030 BKC03_RS04060 -E150_RS04030 CBP48_RS00630 -E150_RS04030 CTJTET1_RS04045 -E150_RS04030 DU10_RS04075 -E150_RS04030 A5291_RS04070 -E150_RS04030 SOTONK1_RS04025 -E150_RS04030 ECS88FINAL_RS0104125 -E150_RS04030 IaCS19096_RS04020 -E150_RS04030 DU13_RS04075 -E150_RS04030 C15_RS0104130 -E150_RS04030 O169_RS04035 -E150_RS04030 KW36_RS04025 -E150_RS04030 AOT15_RS02330 -E150_RS04030 BKB95_RS04080 -E150_RS04030 CBP42_RS00630 -E150_RS04030 CTL2C_RS00625 -E150_RS04030 L1224_RS04005 -E150_RS04030 SW2_RS04030 -E150_RS04030 L1440_RS04000 -E150_RS04030 ECS102511_RS04020 -E150_RS04030 BKB99_RS04060 -E150_RS04030 CBP44_RS00630 -E150_RS04030 L2BUCH2_RS04005 -E150_RS04030 CTB_RS04065 -E150_RS04030 BKB92_RS04060 -E150_RS04030 SOTONIA3_RS04045 -E150_RS04030 AQ244_RS03860 -E150_RS04210 E150_RS04210 -E150_RS04210 7618290 -E150_RS04210 L2BLST_RS04180 -E150_RS04210 FCS84708_RS04200 -E150_RS04210 AQ199_RS00130 -E150_RS04210 BBV16_RS04250 -E150_RS04210 BW688_RS00810 -E150_RS04210 gnl|Prokka|PADJNBJD_00825 -E150_RS04210 NILJEPDF_00826 -E150_RS04210 G9768_RS04205 -E150_RS04210 L3404_RS04175 -E150_RS04210 BKB93_RS04245 -E150_RS04210 LJHENM_04155 -E150_RS04210 JIEJKO_04155 -E150_RS04210 BKC02_RS04240 -E150_RS04210 QSDFRQ_00826 -E150_RS04210 AKW53_RS00920 -E150_RS04210 AQ193_RS04570 -E150_RS04210 BKC01_RS04245 -E150_RS04210 CTRC943_RS04185 -E150_RS04210 AOT15_RS01785 -E150_RS04210 CTJTET1_RS04375 -E150_RS04210 AQ244_RS02560 -E150_RS04210 BKC03_RS04240 -E150_RS04210 CBP48_RS00810 -E150_RS04210 A5291_RS04240 -E150_RS04210 KW39_RS04220 -E150_RS04210 SOTONK1_RS04205 -E150_RS04210 ECS88FINAL_RS0104290 -E150_RS04210 IaCS19096_RS04195 -E150_RS04210 DU10_RS04255 -E150_RS04210 C15_RS0104315 -E150_RS04210 DU13_RS04255 -E150_RS04210 O169_RS04215 -E150_RS04210 KW36_RS04200 -E150_RS04210 BKB95_RS04260 -E150_RS04210 CBP42_RS00810 -E150_RS04210 CTL2C_RS00800 -E150_RS04210 L1224_RS04180 -E150_RS04210 BKB96_RS04245 -E150_RS04210 L1440_RS04175 -E150_RS04210 BKB99_RS04240 -E150_RS04210 SW2_RS04210 -E150_RS04210 ECS102511_RS04200 -E150_RS04210 CBP44_RS00810 -E150_RS04210 CTB_RS04235 -E150_RS04210 L2BUCH2_RS04180 -E150_RS04210 SOTONIA3_RS04220 -E150_RS04210 BKB92_RS04240 -E150_RS04210 CTO_RS04230 -E150_RS04210 AP288_RS02505 -E150_RS04210 BBV13_RS04245 -E150_RS04210 119815 -E150_RS04375 E150_RS04375 -E150_RS04375 gnl|Prokka|PADJNBJD_00855 -E150_RS04375 BW688_RS00975 -E150_RS04375 7618310 -E150_RS04375 FCS84708_RS04360 -E150_RS04375 AQ199_RS00295 -E150_RS04375 119846 -E150_RS04375 NILJEPDF_00856 -E150_RS04375 LJHENM_04305 -E150_RS04375 L3404_RS04335 -E150_RS04375 G9768_RS04365 -E150_RS04375 JIEJKO_04305 -E150_RS04375 QSDFRQ_00856 -E150_RS04375 BKB93_RS04410 -E150_RS04375 BKC02_RS04405 -E150_RS04375 CTRC943_RS04345 -E150_RS04375 BKC01_RS04410 -E150_RS04375 AKW53_RS01085 -E150_RS04375 AOT15_RS01945 -E150_RS04375 AQ193_RS04405 -E150_RS04375 CTJTET1_RS04535 -E150_RS04375 CBP48_RS00975 -E150_RS04375 BKC03_RS04405 -E150_RS04375 A5291_RS04400 -E150_RS04375 KW39_RS04380 -E150_RS04375 AQ244_RS02385 -E150_RS04375 SOTONK1_RS04365 -E150_RS04375 IaCS19096_RS04360 -E150_RS04375 C15_RS0104475 -E150_RS04375 ECS88FINAL_RS0104455 -E150_RS04375 DU10_RS04420 -E150_RS04375 KW36_RS04365 -E150_RS04375 DU13_RS04420 -E150_RS04375 O169_RS04380 -E150_RS04375 CBP42_RS00975 -E150_RS04375 CTL2C_RS00960 -E150_RS04375 L1224_RS04340 -E150_RS04375 BKB95_RS04425 -E150_RS04375 L1440_RS04335 -E150_RS04375 BKB96_RS04410 -E150_RS04375 BKB99_RS04405 -E150_RS04375 SW2_RS04370 -E150_RS04375 ECS102511_RS04365 -E150_RS04375 CBP44_RS00975 -E150_RS04375 L2BUCH2_RS04340 -E150_RS04375 CTB_RS04395 -E150_RS04375 SOTONIA3_RS04380 -E150_RS04375 CTO_RS04390 -E150_RS04375 BKB92_RS04405 -E150_RS04375 L2BLST_RS04340 -E150_RS04375 BBV13_RS04405 -E150_RS04375 AP288_RS02670 -E150_RS04375 BBV16_RS04410 -E150_RS04710 E150_RS04710 -E150_RS04710 BBV16_RS04740 -E150_RS04710 NILJEPDF_00921 -E150_RS04710 FCS84708_RS04695 -E150_RS04710 AQ199_RS00630 -E150_RS04710 BW688_RS01325 -E150_RS04710 119921 -E150_RS04710 JIEJKO_04630 -E150_RS04710 QSDFRQ_00921 -E150_RS04710 LJHENM_04640 -E150_RS04710 L3404_RS04670 -E150_RS04710 7618771 -E150_RS04710 G9768_RS04695 -E150_RS04710 BKB93_RS04755 -E150_RS04710 BKC02_RS04745 -E150_RS04710 CTRC943_RS04680 -E150_RS04710 AKW53_RS01420 -E150_RS04710 AQ193_RS04070 -E150_RS04710 BKC01_RS04750 -E150_RS04710 AOT15_RS02275 -E150_RS04710 CTJTET1_RS04865 -E150_RS04710 CBP48_RS01325 -E150_RS04710 KW39_RS04715 -E150_RS04710 AQ244_RS02055 -E150_RS04710 BKC03_RS04745 -E150_RS04710 SOTONK1_RS04695 -E150_RS04710 A5291_RS04725 -E150_RS04710 ECS88FINAL_RS0104795 -E150_RS04710 IaCS19096_RS04690 -E150_RS04710 C15_RS0104815 -E150_RS04710 DU10_RS04765 -E150_RS04710 O169_RS04715 -E150_RS04710 KW36_RS04695 -E150_RS04710 DU13_RS04765 -E150_RS04710 CTL2C_RS01295 -E150_RS04710 CBP42_RS01325 -E150_RS04710 L1224_RS04675 -E150_RS04710 BKB95_RS04765 -E150_RS04710 L1440_RS04670 -E150_RS04710 BKB96_RS04750 -E150_RS04710 BKB99_RS04745 -E150_RS04710 SW2_RS04705 -E150_RS04710 ECS102511_RS04700 -E150_RS04710 CBP44_RS01325 -E150_RS04710 L2BUCH2_RS04675 -E150_RS04710 CTB_RS04720 -E150_RS04710 SOTONIA3_RS04710 -E150_RS04710 AP288_RS03005 -E150_RS04710 BKB92_RS04750 -E150_RS04710 gnl|Prokka|PADJNBJD_00920 -E150_RS04710 CTO_RS04715 -E150_RS04710 L2BLST_RS04675 -E150_RS04710 BBV13_RS04735 -G9768_RS00425 G9768_RS00425 -G9768_RS00425 BKC02_RS00435 -G9768_RS00425 BBV16_RS00430 -G9768_RS00425 A5291_RS00425 -G9768_RS00425 BKC01_RS00435 -G9768_RS00425 SOTONK1_RS00425 -G9768_RS00425 L3404_RS00425 -G9768_RS00425 IaCS19096_RS00425 -G9768_RS00425 BKC03_RS00435 -G9768_RS00425 C15_RS01000000104895 -G9768_RS00425 7618398 -G9768_RS00425 CTRC943_RS00425 -G9768_RS00425 CTJTET1_RS00425 -G9768_RS00425 KW36_RS00425 -G9768_RS00425 CBP48_RS01825 -G9768_RS00425 AQ244_RS01565 -G9768_RS00425 BKB95_RS00435 -G9768_RS00425 CTB_RS00425 -G9768_RS00425 CTL2C_RS01790 -G9768_RS00425 CBP42_RS01825 -G9768_RS00425 BKB96_RS00435 -G9768_RS00425 L1224_RS00425 -G9768_RS00425 BKB99_RS00435 -G9768_RS00425 CTO_RS00425 -G9768_RS00425 L1440_RS00425 -G9768_RS00425 SOTONIA3_RS00425 -G9768_RS00425 CBP44_RS01830 -G9768_RS00425 119271 -G9768_RS00425 L2BUCH2_RS00425 -G9768_RS00425 AOT15_RS00530 -G9768_RS00425 BBV13_RS00430 -G9768_RS00425 BW688_RS01825 -G9768_RS00770 G9768_RS00770 -G9768_RS00770 L2BLST_RS00770 -G9768_RS00770 BW688_RS02170 -G9768_RS00770 BBV16_RS00780 -G9768_RS00770 BKC02_RS00780 -G9768_RS00770 gnl|Prokka|PADJNBJD_00152 -G9768_RS00770 LJHENM_00760 -G9768_RS00770 AKW53_RS02265 -G9768_RS00770 BKC01_RS00780 -G9768_RS00770 NILJEPDF_00152 -G9768_RS00770 A5291_RS00775 -G9768_RS00770 L3404_RS00770 -G9768_RS00770 SOTONK1_RS00770 -G9768_RS00770 JIEJKO_00765 -G9768_RS00770 QSDFRQ_00152 -G9768_RS00770 CTJTET1_RS00770 -G9768_RS00770 IaCS19096_RS00770 -G9768_RS00770 BKC03_RS00780 -G9768_RS00770 C15_RS0100795 -G9768_RS00770 CTRC943_RS00770 -G9768_RS00770 ECS88FINAL_RS0100795 -G9768_RS00770 KW39_RS00770 -G9768_RS00770 DU10_RS00780 -G9768_RS00770 O169_RS00770 -G9768_RS00770 DU13_RS00785 -G9768_RS00770 KW36_RS00770 -G9768_RS00770 AQ193_RS03225 -G9768_RS00770 CBP48_RS02170 -G9768_RS00770 SW2_RS00770 -G9768_RS00770 BKB95_RS00780 -G9768_RS00770 7618845 -G9768_RS00770 ECS102511_RS00770 -G9768_RS00770 CTL2C_RS02135 -G9768_RS00770 CTB_RS00775 -G9768_RS00770 L1224_RS00770 -G9768_RS00770 AQ244_RS02945 -G9768_RS00770 BKB96_RS00780 -G9768_RS00770 CBP42_RS02170 -G9768_RS00770 BKB99_RS00780 -G9768_RS00770 CTO_RS00775 -G9768_RS00770 L1440_RS00770 -G9768_RS00770 BKB92_RS00780 -G9768_RS00770 SOTONIA3_RS00770 -G9768_RS00770 E150_RS00770 -G9768_RS00770 L2BUCH2_RS00770 -G9768_RS00770 AOT15_RS00185 -G9768_RS00770 CBP44_RS02175 -G9768_RS00770 FCS84708_RS00770 -G9768_RS00770 AP288_RS03840 -G9768_RS00770 BKB93_RS00780 -G9768_RS00770 120561 -G9768_RS00770 AQ199_RS01465 -G9768_RS00770 BBV13_RS00780 -G9768_RS00960 G9768_RS00960 -G9768_RS00960 BKC02_RS00955 -G9768_RS00960 L3404_RS00935 -G9768_RS00960 AKW53_RS02445 -G9768_RS00960 119355 -G9768_RS00960 AOT15_RS01410 -G9768_RS00960 BBV16_RS00985 -G9768_RS00960 BKC01_RS00955 -G9768_RS00960 DU10_RS00965 -G9768_RS00960 gnl|Prokka|PADJNBJD_00187 -G9768_RS00960 BKC03_RS00955 -G9768_RS00960 NILJEPDF_00187 -G9768_RS00960 LJHENM_00940 -G9768_RS00960 CTRC943_RS00940 -G9768_RS00960 CTJTET1_RS00970 -G9768_RS00960 C15_RS0100990 -G9768_RS00960 SOTONK1_RS00955 -G9768_RS00960 ECS88FINAL_RS0100975 -G9768_RS00960 KW39_RS00960 -G9768_RS00960 JIEJKO_00940 -G9768_RS00960 7618449 -G9768_RS00960 A5291_RS00980 -G9768_RS00960 IaCS19096_RS00955 -G9768_RS00960 QSDFRQ_00187 -G9768_RS00960 O169_RS00960 -G9768_RS00960 DU13_RS00965 -G9768_RS00960 SW2_RS00950 -G9768_RS00960 BKB95_RS00970 -G9768_RS00960 CBP48_RS02345 -G9768_RS00960 KW36_RS00955 -G9768_RS00960 ECS102511_RS00950 -G9768_RS00960 BKB96_RS00955 -G9768_RS00960 CTL2C_RS02305 -G9768_RS00960 BKB99_RS00955 -G9768_RS00960 L1224_RS00935 -G9768_RS00960 AQ193_RS03040 -G9768_RS00960 L1440_RS00935 -G9768_RS00960 AQ244_RS03135 -G9768_RS00960 BKB92_RS00955 -G9768_RS00960 CBP42_RS02345 -G9768_RS00960 SOTONIA3_RS00970 -G9768_RS00960 E150_RS00950 -G9768_RS00960 CTB_RS00980 -G9768_RS00960 L2BUCH2_RS00940 -G9768_RS00960 CTO_RS00980 -G9768_RS00960 FCS84708_RS00950 -G9768_RS00960 AP288_RS04020 -G9768_RS00960 BKB93_RS00955 -G9768_RS00960 CBP44_RS02350 -G9768_RS00960 AQ199_RS01645 -G9768_RS00960 L2BLST_RS00940 -G9768_RS00960 BW688_RS02350 -G9768_RS00960 BBV13_RS00985 -G9768_RS01130 G9768_RS01130 -G9768_RS01130 BKC02_RS01125 -G9768_RS01130 L3404_RS01105 -G9768_RS01130 AKW53_RS02615 -G9768_RS01130 AOT15_RS01240 -G9768_RS01130 BKC01_RS01125 -G9768_RS01130 120500 -G9768_RS01130 DU10_RS01135 -G9768_RS01130 gnl|Prokka|PADJNBJD_00221 -G9768_RS01130 BKC03_RS01125 -G9768_RS01130 NILJEPDF_00221 -G9768_RS01130 LJHENM_01110 -G9768_RS01130 CTRC943_RS01110 -G9768_RS01130 CTJTET1_RS01140 -G9768_RS01130 C15_RS0101160 -G9768_RS01130 SOTONK1_RS01125 -G9768_RS01130 ECS88FINAL_RS0101145 -G9768_RS01130 KW39_RS01130 -G9768_RS01130 JIEJKO_01110 -G9768_RS01130 IaCS19096_RS01125 -G9768_RS01130 7618879 -G9768_RS01130 QSDFRQ_00221 -G9768_RS01130 O169_RS01130 -G9768_RS01130 DU13_RS01135 -G9768_RS01130 SW2_RS01120 -G9768_RS01130 BKB95_RS01140 -G9768_RS01130 CBP48_RS02515 -G9768_RS01130 KW36_RS01125 -G9768_RS01130 ECS102511_RS01120 -G9768_RS01130 BKB96_RS01125 -G9768_RS01130 CTL2C_RS02475 -G9768_RS01130 BKB99_RS01125 -G9768_RS01130 L1224_RS01105 -G9768_RS01130 AQ193_RS02870 -G9768_RS01130 L1440_RS01105 -G9768_RS01130 AQ244_RS03305 -G9768_RS01130 BKB92_RS01125 -G9768_RS01130 CBP42_RS02515 -G9768_RS01130 SOTONIA3_RS01140 -G9768_RS01130 E150_RS01120 -G9768_RS01130 L2BUCH2_RS01110 -G9768_RS01130 FCS84708_RS01120 -G9768_RS01130 AP288_RS04190 -G9768_RS01130 BKB93_RS01125 -G9768_RS01130 CBP44_RS02520 -G9768_RS01130 AQ199_RS01815 -G9768_RS01130 L2BLST_RS01110 -G9768_RS01130 BW688_RS02520 -G9768_RS01130 A5291_RS01150 -G9768_RS01130 BBV16_RS01155 -G9768_RS01130 CTB_RS01150 -G9768_RS01130 CTO_RS01150 -G9768_RS01130 BBV13_RS01155 -G9768_RS01300 G9768_RS01300 -G9768_RS01300 BKC02_RS01295 -G9768_RS01300 BBV16_RS01325 -G9768_RS01300 L3404_RS01275 -G9768_RS01300 AKW53_RS02785 -G9768_RS01300 AOT15_RS01070 -G9768_RS01300 BKC01_RS01295 -G9768_RS01300 gnl|Prokka|PADJNBJD_00254 -G9768_RS01300 DU10_RS01305 -G9768_RS01300 NILJEPDF_00254 -G9768_RS01300 LJHENM_01275 -G9768_RS01300 BKC03_RS01295 -G9768_RS01300 CTRC943_RS01280 -G9768_RS01300 CTJTET1_RS01310 -G9768_RS01300 KW39_RS01300 -G9768_RS01300 JIEJKO_01275 -G9768_RS01300 119408 -G9768_RS01300 C15_RS0101330 -G9768_RS01300 SOTONK1_RS01295 -G9768_RS01300 ECS88FINAL_RS0101315 -G9768_RS01300 QSDFRQ_00254 -G9768_RS01300 A5291_RS01320 -G9768_RS01300 O169_RS01300 -G9768_RS01300 IaCS19096_RS01295 -G9768_RS01300 DU13_RS01305 -G9768_RS01300 7618483 -G9768_RS01300 SW2_RS01290 -G9768_RS01300 BKB95_RS01310 -G9768_RS01300 CBP48_RS02685 -G9768_RS01300 KW36_RS01295 -G9768_RS01300 ECS102511_RS01290 -G9768_RS01300 BKB96_RS01295 -G9768_RS01300 CTL2C_RS02645 -G9768_RS01300 BKB99_RS01295 -G9768_RS01300 L1224_RS01275 -G9768_RS01300 AQ193_RS02700 -G9768_RS01300 L1440_RS01275 -G9768_RS01300 AQ244_RS03475 -G9768_RS01300 BKB92_RS01295 -G9768_RS01300 CBP42_RS02685 -G9768_RS01300 SOTONIA3_RS01310 -G9768_RS01300 CTB_RS01320 -G9768_RS01300 E150_RS01290 -G9768_RS01300 L2BUCH2_RS01280 -G9768_RS01300 CTO_RS01320 -G9768_RS01300 FCS84708_RS01290 -G9768_RS01300 AP288_RS04360 -G9768_RS01300 BKB93_RS01295 -G9768_RS01300 CBP44_RS02690 -G9768_RS01300 AQ199_RS01985 -G9768_RS01300 L2BLST_RS01280 -G9768_RS01300 BBV13_RS01325 -G9768_RS01300 BW688_RS02690 -G9768_RS01460 G9768_RS01460 -G9768_RS01460 BKC02_RS01460 -G9768_RS01460 AKW53_RS02950 -G9768_RS01460 BBV16_RS01490 -G9768_RS01460 L3404_RS01435 -G9768_RS01460 BKC01_RS01465 -G9768_RS01460 gnl|Prokka|PADJNBJD_00286 -G9768_RS01460 DU10_RS01470 -G9768_RS01460 NILJEPDF_00286 -G9768_RS01460 LJHENM_01440 -G9768_RS01460 BKC03_RS01460 -G9768_RS01460 CTRC943_RS01440 -G9768_RS01460 CTJTET1_RS01470 -G9768_RS01460 KW39_RS01460 -G9768_RS01460 JIEJKO_01440 -G9768_RS01460 120446 -G9768_RS01460 C15_RS0101495 -G9768_RS01460 SOTONK1_RS01460 -G9768_RS01460 ECS88FINAL_RS0101480 -G9768_RS01460 QSDFRQ_00286 -G9768_RS01460 IaCS19096_RS01455 -G9768_RS01460 A5291_RS01485 -G9768_RS01460 O169_RS01465 -G9768_RS01460 DU13_RS01470 -G9768_RS01460 7618913 -G9768_RS01460 SW2_RS01450 -G9768_RS01460 BKB95_RS01475 -G9768_RS01460 CBP48_RS02850 -G9768_RS01460 KW36_RS01455 -G9768_RS01460 ECS102511_RS01450 -G9768_RS01460 AOT15_RS02455 -G9768_RS01460 BKB96_RS01460 -G9768_RS01460 CTL2C_RS02805 -G9768_RS01460 AQ193_RS02535 -G9768_RS01460 BKB99_RS01460 -G9768_RS01460 L1224_RS01435 -G9768_RS01460 L1440_RS01435 -G9768_RS01460 AQ244_RS03640 -G9768_RS01460 CBP42_RS02850 -G9768_RS01460 SOTONIA3_RS01470 -G9768_RS01460 BKB92_RS01465 -G9768_RS01460 CTB_RS01485 -G9768_RS01460 E150_RS01455 -G9768_RS01460 L2BUCH2_RS01440 -G9768_RS01460 CTO_RS01480 -G9768_RS01460 FCS84708_RS01450 -G9768_RS01460 AP288_RS04520 -G9768_RS01460 BKB93_RS01465 -G9768_RS01460 CBP44_RS02855 -G9768_RS01460 AQ199_RS02145 -G9768_RS01460 L2BLST_RS01440 -G9768_RS01460 BBV13_RS01490 -G9768_RS01460 BW688_RS02860 -G9768_RS01620 G9768_RS01620 -G9768_RS01620 BKC02_RS01620 -G9768_RS01620 L3404_RS01595 -G9768_RS01620 AKW53_RS03110 -G9768_RS01620 BBV16_RS01650 -G9768_RS01620 BKC01_RS01625 -G9768_RS01620 gnl|Prokka|PADJNBJD_00318 -G9768_RS01620 NILJEPDF_00318 -G9768_RS01620 LJHENM_01600 -G9768_RS01620 CTRC943_RS01600 -G9768_RS01620 BKC03_RS01620 -G9768_RS01620 DU10_RS01635 -G9768_RS01620 CTJTET1_RS01630 -G9768_RS01620 KW39_RS01620 -G9768_RS01620 JIEJKO_01600 -G9768_RS01620 C15_RS0101660 -G9768_RS01620 SOTONK1_RS01620 -G9768_RS01620 ECS88FINAL_RS0101640 -G9768_RS01620 120412 -G9768_RS01620 QSDFRQ_00318 -G9768_RS01620 IaCS19096_RS01615 -G9768_RS01620 A5291_RS01645 -G9768_RS01620 O169_RS01625 -G9768_RS01620 DU13_RS01630 -G9768_RS01620 CBP48_RS03010 -G9768_RS01620 7618935 -G9768_RS01620 SW2_RS01610 -G9768_RS01620 BKB95_RS01635 -G9768_RS01620 CTL2C_RS02965 -G9768_RS01620 KW36_RS01615 -G9768_RS01620 ECS102511_RS01610 -G9768_RS01620 AOT15_RS02615 -G9768_RS01620 BKB96_RS01620 -G9768_RS01620 L1224_RS01595 -G9768_RS01620 AQ193_RS02375 -G9768_RS01620 BKB99_RS01620 -G9768_RS01620 L1440_RS01595 -G9768_RS01620 CBP42_RS03010 -G9768_RS01620 AQ244_RS03800 -G9768_RS01620 SOTONIA3_RS01630 -G9768_RS01620 BKB92_RS01625 -G9768_RS01620 CTB_RS01645 -G9768_RS01620 E150_RS01615 -G9768_RS01620 L2BUCH2_RS01600 -G9768_RS01620 CTO_RS01640 -G9768_RS01620 FCS84708_RS01610 -G9768_RS01620 AP288_RS04680 -G9768_RS01620 CBP44_RS03015 -G9768_RS01620 BKB93_RS01625 -G9768_RS01620 L2BLST_RS01600 -G9768_RS01620 AQ199_RS02305 -G9768_RS01620 BW688_RS03020 -G9768_RS01620 BBV13_RS01650 -G9768_RS01960 G9768_RS01960 -G9768_RS01960 L3404_RS01935 -G9768_RS01960 BBV16_RS01990 -G9768_RS01960 BKC02_RS01965 -G9768_RS01960 AQ244_RS01150 -G9768_RS01960 BKC01_RS01965 -G9768_RS01960 AKW53_RS03460 -G9768_RS01960 gnl|Prokka|PADJNBJD_00386 -G9768_RS01960 NILJEPDF_00386 -G9768_RS01960 CTRC943_RS01940 -G9768_RS01960 LJHENM_01945 -G9768_RS01960 JIEJKO_01940 -G9768_RS01960 BKC03_RS01965 -G9768_RS01960 CTJTET1_RS01970 -G9768_RS01960 QSDFRQ_00386 -G9768_RS01960 C15_RS0102005 -G9768_RS01960 SOTONK1_RS01960 -G9768_RS01960 DU10_RS01990 -G9768_RS01960 A5291_RS01985 -G9768_RS01960 KW39_RS01970 -G9768_RS01960 IaCS19096_RS01955 -G9768_RS01960 ECS88FINAL_RS0101995 -G9768_RS01960 O169_RS01970 -G9768_RS01960 AQ193_RS02025 -G9768_RS01960 DU13_RS01985 -G9768_RS01960 7618535 -G9768_RS01960 119490 -G9768_RS01960 CTL2C_RS03305 -G9768_RS01960 L1224_RS01935 -G9768_RS01960 KW36_RS01955 -G9768_RS01960 AOT15_RS02955 -G9768_RS01960 BKB95_RS01985 -G9768_RS01960 BKB96_RS01965 -G9768_RS01960 CBP48_RS03370 -G9768_RS01960 SW2_RS01960 -G9768_RS01960 BKB99_RS01965 -G9768_RS01960 L1440_RS01935 -G9768_RS01960 ECS102511_RS01960 -G9768_RS01960 CTB_RS01985 -G9768_RS01960 SOTONIA3_RS01970 -G9768_RS01960 L2BUCH2_RS01935 -G9768_RS01960 BKB92_RS01975 -G9768_RS01960 CBP42_RS03380 -G9768_RS01960 CTO_RS01985 -G9768_RS01960 E150_RS01965 -G9768_RS01960 L2BLST_RS01935 -G9768_RS01960 BW688_RS03365 -G9768_RS01960 FCS84708_RS01955 -G9768_RS01960 BKB93_RS01975 -G9768_RS01960 BBV13_RS01990 -G9768_RS01960 CBP44_RS03375 -G9768_RS01960 AP288_RS01120 -G9768_RS01960 AQ199_RS02655 -G9768_RS02120 G9768_RS02120 -G9768_RS02120 BBV16_RS02155 -G9768_RS02120 L3404_RS02095 -G9768_RS02120 BKC02_RS02130 -G9768_RS02120 AQ244_RS00990 -G9768_RS02120 BKC01_RS02130 -G9768_RS02120 AKW53_RS03620 -G9768_RS02120 gnl|Prokka|PADJNBJD_00418 -G9768_RS02120 NILJEPDF_00418 -G9768_RS02120 CTRC943_RS02100 -G9768_RS02120 LJHENM_02110 -G9768_RS02120 JIEJKO_02105 -G9768_RS02120 BKC03_RS02130 -G9768_RS02120 CTJTET1_RS02130 -G9768_RS02120 QSDFRQ_00418 -G9768_RS02120 C15_RS0102165 -G9768_RS02120 A5291_RS02145 -G9768_RS02120 SOTONK1_RS02120 -G9768_RS02120 DU10_RS02155 -G9768_RS02120 KW39_RS02130 -G9768_RS02120 IaCS19096_RS02115 -G9768_RS02120 ECS88FINAL_RS0102160 -G9768_RS02120 O169_RS02130 -G9768_RS02120 AQ193_RS01865 -G9768_RS02120 DU13_RS02150 -G9768_RS02120 7618986 -G9768_RS02120 CTL2C_RS03465 -G9768_RS02120 CBP48_RS03535 -G9768_RS02120 120319 -G9768_RS02120 L1224_RS02095 -G9768_RS02120 KW36_RS02115 -G9768_RS02120 AOT15_RS03115 -G9768_RS02120 BKB95_RS02150 -G9768_RS02120 BKB96_RS02130 -G9768_RS02120 SW2_RS02120 -G9768_RS02120 BKB99_RS02130 -G9768_RS02120 L1440_RS02095 -G9768_RS02120 ECS102511_RS02120 -G9768_RS02120 CTB_RS02145 -G9768_RS02120 CBP42_RS03545 -G9768_RS02120 SOTONIA3_RS02130 -G9768_RS02120 L2BUCH2_RS02095 -G9768_RS02120 BKB92_RS02140 -G9768_RS02120 CTO_RS02145 -G9768_RS02120 E150_RS02125 -G9768_RS02120 L2BLST_RS02095 -G9768_RS02120 BW688_RS03530 -G9768_RS02120 FCS84708_RS02115 -G9768_RS02120 BBV13_RS02155 -G9768_RS02120 BKB93_RS02140 -G9768_RS02120 CBP44_RS03540 -G9768_RS02120 AP288_RS00960 -G9768_RS02120 AQ199_RS02815 -G9768_RS02285 G9768_RS02285 -G9768_RS02285 BBV16_RS02325 -G9768_RS02285 L3404_RS02260 -G9768_RS02285 BKC02_RS02300 -G9768_RS02285 BKC01_RS02300 -G9768_RS02285 gnl|Prokka|PADJNBJD_00451 -G9768_RS02285 AKW53_RS03785 -G9768_RS02285 AQ244_RS00825 -G9768_RS02285 NILJEPDF_00451 -G9768_RS02285 LJHENM_02275 -G9768_RS02285 CTRC943_RS02265 -G9768_RS02285 JIEJKO_02275 -G9768_RS02285 BKC03_RS02300 -G9768_RS02285 QSDFRQ_00451 -G9768_RS02285 CTJTET1_RS02295 -G9768_RS02285 C15_RS0102330 -G9768_RS02285 SOTONK1_RS02285 -G9768_RS02285 DU10_RS02325 -G9768_RS02285 A5291_RS02315 -G9768_RS02285 KW39_RS02295 -G9768_RS02285 IaCS19096_RS02280 -G9768_RS02285 ECS88FINAL_RS0102330 -G9768_RS02285 O169_RS02295 -G9768_RS02285 AQ193_RS01700 -G9768_RS02285 DU13_RS02320 -G9768_RS02285 7618574 -G9768_RS02285 BKB96_RS02305 -G9768_RS02285 BKB99_RS02300 -G9768_RS02285 CBP48_RS03705 -G9768_RS02285 119551 -G9768_RS02285 CTL2C_RS03635 -G9768_RS02285 KW36_RS02280 -G9768_RS02285 AOT15_RS03280 -G9768_RS02285 BKB95_RS02320 -G9768_RS02285 L1224_RS02265 -G9768_RS02285 SW2_RS02290 -G9768_RS02285 ECS102511_RS02285 -G9768_RS02285 L1440_RS02265 -G9768_RS02285 CBP42_RS03715 -G9768_RS02285 CTB_RS02315 -G9768_RS02285 L2BUCH2_RS02260 -G9768_RS02285 BKB92_RS02310 -G9768_RS02285 SOTONIA3_RS02300 -G9768_RS02285 CTO_RS02315 -G9768_RS02285 E150_RS02290 -G9768_RS02285 BW688_RS03700 -G9768_RS02285 L2BLST_RS02265 -G9768_RS02285 FCS84708_RS02280 -G9768_RS02285 BBV13_RS02320 -G9768_RS02285 CBP44_RS03710 -G9768_RS02285 BKB93_RS02315 -G9768_RS02285 AP288_RS00795 -G9768_RS02285 AQ199_RS02980 -G9768_RS02445 G9768_RS02445 -G9768_RS02445 L3404_RS02420 -G9768_RS02445 BKC02_RS02465 -G9768_RS02445 gnl|Prokka|PADJNBJD_00482 -G9768_RS02445 AKW53_RS03945 -G9768_RS02445 BKC01_RS02465 -G9768_RS02445 NILJEPDF_00482 -G9768_RS02445 AQ244_RS00665 -G9768_RS02445 LJHENM_02430 -G9768_RS02445 CTRC943_RS02425 -G9768_RS02445 JIEJKO_02430 -G9768_RS02445 QSDFRQ_00482 -G9768_RS02445 BKC03_RS02465 -G9768_RS02445 SOTONK1_RS02445 -G9768_RS02445 CTJTET1_RS02455 -G9768_RS02445 C15_RS0102505 -G9768_RS02445 DU10_RS02485 -G9768_RS02445 KW39_RS02455 -G9768_RS02445 IaCS19096_RS02440 -G9768_RS02445 A5291_RS02480 -G9768_RS02445 ECS88FINAL_RS0102500 -G9768_RS02445 7619016 -G9768_RS02445 O169_RS02455 -G9768_RS02445 AQ193_RS01540 -G9768_RS02445 DU13_RS02480 -G9768_RS02445 BKB96_RS02470 -G9768_RS02445 BKB99_RS02465 -G9768_RS02445 CBP48_RS03865 -G9768_RS02445 BKB95_RS02480 -G9768_RS02445 CTL2C_RS03795 -G9768_RS02445 KW36_RS02440 -G9768_RS02445 AOT15_RS03650 -G9768_RS02445 120270 -G9768_RS02445 L1224_RS02425 -G9768_RS02445 SW2_RS02450 -G9768_RS02445 ECS102511_RS02445 -G9768_RS02445 L1440_RS02425 -G9768_RS02445 CBP42_RS03875 -G9768_RS02445 L2BUCH2_RS02420 -G9768_RS02445 BKB92_RS02470 -G9768_RS02445 CTB_RS02480 -G9768_RS02445 SOTONIA3_RS02460 -G9768_RS02445 E150_RS02450 -G9768_RS02445 CTO_RS02480 -G9768_RS02445 BW688_RS03865 -G9768_RS02445 BBV13_RS02485 -G9768_RS02445 CBP44_RS03870 -G9768_RS02445 L2BLST_RS02425 -G9768_RS02445 FCS84708_RS02440 -G9768_RS02445 BKB93_RS02475 -G9768_RS02445 AP288_RS00635 -G9768_RS02445 BBV16_RS02490 -G9768_RS02445 AQ199_RS03140 -G9768_RS02630 G9768_RS02630 -G9768_RS02630 L3404_RS02605 -G9768_RS02630 BKC02_RS02650 -G9768_RS02630 AQ244_RS00480 -G9768_RS02630 BKC01_RS02650 -G9768_RS02630 gnl|Prokka|PADJNBJD_00519 -G9768_RS02630 NILJEPDF_00519 -G9768_RS02630 LJHENM_02610 -G9768_RS02630 CTRC943_RS02610 -G9768_RS02630 SOTONK1_RS02630 -G9768_RS02630 CTJTET1_RS02640 -G9768_RS02630 JIEJKO_02615 -G9768_RS02630 BKC03_RS02650 -G9768_RS02630 QSDFRQ_00519 -G9768_RS02630 KW39_RS02640 -G9768_RS02630 C15_RS0102695 -G9768_RS02630 ECS88FINAL_RS0102690 -G9768_RS02630 IaCS19096_RS02625 -G9768_RS02630 DU10_RS02670 -G9768_RS02630 O169_RS02640 -G9768_RS02630 A5291_RS02665 -G9768_RS02630 AQ193_RS01355 -G9768_RS02630 DU13_RS02665 -G9768_RS02630 CBP48_RS04050 -G9768_RS02630 CTL2C_RS03980 -G9768_RS02630 KW36_RS02625 -G9768_RS02630 AOT15_RS03465 -G9768_RS02630 BKB95_RS02665 -G9768_RS02630 BKB96_RS02655 -G9768_RS02630 BKB99_RS02650 -G9768_RS02630 7618604 -G9768_RS02630 SW2_RS02635 -G9768_RS02630 L1224_RS02610 -G9768_RS02630 ECS102511_RS02630 -G9768_RS02630 L1440_RS02610 -G9768_RS02630 CBP42_RS04060 -G9768_RS02630 119598 -G9768_RS02630 L2BUCH2_RS02610 -G9768_RS02630 SOTONIA3_RS02645 -G9768_RS02630 BKB92_RS02655 -G9768_RS02630 CTB_RS02665 -G9768_RS02630 E150_RS02635 -G9768_RS02630 AKW53_RS04585 -G9768_RS02630 BW688_RS04050 -G9768_RS02630 CTO_RS02665 -G9768_RS02630 FCS84708_RS02625 -G9768_RS02630 L2BLST_RS02610 -G9768_RS02630 BBV13_RS02670 -G9768_RS02630 CBP44_RS04055 -G9768_RS02630 AQ199_RS03325 -G9768_RS02630 BKB93_RS02660 -G9768_RS02630 AP288_RS00450 -G9768_RS02630 BBV16_RS02680 -G9768_RS02795 G9768_RS02795 -G9768_RS02795 L3404_RS02770 -G9768_RS02795 BKC02_RS02820 -G9768_RS02795 gnl|Prokka|PADJNBJD_00551 -G9768_RS02795 NILJEPDF_00551 -G9768_RS02795 AQ244_RS00315 -G9768_RS02795 BKC01_RS02820 -G9768_RS02795 LJHENM_02775 -G9768_RS02795 CTRC943_RS02775 -G9768_RS02795 AOT15_RS01595 -G9768_RS02795 QSDFRQ_00551 -G9768_RS02795 JIEJKO_02780 -G9768_RS02795 SOTONK1_RS02795 -G9768_RS02795 CTJTET1_RS02805 -G9768_RS02795 BKC03_RS02820 -G9768_RS02795 KW39_RS02805 -G9768_RS02795 C15_RS0102865 -G9768_RS02795 ECS88FINAL_RS0102860 -G9768_RS02795 IaCS19096_RS02790 -G9768_RS02795 DU10_RS02840 -G9768_RS02795 O169_RS02805 -G9768_RS02795 A5291_RS02830 -G9768_RS02795 AQ193_RS01190 -G9768_RS02795 DU13_RS02835 -G9768_RS02795 CBP48_RS04220 -G9768_RS02795 7619062 -G9768_RS02795 CTL2C_RS04145 -G9768_RS02795 KW36_RS02790 -G9768_RS02795 AKW53_RS04020 -G9768_RS02795 BKB95_RS02835 -G9768_RS02795 BKB96_RS02825 -G9768_RS02795 BKB99_RS02820 -G9768_RS02795 SW2_RS02800 -G9768_RS02795 L1224_RS02775 -G9768_RS02795 ECS102511_RS02795 -G9768_RS02795 L1440_RS02775 -G9768_RS02795 120197 -G9768_RS02795 CBP42_RS04230 -G9768_RS02795 L2BUCH2_RS02775 -G9768_RS02795 SOTONIA3_RS02810 -G9768_RS02795 BKB92_RS02825 -G9768_RS02795 CTB_RS02830 -G9768_RS02795 E150_RS02800 -G9768_RS02795 BW688_RS04220 -G9768_RS02795 CTO_RS02830 -G9768_RS02795 FCS84708_RS02790 -G9768_RS02795 L2BLST_RS02775 -G9768_RS02795 BBV13_RS02835 -G9768_RS02795 CBP44_RS04225 -G9768_RS02795 AQ199_RS03490 -G9768_RS02795 BKB93_RS02830 -G9768_RS02795 AP288_RS00285 -G9768_RS02795 BBV16_RS02845 -G9768_RS02960 G9768_RS02960 -G9768_RS02960 BKC02_RS02990 -G9768_RS02960 AOT15_RS03760 -G9768_RS02960 AQ244_RS00150 -G9768_RS02960 BKC01_RS02990 -G9768_RS02960 SOTONK1_RS02960 -G9768_RS02960 CTJTET1_RS02970 -G9768_RS02960 BKC03_RS02990 -G9768_RS02960 C15_RS01000000104955 -G9768_RS02960 KW39_RS02975 -G9768_RS02960 IaCS19096_RS02955 -G9768_RS02960 ECS88FINAL_RS01000000104950 -G9768_RS02960 DU10_RS03010 -G9768_RS02960 A5291_RS02995 -G9768_RS02960 O169_RS02970 -G9768_RS02960 AQ193_RS01025 -G9768_RS02960 KW36_RS02955 -G9768_RS02960 DU13_RS03005 -G9768_RS02960 BKB95_RS03005 -G9768_RS02960 BKB96_RS02995 -G9768_RS02960 BKB99_RS02990 -G9768_RS02960 AKW53_RS04190 -G9768_RS02960 SW2_RS02965 -G9768_RS02960 ECS102511_RS02960 -G9768_RS02960 SOTONIA3_RS02975 -G9768_RS02960 CTB_RS02995 -G9768_RS02960 BKB92_RS02995 -G9768_RS02960 E150_RS02965 -G9768_RS02960 CTO_RS02995 -G9768_RS02960 FCS84708_RS02960 -G9768_RS02960 BBV13_RS03000 -G9768_RS02960 AP288_RS00120 -G9768_RS02960 AQ199_RS03660 -G9768_RS02960 BBV16_RS03010 -G9768_RS02960 BKB93_RS03000 -G9768_RS03120 G9768_RS03120 -G9768_RS03120 L3404_RS03090 -G9768_RS03120 gnl|Prokka|PADJNBJD_00614 -G9768_RS03120 NILJEPDF_00614 -G9768_RS03120 LJHENM_03085 -G9768_RS03120 BKC02_RS03150 -G9768_RS03120 AOT15_RS03920 -G9768_RS03120 AP288_RS01490 -G9768_RS03120 CTRC943_RS03095 -G9768_RS03120 BKC01_RS03150 -G9768_RS03120 QSDFRQ_00614 -G9768_RS03120 JIEJKO_03095 -G9768_RS03120 AQ244_RS04795 -G9768_RS03120 SOTONK1_RS03120 -G9768_RS03120 CTJTET1_RS03135 -G9768_RS03120 BKC03_RS03150 -G9768_RS03120 KW39_RS03135 -G9768_RS03120 C15_RS0103185 -G9768_RS03120 ECS88FINAL_RS0103185 -G9768_RS03120 IaCS19096_RS03115 -G9768_RS03120 DU10_RS03165 -G9768_RS03120 A5291_RS03155 -G9768_RS03120 O169_RS03130 -G9768_RS03120 CTL2C_RS04465 -G9768_RS03120 AQ193_RS00865 -G9768_RS03120 DU13_RS03160 -G9768_RS03120 CBP48_RS04550 -G9768_RS03120 L1224_RS03095 -G9768_RS03120 KW36_RS03120 -G9768_RS03120 BKB95_RS03160 -G9768_RS03120 AKW53_RS04345 -G9768_RS03120 BKB96_RS03155 -G9768_RS03120 BKB99_RS03150 -G9768_RS03120 7618633 -G9768_RS03120 SW2_RS03125 -G9768_RS03120 L1440_RS03095 -G9768_RS03120 ECS102511_RS03120 -G9768_RS03120 CBP42_RS04555 -G9768_RS03120 L2BUCH2_RS03095 -G9768_RS03120 CTB_RS03155 -G9768_RS03120 SOTONIA3_RS03135 -G9768_RS03120 BKB92_RS03150 -G9768_RS03120 BW688_RS04545 -G9768_RS03120 119643 -G9768_RS03120 E150_RS03125 -G9768_RS03120 CTO_RS03150 -G9768_RS03120 L2BLST_RS03095 -G9768_RS03120 CBP44_RS04550 -G9768_RS03120 FCS84708_RS03120 -G9768_RS03120 BBV13_RS03155 -G9768_RS03120 AQ199_RS03820 -G9768_RS03120 BBV16_RS03165 -G9768_RS03120 BKB93_RS03155 -G9768_RS03290 G9768_RS03290 -G9768_RS03290 L3404_RS03260 -G9768_RS03290 gnl|Prokka|PADJNBJD_00647 -G9768_RS03290 AP288_RS01660 -G9768_RS03290 BKC02_RS03320 -G9768_RS03290 NILJEPDF_00648 -G9768_RS03290 LJHENM_03255 -G9768_RS03290 AOT15_RS04090 -G9768_RS03290 CTRC943_RS03265 -G9768_RS03290 AQ244_RS04625 -G9768_RS03290 JIEJKO_03260 -G9768_RS03290 BKC01_RS03320 -G9768_RS03290 QSDFRQ_00648 -G9768_RS03290 KW39_RS03305 -G9768_RS03290 BKC03_RS03320 -G9768_RS03290 CTJTET1_RS03305 -G9768_RS03290 ECS88FINAL_RS0103355 -G9768_RS03290 DU10_RS03335 -G9768_RS03290 SOTONK1_RS03290 -G9768_RS03290 O169_RS03300 -G9768_RS03290 IaCS19096_RS03285 -G9768_RS03290 C15_RS0103355 -G9768_RS03290 A5291_RS03330 -G9768_RS03290 AKW53_RS00040 -G9768_RS03290 DU13_RS03330 -G9768_RS03290 CTL2C_RS04635 -G9768_RS03290 AQ193_RS00695 -G9768_RS03290 CBP48_RS04720 -G9768_RS03290 7619112 -G9768_RS03290 SW2_RS03295 -G9768_RS03290 L1224_RS03265 -G9768_RS03290 KW36_RS03290 -G9768_RS03290 ECS102511_RS03290 -G9768_RS03290 L1440_RS03265 -G9768_RS03290 BKB95_RS03335 -G9768_RS03290 BKB96_RS03330 -G9768_RS03290 BKB99_RS03325 -G9768_RS03290 CBP42_RS04725 -G9768_RS03290 L2BUCH2_RS03265 -G9768_RS03290 BKB92_RS03320 -G9768_RS03290 CTB_RS03330 -G9768_RS03290 E150_RS03295 -G9768_RS03290 SOTONIA3_RS03310 -G9768_RS03290 BW688_RS04715 -G9768_RS03290 CTO_RS03325 -G9768_RS03290 FCS84708_RS03290 -G9768_RS03290 BBV13_RS03330 -G9768_RS03290 L2BLST_RS03265 -G9768_RS03290 CBP44_RS04720 -G9768_RS03290 120116 -G9768_RS03290 AQ199_RS03990 -G9768_RS03290 BBV16_RS03340 -G9768_RS03290 BKB93_RS03325 -G9768_RS03635 G9768_RS03635 -G9768_RS03635 gnl|Prokka|PADJNBJD_00715 -G9768_RS03635 L3404_RS03610 -G9768_RS03635 BKC02_RS03665 -G9768_RS03635 NILJEPDF_00716 -G9768_RS03635 LJHENM_03600 -G9768_RS03635 AOT15_RS04435 -G9768_RS03635 AP288_RS02000 -G9768_RS03635 JIEJKO_03605 -G9768_RS03635 BKC01_RS03665 -G9768_RS03635 QSDFRQ_00716 -G9768_RS03635 CTRC943_RS03620 -G9768_RS03635 AQ244_RS04275 -G9768_RS03635 BKC03_RS03665 -G9768_RS03635 CBP48_RS00235 -G9768_RS03635 CTJTET1_RS03655 -G9768_RS03635 KW39_RS03650 -G9768_RS03635 DU10_RS03680 -G9768_RS03635 SOTONK1_RS03635 -G9768_RS03635 ECS88FINAL_RS0103725 -G9768_RS03635 IaCS19096_RS03630 -G9768_RS03635 C15_RS0103715 -G9768_RS03635 A5291_RS03680 -G9768_RS03635 O169_RS03645 -G9768_RS03635 DU13_RS03680 -G9768_RS03635 KW36_RS03635 -G9768_RS03635 AKW53_RS00385 -G9768_RS03635 AQ193_RS00355 -G9768_RS03635 BKB95_RS03685 -G9768_RS03635 CBP42_RS00235 -G9768_RS03635 SW2_RS03640 -G9768_RS03635 CTL2C_RS00235 -G9768_RS03635 L1224_RS03615 -G9768_RS03635 ECS102511_RS03630 -G9768_RS03635 L1440_RS03615 -G9768_RS03635 BKB96_RS03675 -G9768_RS03635 BKB99_RS03670 -G9768_RS03635 CBP44_RS00235 -G9768_RS03635 L2BUCH2_RS03615 -G9768_RS03635 BKB92_RS03665 -G9768_RS03635 CTB_RS03675 -G9768_RS03635 SOTONIA3_RS03655 -G9768_RS03635 E150_RS03640 -G9768_RS03635 CTO_RS03670 -G9768_RS03635 BBV13_RS03675 -G9768_RS03635 FCS84708_RS03630 -G9768_RS03635 L2BLST_RS03615 -G9768_RS03635 BBV16_RS03685 -G9768_RS03635 BW688_RS00235 -G9768_RS03635 120073 -G9768_RS03635 AQ199_RS04330 -G9768_RS03635 BKB93_RS03670 -G9768_RS03635 7618672 -G9768_RS03810 G9768_RS03810 -G9768_RS03810 gnl|Prokka|PADJNBJD_00750 -G9768_RS03810 L3404_RS03785 -G9768_RS03810 BKC02_RS03845 -G9768_RS03810 NILJEPDF_00751 -G9768_RS03810 LJHENM_03780 -G9768_RS03810 AOT15_RS04610 -G9768_RS03810 AP288_RS02180 -G9768_RS03810 JIEJKO_03780 -G9768_RS03810 BKC01_RS03850 -G9768_RS03810 QSDFRQ_00751 -G9768_RS03810 CTRC943_RS03795 -G9768_RS03810 AQ244_RS04100 -G9768_RS03810 BKC03_RS03845 -G9768_RS03810 CTJTET1_RS03830 -G9768_RS03810 KW39_RS03825 -G9768_RS03810 DU10_RS03860 -G9768_RS03810 CBP48_RS00415 -G9768_RS03810 A5291_RS03855 -G9768_RS03810 SOTONK1_RS03810 -G9768_RS03810 IaCS19096_RS03805 -G9768_RS03810 DU13_RS03860 -G9768_RS03810 C15_RS0103915 -G9768_RS03810 ECS88FINAL_RS0103915 -G9768_RS03810 O169_RS03820 -G9768_RS03810 AQ193_RS00180 -G9768_RS03810 KW36_RS03810 -G9768_RS03810 BKB95_RS03865 -G9768_RS03810 CBP42_RS00415 -G9768_RS03810 SW2_RS03815 -G9768_RS03810 CTL2C_RS00410 -G9768_RS03810 L1224_RS03790 -G9768_RS03810 ECS102511_RS03805 -G9768_RS03810 BKB96_RS03850 -G9768_RS03810 BKB99_RS03845 -G9768_RS03810 L1440_RS03790 -G9768_RS03810 CBP44_RS00415 -G9768_RS03810 L2BUCH2_RS03790 -G9768_RS03810 BKB92_RS03845 -G9768_RS03810 CTB_RS03850 -G9768_RS03810 SOTONIA3_RS03830 -G9768_RS03810 E150_RS03815 -G9768_RS03810 CTO_RS03845 -G9768_RS03810 BBV13_RS03850 -G9768_RS03810 FCS84708_RS03805 -G9768_RS03810 BBV16_RS03860 -G9768_RS03810 L2BLST_RS03790 -G9768_RS03810 7618691 -G9768_RS03810 120043 -G9768_RS03810 BW688_RS00415 -G9768_RS03810 AQ199_RS04505 -G9768_RS03810 BKB93_RS03850 -G9768_RS03975 G9768_RS03975 -G9768_RS03975 gnl|Prokka|PADJNBJD_00782 -G9768_RS03975 L3404_RS03950 -G9768_RS03975 NILJEPDF_00783 -G9768_RS03975 BKC02_RS04010 -G9768_RS03975 LJHENM_03940 -G9768_RS03975 AOT15_RS04775 -G9768_RS03975 AP288_RS02345 -G9768_RS03975 JIEJKO_03940 -G9768_RS03975 QSDFRQ_00783 -G9768_RS03975 BKC01_RS04015 -G9768_RS03975 CTRC943_RS03960 -G9768_RS03975 AKW53_RS00715 -G9768_RS03975 AQ244_RS03935 -G9768_RS03975 BKC03_RS04010 -G9768_RS03975 CBP48_RS00580 -G9768_RS03975 CTJTET1_RS03995 -G9768_RS03975 KW39_RS03990 -G9768_RS03975 DU10_RS04025 -G9768_RS03975 A5291_RS04020 -G9768_RS03975 SOTONK1_RS03975 -G9768_RS03975 IaCS19096_RS03970 -G9768_RS03975 DU13_RS04025 -G9768_RS03975 C15_RS0104080 -G9768_RS03975 ECS88FINAL_RS0104085 -G9768_RS03975 O169_RS03985 -G9768_RS03975 KW36_RS03975 -G9768_RS03975 AQ193_RS00015 -G9768_RS03975 BKB95_RS04030 -G9768_RS03975 CBP42_RS00580 -G9768_RS03975 CTL2C_RS00575 -G9768_RS03975 L1224_RS03955 -G9768_RS03975 SW2_RS03980 -G9768_RS03975 L1440_RS03950 -G9768_RS03975 ECS102511_RS03970 -G9768_RS03975 BKB96_RS04015 -G9768_RS03975 BKB99_RS04010 -G9768_RS03975 CBP44_RS00580 -G9768_RS03975 L2BUCH2_RS03955 -G9768_RS03975 BKB92_RS04010 -G9768_RS03975 CTB_RS04015 -G9768_RS03975 SOTONIA3_RS03995 -G9768_RS03975 E150_RS03980 -G9768_RS03975 CTO_RS04010 -G9768_RS03975 BBV13_RS04015 -G9768_RS03975 FCS84708_RS03970 -G9768_RS03975 L2BLST_RS03955 -G9768_RS03975 BBV16_RS04025 -G9768_RS03975 7618708 -G9768_RS03975 120016 -G9768_RS03975 BW688_RS00580 -G9768_RS03975 AQ199_RS04670 -G9768_RS03975 BKB93_RS04015 -G9768_RS04345 G9768_RS04345 -G9768_RS04345 JIEJKO_04285 -G9768_RS04345 QSDFRQ_00852 -G9768_RS04345 BKB93_RS04390 -G9768_RS04345 BKC02_RS04385 -G9768_RS04345 CTRC943_RS04325 -G9768_RS04345 BKC01_RS04390 -G9768_RS04345 AKW53_RS01065 -G9768_RS04345 AOT15_RS01925 -G9768_RS04345 CTJTET1_RS04515 -G9768_RS04345 CBP48_RS00955 -G9768_RS04345 BKC03_RS04385 -G9768_RS04345 A5291_RS04380 -G9768_RS04345 KW39_RS04360 -G9768_RS04345 SOTONK1_RS04345 -G9768_RS04345 IaCS19096_RS04340 -G9768_RS04345 C15_RS0104455 -G9768_RS04345 ECS88FINAL_RS0104435 -G9768_RS04345 DU10_RS04400 -G9768_RS04345 KW36_RS04345 -G9768_RS04345 DU13_RS04400 -G9768_RS04345 O169_RS04360 -G9768_RS04345 AQ193_RS04425 -G9768_RS04345 CBP42_RS00955 -G9768_RS04345 CTL2C_RS00940 -G9768_RS04345 L1224_RS04320 -G9768_RS04345 BKB95_RS04405 -G9768_RS04345 L1440_RS04315 -G9768_RS04345 BKB96_RS04390 -G9768_RS04345 AQ244_RS02405 -G9768_RS04345 BKB99_RS04385 -G9768_RS04345 SW2_RS04350 -G9768_RS04345 ECS102511_RS04345 -G9768_RS04345 CBP44_RS00955 -G9768_RS04345 L2BUCH2_RS04320 -G9768_RS04345 CTB_RS04375 -G9768_RS04345 SOTONIA3_RS04360 -G9768_RS04345 CTO_RS04370 -G9768_RS04345 BKB92_RS04385 -G9768_RS04345 L2BLST_RS04320 -G9768_RS04345 BBV13_RS04385 -G9768_RS04345 AP288_RS02650 -G9768_RS04345 BBV16_RS04390 -G9768_RS04345 E150_RS04355 -G9768_RS04345 gnl|Prokka|PADJNBJD_00851 -G9768_RS04345 BW688_RS00955 -G9768_RS04345 7618306 -G9768_RS04345 FCS84708_RS04340 -G9768_RS04345 AQ199_RS00275 -G9768_RS04345 119840 -G9768_RS04345 NILJEPDF_00852 -G9768_RS04345 LJHENM_04285 -G9768_RS04345 L3404_RS04315 -G9768_RS04500 G9768_RS04500 -G9768_RS04500 LJHENM_04450 -G9768_RS04500 L3404_RS04475 -G9768_RS04500 JIEJKO_04445 -G9768_RS04500 QSDFRQ_00884 -G9768_RS04500 BKB93_RS04560 -G9768_RS04500 BKC02_RS04550 -G9768_RS04500 AKW53_RS01225 -G9768_RS04500 BKC01_RS04555 -G9768_RS04500 CTRC943_RS04485 -G9768_RS04500 AOT15_RS02080 -G9768_RS04500 CTJTET1_RS04670 -G9768_RS04500 KW39_RS04520 -G9768_RS04500 BKC03_RS04550 -G9768_RS04500 CBP48_RS01125 -G9768_RS04500 A5291_RS04535 -G9768_RS04500 SOTONK1_RS04500 -G9768_RS04500 ECS88FINAL_RS0104600 -G9768_RS04500 IaCS19096_RS04495 -G9768_RS04500 C15_RS0104620 -G9768_RS04500 DU10_RS04570 -G9768_RS04500 O169_RS04520 -G9768_RS04500 KW36_RS04500 -G9768_RS04500 DU13_RS04570 -G9768_RS04500 AQ193_RS04265 -G9768_RS04500 BKB95_RS04570 -G9768_RS04500 CBP42_RS01125 -G9768_RS04500 CTL2C_RS01100 -G9768_RS04500 L1224_RS04480 -G9768_RS04500 BKB96_RS04555 -G9768_RS04500 L1440_RS04475 -G9768_RS04500 BKB99_RS04550 -G9768_RS04500 SW2_RS04510 -G9768_RS04500 ECS102511_RS04505 -G9768_RS04500 AQ244_RS02250 -G9768_RS04500 CBP44_RS01125 -G9768_RS04500 CTB_RS04530 -G9768_RS04500 L2BUCH2_RS04480 -G9768_RS04500 SOTONIA3_RS04515 -G9768_RS04500 CTO_RS04525 -G9768_RS04500 BBV13_RS04540 -G9768_RS04500 BKB92_RS04555 -G9768_RS04500 AP288_RS02810 -G9768_RS04500 BBV16_RS04545 -G9768_RS04500 E150_RS04515 -G9768_RS04500 L2BLST_RS04480 -G9768_RS04500 gnl|Prokka|PADJNBJD_00883 -G9768_RS04500 FCS84708_RS04500 -G9768_RS04500 AQ199_RS00435 -G9768_RS04500 BW688_RS01125 -G9768_RS04500 119873 -G9768_RS04500 NILJEPDF_00884 -G9768_RS04500 7618328 -G9768_RS04670 G9768_RS04670 -G9768_RS04670 BKB93_RS04730 -G9768_RS04670 BKC02_RS04720 -G9768_RS04670 CTRC943_RS04655 -G9768_RS04670 AKW53_RS01395 -G9768_RS04670 BKC01_RS04725 -G9768_RS04670 AOT15_RS02250 -G9768_RS04670 CTJTET1_RS04840 -G9768_RS04670 CBP48_RS01300 -G9768_RS04670 KW39_RS04690 -G9768_RS04670 BKC03_RS04720 -G9768_RS04670 SOTONK1_RS04670 -G9768_RS04670 A5291_RS04700 -G9768_RS04670 ECS88FINAL_RS0104770 -G9768_RS04670 IaCS19096_RS04665 -G9768_RS04670 C15_RS0104790 -G9768_RS04670 DU10_RS04740 -G9768_RS04670 O169_RS04690 -G9768_RS04670 KW36_RS04670 -G9768_RS04670 DU13_RS04740 -G9768_RS04670 CTL2C_RS01270 -G9768_RS04670 CBP42_RS01300 -G9768_RS04670 L1224_RS04650 -G9768_RS04670 AQ193_RS04095 -G9768_RS04670 BKB95_RS04740 -G9768_RS04670 L1440_RS04645 -G9768_RS04670 BKB96_RS04725 -G9768_RS04670 BKB99_RS04720 -G9768_RS04670 SW2_RS04680 -G9768_RS04670 ECS102511_RS04675 -G9768_RS04670 AQ244_RS02080 -G9768_RS04670 CBP44_RS01300 -G9768_RS04670 L2BUCH2_RS04650 -G9768_RS04670 CTB_RS04695 -G9768_RS04670 SOTONIA3_RS04685 -G9768_RS04670 AP288_RS02980 -G9768_RS04670 BKB92_RS04725 -G9768_RS04670 gnl|Prokka|PADJNBJD_00915 -G9768_RS04670 CTO_RS04690 -G9768_RS04670 L2BLST_RS04650 -G9768_RS04670 BBV13_RS04710 -G9768_RS04670 E150_RS04685 -G9768_RS04670 BBV16_RS04715 -G9768_RS04670 NILJEPDF_00916 -G9768_RS04670 FCS84708_RS04670 -G9768_RS04670 AQ199_RS00605 -G9768_RS04670 BW688_RS01300 -G9768_RS04670 119899 -G9768_RS04670 JIEJKO_04605 -G9768_RS04670 QSDFRQ_00916 -G9768_RS04670 LJHENM_04615 -G9768_RS04670 L3404_RS04645 -G9768_RS04670 7618344 -gnl|Prokka|PADJNBJD_00014 gnl|Prokka|PADJNBJD_00014 -gnl|Prokka|PADJNBJD_00014 LJHENM_00070 -gnl|Prokka|PADJNBJD_00014 A5291_RS00070 -gnl|Prokka|PADJNBJD_00014 SOTONK1_RS00070 -gnl|Prokka|PADJNBJD_00014 JIEJKO_00065 -gnl|Prokka|PADJNBJD_00014 NILJEPDF_00014 -gnl|Prokka|PADJNBJD_00014 L3404_RS00070 -gnl|Prokka|PADJNBJD_00014 AOT15_RS00885 -gnl|Prokka|PADJNBJD_00014 IaCS19096_RS00070 -gnl|Prokka|PADJNBJD_00014 BKC03_RS00070 -gnl|Prokka|PADJNBJD_00014 C15_RS0100070 -gnl|Prokka|PADJNBJD_00014 AKW53_RS01555 -gnl|Prokka|PADJNBJD_00014 QSDFRQ_00014 -gnl|Prokka|PADJNBJD_00014 CTJTET1_RS00070 -gnl|Prokka|PADJNBJD_00014 DU10_RS00070 -gnl|Prokka|PADJNBJD_00014 CTRC943_RS00070 -gnl|Prokka|PADJNBJD_00014 O169_RS00070 -gnl|Prokka|PADJNBJD_00014 CBP48_RS01460 -gnl|Prokka|PADJNBJD_00014 ECS88FINAL_RS0100075 -gnl|Prokka|PADJNBJD_00014 DU13_RS00070 -gnl|Prokka|PADJNBJD_00014 KW39_RS00070 -gnl|Prokka|PADJNBJD_00014 BKB95_RS00070 -gnl|Prokka|PADJNBJD_00014 KW36_RS00070 -gnl|Prokka|PADJNBJD_00014 SW2_RS00070 -gnl|Prokka|PADJNBJD_00014 ECS102511_RS00070 -gnl|Prokka|PADJNBJD_00014 CTB_RS00070 -gnl|Prokka|PADJNBJD_00014 CTL2C_RS01435 -gnl|Prokka|PADJNBJD_00014 CBP42_RS01460 -gnl|Prokka|PADJNBJD_00014 L1224_RS00070 -gnl|Prokka|PADJNBJD_00014 BKB96_RS00070 -gnl|Prokka|PADJNBJD_00014 AQ193_RS03935 -gnl|Prokka|PADJNBJD_00014 BKB99_RS00070 -gnl|Prokka|PADJNBJD_00014 CTO_RS00070 -gnl|Prokka|PADJNBJD_00014 SOTONIA3_RS00070 -gnl|Prokka|PADJNBJD_00014 L1440_RS00070 -gnl|Prokka|PADJNBJD_00014 BKB92_RS00070 -gnl|Prokka|PADJNBJD_00014 119210 -gnl|Prokka|PADJNBJD_00014 AQ244_RS01920 -gnl|Prokka|PADJNBJD_00014 CBP44_RS01460 -gnl|Prokka|PADJNBJD_00014 E150_RS00070 -gnl|Prokka|PADJNBJD_00014 L2BUCH2_RS00070 -gnl|Prokka|PADJNBJD_00014 BKB93_RS00070 -gnl|Prokka|PADJNBJD_00014 FCS84708_RS00070 -gnl|Prokka|PADJNBJD_00014 AP288_RS03140 -gnl|Prokka|PADJNBJD_00014 BBV13_RS00070 -gnl|Prokka|PADJNBJD_00014 G9768_RS00070 -gnl|Prokka|PADJNBJD_00014 AQ199_RS00765 -gnl|Prokka|PADJNBJD_00014 BW688_RS01460 -gnl|Prokka|PADJNBJD_00014 L2BLST_RS00070 -gnl|Prokka|PADJNBJD_00014 BKC02_RS00070 -gnl|Prokka|PADJNBJD_00014 BBV16_RS00070 -gnl|Prokka|PADJNBJD_00014 BKC01_RS00070 -gnl|Prokka|PADJNBJD_00014 7618358 -gnl|Prokka|PADJNBJD_00081 gnl|Prokka|PADJNBJD_00081 -gnl|Prokka|PADJNBJD_00081 AOT15_RS00545 -gnl|Prokka|PADJNBJD_00081 NILJEPDF_00081 -gnl|Prokka|PADJNBJD_00081 LJHENM_00410 -gnl|Prokka|PADJNBJD_00081 A5291_RS00410 -gnl|Prokka|PADJNBJD_00081 BKC01_RS00420 -gnl|Prokka|PADJNBJD_00081 SOTONK1_RS00410 -gnl|Prokka|PADJNBJD_00081 L3404_RS00410 -gnl|Prokka|PADJNBJD_00081 JIEJKO_00410 -gnl|Prokka|PADJNBJD_00081 AKW53_RS01900 -gnl|Prokka|PADJNBJD_00081 QSDFRQ_00081 -gnl|Prokka|PADJNBJD_00081 IaCS19096_RS00410 -gnl|Prokka|PADJNBJD_00081 BKC03_RS00420 -gnl|Prokka|PADJNBJD_00081 C15_RS0100420 -gnl|Prokka|PADJNBJD_00081 DU10_RS00420 -gnl|Prokka|PADJNBJD_00081 7618814 -gnl|Prokka|PADJNBJD_00081 CTRC943_RS00410 -gnl|Prokka|PADJNBJD_00081 CTJTET1_RS00410 -gnl|Prokka|PADJNBJD_00081 O169_RS00410 -gnl|Prokka|PADJNBJD_00081 KW36_RS00410 -gnl|Prokka|PADJNBJD_00081 DU13_RS00425 -gnl|Prokka|PADJNBJD_00081 CBP48_RS01810 -gnl|Prokka|PADJNBJD_00081 ECS88FINAL_RS0100425 -gnl|Prokka|PADJNBJD_00081 KW39_RS00410 -gnl|Prokka|PADJNBJD_00081 BKB95_RS00420 -gnl|Prokka|PADJNBJD_00081 SW2_RS00410 -gnl|Prokka|PADJNBJD_00081 ECS102511_RS00410 -gnl|Prokka|PADJNBJD_00081 CTB_RS00410 -gnl|Prokka|PADJNBJD_00081 CTL2C_RS01775 -gnl|Prokka|PADJNBJD_00081 CBP42_RS01810 -gnl|Prokka|PADJNBJD_00081 BKB96_RS00420 -gnl|Prokka|PADJNBJD_00081 L1224_RS00410 -gnl|Prokka|PADJNBJD_00081 AQ193_RS03585 -gnl|Prokka|PADJNBJD_00081 AQ244_RS01580 -gnl|Prokka|PADJNBJD_00081 BKB99_RS00420 -gnl|Prokka|PADJNBJD_00081 CTO_RS00410 -gnl|Prokka|PADJNBJD_00081 L1440_RS00410 -gnl|Prokka|PADJNBJD_00081 BKB92_RS00420 -gnl|Prokka|PADJNBJD_00081 SOTONIA3_RS00410 -gnl|Prokka|PADJNBJD_00081 CBP44_RS01815 -gnl|Prokka|PADJNBJD_00081 120610 -gnl|Prokka|PADJNBJD_00081 E150_RS00410 -gnl|Prokka|PADJNBJD_00081 L2BUCH2_RS00410 -gnl|Prokka|PADJNBJD_00081 BKB93_RS00420 -gnl|Prokka|PADJNBJD_00081 FCS84708_RS00410 -gnl|Prokka|PADJNBJD_00081 AP288_RS03480 -gnl|Prokka|PADJNBJD_00081 BBV13_RS00415 -gnl|Prokka|PADJNBJD_00081 AQ199_RS01105 -gnl|Prokka|PADJNBJD_00081 BW688_RS01810 -gnl|Prokka|PADJNBJD_00081 G9768_RS00410 -gnl|Prokka|PADJNBJD_00081 L2BLST_RS00410 -gnl|Prokka|PADJNBJD_00081 BKC02_RS00420 -gnl|Prokka|PADJNBJD_00081 BBV16_RS00415 -gnl|Prokka|PADJNBJD_00113 gnl|Prokka|PADJNBJD_00113 -gnl|Prokka|PADJNBJD_00113 LJHENM_00565 -gnl|Prokka|PADJNBJD_00113 AKW53_RS02070 -gnl|Prokka|PADJNBJD_00113 AOT15_RS00380 -gnl|Prokka|PADJNBJD_00113 BKC01_RS00585 -gnl|Prokka|PADJNBJD_00113 NILJEPDF_00113 -gnl|Prokka|PADJNBJD_00113 A5291_RS00580 -gnl|Prokka|PADJNBJD_00113 SOTONK1_RS00575 -gnl|Prokka|PADJNBJD_00113 L3404_RS00575 -gnl|Prokka|PADJNBJD_00113 JIEJKO_00570 -gnl|Prokka|PADJNBJD_00113 QSDFRQ_00113 -gnl|Prokka|PADJNBJD_00113 IaCS19096_RS00575 -gnl|Prokka|PADJNBJD_00113 BKC03_RS00585 -gnl|Prokka|PADJNBJD_00113 C15_RS0100590 -gnl|Prokka|PADJNBJD_00113 CTJTET1_RS00575 -gnl|Prokka|PADJNBJD_00113 KW39_RS00575 -gnl|Prokka|PADJNBJD_00113 DU10_RS00585 -gnl|Prokka|PADJNBJD_00113 CTRC943_RS00575 -gnl|Prokka|PADJNBJD_00113 ECS88FINAL_RS0100590 -gnl|Prokka|PADJNBJD_00113 O169_RS00575 -gnl|Prokka|PADJNBJD_00113 DU13_RS00590 -gnl|Prokka|PADJNBJD_00113 7618835 -gnl|Prokka|PADJNBJD_00113 KW36_RS00575 -gnl|Prokka|PADJNBJD_00113 CBP48_RS01975 -gnl|Prokka|PADJNBJD_00113 SW2_RS00575 -gnl|Prokka|PADJNBJD_00113 BKB95_RS00585 -gnl|Prokka|PADJNBJD_00113 ECS102511_RS00575 -gnl|Prokka|PADJNBJD_00113 CTL2C_RS01940 -gnl|Prokka|PADJNBJD_00113 CTB_RS00580 -gnl|Prokka|PADJNBJD_00113 AQ244_RS02750 -gnl|Prokka|PADJNBJD_00113 BKB96_RS00585 -gnl|Prokka|PADJNBJD_00113 CBP42_RS01975 -gnl|Prokka|PADJNBJD_00113 L1224_RS00575 -gnl|Prokka|PADJNBJD_00113 BKB99_RS00585 -gnl|Prokka|PADJNBJD_00113 BKB92_RS00585 -gnl|Prokka|PADJNBJD_00113 SOTONIA3_RS00575 -gnl|Prokka|PADJNBJD_00113 L1440_RS00575 -gnl|Prokka|PADJNBJD_00113 AQ193_RS03420 -gnl|Prokka|PADJNBJD_00113 CTO_RS00580 -gnl|Prokka|PADJNBJD_00113 E150_RS00575 -gnl|Prokka|PADJNBJD_00113 CBP44_RS01980 -gnl|Prokka|PADJNBJD_00113 120577 -gnl|Prokka|PADJNBJD_00113 L2BUCH2_RS00575 -gnl|Prokka|PADJNBJD_00113 FCS84708_RS00575 -gnl|Prokka|PADJNBJD_00113 AP288_RS03645 -gnl|Prokka|PADJNBJD_00113 BKB93_RS00585 -gnl|Prokka|PADJNBJD_00113 AQ199_RS01270 -gnl|Prokka|PADJNBJD_00113 BBV13_RS00585 -gnl|Prokka|PADJNBJD_00113 G9768_RS00575 -gnl|Prokka|PADJNBJD_00113 L2BLST_RS00575 -gnl|Prokka|PADJNBJD_00113 BW688_RS01975 -gnl|Prokka|PADJNBJD_00113 BKC02_RS00585 -gnl|Prokka|PADJNBJD_00113 BBV16_RS00585 -gnl|Prokka|PADJNBJD_00147 gnl|Prokka|PADJNBJD_00147 -gnl|Prokka|PADJNBJD_00147 LJHENM_00735 -gnl|Prokka|PADJNBJD_00147 AKW53_RS02240 -gnl|Prokka|PADJNBJD_00147 AOT15_RS00210 -gnl|Prokka|PADJNBJD_00147 BKC01_RS00755 -gnl|Prokka|PADJNBJD_00147 NILJEPDF_00147 -gnl|Prokka|PADJNBJD_00147 A5291_RS00750 -gnl|Prokka|PADJNBJD_00147 L3404_RS00745 -gnl|Prokka|PADJNBJD_00147 SOTONK1_RS00745 -gnl|Prokka|PADJNBJD_00147 JIEJKO_00740 -gnl|Prokka|PADJNBJD_00147 QSDFRQ_00147 -gnl|Prokka|PADJNBJD_00147 CTJTET1_RS00745 -gnl|Prokka|PADJNBJD_00147 IaCS19096_RS00745 -gnl|Prokka|PADJNBJD_00147 BKC03_RS00755 -gnl|Prokka|PADJNBJD_00147 C15_RS0100770 -gnl|Prokka|PADJNBJD_00147 CTRC943_RS00745 -gnl|Prokka|PADJNBJD_00147 ECS88FINAL_RS0100770 -gnl|Prokka|PADJNBJD_00147 KW39_RS00745 -gnl|Prokka|PADJNBJD_00147 DU10_RS00755 -gnl|Prokka|PADJNBJD_00147 O169_RS00745 -gnl|Prokka|PADJNBJD_00147 DU13_RS00760 -gnl|Prokka|PADJNBJD_00147 KW36_RS00745 -gnl|Prokka|PADJNBJD_00147 CBP48_RS02145 -gnl|Prokka|PADJNBJD_00147 SW2_RS00745 -gnl|Prokka|PADJNBJD_00147 BKB95_RS00755 -gnl|Prokka|PADJNBJD_00147 7618433 -gnl|Prokka|PADJNBJD_00147 ECS102511_RS00745 -gnl|Prokka|PADJNBJD_00147 CTL2C_RS02110 -gnl|Prokka|PADJNBJD_00147 CTB_RS00750 -gnl|Prokka|PADJNBJD_00147 L1224_RS00745 -gnl|Prokka|PADJNBJD_00147 AQ244_RS02920 -gnl|Prokka|PADJNBJD_00147 BKB96_RS00755 -gnl|Prokka|PADJNBJD_00147 CBP42_RS02145 -gnl|Prokka|PADJNBJD_00147 BKB99_RS00755 -gnl|Prokka|PADJNBJD_00147 CTO_RS00750 -gnl|Prokka|PADJNBJD_00147 L1440_RS00745 -gnl|Prokka|PADJNBJD_00147 BKB92_RS00755 -gnl|Prokka|PADJNBJD_00147 SOTONIA3_RS00745 -gnl|Prokka|PADJNBJD_00147 AQ193_RS03250 -gnl|Prokka|PADJNBJD_00147 E150_RS00745 -gnl|Prokka|PADJNBJD_00147 L2BUCH2_RS00745 -gnl|Prokka|PADJNBJD_00147 CBP44_RS02150 -gnl|Prokka|PADJNBJD_00147 FCS84708_RS00745 -gnl|Prokka|PADJNBJD_00147 AP288_RS03815 -gnl|Prokka|PADJNBJD_00147 BKB93_RS00755 -gnl|Prokka|PADJNBJD_00147 119326 -gnl|Prokka|PADJNBJD_00147 AQ199_RS01440 -gnl|Prokka|PADJNBJD_00147 BBV13_RS00755 -gnl|Prokka|PADJNBJD_00147 G9768_RS00745 -gnl|Prokka|PADJNBJD_00147 L2BLST_RS00745 -gnl|Prokka|PADJNBJD_00147 BW688_RS02145 -gnl|Prokka|PADJNBJD_00147 BBV16_RS00755 -gnl|Prokka|PADJNBJD_00147 BKC02_RS00755 -gnl|Prokka|PADJNBJD_00179 gnl|Prokka|PADJNBJD_00179 -gnl|Prokka|PADJNBJD_00179 BKC03_RS00915 -gnl|Prokka|PADJNBJD_00179 NILJEPDF_00179 -gnl|Prokka|PADJNBJD_00179 LJHENM_00900 -gnl|Prokka|PADJNBJD_00179 CTRC943_RS00900 -gnl|Prokka|PADJNBJD_00179 CTJTET1_RS00930 -gnl|Prokka|PADJNBJD_00179 C15_RS0100950 -gnl|Prokka|PADJNBJD_00179 SOTONK1_RS00915 -gnl|Prokka|PADJNBJD_00179 ECS88FINAL_RS0100935 -gnl|Prokka|PADJNBJD_00179 KW39_RS00920 -gnl|Prokka|PADJNBJD_00179 JIEJKO_00900 -gnl|Prokka|PADJNBJD_00179 7618856 -gnl|Prokka|PADJNBJD_00179 A5291_RS00940 -gnl|Prokka|PADJNBJD_00179 IaCS19096_RS00915 -gnl|Prokka|PADJNBJD_00179 QSDFRQ_00179 -gnl|Prokka|PADJNBJD_00179 O169_RS00920 -gnl|Prokka|PADJNBJD_00179 DU13_RS00925 -gnl|Prokka|PADJNBJD_00179 SW2_RS00910 -gnl|Prokka|PADJNBJD_00179 BKB95_RS00930 -gnl|Prokka|PADJNBJD_00179 CBP48_RS02305 -gnl|Prokka|PADJNBJD_00179 KW36_RS00915 -gnl|Prokka|PADJNBJD_00179 ECS102511_RS00910 -gnl|Prokka|PADJNBJD_00179 BKB96_RS00915 -gnl|Prokka|PADJNBJD_00179 CTL2C_RS02265 -gnl|Prokka|PADJNBJD_00179 AOT15_RS01450 -gnl|Prokka|PADJNBJD_00179 BKB99_RS00915 -gnl|Prokka|PADJNBJD_00179 L1224_RS00895 -gnl|Prokka|PADJNBJD_00179 L1440_RS00895 -gnl|Prokka|PADJNBJD_00179 AQ244_RS03095 -gnl|Prokka|PADJNBJD_00179 BKB92_RS00915 -gnl|Prokka|PADJNBJD_00179 CBP42_RS02305 -gnl|Prokka|PADJNBJD_00179 SOTONIA3_RS00930 -gnl|Prokka|PADJNBJD_00179 E150_RS00910 -gnl|Prokka|PADJNBJD_00179 CTB_RS00940 -gnl|Prokka|PADJNBJD_00179 L2BUCH2_RS00900 -gnl|Prokka|PADJNBJD_00179 CTO_RS00940 -gnl|Prokka|PADJNBJD_00179 FCS84708_RS00910 -gnl|Prokka|PADJNBJD_00179 AP288_RS03980 -gnl|Prokka|PADJNBJD_00179 BKB93_RS00915 -gnl|Prokka|PADJNBJD_00179 CBP44_RS02310 -gnl|Prokka|PADJNBJD_00179 AQ193_RS03080 -gnl|Prokka|PADJNBJD_00179 AQ199_RS01605 -gnl|Prokka|PADJNBJD_00179 L2BLST_RS00900 -gnl|Prokka|PADJNBJD_00179 BW688_RS02310 -gnl|Prokka|PADJNBJD_00179 BBV13_RS00945 -gnl|Prokka|PADJNBJD_00179 G9768_RS00920 -gnl|Prokka|PADJNBJD_00179 BKC02_RS00915 -gnl|Prokka|PADJNBJD_00179 L3404_RS00895 -gnl|Prokka|PADJNBJD_00179 AKW53_RS02405 -gnl|Prokka|PADJNBJD_00179 120536 -gnl|Prokka|PADJNBJD_00179 BBV16_RS00945 -gnl|Prokka|PADJNBJD_00179 BKC01_RS00915 -gnl|Prokka|PADJNBJD_00179 DU10_RS00925 -gnl|Prokka|PADJNBJD_00215 gnl|Prokka|PADJNBJD_00215 -gnl|Prokka|PADJNBJD_00215 BKC03_RS01095 -gnl|Prokka|PADJNBJD_00215 NILJEPDF_00215 -gnl|Prokka|PADJNBJD_00215 LJHENM_01080 -gnl|Prokka|PADJNBJD_00215 CTRC943_RS01080 -gnl|Prokka|PADJNBJD_00215 CTJTET1_RS01110 -gnl|Prokka|PADJNBJD_00215 C15_RS0101130 -gnl|Prokka|PADJNBJD_00215 SOTONK1_RS01095 -gnl|Prokka|PADJNBJD_00215 ECS88FINAL_RS0101115 -gnl|Prokka|PADJNBJD_00215 KW39_RS01100 -gnl|Prokka|PADJNBJD_00215 JIEJKO_01080 -gnl|Prokka|PADJNBJD_00215 A5291_RS01120 -gnl|Prokka|PADJNBJD_00215 IaCS19096_RS01095 -gnl|Prokka|PADJNBJD_00215 7618874 -gnl|Prokka|PADJNBJD_00215 QSDFRQ_00215 -gnl|Prokka|PADJNBJD_00215 O169_RS01100 -gnl|Prokka|PADJNBJD_00215 DU13_RS01105 -gnl|Prokka|PADJNBJD_00215 SW2_RS01090 -gnl|Prokka|PADJNBJD_00215 BKB95_RS01110 -gnl|Prokka|PADJNBJD_00215 CBP48_RS02485 -gnl|Prokka|PADJNBJD_00215 KW36_RS01095 -gnl|Prokka|PADJNBJD_00215 ECS102511_RS01090 -gnl|Prokka|PADJNBJD_00215 BKB96_RS01095 -gnl|Prokka|PADJNBJD_00215 CTL2C_RS02445 -gnl|Prokka|PADJNBJD_00215 AOT15_RS01270 -gnl|Prokka|PADJNBJD_00215 BKB99_RS01095 -gnl|Prokka|PADJNBJD_00215 L1224_RS01075 -gnl|Prokka|PADJNBJD_00215 L1440_RS01075 -gnl|Prokka|PADJNBJD_00215 AQ244_RS03275 -gnl|Prokka|PADJNBJD_00215 BKB92_RS01095 -gnl|Prokka|PADJNBJD_00215 CBP42_RS02485 -gnl|Prokka|PADJNBJD_00215 SOTONIA3_RS01110 -gnl|Prokka|PADJNBJD_00215 E150_RS01090 -gnl|Prokka|PADJNBJD_00215 CTB_RS01120 -gnl|Prokka|PADJNBJD_00215 L2BUCH2_RS01080 -gnl|Prokka|PADJNBJD_00215 CTO_RS01120 -gnl|Prokka|PADJNBJD_00215 FCS84708_RS01090 -gnl|Prokka|PADJNBJD_00215 AP288_RS04160 -gnl|Prokka|PADJNBJD_00215 BKB93_RS01095 -gnl|Prokka|PADJNBJD_00215 CBP44_RS02490 -gnl|Prokka|PADJNBJD_00215 AQ193_RS02900 -gnl|Prokka|PADJNBJD_00215 AQ199_RS01785 -gnl|Prokka|PADJNBJD_00215 L2BLST_RS01080 -gnl|Prokka|PADJNBJD_00215 BW688_RS02490 -gnl|Prokka|PADJNBJD_00215 BBV13_RS01125 -gnl|Prokka|PADJNBJD_00215 G9768_RS01100 -gnl|Prokka|PADJNBJD_00215 BKC02_RS01095 -gnl|Prokka|PADJNBJD_00215 L3404_RS01075 -gnl|Prokka|PADJNBJD_00215 AKW53_RS02585 -gnl|Prokka|PADJNBJD_00215 BBV16_RS01125 -gnl|Prokka|PADJNBJD_00215 BKC01_RS01095 -gnl|Prokka|PADJNBJD_00215 120508 -gnl|Prokka|PADJNBJD_00215 DU10_RS01105 -gnl|Prokka|PADJNBJD_00249 gnl|Prokka|PADJNBJD_00249 -gnl|Prokka|PADJNBJD_00249 DU10_RS01280 -gnl|Prokka|PADJNBJD_00249 NILJEPDF_00249 -gnl|Prokka|PADJNBJD_00249 LJHENM_01250 -gnl|Prokka|PADJNBJD_00249 BKC03_RS01270 -gnl|Prokka|PADJNBJD_00249 119402 -gnl|Prokka|PADJNBJD_00249 CTRC943_RS01255 -gnl|Prokka|PADJNBJD_00249 CTJTET1_RS01285 -gnl|Prokka|PADJNBJD_00249 KW39_RS01275 -gnl|Prokka|PADJNBJD_00249 JIEJKO_01250 -gnl|Prokka|PADJNBJD_00249 C15_RS0101305 -gnl|Prokka|PADJNBJD_00249 SOTONK1_RS01270 -gnl|Prokka|PADJNBJD_00249 ECS88FINAL_RS0101290 -gnl|Prokka|PADJNBJD_00249 QSDFRQ_00249 -gnl|Prokka|PADJNBJD_00249 A5291_RS01295 -gnl|Prokka|PADJNBJD_00249 IaCS19096_RS01270 -gnl|Prokka|PADJNBJD_00249 O169_RS01275 -gnl|Prokka|PADJNBJD_00249 DU13_RS01280 -gnl|Prokka|PADJNBJD_00249 7618479 -gnl|Prokka|PADJNBJD_00249 SW2_RS01265 -gnl|Prokka|PADJNBJD_00249 AOT15_RS01095 -gnl|Prokka|PADJNBJD_00249 BKB95_RS01285 -gnl|Prokka|PADJNBJD_00249 CBP48_RS02660 -gnl|Prokka|PADJNBJD_00249 KW36_RS01270 -gnl|Prokka|PADJNBJD_00249 ECS102511_RS01265 -gnl|Prokka|PADJNBJD_00249 BKB96_RS01270 -gnl|Prokka|PADJNBJD_00249 CTL2C_RS02620 -gnl|Prokka|PADJNBJD_00249 BKB99_RS01270 -gnl|Prokka|PADJNBJD_00249 L1224_RS01250 -gnl|Prokka|PADJNBJD_00249 L1440_RS01250 -gnl|Prokka|PADJNBJD_00249 AQ244_RS03450 -gnl|Prokka|PADJNBJD_00249 BKB92_RS01270 -gnl|Prokka|PADJNBJD_00249 CBP42_RS02660 -gnl|Prokka|PADJNBJD_00249 SOTONIA3_RS01285 -gnl|Prokka|PADJNBJD_00249 CTB_RS01295 -gnl|Prokka|PADJNBJD_00249 E150_RS01265 -gnl|Prokka|PADJNBJD_00249 L2BUCH2_RS01255 -gnl|Prokka|PADJNBJD_00249 CTO_RS01295 -gnl|Prokka|PADJNBJD_00249 FCS84708_RS01265 -gnl|Prokka|PADJNBJD_00249 AP288_RS04335 -gnl|Prokka|PADJNBJD_00249 AQ193_RS02725 -gnl|Prokka|PADJNBJD_00249 BKB93_RS01270 -gnl|Prokka|PADJNBJD_00249 CBP44_RS02665 -gnl|Prokka|PADJNBJD_00249 AQ199_RS01960 -gnl|Prokka|PADJNBJD_00249 L2BLST_RS01255 -gnl|Prokka|PADJNBJD_00249 BW688_RS02665 -gnl|Prokka|PADJNBJD_00249 BBV13_RS01300 -gnl|Prokka|PADJNBJD_00249 G9768_RS01275 -gnl|Prokka|PADJNBJD_00249 BKC02_RS01270 -gnl|Prokka|PADJNBJD_00249 L3404_RS01250 -gnl|Prokka|PADJNBJD_00249 AKW53_RS02760 -gnl|Prokka|PADJNBJD_00249 BBV16_RS01300 -gnl|Prokka|PADJNBJD_00249 BKC01_RS01270 -gnl|Prokka|PADJNBJD_00281 gnl|Prokka|PADJNBJD_00281 -gnl|Prokka|PADJNBJD_00281 DU10_RS01445 -gnl|Prokka|PADJNBJD_00281 NILJEPDF_00281 -gnl|Prokka|PADJNBJD_00281 LJHENM_01415 -gnl|Prokka|PADJNBJD_00281 BKC03_RS01435 -gnl|Prokka|PADJNBJD_00281 CTRC943_RS01415 -gnl|Prokka|PADJNBJD_00281 CTJTET1_RS01445 -gnl|Prokka|PADJNBJD_00281 KW39_RS01435 -gnl|Prokka|PADJNBJD_00281 JIEJKO_01415 -gnl|Prokka|PADJNBJD_00281 120448 -gnl|Prokka|PADJNBJD_00281 C15_RS0101470 -gnl|Prokka|PADJNBJD_00281 SOTONK1_RS01435 -gnl|Prokka|PADJNBJD_00281 ECS88FINAL_RS0101455 -gnl|Prokka|PADJNBJD_00281 QSDFRQ_00281 -gnl|Prokka|PADJNBJD_00281 IaCS19096_RS01430 -gnl|Prokka|PADJNBJD_00281 A5291_RS01460 -gnl|Prokka|PADJNBJD_00281 O169_RS01440 -gnl|Prokka|PADJNBJD_00281 DU13_RS01445 -gnl|Prokka|PADJNBJD_00281 7618912 -gnl|Prokka|PADJNBJD_00281 SW2_RS01425 -gnl|Prokka|PADJNBJD_00281 BKB95_RS01450 -gnl|Prokka|PADJNBJD_00281 CBP48_RS02825 -gnl|Prokka|PADJNBJD_00281 KW36_RS01430 -gnl|Prokka|PADJNBJD_00281 ECS102511_RS01425 -gnl|Prokka|PADJNBJD_00281 AOT15_RS02430 -gnl|Prokka|PADJNBJD_00281 BKB96_RS01435 -gnl|Prokka|PADJNBJD_00281 CTL2C_RS02780 -gnl|Prokka|PADJNBJD_00281 BKB99_RS01435 -gnl|Prokka|PADJNBJD_00281 L1224_RS01410 -gnl|Prokka|PADJNBJD_00281 L1440_RS01410 -gnl|Prokka|PADJNBJD_00281 AQ244_RS03615 -gnl|Prokka|PADJNBJD_00281 CBP42_RS02825 -gnl|Prokka|PADJNBJD_00281 SOTONIA3_RS01445 -gnl|Prokka|PADJNBJD_00281 BKB92_RS01440 -gnl|Prokka|PADJNBJD_00281 CTB_RS01460 -gnl|Prokka|PADJNBJD_00281 E150_RS01430 -gnl|Prokka|PADJNBJD_00281 L2BUCH2_RS01415 -gnl|Prokka|PADJNBJD_00281 CTO_RS01455 -gnl|Prokka|PADJNBJD_00281 FCS84708_RS01425 -gnl|Prokka|PADJNBJD_00281 AQ193_RS02560 -gnl|Prokka|PADJNBJD_00281 AP288_RS04495 -gnl|Prokka|PADJNBJD_00281 BKB93_RS01440 -gnl|Prokka|PADJNBJD_00281 CBP44_RS02830 -gnl|Prokka|PADJNBJD_00281 AQ199_RS02120 -gnl|Prokka|PADJNBJD_00281 L2BLST_RS01415 -gnl|Prokka|PADJNBJD_00281 BBV13_RS01465 -gnl|Prokka|PADJNBJD_00281 BW688_RS02835 -gnl|Prokka|PADJNBJD_00281 G9768_RS01435 -gnl|Prokka|PADJNBJD_00281 BKC02_RS01435 -gnl|Prokka|PADJNBJD_00281 AKW53_RS02925 -gnl|Prokka|PADJNBJD_00281 BBV16_RS01465 -gnl|Prokka|PADJNBJD_00281 L3404_RS01410 -gnl|Prokka|PADJNBJD_00281 BKC01_RS01440 -gnl|Prokka|PADJNBJD_00313 gnl|Prokka|PADJNBJD_00313 -gnl|Prokka|PADJNBJD_00313 NILJEPDF_00313 -gnl|Prokka|PADJNBJD_00313 LJHENM_01575 -gnl|Prokka|PADJNBJD_00313 CTRC943_RS01575 -gnl|Prokka|PADJNBJD_00313 BKC03_RS01595 -gnl|Prokka|PADJNBJD_00313 DU10_RS01610 -gnl|Prokka|PADJNBJD_00313 CTJTET1_RS01605 -gnl|Prokka|PADJNBJD_00313 KW39_RS01595 -gnl|Prokka|PADJNBJD_00313 JIEJKO_01575 -gnl|Prokka|PADJNBJD_00313 C15_RS0101635 -gnl|Prokka|PADJNBJD_00313 SOTONK1_RS01595 -gnl|Prokka|PADJNBJD_00313 ECS88FINAL_RS0101615 -gnl|Prokka|PADJNBJD_00313 120420 -gnl|Prokka|PADJNBJD_00313 QSDFRQ_00313 -gnl|Prokka|PADJNBJD_00313 IaCS19096_RS01590 -gnl|Prokka|PADJNBJD_00313 A5291_RS01620 -gnl|Prokka|PADJNBJD_00313 O169_RS01600 -gnl|Prokka|PADJNBJD_00313 DU13_RS01605 -gnl|Prokka|PADJNBJD_00313 CBP48_RS02985 -gnl|Prokka|PADJNBJD_00313 7618930 -gnl|Prokka|PADJNBJD_00313 SW2_RS01585 -gnl|Prokka|PADJNBJD_00313 BKB95_RS01610 -gnl|Prokka|PADJNBJD_00313 CTL2C_RS02940 -gnl|Prokka|PADJNBJD_00313 KW36_RS01590 -gnl|Prokka|PADJNBJD_00313 ECS102511_RS01585 -gnl|Prokka|PADJNBJD_00313 AOT15_RS02590 -gnl|Prokka|PADJNBJD_00313 BKB96_RS01595 -gnl|Prokka|PADJNBJD_00313 L1224_RS01570 -gnl|Prokka|PADJNBJD_00313 BKB99_RS01595 -gnl|Prokka|PADJNBJD_00313 L1440_RS01570 -gnl|Prokka|PADJNBJD_00313 CBP42_RS02985 -gnl|Prokka|PADJNBJD_00313 AQ244_RS03775 -gnl|Prokka|PADJNBJD_00313 SOTONIA3_RS01605 -gnl|Prokka|PADJNBJD_00313 BKB92_RS01600 -gnl|Prokka|PADJNBJD_00313 CTB_RS01620 -gnl|Prokka|PADJNBJD_00313 E150_RS01590 -gnl|Prokka|PADJNBJD_00313 L2BUCH2_RS01575 -gnl|Prokka|PADJNBJD_00313 CTO_RS01615 -gnl|Prokka|PADJNBJD_00313 FCS84708_RS01585 -gnl|Prokka|PADJNBJD_00313 AQ193_RS02400 -gnl|Prokka|PADJNBJD_00313 AP288_RS04655 -gnl|Prokka|PADJNBJD_00313 CBP44_RS02990 -gnl|Prokka|PADJNBJD_00313 BKB93_RS01600 -gnl|Prokka|PADJNBJD_00313 L2BLST_RS01575 -gnl|Prokka|PADJNBJD_00313 AQ199_RS02280 -gnl|Prokka|PADJNBJD_00313 BW688_RS02995 -gnl|Prokka|PADJNBJD_00313 BBV13_RS01625 -gnl|Prokka|PADJNBJD_00313 G9768_RS01595 -gnl|Prokka|PADJNBJD_00313 BKC02_RS01595 -gnl|Prokka|PADJNBJD_00313 L3404_RS01570 -gnl|Prokka|PADJNBJD_00313 AKW53_RS03085 -gnl|Prokka|PADJNBJD_00313 BBV16_RS01625 -gnl|Prokka|PADJNBJD_00313 BKC01_RS01600 -gnl|Prokka|PADJNBJD_00348 gnl|Prokka|PADJNBJD_00348 -gnl|Prokka|PADJNBJD_00348 NILJEPDF_00348 -gnl|Prokka|PADJNBJD_00348 CTRC943_RS01750 -gnl|Prokka|PADJNBJD_00348 LJHENM_01755 -gnl|Prokka|PADJNBJD_00348 JIEJKO_01750 -gnl|Prokka|PADJNBJD_00348 BKC03_RS01775 -gnl|Prokka|PADJNBJD_00348 CTJTET1_RS01780 -gnl|Prokka|PADJNBJD_00348 AP288_RS01310 -gnl|Prokka|PADJNBJD_00348 QSDFRQ_00348 -gnl|Prokka|PADJNBJD_00348 C15_RS0101810 -gnl|Prokka|PADJNBJD_00348 SOTONK1_RS01770 -gnl|Prokka|PADJNBJD_00348 A5291_RS01795 -gnl|Prokka|PADJNBJD_00348 KW39_RS01780 -gnl|Prokka|PADJNBJD_00348 IaCS19096_RS01765 -gnl|Prokka|PADJNBJD_00348 119462 -gnl|Prokka|PADJNBJD_00348 ECS88FINAL_RS0101800 -gnl|Prokka|PADJNBJD_00348 O169_RS01780 -gnl|Prokka|PADJNBJD_00348 DU13_RS01790 -gnl|Prokka|PADJNBJD_00348 7618518 -gnl|Prokka|PADJNBJD_00348 AQ244_RS01340 -gnl|Prokka|PADJNBJD_00348 CTL2C_RS03115 -gnl|Prokka|PADJNBJD_00348 BKB95_RS01790 -gnl|Prokka|PADJNBJD_00348 CBP48_RS03175 -gnl|Prokka|PADJNBJD_00348 L1224_RS01745 -gnl|Prokka|PADJNBJD_00348 KW36_RS01765 -gnl|Prokka|PADJNBJD_00348 AOT15_RS02765 -gnl|Prokka|PADJNBJD_00348 BKB96_RS01775 -gnl|Prokka|PADJNBJD_00348 SW2_RS01770 -gnl|Prokka|PADJNBJD_00348 BKB99_RS01775 -gnl|Prokka|PADJNBJD_00348 L1440_RS01745 -gnl|Prokka|PADJNBJD_00348 ECS102511_RS01770 -gnl|Prokka|PADJNBJD_00348 CTB_RS01795 -gnl|Prokka|PADJNBJD_00348 SOTONIA3_RS01780 -gnl|Prokka|PADJNBJD_00348 L2BUCH2_RS01745 -gnl|Prokka|PADJNBJD_00348 AQ193_RS02215 -gnl|Prokka|PADJNBJD_00348 BKB92_RS01785 -gnl|Prokka|PADJNBJD_00348 CTO_RS01795 -gnl|Prokka|PADJNBJD_00348 E150_RS01775 -gnl|Prokka|PADJNBJD_00348 L2BLST_RS01745 -gnl|Prokka|PADJNBJD_00348 FCS84708_RS01765 -gnl|Prokka|PADJNBJD_00348 BW688_RS03175 -gnl|Prokka|PADJNBJD_00348 BKB93_RS01785 -gnl|Prokka|PADJNBJD_00348 CBP44_RS03180 -gnl|Prokka|PADJNBJD_00348 BBV13_RS01800 -gnl|Prokka|PADJNBJD_00348 AQ199_RS02465 -gnl|Prokka|PADJNBJD_00348 G9768_RS01770 -gnl|Prokka|PADJNBJD_00348 BBV16_RS01800 -gnl|Prokka|PADJNBJD_00348 BKC02_RS01775 -gnl|Prokka|PADJNBJD_00348 BKC01_RS01775 -gnl|Prokka|PADJNBJD_00348 AKW53_RS03270 -gnl|Prokka|PADJNBJD_00348 DU10_RS01795 -gnl|Prokka|PADJNBJD_00348 L3404_RS01745 -gnl|Prokka|PADJNBJD_00381 gnl|Prokka|PADJNBJD_00381 -gnl|Prokka|PADJNBJD_00381 NILJEPDF_00381 -gnl|Prokka|PADJNBJD_00381 CTRC943_RS01915 -gnl|Prokka|PADJNBJD_00381 LJHENM_01920 -gnl|Prokka|PADJNBJD_00381 JIEJKO_01915 -gnl|Prokka|PADJNBJD_00381 BKC03_RS01940 -gnl|Prokka|PADJNBJD_00381 CTJTET1_RS01945 -gnl|Prokka|PADJNBJD_00381 AP288_RS01145 -gnl|Prokka|PADJNBJD_00381 QSDFRQ_00381 -gnl|Prokka|PADJNBJD_00381 C15_RS0101980 -gnl|Prokka|PADJNBJD_00381 SOTONK1_RS01935 -gnl|Prokka|PADJNBJD_00381 DU10_RS01965 -gnl|Prokka|PADJNBJD_00381 A5291_RS01960 -gnl|Prokka|PADJNBJD_00381 KW39_RS01945 -gnl|Prokka|PADJNBJD_00381 IaCS19096_RS01930 -gnl|Prokka|PADJNBJD_00381 ECS88FINAL_RS0101970 -gnl|Prokka|PADJNBJD_00381 O169_RS01945 -gnl|Prokka|PADJNBJD_00381 DU13_RS01960 -gnl|Prokka|PADJNBJD_00381 AQ244_RS01175 -gnl|Prokka|PADJNBJD_00381 7618970 -gnl|Prokka|PADJNBJD_00381 120344 -gnl|Prokka|PADJNBJD_00381 CTL2C_RS03280 -gnl|Prokka|PADJNBJD_00381 L1224_RS01910 -gnl|Prokka|PADJNBJD_00381 KW36_RS01930 -gnl|Prokka|PADJNBJD_00381 AOT15_RS02930 -gnl|Prokka|PADJNBJD_00381 BKB95_RS01960 -gnl|Prokka|PADJNBJD_00381 BKB96_RS01940 -gnl|Prokka|PADJNBJD_00381 CBP48_RS03345 -gnl|Prokka|PADJNBJD_00381 SW2_RS01935 -gnl|Prokka|PADJNBJD_00381 BKB99_RS01940 -gnl|Prokka|PADJNBJD_00381 L1440_RS01910 -gnl|Prokka|PADJNBJD_00381 ECS102511_RS01935 -gnl|Prokka|PADJNBJD_00381 CTB_RS01960 -gnl|Prokka|PADJNBJD_00381 SOTONIA3_RS01945 -gnl|Prokka|PADJNBJD_00381 L2BUCH2_RS01910 -gnl|Prokka|PADJNBJD_00381 AQ193_RS02050 -gnl|Prokka|PADJNBJD_00381 BKB92_RS01950 -gnl|Prokka|PADJNBJD_00381 CBP42_RS03355 -gnl|Prokka|PADJNBJD_00381 CTO_RS01960 -gnl|Prokka|PADJNBJD_00381 E150_RS01940 -gnl|Prokka|PADJNBJD_00381 L2BLST_RS01910 -gnl|Prokka|PADJNBJD_00381 BW688_RS03340 -gnl|Prokka|PADJNBJD_00381 FCS84708_RS01930 -gnl|Prokka|PADJNBJD_00381 BKB93_RS01950 -gnl|Prokka|PADJNBJD_00381 BBV13_RS01965 -gnl|Prokka|PADJNBJD_00381 CBP44_RS03350 -gnl|Prokka|PADJNBJD_00381 AQ199_RS02630 -gnl|Prokka|PADJNBJD_00381 G9768_RS01935 -gnl|Prokka|PADJNBJD_00381 L3404_RS01910 -gnl|Prokka|PADJNBJD_00381 BBV16_RS01965 -gnl|Prokka|PADJNBJD_00381 BKC02_RS01940 -gnl|Prokka|PADJNBJD_00381 BKC01_RS01940 -gnl|Prokka|PADJNBJD_00381 AKW53_RS03435 -gnl|Prokka|PADJNBJD_00413 gnl|Prokka|PADJNBJD_00413 -gnl|Prokka|PADJNBJD_00413 NILJEPDF_00413 -gnl|Prokka|PADJNBJD_00413 CTRC943_RS02075 -gnl|Prokka|PADJNBJD_00413 LJHENM_02080 -gnl|Prokka|PADJNBJD_00413 JIEJKO_02075 -gnl|Prokka|PADJNBJD_00413 BKC03_RS02100 -gnl|Prokka|PADJNBJD_00413 CTJTET1_RS02105 -gnl|Prokka|PADJNBJD_00413 AP288_RS00985 -gnl|Prokka|PADJNBJD_00413 QSDFRQ_00413 -gnl|Prokka|PADJNBJD_00413 C15_RS0102140 -gnl|Prokka|PADJNBJD_00413 A5291_RS02120 -gnl|Prokka|PADJNBJD_00413 SOTONK1_RS02095 -gnl|Prokka|PADJNBJD_00413 DU10_RS02125 -gnl|Prokka|PADJNBJD_00413 KW39_RS02105 -gnl|Prokka|PADJNBJD_00413 IaCS19096_RS02090 -gnl|Prokka|PADJNBJD_00413 ECS88FINAL_RS0102135 -gnl|Prokka|PADJNBJD_00413 O169_RS02105 -gnl|Prokka|PADJNBJD_00413 DU13_RS02120 -gnl|Prokka|PADJNBJD_00413 7618548 -gnl|Prokka|PADJNBJD_00413 AQ244_RS01015 -gnl|Prokka|PADJNBJD_00413 CTL2C_RS03440 -gnl|Prokka|PADJNBJD_00413 CBP48_RS03505 -gnl|Prokka|PADJNBJD_00413 119511 -gnl|Prokka|PADJNBJD_00413 L1224_RS02070 -gnl|Prokka|PADJNBJD_00413 KW36_RS02090 -gnl|Prokka|PADJNBJD_00413 AOT15_RS03090 -gnl|Prokka|PADJNBJD_00413 BKB95_RS02120 -gnl|Prokka|PADJNBJD_00413 BKB96_RS02100 -gnl|Prokka|PADJNBJD_00413 SW2_RS02095 -gnl|Prokka|PADJNBJD_00413 BKB99_RS02100 -gnl|Prokka|PADJNBJD_00413 L1440_RS02070 -gnl|Prokka|PADJNBJD_00413 ECS102511_RS02095 -gnl|Prokka|PADJNBJD_00413 CTB_RS02120 -gnl|Prokka|PADJNBJD_00413 CBP42_RS03515 -gnl|Prokka|PADJNBJD_00413 SOTONIA3_RS02105 -gnl|Prokka|PADJNBJD_00413 L2BUCH2_RS02070 -gnl|Prokka|PADJNBJD_00413 AQ193_RS01890 -gnl|Prokka|PADJNBJD_00413 BKB92_RS02110 -gnl|Prokka|PADJNBJD_00413 CTO_RS02120 -gnl|Prokka|PADJNBJD_00413 E150_RS02100 -gnl|Prokka|PADJNBJD_00413 L2BLST_RS02070 -gnl|Prokka|PADJNBJD_00413 BW688_RS03500 -gnl|Prokka|PADJNBJD_00413 FCS84708_RS02090 -gnl|Prokka|PADJNBJD_00413 BBV13_RS02125 -gnl|Prokka|PADJNBJD_00413 BKB93_RS02110 -gnl|Prokka|PADJNBJD_00413 CBP44_RS03510 -gnl|Prokka|PADJNBJD_00413 AQ199_RS02790 -gnl|Prokka|PADJNBJD_00413 G9768_RS02095 -gnl|Prokka|PADJNBJD_00413 BBV16_RS02125 -gnl|Prokka|PADJNBJD_00413 L3404_RS02070 -gnl|Prokka|PADJNBJD_00413 BKC02_RS02100 -gnl|Prokka|PADJNBJD_00413 BKC01_RS02100 -gnl|Prokka|PADJNBJD_00413 AKW53_RS03595 -gnl|Prokka|PADJNBJD_00447 gnl|Prokka|PADJNBJD_00447 -gnl|Prokka|PADJNBJD_00447 NILJEPDF_00447 -gnl|Prokka|PADJNBJD_00447 CTRC943_RS02245 -gnl|Prokka|PADJNBJD_00447 LJHENM_02255 -gnl|Prokka|PADJNBJD_00447 JIEJKO_02250 -gnl|Prokka|PADJNBJD_00447 BKC03_RS02275 -gnl|Prokka|PADJNBJD_00447 CTJTET1_RS02275 -gnl|Prokka|PADJNBJD_00447 AP288_RS00815 -gnl|Prokka|PADJNBJD_00447 QSDFRQ_00447 -gnl|Prokka|PADJNBJD_00447 C15_RS0102310 -gnl|Prokka|PADJNBJD_00447 SOTONK1_RS02265 -gnl|Prokka|PADJNBJD_00447 DU10_RS02300 -gnl|Prokka|PADJNBJD_00447 A5291_RS02295 -gnl|Prokka|PADJNBJD_00447 KW39_RS02275 -gnl|Prokka|PADJNBJD_00447 IaCS19096_RS02260 -gnl|Prokka|PADJNBJD_00447 ECS88FINAL_RS0102310 -gnl|Prokka|PADJNBJD_00447 O169_RS02275 -gnl|Prokka|PADJNBJD_00447 DU13_RS02295 -gnl|Prokka|PADJNBJD_00447 7618570 -gnl|Prokka|PADJNBJD_00447 AQ244_RS00845 -gnl|Prokka|PADJNBJD_00447 BKB96_RS02280 -gnl|Prokka|PADJNBJD_00447 BKB99_RS02275 -gnl|Prokka|PADJNBJD_00447 CBP48_RS03680 -gnl|Prokka|PADJNBJD_00447 CTL2C_RS03615 -gnl|Prokka|PADJNBJD_00447 KW36_RS02260 -gnl|Prokka|PADJNBJD_00447 AOT15_RS03260 -gnl|Prokka|PADJNBJD_00447 BKB95_RS02295 -gnl|Prokka|PADJNBJD_00447 119545 -gnl|Prokka|PADJNBJD_00447 L1224_RS02245 -gnl|Prokka|PADJNBJD_00447 SW2_RS02270 -gnl|Prokka|PADJNBJD_00447 ECS102511_RS02265 -gnl|Prokka|PADJNBJD_00447 L1440_RS02245 -gnl|Prokka|PADJNBJD_00447 CBP42_RS03690 -gnl|Prokka|PADJNBJD_00447 CTB_RS02295 -gnl|Prokka|PADJNBJD_00447 L2BUCH2_RS02240 -gnl|Prokka|PADJNBJD_00447 AQ193_RS01720 -gnl|Prokka|PADJNBJD_00447 BKB92_RS02285 -gnl|Prokka|PADJNBJD_00447 SOTONIA3_RS02280 -gnl|Prokka|PADJNBJD_00447 CTO_RS02295 -gnl|Prokka|PADJNBJD_00447 E150_RS02270 -gnl|Prokka|PADJNBJD_00447 BW688_RS03675 -gnl|Prokka|PADJNBJD_00447 L2BLST_RS02245 -gnl|Prokka|PADJNBJD_00447 FCS84708_RS02260 -gnl|Prokka|PADJNBJD_00447 BBV13_RS02300 -gnl|Prokka|PADJNBJD_00447 CBP44_RS03685 -gnl|Prokka|PADJNBJD_00447 BKB93_RS02290 -gnl|Prokka|PADJNBJD_00447 AQ199_RS02960 -gnl|Prokka|PADJNBJD_00447 G9768_RS02265 -gnl|Prokka|PADJNBJD_00447 BBV16_RS02305 -gnl|Prokka|PADJNBJD_00447 L3404_RS02240 -gnl|Prokka|PADJNBJD_00447 BKC02_RS02275 -gnl|Prokka|PADJNBJD_00447 BKC01_RS02275 -gnl|Prokka|PADJNBJD_00447 AKW53_RS03765 -gnl|Prokka|PADJNBJD_00479 gnl|Prokka|PADJNBJD_00479 -gnl|Prokka|PADJNBJD_00479 AKW53_RS03930 -gnl|Prokka|PADJNBJD_00479 BKC01_RS02450 -gnl|Prokka|PADJNBJD_00479 NILJEPDF_00479 -gnl|Prokka|PADJNBJD_00479 AP288_RS00650 -gnl|Prokka|PADJNBJD_00479 LJHENM_02415 -gnl|Prokka|PADJNBJD_00479 CTRC943_RS02410 -gnl|Prokka|PADJNBJD_00479 JIEJKO_02415 -gnl|Prokka|PADJNBJD_00479 QSDFRQ_00479 -gnl|Prokka|PADJNBJD_00479 BKC03_RS02450 -gnl|Prokka|PADJNBJD_00479 CTJTET1_RS02440 -gnl|Prokka|PADJNBJD_00479 AOT15_RS00055 -gnl|Prokka|PADJNBJD_00479 C15_RS0102490 -gnl|Prokka|PADJNBJD_00479 SOTONK1_RS02430 -gnl|Prokka|PADJNBJD_00479 DU10_RS02470 -gnl|Prokka|PADJNBJD_00479 KW39_RS02440 -gnl|Prokka|PADJNBJD_00479 IaCS19096_RS02425 -gnl|Prokka|PADJNBJD_00479 AQ244_RS00680 -gnl|Prokka|PADJNBJD_00479 A5291_RS02465 -gnl|Prokka|PADJNBJD_00479 ECS88FINAL_RS0102485 -gnl|Prokka|PADJNBJD_00479 7619014 -gnl|Prokka|PADJNBJD_00479 O169_RS02440 -gnl|Prokka|PADJNBJD_00479 DU13_RS02465 -gnl|Prokka|PADJNBJD_00479 CBP48_RS03850 -gnl|Prokka|PADJNBJD_00479 BKB95_RS02465 -gnl|Prokka|PADJNBJD_00479 BKB96_RS02455 -gnl|Prokka|PADJNBJD_00479 BKB99_RS02450 -gnl|Prokka|PADJNBJD_00479 CTL2C_RS03780 -gnl|Prokka|PADJNBJD_00479 KW36_RS02425 -gnl|Prokka|PADJNBJD_00479 120273 -gnl|Prokka|PADJNBJD_00479 L1224_RS02410 -gnl|Prokka|PADJNBJD_00479 SW2_RS02435 -gnl|Prokka|PADJNBJD_00479 ECS102511_RS02430 -gnl|Prokka|PADJNBJD_00479 L1440_RS02410 -gnl|Prokka|PADJNBJD_00479 AQ193_RS01555 -gnl|Prokka|PADJNBJD_00479 CBP42_RS03860 -gnl|Prokka|PADJNBJD_00479 L2BUCH2_RS02405 -gnl|Prokka|PADJNBJD_00479 BKB92_RS02455 -gnl|Prokka|PADJNBJD_00479 CTB_RS02465 -gnl|Prokka|PADJNBJD_00479 SOTONIA3_RS02445 -gnl|Prokka|PADJNBJD_00479 E150_RS02435 -gnl|Prokka|PADJNBJD_00479 CTO_RS02465 -gnl|Prokka|PADJNBJD_00479 BBV13_RS02470 -gnl|Prokka|PADJNBJD_00479 BW688_RS03850 -gnl|Prokka|PADJNBJD_00479 CBP44_RS03855 -gnl|Prokka|PADJNBJD_00479 L2BLST_RS02410 -gnl|Prokka|PADJNBJD_00479 FCS84708_RS02425 -gnl|Prokka|PADJNBJD_00479 BKB93_RS02460 -gnl|Prokka|PADJNBJD_00479 BBV16_RS02475 -gnl|Prokka|PADJNBJD_00479 AQ199_RS03125 -gnl|Prokka|PADJNBJD_00479 G9768_RS02430 -gnl|Prokka|PADJNBJD_00479 L3404_RS02405 -gnl|Prokka|PADJNBJD_00479 BKC02_RS02450 -gnl|Prokka|PADJNBJD_00514 gnl|Prokka|PADJNBJD_00514 -gnl|Prokka|PADJNBJD_00514 NILJEPDF_00514 -gnl|Prokka|PADJNBJD_00514 LJHENM_02585 -gnl|Prokka|PADJNBJD_00514 CTRC943_RS02585 -gnl|Prokka|PADJNBJD_00514 SOTONK1_RS02605 -gnl|Prokka|PADJNBJD_00514 CTJTET1_RS02615 -gnl|Prokka|PADJNBJD_00514 JIEJKO_02590 -gnl|Prokka|PADJNBJD_00514 BKC03_RS02625 -gnl|Prokka|PADJNBJD_00514 QSDFRQ_00514 -gnl|Prokka|PADJNBJD_00514 KW39_RS02615 -gnl|Prokka|PADJNBJD_00514 AP288_RS00475 -gnl|Prokka|PADJNBJD_00514 C15_RS0102670 -gnl|Prokka|PADJNBJD_00514 ECS88FINAL_RS0102665 -gnl|Prokka|PADJNBJD_00514 IaCS19096_RS02600 -gnl|Prokka|PADJNBJD_00514 DU10_RS02645 -gnl|Prokka|PADJNBJD_00514 O169_RS02615 -gnl|Prokka|PADJNBJD_00514 A5291_RS02640 -gnl|Prokka|PADJNBJD_00514 DU13_RS02640 -gnl|Prokka|PADJNBJD_00514 AQ244_RS00505 -gnl|Prokka|PADJNBJD_00514 CBP48_RS04025 -gnl|Prokka|PADJNBJD_00514 CTL2C_RS03955 -gnl|Prokka|PADJNBJD_00514 KW36_RS02600 -gnl|Prokka|PADJNBJD_00514 BKB95_RS02640 -gnl|Prokka|PADJNBJD_00514 BKB96_RS02630 -gnl|Prokka|PADJNBJD_00514 BKB99_RS02625 -gnl|Prokka|PADJNBJD_00514 7619028 -gnl|Prokka|PADJNBJD_00514 SW2_RS02610 -gnl|Prokka|PADJNBJD_00514 L1224_RS02585 -gnl|Prokka|PADJNBJD_00514 ECS102511_RS02605 -gnl|Prokka|PADJNBJD_00514 L1440_RS02585 -gnl|Prokka|PADJNBJD_00514 CBP42_RS04035 -gnl|Prokka|PADJNBJD_00514 120250 -gnl|Prokka|PADJNBJD_00514 L2BUCH2_RS02585 -gnl|Prokka|PADJNBJD_00514 SOTONIA3_RS02620 -gnl|Prokka|PADJNBJD_00514 AQ193_RS01380 -gnl|Prokka|PADJNBJD_00514 BKB92_RS02630 -gnl|Prokka|PADJNBJD_00514 CTB_RS02640 -gnl|Prokka|PADJNBJD_00514 E150_RS02610 -gnl|Prokka|PADJNBJD_00514 AOT15_RS03490 -gnl|Prokka|PADJNBJD_00514 BW688_RS04025 -gnl|Prokka|PADJNBJD_00514 CTO_RS02640 -gnl|Prokka|PADJNBJD_00514 FCS84708_RS02600 -gnl|Prokka|PADJNBJD_00514 L2BLST_RS02585 -gnl|Prokka|PADJNBJD_00514 BBV13_RS02645 -gnl|Prokka|PADJNBJD_00514 CBP44_RS04030 -gnl|Prokka|PADJNBJD_00514 AQ199_RS03300 -gnl|Prokka|PADJNBJD_00514 BKB93_RS02635 -gnl|Prokka|PADJNBJD_00514 BBV16_RS02655 -gnl|Prokka|PADJNBJD_00514 G9768_RS02605 -gnl|Prokka|PADJNBJD_00514 L3404_RS02580 -gnl|Prokka|PADJNBJD_00514 BKC02_RS02625 -gnl|Prokka|PADJNBJD_00514 AKW53_RS04610 -gnl|Prokka|PADJNBJD_00514 BKC01_RS02625 -gnl|Prokka|PADJNBJD_00548 gnl|Prokka|PADJNBJD_00548 -gnl|Prokka|PADJNBJD_00548 NILJEPDF_00548 -gnl|Prokka|PADJNBJD_00548 BKC01_RS02805 -gnl|Prokka|PADJNBJD_00548 LJHENM_02760 -gnl|Prokka|PADJNBJD_00548 AP288_RS00300 -gnl|Prokka|PADJNBJD_00548 CTRC943_RS02760 -gnl|Prokka|PADJNBJD_00548 AOT15_RS01580 -gnl|Prokka|PADJNBJD_00548 QSDFRQ_00548 -gnl|Prokka|PADJNBJD_00548 JIEJKO_02765 -gnl|Prokka|PADJNBJD_00548 SOTONK1_RS02780 -gnl|Prokka|PADJNBJD_00548 CTJTET1_RS02790 -gnl|Prokka|PADJNBJD_00548 BKC03_RS02805 -gnl|Prokka|PADJNBJD_00548 KW39_RS02790 -gnl|Prokka|PADJNBJD_00548 C15_RS0102850 -gnl|Prokka|PADJNBJD_00548 ECS88FINAL_RS0102845 -gnl|Prokka|PADJNBJD_00548 IaCS19096_RS02775 -gnl|Prokka|PADJNBJD_00548 AQ244_RS00330 -gnl|Prokka|PADJNBJD_00548 DU10_RS02825 -gnl|Prokka|PADJNBJD_00548 O169_RS02790 -gnl|Prokka|PADJNBJD_00548 A5291_RS02815 -gnl|Prokka|PADJNBJD_00548 DU13_RS02820 -gnl|Prokka|PADJNBJD_00548 CBP48_RS04205 -gnl|Prokka|PADJNBJD_00548 7619059 -gnl|Prokka|PADJNBJD_00548 CTL2C_RS04130 -gnl|Prokka|PADJNBJD_00548 KW36_RS02775 -gnl|Prokka|PADJNBJD_00548 AKW53_RS04005 -gnl|Prokka|PADJNBJD_00548 BKB95_RS02820 -gnl|Prokka|PADJNBJD_00548 BKB96_RS02810 -gnl|Prokka|PADJNBJD_00548 BKB99_RS02805 -gnl|Prokka|PADJNBJD_00548 SW2_RS02785 -gnl|Prokka|PADJNBJD_00548 L1224_RS02760 -gnl|Prokka|PADJNBJD_00548 ECS102511_RS02780 -gnl|Prokka|PADJNBJD_00548 L1440_RS02760 -gnl|Prokka|PADJNBJD_00548 AQ193_RS01205 -gnl|Prokka|PADJNBJD_00548 120202 -gnl|Prokka|PADJNBJD_00548 CBP42_RS04215 -gnl|Prokka|PADJNBJD_00548 L2BUCH2_RS02760 -gnl|Prokka|PADJNBJD_00548 SOTONIA3_RS02795 -gnl|Prokka|PADJNBJD_00548 BKB92_RS02810 -gnl|Prokka|PADJNBJD_00548 CTB_RS02815 -gnl|Prokka|PADJNBJD_00548 E150_RS02785 -gnl|Prokka|PADJNBJD_00548 BW688_RS04205 -gnl|Prokka|PADJNBJD_00548 CTO_RS02815 -gnl|Prokka|PADJNBJD_00548 FCS84708_RS02775 -gnl|Prokka|PADJNBJD_00548 L2BLST_RS02760 -gnl|Prokka|PADJNBJD_00548 BBV13_RS02820 -gnl|Prokka|PADJNBJD_00548 CBP44_RS04210 -gnl|Prokka|PADJNBJD_00548 AQ199_RS03475 -gnl|Prokka|PADJNBJD_00548 BKB93_RS02815 -gnl|Prokka|PADJNBJD_00548 BBV16_RS02830 -gnl|Prokka|PADJNBJD_00548 G9768_RS02780 -gnl|Prokka|PADJNBJD_00548 L3404_RS02755 -gnl|Prokka|PADJNBJD_00548 BKC02_RS02805 -gnl|Prokka|PADJNBJD_00581 gnl|Prokka|PADJNBJD_00581 -gnl|Prokka|PADJNBJD_00581 AOT15_RS03745 -gnl|Prokka|PADJNBJD_00581 NILJEPDF_00581 -gnl|Prokka|PADJNBJD_00581 AP288_RS00135 -gnl|Prokka|PADJNBJD_00581 BKC01_RS02975 -gnl|Prokka|PADJNBJD_00581 LJHENM_02925 -gnl|Prokka|PADJNBJD_00581 CTRC943_RS02925 -gnl|Prokka|PADJNBJD_00581 QSDFRQ_00581 -gnl|Prokka|PADJNBJD_00581 JIEJKO_02930 -gnl|Prokka|PADJNBJD_00581 SOTONK1_RS02945 -gnl|Prokka|PADJNBJD_00581 CTJTET1_RS02955 -gnl|Prokka|PADJNBJD_00581 BKC03_RS02975 -gnl|Prokka|PADJNBJD_00581 C15_RS0103015 -gnl|Prokka|PADJNBJD_00581 KW39_RS02960 -gnl|Prokka|PADJNBJD_00581 IaCS19096_RS02940 -gnl|Prokka|PADJNBJD_00581 AQ244_RS00165 -gnl|Prokka|PADJNBJD_00581 ECS88FINAL_RS0103015 -gnl|Prokka|PADJNBJD_00581 DU10_RS02995 -gnl|Prokka|PADJNBJD_00581 A5291_RS02980 -gnl|Prokka|PADJNBJD_00581 O169_RS02955 -gnl|Prokka|PADJNBJD_00581 DU13_RS02990 -gnl|Prokka|PADJNBJD_00581 CBP48_RS04375 -gnl|Prokka|PADJNBJD_00581 CTL2C_RS04295 -gnl|Prokka|PADJNBJD_00581 KW36_RS02940 -gnl|Prokka|PADJNBJD_00581 BKB95_RS02990 -gnl|Prokka|PADJNBJD_00581 BKB96_RS02980 -gnl|Prokka|PADJNBJD_00581 BKB99_RS02975 -gnl|Prokka|PADJNBJD_00581 L1224_RS02925 -gnl|Prokka|PADJNBJD_00581 AKW53_RS04175 -gnl|Prokka|PADJNBJD_00581 7618614 -gnl|Prokka|PADJNBJD_00581 SW2_RS02950 -gnl|Prokka|PADJNBJD_00581 ECS102511_RS02945 -gnl|Prokka|PADJNBJD_00581 L1440_RS02925 -gnl|Prokka|PADJNBJD_00581 AQ193_RS01040 -gnl|Prokka|PADJNBJD_00581 CBP42_RS04385 -gnl|Prokka|PADJNBJD_00581 L2BUCH2_RS02925 -gnl|Prokka|PADJNBJD_00581 119613 -gnl|Prokka|PADJNBJD_00581 SOTONIA3_RS02960 -gnl|Prokka|PADJNBJD_00581 CTB_RS02980 -gnl|Prokka|PADJNBJD_00581 BKB92_RS02980 -gnl|Prokka|PADJNBJD_00581 E150_RS02950 -gnl|Prokka|PADJNBJD_00581 BW688_RS04375 -gnl|Prokka|PADJNBJD_00581 CTO_RS02980 -gnl|Prokka|PADJNBJD_00581 L2BLST_RS02925 -gnl|Prokka|PADJNBJD_00581 FCS84708_RS02945 -gnl|Prokka|PADJNBJD_00581 BBV13_RS02985 -gnl|Prokka|PADJNBJD_00581 CBP44_RS04380 -gnl|Prokka|PADJNBJD_00581 AQ199_RS03645 -gnl|Prokka|PADJNBJD_00581 BBV16_RS02995 -gnl|Prokka|PADJNBJD_00581 BKB93_RS02985 -gnl|Prokka|PADJNBJD_00581 G9768_RS02945 -gnl|Prokka|PADJNBJD_00581 L3404_RS02920 -gnl|Prokka|PADJNBJD_00581 BKC02_RS02975 -gnl|Prokka|PADJNBJD_00613 gnl|Prokka|PADJNBJD_00613 -gnl|Prokka|PADJNBJD_00613 NILJEPDF_00613 -gnl|Prokka|PADJNBJD_00613 LJHENM_03080 -gnl|Prokka|PADJNBJD_00613 BKC02_RS03145 -gnl|Prokka|PADJNBJD_00613 AOT15_RS03915 -gnl|Prokka|PADJNBJD_00613 AP288_RS01480 -gnl|Prokka|PADJNBJD_00613 CTRC943_RS03085 -gnl|Prokka|PADJNBJD_00613 BKC01_RS03145 -gnl|Prokka|PADJNBJD_00613 QSDFRQ_00613 -gnl|Prokka|PADJNBJD_00613 JIEJKO_03090 -gnl|Prokka|PADJNBJD_00613 SOTONK1_RS03115 -gnl|Prokka|PADJNBJD_00613 CTJTET1_RS03125 -gnl|Prokka|PADJNBJD_00613 BKC03_RS03145 -gnl|Prokka|PADJNBJD_00613 KW39_RS03125 -gnl|Prokka|PADJNBJD_00613 AQ244_RS04800 -gnl|Prokka|PADJNBJD_00613 C15_RS0103180 -gnl|Prokka|PADJNBJD_00613 ECS88FINAL_RS0103180 -gnl|Prokka|PADJNBJD_00613 IaCS19096_RS03110 -gnl|Prokka|PADJNBJD_00613 DU10_RS03160 -gnl|Prokka|PADJNBJD_00613 A5291_RS03145 -gnl|Prokka|PADJNBJD_00613 O169_RS03120 -gnl|Prokka|PADJNBJD_00613 CTL2C_RS04455 -gnl|Prokka|PADJNBJD_00613 DU13_RS03155 -gnl|Prokka|PADJNBJD_00613 CBP48_RS04545 -gnl|Prokka|PADJNBJD_00613 L1224_RS03085 -gnl|Prokka|PADJNBJD_00613 KW36_RS03110 -gnl|Prokka|PADJNBJD_00613 BKB95_RS03155 -gnl|Prokka|PADJNBJD_00613 AKW53_RS04340 -gnl|Prokka|PADJNBJD_00613 AQ193_RS00875 -gnl|Prokka|PADJNBJD_00613 BKB96_RS03150 -gnl|Prokka|PADJNBJD_00613 BKB99_RS03145 -gnl|Prokka|PADJNBJD_00613 7619098 -gnl|Prokka|PADJNBJD_00613 SW2_RS03115 -gnl|Prokka|PADJNBJD_00613 L1440_RS03085 -gnl|Prokka|PADJNBJD_00613 ECS102511_RS03110 -gnl|Prokka|PADJNBJD_00613 CBP42_RS04550 -gnl|Prokka|PADJNBJD_00613 L2BUCH2_RS03085 -gnl|Prokka|PADJNBJD_00613 CTB_RS03145 -gnl|Prokka|PADJNBJD_00613 SOTONIA3_RS03130 -gnl|Prokka|PADJNBJD_00613 BKB92_RS03145 -gnl|Prokka|PADJNBJD_00613 BW688_RS04540 -gnl|Prokka|PADJNBJD_00613 120141 -gnl|Prokka|PADJNBJD_00613 E150_RS03115 -gnl|Prokka|PADJNBJD_00613 CTO_RS03145 -gnl|Prokka|PADJNBJD_00613 L2BLST_RS03085 -gnl|Prokka|PADJNBJD_00613 CBP44_RS04545 -gnl|Prokka|PADJNBJD_00613 FCS84708_RS03110 -gnl|Prokka|PADJNBJD_00613 BBV13_RS03150 -gnl|Prokka|PADJNBJD_00613 AQ199_RS03810 -gnl|Prokka|PADJNBJD_00613 BBV16_RS03160 -gnl|Prokka|PADJNBJD_00613 BKB93_RS03150 -gnl|Prokka|PADJNBJD_00613 G9768_RS03115 -gnl|Prokka|PADJNBJD_00613 L3404_RS03080 -gnl|Prokka|PADJNBJD_00646 gnl|Prokka|PADJNBJD_00646 -gnl|Prokka|PADJNBJD_00646 AP288_RS01655 -gnl|Prokka|PADJNBJD_00646 BKC02_RS03315 -gnl|Prokka|PADJNBJD_00646 NILJEPDF_00647 -gnl|Prokka|PADJNBJD_00646 LJHENM_03250 -gnl|Prokka|PADJNBJD_00646 AOT15_RS04085 -gnl|Prokka|PADJNBJD_00646 CTRC943_RS03260 -gnl|Prokka|PADJNBJD_00646 JIEJKO_03255 -gnl|Prokka|PADJNBJD_00646 BKC01_RS03315 -gnl|Prokka|PADJNBJD_00646 QSDFRQ_00647 -gnl|Prokka|PADJNBJD_00646 AQ244_RS04630 -gnl|Prokka|PADJNBJD_00646 KW39_RS03300 -gnl|Prokka|PADJNBJD_00646 BKC03_RS03315 -gnl|Prokka|PADJNBJD_00646 CTJTET1_RS03300 -gnl|Prokka|PADJNBJD_00646 ECS88FINAL_RS0103350 -gnl|Prokka|PADJNBJD_00646 DU10_RS03330 -gnl|Prokka|PADJNBJD_00646 SOTONK1_RS03285 -gnl|Prokka|PADJNBJD_00646 O169_RS03295 -gnl|Prokka|PADJNBJD_00646 IaCS19096_RS03280 -gnl|Prokka|PADJNBJD_00646 C15_RS0103350 -gnl|Prokka|PADJNBJD_00646 A5291_RS03325 -gnl|Prokka|PADJNBJD_00646 AKW53_RS00035 -gnl|Prokka|PADJNBJD_00646 DU13_RS03325 -gnl|Prokka|PADJNBJD_00646 CTL2C_RS04630 -gnl|Prokka|PADJNBJD_00646 CBP48_RS04715 -gnl|Prokka|PADJNBJD_00646 7619111 -gnl|Prokka|PADJNBJD_00646 SW2_RS03290 -gnl|Prokka|PADJNBJD_00646 L1224_RS03260 -gnl|Prokka|PADJNBJD_00646 KW36_RS03285 -gnl|Prokka|PADJNBJD_00646 ECS102511_RS03285 -gnl|Prokka|PADJNBJD_00646 L1440_RS03260 -gnl|Prokka|PADJNBJD_00646 AQ193_RS00700 -gnl|Prokka|PADJNBJD_00646 BKB95_RS03330 -gnl|Prokka|PADJNBJD_00646 BKB96_RS03325 -gnl|Prokka|PADJNBJD_00646 BKB99_RS03320 -gnl|Prokka|PADJNBJD_00646 CBP42_RS04720 -gnl|Prokka|PADJNBJD_00646 L2BUCH2_RS03260 -gnl|Prokka|PADJNBJD_00646 BKB92_RS03315 -gnl|Prokka|PADJNBJD_00646 CTB_RS03325 -gnl|Prokka|PADJNBJD_00646 E150_RS03290 -gnl|Prokka|PADJNBJD_00646 SOTONIA3_RS03305 -gnl|Prokka|PADJNBJD_00646 BW688_RS04710 -gnl|Prokka|PADJNBJD_00646 CTO_RS03320 -gnl|Prokka|PADJNBJD_00646 FCS84708_RS03285 -gnl|Prokka|PADJNBJD_00646 BBV13_RS03325 -gnl|Prokka|PADJNBJD_00646 L2BLST_RS03260 -gnl|Prokka|PADJNBJD_00646 CBP44_RS04715 -gnl|Prokka|PADJNBJD_00646 120118 -gnl|Prokka|PADJNBJD_00646 AQ199_RS03985 -gnl|Prokka|PADJNBJD_00646 BBV16_RS03335 -gnl|Prokka|PADJNBJD_00646 BKB93_RS03320 -gnl|Prokka|PADJNBJD_00646 G9768_RS03285 -gnl|Prokka|PADJNBJD_00646 L3404_RS03255 -gnl|Prokka|PADJNBJD_00680 gnl|Prokka|PADJNBJD_00680 -gnl|Prokka|PADJNBJD_00680 L3404_RS03435 -gnl|Prokka|PADJNBJD_00680 BKC02_RS03490 -gnl|Prokka|PADJNBJD_00680 NILJEPDF_00681 -gnl|Prokka|PADJNBJD_00680 LJHENM_03420 -gnl|Prokka|PADJNBJD_00680 AOT15_RS04255 -gnl|Prokka|PADJNBJD_00680 AP288_RS01825 -gnl|Prokka|PADJNBJD_00680 JIEJKO_03425 -gnl|Prokka|PADJNBJD_00680 BKC01_RS03490 -gnl|Prokka|PADJNBJD_00680 QSDFRQ_00681 -gnl|Prokka|PADJNBJD_00680 CTRC943_RS03440 -gnl|Prokka|PADJNBJD_00680 AQ244_RS04455 -gnl|Prokka|PADJNBJD_00680 BKC03_RS03490 -gnl|Prokka|PADJNBJD_00680 CBP48_RS00060 -gnl|Prokka|PADJNBJD_00680 CTJTET1_RS03475 -gnl|Prokka|PADJNBJD_00680 KW39_RS03475 -gnl|Prokka|PADJNBJD_00680 DU10_RS03505 -gnl|Prokka|PADJNBJD_00680 SOTONK1_RS03455 -gnl|Prokka|PADJNBJD_00680 ECS88FINAL_RS0103535 -gnl|Prokka|PADJNBJD_00680 IaCS19096_RS03450 -gnl|Prokka|PADJNBJD_00680 C15_RS0103530 -gnl|Prokka|PADJNBJD_00680 A5291_RS03500 -gnl|Prokka|PADJNBJD_00680 O169_RS03470 -gnl|Prokka|PADJNBJD_00680 DU13_RS03505 -gnl|Prokka|PADJNBJD_00680 KW36_RS03455 -gnl|Prokka|PADJNBJD_00680 AKW53_RS00205 -gnl|Prokka|PADJNBJD_00680 AQ193_RS00530 -gnl|Prokka|PADJNBJD_00680 BKB95_RS03510 -gnl|Prokka|PADJNBJD_00680 CBP42_RS00060 -gnl|Prokka|PADJNBJD_00680 SW2_RS03465 -gnl|Prokka|PADJNBJD_00680 CTL2C_RS00060 -gnl|Prokka|PADJNBJD_00680 L1224_RS03440 -gnl|Prokka|PADJNBJD_00680 ECS102511_RS03455 -gnl|Prokka|PADJNBJD_00680 L1440_RS03440 -gnl|Prokka|PADJNBJD_00680 BKB96_RS03500 -gnl|Prokka|PADJNBJD_00680 BKB99_RS03495 -gnl|Prokka|PADJNBJD_00680 CBP44_RS00060 -gnl|Prokka|PADJNBJD_00680 L2BUCH2_RS03440 -gnl|Prokka|PADJNBJD_00680 BKB92_RS03490 -gnl|Prokka|PADJNBJD_00680 CTB_RS03495 -gnl|Prokka|PADJNBJD_00680 SOTONIA3_RS03475 -gnl|Prokka|PADJNBJD_00680 E150_RS03465 -gnl|Prokka|PADJNBJD_00680 CTO_RS03490 -gnl|Prokka|PADJNBJD_00680 BBV13_RS03495 -gnl|Prokka|PADJNBJD_00680 FCS84708_RS03455 -gnl|Prokka|PADJNBJD_00680 L2BLST_RS03440 -gnl|Prokka|PADJNBJD_00680 7618210 -gnl|Prokka|PADJNBJD_00680 BBV16_RS03505 -gnl|Prokka|PADJNBJD_00680 BW688_RS00060 -gnl|Prokka|PADJNBJD_00680 AQ199_RS04155 -gnl|Prokka|PADJNBJD_00680 BKB93_RS03495 -gnl|Prokka|PADJNBJD_00680 119692 -gnl|Prokka|PADJNBJD_00680 G9768_RS03455 -gnl|Prokka|PADJNBJD_00713 gnl|Prokka|PADJNBJD_00713 -gnl|Prokka|PADJNBJD_00713 L3404_RS03600 -gnl|Prokka|PADJNBJD_00713 BKC02_RS03655 -gnl|Prokka|PADJNBJD_00713 NILJEPDF_00714 -gnl|Prokka|PADJNBJD_00713 LJHENM_03585 -gnl|Prokka|PADJNBJD_00713 AOT15_RS04425 -gnl|Prokka|PADJNBJD_00713 AP288_RS01990 -gnl|Prokka|PADJNBJD_00713 JIEJKO_03590 -gnl|Prokka|PADJNBJD_00713 BKC01_RS03655 -gnl|Prokka|PADJNBJD_00713 QSDFRQ_00714 -gnl|Prokka|PADJNBJD_00713 CTRC943_RS03610 -gnl|Prokka|PADJNBJD_00713 BKC03_RS03655 -gnl|Prokka|PADJNBJD_00713 CBP48_RS00225 -gnl|Prokka|PADJNBJD_00713 CTJTET1_RS03645 -gnl|Prokka|PADJNBJD_00713 KW39_RS03640 -gnl|Prokka|PADJNBJD_00713 AQ244_RS04285 -gnl|Prokka|PADJNBJD_00713 DU10_RS03670 -gnl|Prokka|PADJNBJD_00713 SOTONK1_RS03625 -gnl|Prokka|PADJNBJD_00713 ECS88FINAL_RS0103715 -gnl|Prokka|PADJNBJD_00713 IaCS19096_RS03620 -gnl|Prokka|PADJNBJD_00713 C15_RS0103705 -gnl|Prokka|PADJNBJD_00713 A5291_RS03670 -gnl|Prokka|PADJNBJD_00713 O169_RS03635 -gnl|Prokka|PADJNBJD_00713 DU13_RS03670 -gnl|Prokka|PADJNBJD_00713 KW36_RS03625 -gnl|Prokka|PADJNBJD_00713 AKW53_RS00375 -gnl|Prokka|PADJNBJD_00713 AQ193_RS00365 -gnl|Prokka|PADJNBJD_00713 BKB95_RS03675 -gnl|Prokka|PADJNBJD_00713 CBP42_RS00225 -gnl|Prokka|PADJNBJD_00713 SW2_RS03630 -gnl|Prokka|PADJNBJD_00713 CTL2C_RS00225 -gnl|Prokka|PADJNBJD_00713 L1224_RS03605 -gnl|Prokka|PADJNBJD_00713 ECS102511_RS03620 -gnl|Prokka|PADJNBJD_00713 L1440_RS03605 -gnl|Prokka|PADJNBJD_00713 BKB96_RS03665 -gnl|Prokka|PADJNBJD_00713 BKB99_RS03660 -gnl|Prokka|PADJNBJD_00713 CBP44_RS00225 -gnl|Prokka|PADJNBJD_00713 L2BUCH2_RS03605 -gnl|Prokka|PADJNBJD_00713 BKB92_RS03655 -gnl|Prokka|PADJNBJD_00713 CTB_RS03665 -gnl|Prokka|PADJNBJD_00713 SOTONIA3_RS03645 -gnl|Prokka|PADJNBJD_00713 E150_RS03630 -gnl|Prokka|PADJNBJD_00713 CTO_RS03660 -gnl|Prokka|PADJNBJD_00713 BBV13_RS03665 -gnl|Prokka|PADJNBJD_00713 FCS84708_RS03620 -gnl|Prokka|PADJNBJD_00713 L2BLST_RS03605 -gnl|Prokka|PADJNBJD_00713 BBV16_RS03675 -gnl|Prokka|PADJNBJD_00713 BW688_RS00225 -gnl|Prokka|PADJNBJD_00713 AQ199_RS04320 -gnl|Prokka|PADJNBJD_00713 BKB93_RS03660 -gnl|Prokka|PADJNBJD_00713 7618236 -gnl|Prokka|PADJNBJD_00713 G9768_RS03625 -gnl|Prokka|PADJNBJD_00749 gnl|Prokka|PADJNBJD_00749 -gnl|Prokka|PADJNBJD_00749 L3404_RS03780 -gnl|Prokka|PADJNBJD_00749 BKC02_RS03840 -gnl|Prokka|PADJNBJD_00749 NILJEPDF_00750 -gnl|Prokka|PADJNBJD_00749 LJHENM_03775 -gnl|Prokka|PADJNBJD_00749 AOT15_RS04605 -gnl|Prokka|PADJNBJD_00749 AP288_RS02175 -gnl|Prokka|PADJNBJD_00749 JIEJKO_03775 -gnl|Prokka|PADJNBJD_00749 BKC01_RS03845 -gnl|Prokka|PADJNBJD_00749 QSDFRQ_00750 -gnl|Prokka|PADJNBJD_00749 CTRC943_RS03790 -gnl|Prokka|PADJNBJD_00749 AKW53_RS00545 -gnl|Prokka|PADJNBJD_00749 BKC03_RS03840 -gnl|Prokka|PADJNBJD_00749 CTJTET1_RS03825 -gnl|Prokka|PADJNBJD_00749 KW39_RS03820 -gnl|Prokka|PADJNBJD_00749 AQ244_RS04105 -gnl|Prokka|PADJNBJD_00749 DU10_RS03855 -gnl|Prokka|PADJNBJD_00749 CBP48_RS00410 -gnl|Prokka|PADJNBJD_00749 A5291_RS03850 -gnl|Prokka|PADJNBJD_00749 SOTONK1_RS03805 -gnl|Prokka|PADJNBJD_00749 IaCS19096_RS03800 -gnl|Prokka|PADJNBJD_00749 DU13_RS03855 -gnl|Prokka|PADJNBJD_00749 C15_RS0103910 -gnl|Prokka|PADJNBJD_00749 ECS88FINAL_RS0103910 -gnl|Prokka|PADJNBJD_00749 O169_RS03815 -gnl|Prokka|PADJNBJD_00749 KW36_RS03805 -gnl|Prokka|PADJNBJD_00749 AQ193_RS00185 -gnl|Prokka|PADJNBJD_00749 BKB95_RS03860 -gnl|Prokka|PADJNBJD_00749 CBP42_RS00410 -gnl|Prokka|PADJNBJD_00749 SW2_RS03810 -gnl|Prokka|PADJNBJD_00749 CTL2C_RS00405 -gnl|Prokka|PADJNBJD_00749 L1224_RS03785 -gnl|Prokka|PADJNBJD_00749 ECS102511_RS03800 -gnl|Prokka|PADJNBJD_00749 BKB96_RS03845 -gnl|Prokka|PADJNBJD_00749 BKB99_RS03840 -gnl|Prokka|PADJNBJD_00749 L1440_RS03785 -gnl|Prokka|PADJNBJD_00749 CBP44_RS00410 -gnl|Prokka|PADJNBJD_00749 L2BUCH2_RS03785 -gnl|Prokka|PADJNBJD_00749 BKB92_RS03840 -gnl|Prokka|PADJNBJD_00749 CTB_RS03845 -gnl|Prokka|PADJNBJD_00749 SOTONIA3_RS03825 -gnl|Prokka|PADJNBJD_00749 E150_RS03810 -gnl|Prokka|PADJNBJD_00749 CTO_RS03840 -gnl|Prokka|PADJNBJD_00749 BBV13_RS03845 -gnl|Prokka|PADJNBJD_00749 FCS84708_RS03800 -gnl|Prokka|PADJNBJD_00749 BBV16_RS03855 -gnl|Prokka|PADJNBJD_00749 L2BLST_RS03785 -gnl|Prokka|PADJNBJD_00749 7618690 -gnl|Prokka|PADJNBJD_00749 120045 -gnl|Prokka|PADJNBJD_00749 BW688_RS00410 -gnl|Prokka|PADJNBJD_00749 AQ199_RS04500 -gnl|Prokka|PADJNBJD_00749 BKB93_RS03845 -gnl|Prokka|PADJNBJD_00749 G9768_RS03805 -gnl|Prokka|PADJNBJD_00822 gnl|Prokka|PADJNBJD_00822 -gnl|Prokka|PADJNBJD_00822 BKB93_RS04225 -gnl|Prokka|PADJNBJD_00822 NILJEPDF_00823 -gnl|Prokka|PADJNBJD_00822 G9768_RS04185 -gnl|Prokka|PADJNBJD_00822 L3404_RS04160 -gnl|Prokka|PADJNBJD_00822 LJHENM_04140 -gnl|Prokka|PADJNBJD_00822 JIEJKO_04140 -gnl|Prokka|PADJNBJD_00822 BKC02_RS04220 -gnl|Prokka|PADJNBJD_00822 QSDFRQ_00823 -gnl|Prokka|PADJNBJD_00822 AKW53_RS00900 -gnl|Prokka|PADJNBJD_00822 BKC01_RS04225 -gnl|Prokka|PADJNBJD_00822 CTRC943_RS04170 -gnl|Prokka|PADJNBJD_00822 AOT15_RS01770 -gnl|Prokka|PADJNBJD_00822 CTJTET1_RS04360 -gnl|Prokka|PADJNBJD_00822 KW39_RS04200 -gnl|Prokka|PADJNBJD_00822 BKC03_RS04220 -gnl|Prokka|PADJNBJD_00822 CBP48_RS00790 -gnl|Prokka|PADJNBJD_00822 A5291_RS04225 -gnl|Prokka|PADJNBJD_00822 ECS88FINAL_RS0104270 -gnl|Prokka|PADJNBJD_00822 DU10_RS04235 -gnl|Prokka|PADJNBJD_00822 SOTONK1_RS04185 -gnl|Prokka|PADJNBJD_00822 IaCS19096_RS04180 -gnl|Prokka|PADJNBJD_00822 DU13_RS04235 -gnl|Prokka|PADJNBJD_00822 C15_RS0104295 -gnl|Prokka|PADJNBJD_00822 O169_RS04195 -gnl|Prokka|PADJNBJD_00822 KW36_RS04185 -gnl|Prokka|PADJNBJD_00822 AQ193_RS04590 -gnl|Prokka|PADJNBJD_00822 AQ244_RS02580 -gnl|Prokka|PADJNBJD_00822 BKB95_RS04240 -gnl|Prokka|PADJNBJD_00822 CBP42_RS00790 -gnl|Prokka|PADJNBJD_00822 CTL2C_RS00785 -gnl|Prokka|PADJNBJD_00822 L1224_RS04165 -gnl|Prokka|PADJNBJD_00822 BKB96_RS04225 -gnl|Prokka|PADJNBJD_00822 SW2_RS04190 -gnl|Prokka|PADJNBJD_00822 L1440_RS04160 -gnl|Prokka|PADJNBJD_00822 ECS102511_RS04180 -gnl|Prokka|PADJNBJD_00822 BKB99_RS04220 -gnl|Prokka|PADJNBJD_00822 CBP44_RS00790 -gnl|Prokka|PADJNBJD_00822 CTB_RS04220 -gnl|Prokka|PADJNBJD_00822 L2BUCH2_RS04165 -gnl|Prokka|PADJNBJD_00822 BKB92_RS04220 -gnl|Prokka|PADJNBJD_00822 SOTONIA3_RS04205 -gnl|Prokka|PADJNBJD_00822 CTO_RS04215 -gnl|Prokka|PADJNBJD_00822 AP288_RS02485 -gnl|Prokka|PADJNBJD_00822 E150_RS04190 -gnl|Prokka|PADJNBJD_00822 BBV13_RS04225 -gnl|Prokka|PADJNBJD_00822 119812 -gnl|Prokka|PADJNBJD_00822 FCS84708_RS04180 -gnl|Prokka|PADJNBJD_00822 AQ199_RS00110 -gnl|Prokka|PADJNBJD_00822 7618288 -gnl|Prokka|PADJNBJD_00822 L2BLST_RS04165 -gnl|Prokka|PADJNBJD_00822 BBV16_RS04235 -gnl|Prokka|PADJNBJD_00822 BW688_RS00790 -gnl|Prokka|PADJNBJD_00922 gnl|Prokka|PADJNBJD_00922 -gnl|Prokka|PADJNBJD_00922 CTO_RS04725 -gnl|Prokka|PADJNBJD_00922 L2BLST_RS04685 -gnl|Prokka|PADJNBJD_00922 BBV13_RS04745 -gnl|Prokka|PADJNBJD_00922 E150_RS04720 -gnl|Prokka|PADJNBJD_00922 BBV16_RS04750 -gnl|Prokka|PADJNBJD_00922 NILJEPDF_00923 -gnl|Prokka|PADJNBJD_00922 FCS84708_RS04705 -gnl|Prokka|PADJNBJD_00922 AQ199_RS00640 -gnl|Prokka|PADJNBJD_00922 BW688_RS01335 -gnl|Prokka|PADJNBJD_00922 119189 -gnl|Prokka|PADJNBJD_00922 JIEJKO_04640 -gnl|Prokka|PADJNBJD_00922 QSDFRQ_00923 -gnl|Prokka|PADJNBJD_00922 LJHENM_04650 -gnl|Prokka|PADJNBJD_00922 L3404_RS04680 -gnl|Prokka|PADJNBJD_00922 G9768_RS04705 -gnl|Prokka|PADJNBJD_00922 7618170 -gnl|Prokka|PADJNBJD_00922 BKB93_RS04765 -gnl|Prokka|PADJNBJD_00922 BKC02_RS04755 -gnl|Prokka|PADJNBJD_00922 AQ193_RS04060 -gnl|Prokka|PADJNBJD_00922 CTRC943_RS04690 -gnl|Prokka|PADJNBJD_00922 AKW53_RS01430 -gnl|Prokka|PADJNBJD_00922 BKC01_RS04760 -gnl|Prokka|PADJNBJD_00922 AOT15_RS02285 -gnl|Prokka|PADJNBJD_00922 AQ244_RS02045 -gnl|Prokka|PADJNBJD_00922 CTJTET1_RS04875 -gnl|Prokka|PADJNBJD_00922 CBP48_RS01335 -gnl|Prokka|PADJNBJD_00922 KW39_RS04725 -gnl|Prokka|PADJNBJD_00922 BKC03_RS04755 -gnl|Prokka|PADJNBJD_00922 SOTONK1_RS04705 -gnl|Prokka|PADJNBJD_00922 A5291_RS04735 -gnl|Prokka|PADJNBJD_00922 ECS88FINAL_RS0104805 -gnl|Prokka|PADJNBJD_00922 IaCS19096_RS04700 -gnl|Prokka|PADJNBJD_00922 C15_RS0104825 -gnl|Prokka|PADJNBJD_00922 DU10_RS04775 -gnl|Prokka|PADJNBJD_00922 O169_RS04725 -gnl|Prokka|PADJNBJD_00922 KW36_RS04705 -gnl|Prokka|PADJNBJD_00922 DU13_RS04775 -gnl|Prokka|PADJNBJD_00922 CTL2C_RS01305 -gnl|Prokka|PADJNBJD_00922 CBP42_RS01335 -gnl|Prokka|PADJNBJD_00922 L1224_RS04685 -gnl|Prokka|PADJNBJD_00922 BKB95_RS04775 -gnl|Prokka|PADJNBJD_00922 L1440_RS04680 -gnl|Prokka|PADJNBJD_00922 BKB96_RS04760 -gnl|Prokka|PADJNBJD_00922 BKB99_RS04755 -gnl|Prokka|PADJNBJD_00922 SW2_RS04715 -gnl|Prokka|PADJNBJD_00922 ECS102511_RS04710 -gnl|Prokka|PADJNBJD_00922 CBP44_RS01335 -gnl|Prokka|PADJNBJD_00922 L2BUCH2_RS04685 -gnl|Prokka|PADJNBJD_00922 CTB_RS04730 -gnl|Prokka|PADJNBJD_00922 SOTONIA3_RS04720 -gnl|Prokka|PADJNBJD_00922 AP288_RS03015 -gnl|Prokka|PADJNBJD_00922 BKB92_RS04760 -C15_RS0100055 C15_RS0100055 -C15_RS0100055 QSDFRQ_00011 -C15_RS0100055 CTJTET1_RS00055 -C15_RS0100055 AKW53_RS01540 -C15_RS0100055 DU10_RS00055 -C15_RS0100055 CTRC943_RS00055 -C15_RS0100055 O169_RS00055 -C15_RS0100055 CBP48_RS01445 -C15_RS0100055 ECS88FINAL_RS0100060 -C15_RS0100055 AOT15_RS00900 -C15_RS0100055 DU13_RS00055 -C15_RS0100055 KW39_RS00055 -C15_RS0100055 BKB95_RS00055 -C15_RS0100055 KW36_RS00055 -C15_RS0100055 SW2_RS00055 -C15_RS0100055 ECS102511_RS00055 -C15_RS0100055 CTB_RS00055 -C15_RS0100055 CTL2C_RS01420 -C15_RS0100055 CBP42_RS01445 -C15_RS0100055 L1224_RS00055 -C15_RS0100055 BKB96_RS00055 -C15_RS0100055 BKB99_RS00055 -C15_RS0100055 CTO_RS00055 -C15_RS0100055 SOTONIA3_RS00055 -C15_RS0100055 L1440_RS00055 -C15_RS0100055 BKB92_RS00055 -C15_RS0100055 120660 -C15_RS0100055 CBP44_RS01445 -C15_RS0100055 AQ193_RS03950 -C15_RS0100055 E150_RS00055 -C15_RS0100055 L2BUCH2_RS00055 -C15_RS0100055 BKB93_RS00055 -C15_RS0100055 FCS84708_RS00055 -C15_RS0100055 AQ244_RS01935 -C15_RS0100055 AP288_RS03125 -C15_RS0100055 BBV13_RS00055 -C15_RS0100055 G9768_RS00055 -C15_RS0100055 BW688_RS01445 -C15_RS0100055 L2BLST_RS00055 -C15_RS0100055 AQ199_RS00750 -C15_RS0100055 BKC02_RS00055 -C15_RS0100055 BBV16_RS00055 -C15_RS0100055 BKC01_RS00055 -C15_RS0100055 7618782 -C15_RS0100055 gnl|Prokka|PADJNBJD_00011 -C15_RS0100055 LJHENM_00055 -C15_RS0100055 A5291_RS00055 -C15_RS0100055 SOTONK1_RS00055 -C15_RS0100055 JIEJKO_00050 -C15_RS0100055 NILJEPDF_00011 -C15_RS0100055 L3404_RS00055 -C15_RS0100055 IaCS19096_RS00055 -C15_RS0100055 BKC03_RS00055 -C15_RS0100220 C15_RS0100220 -C15_RS0100220 DU10_RS00225 -C15_RS0100220 CTRC943_RS00220 -C15_RS0100220 CTJTET1_RS00220 -C15_RS0100220 O169_RS00220 -C15_RS0100220 CBP48_RS01615 -C15_RS0100220 ECS88FINAL_RS0100225 -C15_RS0100220 DU13_RS00225 -C15_RS0100220 KW39_RS00220 -C15_RS0100220 KW36_RS00220 -C15_RS0100220 AOT15_RS00735 -C15_RS0100220 BKB95_RS00225 -C15_RS0100220 SW2_RS00220 -C15_RS0100220 ECS102511_RS00220 -C15_RS0100220 CTL2C_RS01585 -C15_RS0100220 CBP42_RS01615 -C15_RS0100220 CTB_RS00220 -C15_RS0100220 L1224_RS00220 -C15_RS0100220 BKB96_RS00225 -C15_RS0100220 L1440_RS00220 -C15_RS0100220 BKB99_RS00225 -C15_RS0100220 BKB92_RS00225 -C15_RS0100220 CTO_RS00220 -C15_RS0100220 SOTONIA3_RS00220 -C15_RS0100220 119239 -C15_RS0100220 CBP44_RS01620 -C15_RS0100220 E150_RS00220 -C15_RS0100220 L2BUCH2_RS00220 -C15_RS0100220 BKB93_RS00225 -C15_RS0100220 FCS84708_RS00220 -C15_RS0100220 AP288_RS03290 -C15_RS0100220 AQ193_RS03785 -C15_RS0100220 AQ244_RS01770 -C15_RS0100220 BBV13_RS00225 -C15_RS0100220 AQ199_RS00915 -C15_RS0100220 BW688_RS01615 -C15_RS0100220 G9768_RS00220 -C15_RS0100220 L2BLST_RS00220 -C15_RS0100220 BKC02_RS00225 -C15_RS0100220 gnl|Prokka|PADJNBJD_00043 -C15_RS0100220 BBV16_RS00225 -C15_RS0100220 JIEJKO_00210 -C15_RS0100220 NILJEPDF_00043 -C15_RS0100220 LJHENM_00220 -C15_RS0100220 BKC01_RS00225 -C15_RS0100220 7618377 -C15_RS0100220 A5291_RS00220 -C15_RS0100220 SOTONK1_RS00220 -C15_RS0100220 L3404_RS00220 -C15_RS0100220 AKW53_RS01710 -C15_RS0100220 QSDFRQ_00043 -C15_RS0100220 IaCS19096_RS00220 -C15_RS0100220 BKC03_RS00225 -C15_RS0100395 C15_RS0100395 -C15_RS0100395 DU10_RS00395 -C15_RS0100395 7618810 -C15_RS0100395 CTRC943_RS00385 -C15_RS0100395 CTJTET1_RS00385 -C15_RS0100395 O169_RS00385 -C15_RS0100395 KW36_RS00385 -C15_RS0100395 DU13_RS00400 -C15_RS0100395 CBP48_RS01785 -C15_RS0100395 ECS88FINAL_RS0100400 -C15_RS0100395 KW39_RS00385 -C15_RS0100395 AOT15_RS00570 -C15_RS0100395 BKB95_RS00395 -C15_RS0100395 SW2_RS00385 -C15_RS0100395 ECS102511_RS00385 -C15_RS0100395 CTB_RS00385 -C15_RS0100395 CTL2C_RS01750 -C15_RS0100395 CBP42_RS01785 -C15_RS0100395 BKB96_RS00395 -C15_RS0100395 L1224_RS00385 -C15_RS0100395 BKB99_RS00395 -C15_RS0100395 CTO_RS00385 -C15_RS0100395 L1440_RS00385 -C15_RS0100395 BKB92_RS00395 -C15_RS0100395 SOTONIA3_RS00385 -C15_RS0100395 CBP44_RS01790 -C15_RS0100395 120616 -C15_RS0100395 E150_RS00385 -C15_RS0100395 L2BUCH2_RS00385 -C15_RS0100395 BKB93_RS00395 -C15_RS0100395 FCS84708_RS00385 -C15_RS0100395 AP288_RS03455 -C15_RS0100395 AQ193_RS03610 -C15_RS0100395 AQ244_RS01605 -C15_RS0100395 BBV13_RS00390 -C15_RS0100395 AQ199_RS01080 -C15_RS0100395 BW688_RS01785 -C15_RS0100395 G9768_RS00385 -C15_RS0100395 L2BLST_RS00385 -C15_RS0100395 BKC02_RS00395 -C15_RS0100395 BBV16_RS00390 -C15_RS0100395 gnl|Prokka|PADJNBJD_00076 -C15_RS0100395 NILJEPDF_00076 -C15_RS0100395 LJHENM_00385 -C15_RS0100395 A5291_RS00385 -C15_RS0100395 BKC01_RS00395 -C15_RS0100395 SOTONK1_RS00385 -C15_RS0100395 L3404_RS00385 -C15_RS0100395 JIEJKO_00385 -C15_RS0100395 AKW53_RS01875 -C15_RS0100395 QSDFRQ_00076 -C15_RS0100395 IaCS19096_RS00385 -C15_RS0100395 BKC03_RS00395 -C15_RS0100565 C15_RS0100565 -C15_RS0100565 DU10_RS00560 -C15_RS0100565 CTJTET1_RS00550 -C15_RS0100565 KW39_RS00550 -C15_RS0100565 O169_RS00550 -C15_RS0100565 DU13_RS00565 -C15_RS0100565 7618832 -C15_RS0100565 CTRC943_RS00550 -C15_RS0100565 ECS88FINAL_RS0100565 -C15_RS0100565 KW36_RS00550 -C15_RS0100565 CBP48_RS01950 -C15_RS0100565 SW2_RS00550 -C15_RS0100565 AOT15_RS00405 -C15_RS0100565 BKB95_RS00560 -C15_RS0100565 ECS102511_RS00550 -C15_RS0100565 CTL2C_RS01915 -C15_RS0100565 AQ244_RS02725 -C15_RS0100565 BKB96_RS00560 -C15_RS0100565 CBP42_RS01950 -C15_RS0100565 CTB_RS00555 -C15_RS0100565 BKB99_RS00560 -C15_RS0100565 L1224_RS00550 -C15_RS0100565 BKB92_RS00560 -C15_RS0100565 SOTONIA3_RS00550 -C15_RS0100565 L1440_RS00550 -C15_RS0100565 CTO_RS00555 -C15_RS0100565 E150_RS00550 -C15_RS0100565 CBP44_RS01955 -C15_RS0100565 120581 -C15_RS0100565 BKB93_RS00560 -C15_RS0100565 L2BUCH2_RS00550 -C15_RS0100565 FCS84708_RS00550 -C15_RS0100565 AP288_RS03620 -C15_RS0100565 AQ193_RS03445 -C15_RS0100565 AQ199_RS01245 -C15_RS0100565 BBV13_RS00560 -C15_RS0100565 G9768_RS00550 -C15_RS0100565 L2BLST_RS00550 -C15_RS0100565 BW688_RS01950 -C15_RS0100565 BKC02_RS00560 -C15_RS0100565 gnl|Prokka|PADJNBJD_00108 -C15_RS0100565 LJHENM_00540 -C15_RS0100565 BBV16_RS00560 -C15_RS0100565 BKC01_RS00560 -C15_RS0100565 NILJEPDF_00108 -C15_RS0100565 AKW53_RS02045 -C15_RS0100565 SOTONK1_RS00550 -C15_RS0100565 JIEJKO_00545 -C15_RS0100565 A5291_RS00555 -C15_RS0100565 L3404_RS00550 -C15_RS0100565 QSDFRQ_00108 -C15_RS0100565 IaCS19096_RS00550 -C15_RS0100565 BKC03_RS00560 -C15_RS0100735 C15_RS0100735 -C15_RS0100735 CTRC943_RS00710 -C15_RS0100735 ECS88FINAL_RS0100735 -C15_RS0100735 KW39_RS00710 -C15_RS0100735 DU10_RS00720 -C15_RS0100735 O169_RS00710 -C15_RS0100735 DU13_RS00725 -C15_RS0100735 7618427 -C15_RS0100735 KW36_RS00710 -C15_RS0100735 CBP48_RS02110 -C15_RS0100735 SW2_RS00710 -C15_RS0100735 BKB95_RS00720 -C15_RS0100735 AOT15_RS00245 -C15_RS0100735 ECS102511_RS00710 -C15_RS0100735 CTL2C_RS02075 -C15_RS0100735 CTB_RS00715 -C15_RS0100735 L1224_RS00710 -C15_RS0100735 AQ244_RS02885 -C15_RS0100735 BKB96_RS00720 -C15_RS0100735 CBP42_RS02110 -C15_RS0100735 BKB99_RS00720 -C15_RS0100735 CTO_RS00715 -C15_RS0100735 L1440_RS00710 -C15_RS0100735 BKB92_RS00720 -C15_RS0100735 SOTONIA3_RS00710 -C15_RS0100735 E150_RS00710 -C15_RS0100735 L2BUCH2_RS00710 -C15_RS0100735 CBP44_RS02115 -C15_RS0100735 FCS84708_RS00710 -C15_RS0100735 AP288_RS03780 -C15_RS0100735 BKB93_RS00720 -C15_RS0100735 119317 -C15_RS0100735 AQ199_RS01405 -C15_RS0100735 BBV13_RS00720 -C15_RS0100735 G9768_RS00710 -C15_RS0100735 L2BLST_RS00710 -C15_RS0100735 BW688_RS02110 -C15_RS0100735 AQ193_RS03285 -C15_RS0100735 BBV16_RS00720 -C15_RS0100735 BKC02_RS00720 -C15_RS0100735 gnl|Prokka|PADJNBJD_00140 -C15_RS0100735 LJHENM_00700 -C15_RS0100735 AKW53_RS02205 -C15_RS0100735 BKC01_RS00720 -C15_RS0100735 NILJEPDF_00140 -C15_RS0100735 A5291_RS00715 -C15_RS0100735 L3404_RS00710 -C15_RS0100735 SOTONK1_RS00710 -C15_RS0100735 JIEJKO_00705 -C15_RS0100735 QSDFRQ_00140 -C15_RS0100735 CTJTET1_RS00710 -C15_RS0100735 IaCS19096_RS00710 -C15_RS0100735 BKC03_RS00720 -C15_RS0100940 C15_RS0100940 -C15_RS0100940 SOTONK1_RS00905 -C15_RS0100940 KW39_RS00910 -C15_RS0100940 JIEJKO_00890 -C15_RS0100940 A5291_RS00930 -C15_RS0100940 IaCS19096_RS00905 -C15_RS0100940 QSDFRQ_00177 -C15_RS0100940 O169_RS00910 -C15_RS0100940 DU13_RS00915 -C15_RS0100940 BKB95_RS00920 -C15_RS0100940 KW36_RS00905 -C15_RS0100940 BKB96_RS00905 -C15_RS0100940 BKB99_RS00905 -C15_RS0100940 AOT15_RS01460 -C15_RS0100940 AQ244_RS03085 -C15_RS0100940 SOTONIA3_RS00920 -C15_RS0100940 CTB_RS00930 -C15_RS0100940 CTO_RS00930 -C15_RS0100940 BBV13_RS00935 -C15_RS0100940 G9768_RS00910 -C15_RS0100940 BKC02_RS00905 -C15_RS0100940 120537 -C15_RS0100940 BBV16_RS00935 -C15_RS0100940 BKC01_RS00905 -C15_RS0100940 gnl|Prokka|PADJNBJD_00177 -C15_RS0100940 BKC03_RS00905 -C15_RS0100940 NILJEPDF_00177 -C15_RS0100940 LJHENM_00890 -C15_RS0100940 CTJTET1_RS00920 -C15_RS0101110 C15_RS0101110 -C15_RS0101110 SOTONK1_RS01075 -C15_RS0101110 ECS88FINAL_RS0101095 -C15_RS0101110 KW39_RS01080 -C15_RS0101110 JIEJKO_01060 -C15_RS0101110 A5291_RS01100 -C15_RS0101110 IaCS19096_RS01075 -C15_RS0101110 7618464 -C15_RS0101110 QSDFRQ_00211 -C15_RS0101110 O169_RS01080 -C15_RS0101110 DU13_RS01085 -C15_RS0101110 SW2_RS01070 -C15_RS0101110 BKB95_RS01090 -C15_RS0101110 CBP48_RS02465 -C15_RS0101110 KW36_RS01075 -C15_RS0101110 ECS102511_RS01070 -C15_RS0101110 BKB96_RS01075 -C15_RS0101110 CTL2C_RS02425 -C15_RS0101110 BKB99_RS01075 -C15_RS0101110 L1224_RS01055 -C15_RS0101110 L1440_RS01055 -C15_RS0101110 AOT15_RS01290 -C15_RS0101110 AQ244_RS03255 -C15_RS0101110 BKB92_RS01075 -C15_RS0101110 CBP42_RS02465 -C15_RS0101110 SOTONIA3_RS01090 -C15_RS0101110 E150_RS01070 -C15_RS0101110 CTB_RS01100 -C15_RS0101110 L2BUCH2_RS01060 -C15_RS0101110 CTO_RS01100 -C15_RS0101110 FCS84708_RS01070 -C15_RS0101110 AP288_RS04140 -C15_RS0101110 BKB93_RS01075 -C15_RS0101110 CBP44_RS02470 -C15_RS0101110 AQ199_RS01765 -C15_RS0101110 L2BLST_RS01060 -C15_RS0101110 BW688_RS02470 -C15_RS0101110 BBV13_RS01105 -C15_RS0101110 G9768_RS01080 -C15_RS0101110 AQ193_RS02920 -C15_RS0101110 BKC02_RS01075 -C15_RS0101110 L3404_RS01055 -C15_RS0101110 AKW53_RS02565 -C15_RS0101110 BBV16_RS01105 -C15_RS0101110 BKC01_RS01075 -C15_RS0101110 119379 -C15_RS0101110 DU10_RS01085 -C15_RS0101110 gnl|Prokka|PADJNBJD_00211 -C15_RS0101110 BKC03_RS01075 -C15_RS0101110 NILJEPDF_00211 -C15_RS0101110 LJHENM_01060 -C15_RS0101110 CTRC943_RS01060 -C15_RS0101110 CTJTET1_RS01090 -C15_RS0101290 C15_RS0101290 -C15_RS0101290 SOTONK1_RS01255 -C15_RS0101290 ECS88FINAL_RS0101275 -C15_RS0101290 QSDFRQ_00246 -C15_RS0101290 A5291_RS01280 -C15_RS0101290 IaCS19096_RS01255 -C15_RS0101290 O169_RS01260 -C15_RS0101290 DU13_RS01265 -C15_RS0101290 7618893 -C15_RS0101290 SW2_RS01250 -C15_RS0101290 BKB95_RS01270 -C15_RS0101290 CBP48_RS02645 -C15_RS0101290 KW36_RS01255 -C15_RS0101290 ECS102511_RS01250 -C15_RS0101290 BKB96_RS01255 -C15_RS0101290 CTL2C_RS02605 -C15_RS0101290 BKB99_RS01255 -C15_RS0101290 L1224_RS01235 -C15_RS0101290 L1440_RS01235 -C15_RS0101290 AOT15_RS01110 -C15_RS0101290 AQ244_RS03435 -C15_RS0101290 BKB92_RS01255 -C15_RS0101290 CBP42_RS02645 -C15_RS0101290 SOTONIA3_RS01270 -C15_RS0101290 CTB_RS01280 -C15_RS0101290 E150_RS01250 -C15_RS0101290 L2BUCH2_RS01240 -C15_RS0101290 CTO_RS01280 -C15_RS0101290 FCS84708_RS01250 -C15_RS0101290 AP288_RS04320 -C15_RS0101290 BKB93_RS01255 -C15_RS0101290 CBP44_RS02650 -C15_RS0101290 AQ199_RS01945 -C15_RS0101290 L2BLST_RS01240 -C15_RS0101290 BW688_RS02650 -C15_RS0101290 BBV13_RS01285 -C15_RS0101290 G9768_RS01260 -C15_RS0101290 AQ193_RS02740 -C15_RS0101290 BKC02_RS01255 -C15_RS0101290 L3404_RS01235 -C15_RS0101290 AKW53_RS02745 -C15_RS0101290 BBV16_RS01285 -C15_RS0101290 BKC01_RS01255 -C15_RS0101290 gnl|Prokka|PADJNBJD_00246 -C15_RS0101290 DU10_RS01265 -C15_RS0101290 NILJEPDF_00246 -C15_RS0101290 LJHENM_01235 -C15_RS0101290 BKC03_RS01255 -C15_RS0101290 120478 -C15_RS0101290 CTRC943_RS01240 -C15_RS0101290 CTJTET1_RS01270 -C15_RS0101290 KW39_RS01260 -C15_RS0101290 JIEJKO_01235 -C15_RS0101455 C15_RS0101455 -C15_RS0101455 SOTONK1_RS01420 -C15_RS0101455 ECS88FINAL_RS0101440 -C15_RS0101455 QSDFRQ_00278 -C15_RS0101455 IaCS19096_RS01415 -C15_RS0101455 A5291_RS01445 -C15_RS0101455 O169_RS01425 -C15_RS0101455 DU13_RS01430 -C15_RS0101455 7618909 -C15_RS0101455 SW2_RS01410 -C15_RS0101455 BKB95_RS01435 -C15_RS0101455 CBP48_RS02810 -C15_RS0101455 KW36_RS01415 -C15_RS0101455 ECS102511_RS01410 -C15_RS0101455 AOT15_RS02415 -C15_RS0101455 BKB96_RS01420 -C15_RS0101455 CTL2C_RS02765 -C15_RS0101455 BKB99_RS01420 -C15_RS0101455 L1224_RS01395 -C15_RS0101455 L1440_RS01395 -C15_RS0101455 AQ244_RS03600 -C15_RS0101455 CBP42_RS02810 -C15_RS0101455 SOTONIA3_RS01430 -C15_RS0101455 BKB92_RS01425 -C15_RS0101455 CTB_RS01445 -C15_RS0101455 E150_RS01415 -C15_RS0101455 L2BUCH2_RS01400 -C15_RS0101455 CTO_RS01440 -C15_RS0101455 FCS84708_RS01410 -C15_RS0101455 AP288_RS04480 -C15_RS0101455 BKB93_RS01425 -C15_RS0101455 CBP44_RS02815 -C15_RS0101455 AQ199_RS02105 -C15_RS0101455 L2BLST_RS01400 -C15_RS0101455 BBV13_RS01450 -C15_RS0101455 BW688_RS02815 -C15_RS0101455 AQ193_RS02575 -C15_RS0101455 G9768_RS01420 -C15_RS0101455 BKC02_RS01420 -C15_RS0101455 BBV16_RS01450 -C15_RS0101455 L3404_RS01395 -C15_RS0101455 BKC01_RS01425 -C15_RS0101455 gnl|Prokka|PADJNBJD_00278 -C15_RS0101455 DU10_RS01430 -C15_RS0101455 NILJEPDF_00278 -C15_RS0101455 LJHENM_01400 -C15_RS0101455 BKC03_RS01420 -C15_RS0101455 CTRC943_RS01400 -C15_RS0101455 CTJTET1_RS01430 -C15_RS0101455 KW39_RS01420 -C15_RS0101455 JIEJKO_01400 -C15_RS0101455 120453 -C15_RS0101620 C15_RS0101620 -C15_RS0101620 SOTONK1_RS01580 -C15_RS0101620 ECS88FINAL_RS0101600 -C15_RS0101620 120424 -C15_RS0101620 QSDFRQ_00310 -C15_RS0101620 IaCS19096_RS01575 -C15_RS0101620 A5291_RS01605 -C15_RS0101620 O169_RS01585 -C15_RS0101620 DU13_RS01590 -C15_RS0101620 CBP48_RS02970 -C15_RS0101620 7618927 -C15_RS0101620 SW2_RS01570 -C15_RS0101620 BKB95_RS01595 -C15_RS0101620 CTL2C_RS02925 -C15_RS0101620 KW36_RS01575 -C15_RS0101620 ECS102511_RS01570 -C15_RS0101620 AOT15_RS02575 -C15_RS0101620 BKB96_RS01580 -C15_RS0101620 L1224_RS01555 -C15_RS0101620 BKB99_RS01580 -C15_RS0101620 L1440_RS01555 -C15_RS0101620 CBP42_RS02970 -C15_RS0101620 AQ244_RS03760 -C15_RS0101620 SOTONIA3_RS01590 -C15_RS0101620 BKB92_RS01585 -C15_RS0101620 CTB_RS01605 -C15_RS0101620 E150_RS01575 -C15_RS0101620 L2BUCH2_RS01560 -C15_RS0101620 CTO_RS01600 -C15_RS0101620 FCS84708_RS01570 -C15_RS0101620 AP288_RS04640 -C15_RS0101620 CBP44_RS02975 -C15_RS0101620 BKB93_RS01585 -C15_RS0101620 L2BLST_RS01560 -C15_RS0101620 AQ199_RS02265 -C15_RS0101620 BW688_RS02980 -C15_RS0101620 BBV13_RS01610 -C15_RS0101620 AQ193_RS02415 -C15_RS0101620 G9768_RS01580 -C15_RS0101620 BKC02_RS01580 -C15_RS0101620 L3404_RS01555 -C15_RS0101620 AKW53_RS03070 -C15_RS0101620 BBV16_RS01610 -C15_RS0101620 BKC01_RS01585 -C15_RS0101620 gnl|Prokka|PADJNBJD_00310 -C15_RS0101620 NILJEPDF_00310 -C15_RS0101620 LJHENM_01560 -C15_RS0101620 CTRC943_RS01560 -C15_RS0101620 BKC03_RS01580 -C15_RS0101620 DU10_RS01595 -C15_RS0101620 CTJTET1_RS01590 -C15_RS0101620 KW39_RS01580 -C15_RS0101620 JIEJKO_01560 -C15_RS0101790 C15_RS0101790 -C15_RS0101790 SOTONK1_RS01750 -C15_RS0101790 A5291_RS01775 -C15_RS0101790 KW39_RS01760 -C15_RS0101790 IaCS19096_RS01745 -C15_RS0101790 119148 -C15_RS0101790 ECS88FINAL_RS0101780 -C15_RS0101790 O169_RS01760 -C15_RS0101790 DU13_RS01770 -C15_RS0101790 7618514 -C15_RS0101790 CTL2C_RS03095 -C15_RS0101790 BKB95_RS01770 -C15_RS0101790 CBP48_RS03155 -C15_RS0101790 L1224_RS01725 -C15_RS0101790 KW36_RS01745 -C15_RS0101790 AOT15_RS02745 -C15_RS0101790 BKB96_RS01755 -C15_RS0101790 SW2_RS01750 -C15_RS0101790 AP288_RS01330 -C15_RS0101790 BKB99_RS01755 -C15_RS0101790 L1440_RS01725 -C15_RS0101790 ECS102511_RS01750 -C15_RS0101790 AQ244_RS01360 -C15_RS0101790 CBP42_RS03155 -C15_RS0101790 CTB_RS01775 -C15_RS0101790 SOTONIA3_RS01760 -C15_RS0101790 L2BUCH2_RS01725 -C15_RS0101790 BKB92_RS01765 -C15_RS0101790 CTO_RS01775 -C15_RS0101790 E150_RS01755 -C15_RS0101790 L2BLST_RS01725 -C15_RS0101790 FCS84708_RS01745 -C15_RS0101790 BW688_RS03155 -C15_RS0101790 BKB93_RS01765 -C15_RS0101790 CBP44_RS03160 -C15_RS0101790 BBV13_RS01780 -C15_RS0101790 AQ193_RS02235 -C15_RS0101790 AQ199_RS02445 -C15_RS0101790 G9768_RS01750 -C15_RS0101790 L3404_RS01725 -C15_RS0101790 BBV16_RS01780 -C15_RS0101790 BKC02_RS01755 -C15_RS0101790 BKC01_RS01755 -C15_RS0101790 AKW53_RS03250 -C15_RS0101790 gnl|Prokka|PADJNBJD_00344 -C15_RS0101790 NILJEPDF_00344 -C15_RS0101790 CTRC943_RS01730 -C15_RS0101790 LJHENM_01735 -C15_RS0101790 JIEJKO_01730 -C15_RS0101790 BKC03_RS01755 -C15_RS0101790 CTJTET1_RS01760 -C15_RS0101790 DU10_RS01775 -C15_RS0101790 QSDFRQ_00344 -C15_RS0101960 C15_RS0101960 -C15_RS0101960 SOTONK1_RS01915 -C15_RS0101960 DU10_RS01945 -C15_RS0101960 A5291_RS01940 -C15_RS0101960 KW39_RS01925 -C15_RS0101960 IaCS19096_RS01910 -C15_RS0101960 ECS88FINAL_RS0101950 -C15_RS0101960 O169_RS01925 -C15_RS0101960 DU13_RS01940 -C15_RS0101960 CTL2C_RS03260 -C15_RS0101960 L1224_RS01890 -C15_RS0101960 KW36_RS01910 -C15_RS0101960 AOT15_RS02910 -C15_RS0101960 BKB95_RS01940 -C15_RS0101960 BKB96_RS01920 -C15_RS0101960 CBP48_RS03325 -C15_RS0101960 SW2_RS01915 -C15_RS0101960 AP288_RS01165 -C15_RS0101960 BKB99_RS01920 -C15_RS0101960 L1440_RS01890 -C15_RS0101960 ECS102511_RS01915 -C15_RS0101960 AQ244_RS01195 -C15_RS0101960 CTB_RS01940 -C15_RS0101960 SOTONIA3_RS01925 -C15_RS0101960 L2BUCH2_RS01890 -C15_RS0101960 BKB92_RS01930 -C15_RS0101960 CBP42_RS03335 -C15_RS0101960 CTO_RS01940 -C15_RS0101960 E150_RS01920 -C15_RS0101960 L2BLST_RS01890 -C15_RS0101960 BW688_RS03320 -C15_RS0101960 FCS84708_RS01910 -C15_RS0101960 BKB93_RS01930 -C15_RS0101960 BBV13_RS01945 -C15_RS0101960 CBP44_RS03330 -C15_RS0101960 AQ193_RS02070 -C15_RS0101960 AQ199_RS02610 -C15_RS0101960 G9768_RS01915 -C15_RS0101960 L3404_RS01890 -C15_RS0101960 BBV16_RS01945 -C15_RS0101960 BKC02_RS01920 -C15_RS0101960 BKC01_RS01920 -C15_RS0101960 AKW53_RS03415 -C15_RS0101960 gnl|Prokka|PADJNBJD_00377 -C15_RS0101960 NILJEPDF_00377 -C15_RS0101960 CTRC943_RS01895 -C15_RS0101960 LJHENM_01900 -C15_RS0101960 JIEJKO_01895 -C15_RS0101960 BKC03_RS01920 -C15_RS0101960 CTJTET1_RS01925 -C15_RS0101960 QSDFRQ_00377 -C15_RS0102120 C15_RS0102120 -C15_RS0102120 A5291_RS02100 -C15_RS0102120 SOTONK1_RS02075 -C15_RS0102120 DU10_RS02105 -C15_RS0102120 KW39_RS02085 -C15_RS0102120 IaCS19096_RS02070 -C15_RS0102120 ECS88FINAL_RS0102115 -C15_RS0102120 O169_RS02085 -C15_RS0102120 DU13_RS02100 -C15_RS0102120 7618545 -C15_RS0102120 CTL2C_RS03420 -C15_RS0102120 CBP48_RS03485 -C15_RS0102120 119507 -C15_RS0102120 L1224_RS02050 -C15_RS0102120 KW36_RS02070 -C15_RS0102120 AOT15_RS03070 -C15_RS0102120 BKB95_RS02100 -C15_RS0102120 BKB96_RS02080 -C15_RS0102120 SW2_RS02075 -C15_RS0102120 AP288_RS01005 -C15_RS0102120 BKB99_RS02080 -C15_RS0102120 L1440_RS02050 -C15_RS0102120 ECS102511_RS02075 -C15_RS0102120 CTB_RS02100 -C15_RS0102120 AQ244_RS01035 -C15_RS0102120 CBP42_RS03495 -C15_RS0102120 SOTONIA3_RS02085 -C15_RS0102120 L2BUCH2_RS02050 -C15_RS0102120 BKB92_RS02090 -C15_RS0102120 CTO_RS02100 -C15_RS0102120 E150_RS02080 -C15_RS0102120 L2BLST_RS02050 -C15_RS0102120 BW688_RS03480 -C15_RS0102120 FCS84708_RS02070 -C15_RS0102120 BBV13_RS02105 -C15_RS0102120 BKB93_RS02090 -C15_RS0102120 CBP44_RS03490 -C15_RS0102120 AQ193_RS01910 -C15_RS0102120 AQ199_RS02770 -C15_RS0102120 G9768_RS02075 -C15_RS0102120 BBV16_RS02105 -C15_RS0102120 L3404_RS02050 -C15_RS0102120 BKC02_RS02080 -C15_RS0102120 BKC01_RS02080 -C15_RS0102120 AKW53_RS03575 -C15_RS0102120 gnl|Prokka|PADJNBJD_00409 -C15_RS0102120 NILJEPDF_00409 -C15_RS0102120 CTRC943_RS02055 -C15_RS0102120 LJHENM_02060 -C15_RS0102120 JIEJKO_02055 -C15_RS0102120 BKC03_RS02080 -C15_RS0102120 CTJTET1_RS02085 -C15_RS0102120 QSDFRQ_00409 -C15_RS01000000104930 C15_RS01000000104930 -C15_RS01000000104930 SOTONK1_RS02245 -C15_RS01000000104930 DU10_RS02280 -C15_RS01000000104930 A5291_RS02275 -C15_RS01000000104930 KW39_RS02255 -C15_RS01000000104930 IaCS19096_RS02240 -C15_RS01000000104930 ECS88FINAL_RS01000000104925 -C15_RS01000000104930 O169_RS02255 -C15_RS01000000104930 DU13_RS02275 -C15_RS01000000104930 7618566 -C15_RS01000000104930 BKB96_RS02260 -C15_RS01000000104930 BKB99_RS02255 -C15_RS01000000104930 CBP48_RS03660 -C15_RS01000000104930 CTL2C_RS03595 -C15_RS01000000104930 KW36_RS02240 -C15_RS01000000104930 AOT15_RS03240 -C15_RS01000000104930 BKB95_RS02275 -C15_RS01000000104930 119539 -C15_RS01000000104930 L1224_RS02225 -C15_RS01000000104930 AP288_RS00835 -C15_RS01000000104930 SW2_RS02250 -C15_RS01000000104930 ECS102511_RS02245 -C15_RS01000000104930 L1440_RS02225 -C15_RS01000000104930 CBP42_RS03670 -C15_RS01000000104930 CTB_RS02275 -C15_RS01000000104930 L2BUCH2_RS02220 -C15_RS01000000104930 AQ244_RS00865 -C15_RS01000000104930 BKB92_RS02265 -C15_RS01000000104930 SOTONIA3_RS02260 -C15_RS01000000104930 CTO_RS02275 -C15_RS01000000104930 E150_RS02250 -C15_RS01000000104930 BW688_RS03655 -C15_RS01000000104930 L2BLST_RS02225 -C15_RS01000000104930 FCS84708_RS02240 -C15_RS01000000104930 BBV13_RS02280 -C15_RS01000000104930 CBP44_RS03665 -C15_RS01000000104930 BKB93_RS02270 -C15_RS01000000104930 AQ193_RS01740 -C15_RS01000000104930 AQ199_RS02940 -C15_RS01000000104930 G9768_RS02245 -C15_RS01000000104930 BBV16_RS02285 -C15_RS01000000104930 L3404_RS02220 -C15_RS01000000104930 BKC02_RS02255 -C15_RS01000000104930 BKC01_RS02255 -C15_RS01000000104930 AKW53_RS03745 -C15_RS01000000104930 gnl|Prokka|PADJNBJD_00443 -C15_RS01000000104930 NILJEPDF_00443 -C15_RS01000000104930 CTRC943_RS02225 -C15_RS01000000104930 LJHENM_02235 -C15_RS01000000104930 JIEJKO_02230 -C15_RS01000000104930 BKC03_RS02255 -C15_RS01000000104930 CTJTET1_RS02255 -C15_RS01000000104930 QSDFRQ_00443 -C15_RS0102455 C15_RS0102455 -C15_RS0102455 SOTONK1_RS02400 -C15_RS0102455 IaCS19096_RS02395 -C15_RS0102455 A5291_RS02435 -C15_RS0102455 BKB96_RS02425 -C15_RS0102455 BKB99_RS02420 -C15_RS0102455 CTL2C_RS03750 -C15_RS0102455 KW36_RS02395 -C15_RS0102455 L1224_RS02380 -C15_RS0102455 L1440_RS02380 -C15_RS0102455 L2BUCH2_RS02375 -C15_RS0102455 AQ244_RS00710 -C15_RS0102455 CTB_RS02435 -C15_RS0102455 SOTONIA3_RS02415 -C15_RS0102455 CTO_RS02435 -C15_RS0102455 BBV13_RS02440 -C15_RS0102455 BW688_RS03820 -C15_RS0102455 L2BLST_RS02380 -C15_RS0102455 BBV16_RS02445 -C15_RS0102455 G9768_RS02400 -C15_RS0102455 L3404_RS02375 -C15_RS0102455 BKC02_RS02420 -C15_RS0102455 BKC01_RS02420 -C15_RS0102455 CTRC943_RS02380 -C15_RS0102455 BKC03_RS02420 -C15_RS0102455 CTJTET1_RS02410 -C15_RS0102455 AOT15_RS00025 -C15_RS0102630 C15_RS0102630 -C15_RS0102630 O169_RS02585 -C15_RS0102630 A5291_RS02610 -C15_RS0102630 DU13_RS02610 -C15_RS0102630 7619024 -C15_RS0102630 CBP48_RS03995 -C15_RS0102630 CTL2C_RS03925 -C15_RS0102630 KW36_RS02570 -C15_RS0102630 BKB96_RS02600 -C15_RS0102630 BKB99_RS02595 -C15_RS0102630 SW2_RS02580 -C15_RS0102630 L1224_RS02555 -C15_RS0102630 ECS102511_RS02575 -C15_RS0102630 AKW53_RS04640 -C15_RS0102630 BKB95_RS02610 -C15_RS0102630 L1440_RS02555 -C15_RS0102630 120258 -C15_RS0102630 AP288_RS00505 -C15_RS0102630 CBP42_RS04005 -C15_RS0102630 L2BUCH2_RS02555 -C15_RS0102630 BKB92_RS02600 -C15_RS0102630 CTB_RS02610 -C15_RS0102630 SOTONIA3_RS02590 -C15_RS0102630 E150_RS02580 -C15_RS0102630 AQ244_RS00535 -C15_RS0102630 BW688_RS03995 -C15_RS0102630 CTO_RS02610 -C15_RS0102630 FCS84708_RS02570 -C15_RS0102630 L2BLST_RS02555 -C15_RS0102630 BBV13_RS02615 -C15_RS0102630 CBP44_RS04000 -C15_RS0102630 AQ199_RS03270 -C15_RS0102630 BKB93_RS02605 -C15_RS0102630 BBV16_RS02625 -C15_RS0102630 G9768_RS02575 -C15_RS0102630 L3404_RS02550 -C15_RS0102630 BKC02_RS02595 -C15_RS0102630 AQ193_RS01410 -C15_RS0102630 gnl|Prokka|PADJNBJD_00507 -C15_RS0102630 BKC01_RS02595 -C15_RS0102630 NILJEPDF_00507 -C15_RS0102630 LJHENM_02550 -C15_RS0102630 AOT15_RS03520 -C15_RS0102630 CTRC943_RS02555 -C15_RS0102630 JIEJKO_02555 -C15_RS0102630 QSDFRQ_00507 -C15_RS0102630 SOTONK1_RS02575 -C15_RS0102630 BKC03_RS02595 -C15_RS0102630 CTJTET1_RS02585 -C15_RS0102630 KW39_RS02585 -C15_RS0102630 ECS88FINAL_RS0102625 -C15_RS0102630 IaCS19096_RS02570 -C15_RS0102630 DU10_RS02615 -C15_RS0102815 C15_RS0102815 -C15_RS0102815 ECS88FINAL_RS0102810 -C15_RS0102815 IaCS19096_RS02740 -C15_RS0102815 DU10_RS02790 -C15_RS0102815 O169_RS02755 -C15_RS0102815 A5291_RS02780 -C15_RS0102815 DU13_RS02785 -C15_RS0102815 CBP48_RS04170 -C15_RS0102815 7619052 -C15_RS0102815 CTL2C_RS04095 -C15_RS0102815 KW36_RS02740 -C15_RS0102815 AKW53_RS03970 -C15_RS0102815 BKB95_RS02785 -C15_RS0102815 BKB96_RS02775 -C15_RS0102815 BKB99_RS02770 -C15_RS0102815 SW2_RS02750 -C15_RS0102815 L1224_RS02725 -C15_RS0102815 ECS102511_RS02745 -C15_RS0102815 L1440_RS02725 -C15_RS0102815 AP288_RS00335 -C15_RS0102815 120212 -C15_RS0102815 CBP42_RS04180 -C15_RS0102815 L2BUCH2_RS02725 -C15_RS0102815 SOTONIA3_RS02760 -C15_RS0102815 BKB92_RS02775 -C15_RS0102815 CTB_RS02780 -C15_RS0102815 AQ244_RS00365 -C15_RS0102815 E150_RS02750 -C15_RS0102815 BW688_RS04170 -C15_RS0102815 CTO_RS02780 -C15_RS0102815 FCS84708_RS02740 -C15_RS0102815 L2BLST_RS02725 -C15_RS0102815 BBV13_RS02785 -C15_RS0102815 CBP44_RS04175 -C15_RS0102815 AQ199_RS03440 -C15_RS0102815 BKB93_RS02780 -C15_RS0102815 BBV16_RS02795 -C15_RS0102815 G9768_RS02745 -C15_RS0102815 AQ193_RS01240 -C15_RS0102815 L3404_RS02720 -C15_RS0102815 BKC02_RS02770 -C15_RS0102815 gnl|Prokka|PADJNBJD_00541 -C15_RS0102815 NILJEPDF_00541 -C15_RS0102815 BKC01_RS02770 -C15_RS0102815 LJHENM_02725 -C15_RS0102815 CTRC943_RS02725 -C15_RS0102815 AOT15_RS01545 -C15_RS0102815 QSDFRQ_00541 -C15_RS0102815 JIEJKO_02730 -C15_RS0102815 SOTONK1_RS02745 -C15_RS0102815 CTJTET1_RS02755 -C15_RS0102815 BKC03_RS02770 -C15_RS0102815 KW39_RS02755 -C15_RS0102980 C15_RS0102980 -C15_RS0102980 ECS88FINAL_RS0102975 -C15_RS0102980 IaCS19096_RS02905 -C15_RS0102980 DU10_RS02955 -C15_RS0102980 O169_RS02920 -C15_RS0102980 A5291_RS02945 -C15_RS0102980 DU13_RS02950 -C15_RS0102980 CBP48_RS04335 -C15_RS0102980 CTL2C_RS04260 -C15_RS0102980 KW36_RS02905 -C15_RS0102980 AKW53_RS04135 -C15_RS0102980 BKB95_RS02950 -C15_RS0102980 BKB96_RS02940 -C15_RS0102980 BKB99_RS02935 -C15_RS0102980 7619083 -C15_RS0102980 SW2_RS02915 -C15_RS0102980 L1224_RS02890 -C15_RS0102980 ECS102511_RS02910 -C15_RS0102980 L1440_RS02890 -C15_RS0102980 AP288_RS00170 -C15_RS0102980 CBP42_RS04345 -C15_RS0102980 120164 -C15_RS0102980 L2BUCH2_RS02890 -C15_RS0102980 SOTONIA3_RS02925 -C15_RS0102980 CTB_RS02945 -C15_RS0102980 AQ244_RS00200 -C15_RS0102980 E150_RS02915 -C15_RS0102980 BW688_RS04335 -C15_RS0102980 CTO_RS02945 -C15_RS0102980 FCS84708_RS02905 -C15_RS0102980 L2BLST_RS02890 -C15_RS0102980 BBV13_RS02950 -C15_RS0102980 CBP44_RS04340 -C15_RS0102980 AQ199_RS03605 -C15_RS0102980 BBV16_RS02960 -C15_RS0102980 G9768_RS02910 -C15_RS0102980 AQ193_RS01075 -C15_RS0102980 L3404_RS02885 -C15_RS0102980 BKC02_RS02935 -C15_RS0102980 gnl|Prokka|PADJNBJD_00574 -C15_RS0102980 AOT15_RS03710 -C15_RS0102980 NILJEPDF_00574 -C15_RS0102980 BKC01_RS02935 -C15_RS0102980 LJHENM_02890 -C15_RS0102980 CTRC943_RS02890 -C15_RS0102980 QSDFRQ_00574 -C15_RS0102980 JIEJKO_02895 -C15_RS0102980 SOTONK1_RS02910 -C15_RS0102980 CTJTET1_RS02920 -C15_RS0102980 BKC03_RS02935 -C15_RS0102980 KW39_RS02920 -C15_RS0102980 BKB93_RS02945 -C15_RS0102980 BKB92_RS02940 -C15_RS0103135 C15_RS0103135 -C15_RS0103135 ECS88FINAL_RS0103130 -C15_RS0103135 IaCS19096_RS03065 -C15_RS0103135 DU10_RS03115 -C15_RS0103135 A5291_RS03100 -C15_RS0103135 O169_RS03075 -C15_RS0103135 CTL2C_RS04410 -C15_RS0103135 DU13_RS03110 -C15_RS0103135 CBP48_RS04500 -C15_RS0103135 L1224_RS03040 -C15_RS0103135 KW36_RS03065 -C15_RS0103135 BKB95_RS03110 -C15_RS0103135 AKW53_RS04295 -C15_RS0103135 BKB96_RS03105 -C15_RS0103135 BKB99_RS03100 -C15_RS0103135 7619093 -C15_RS0103135 SW2_RS03070 -C15_RS0103135 L1440_RS03040 -C15_RS0103135 ECS102511_RS03065 -C15_RS0103135 AP288_RS00015 -C15_RS0103135 CBP42_RS04505 -C15_RS0103135 L2BUCH2_RS03040 -C15_RS0103135 CTB_RS03100 -C15_RS0103135 SOTONIA3_RS03085 -C15_RS0103135 BKB92_RS03100 -C15_RS0103135 AQ244_RS00040 -C15_RS0103135 BW688_RS04495 -C15_RS0103135 120149 -C15_RS0103135 E150_RS03070 -C15_RS0103135 CTO_RS03100 -C15_RS0103135 L2BLST_RS03040 -C15_RS0103135 CBP44_RS04500 -C15_RS0103135 FCS84708_RS03065 -C15_RS0103135 BBV13_RS03105 -C15_RS0103135 AQ199_RS03765 -C15_RS0103135 BBV16_RS03115 -C15_RS0103135 BKB93_RS03105 -C15_RS0103135 G9768_RS03070 -C15_RS0103135 L3404_RS03035 -C15_RS0103135 gnl|Prokka|PADJNBJD_00604 -C15_RS0103135 AQ193_RS00920 -C15_RS0103135 NILJEPDF_00604 -C15_RS0103135 LJHENM_03035 -C15_RS0103135 BKC02_RS03100 -C15_RS0103135 AOT15_RS03870 -C15_RS0103135 CTRC943_RS03040 -C15_RS0103135 BKC01_RS03100 -C15_RS0103135 QSDFRQ_00604 -C15_RS0103135 JIEJKO_03045 -C15_RS0103135 SOTONK1_RS03070 -C15_RS0103135 CTJTET1_RS03080 -C15_RS0103135 BKC03_RS03100 -C15_RS0103135 KW39_RS03080 -C15_RS0103295 C15_RS0103295 -C15_RS0103295 A5291_RS03270 -C15_RS0103295 DU13_RS03270 -C15_RS0103295 CTL2C_RS04575 -C15_RS0103295 AKW53_RS04455 -C15_RS0103295 CBP48_RS04660 -C15_RS0103295 7618648 -C15_RS0103295 SW2_RS03235 -C15_RS0103295 L1224_RS03205 -C15_RS0103295 KW36_RS03230 -C15_RS0103295 ECS102511_RS03230 -C15_RS0103295 L1440_RS03205 -C15_RS0103295 BKB95_RS03275 -C15_RS0103295 BKB96_RS03270 -C15_RS0103295 BKB99_RS03265 -C15_RS0103295 CBP42_RS04665 -C15_RS0103295 L2BUCH2_RS03205 -C15_RS0103295 BKB92_RS03260 -C15_RS0103295 CTB_RS03270 -C15_RS0103295 E150_RS03235 -C15_RS0103295 SOTONIA3_RS03250 -C15_RS0103295 BW688_RS04655 -C15_RS0103295 CTO_RS03265 -C15_RS0103295 FCS84708_RS03230 -C15_RS0103295 L2BLST_RS03205 -C15_RS0103295 AQ244_RS04685 -C15_RS0103295 BBV13_RS03270 -C15_RS0103295 CBP44_RS04660 -C15_RS0103295 119666 -C15_RS0103295 AQ199_RS03930 -C15_RS0103295 BKB93_RS03265 -C15_RS0103295 BBV16_RS03280 -C15_RS0103295 G9768_RS03230 -C15_RS0103295 L3404_RS03200 -C15_RS0103295 gnl|Prokka|PADJNBJD_00635 -C15_RS0103295 AP288_RS01600 -C15_RS0103295 BKC02_RS03260 -C15_RS0103295 NILJEPDF_00636 -C15_RS0103295 LJHENM_03195 -C15_RS0103295 AOT15_RS04030 -C15_RS0103295 AQ193_RS00755 -C15_RS0103295 CTRC943_RS03205 -C15_RS0103295 JIEJKO_03200 -C15_RS0103295 BKC01_RS03260 -C15_RS0103295 QSDFRQ_00636 -C15_RS0103295 KW39_RS03245 -C15_RS0103295 BKC03_RS03260 -C15_RS0103295 CTJTET1_RS03245 -C15_RS0103295 ECS88FINAL_RS0103295 -C15_RS0103295 DU10_RS03275 -C15_RS0103295 SOTONK1_RS03230 -C15_RS0103295 O169_RS03240 -C15_RS0103295 IaCS19096_RS03225 -C15_RS0103475 C15_RS0103475 -C15_RS0103475 A5291_RS03445 -C15_RS0103475 O169_RS03415 -C15_RS0103475 DU13_RS03450 -C15_RS0103475 AKW53_RS00150 -C15_RS0103475 KW36_RS03400 -C15_RS0103475 BKB95_RS03455 -C15_RS0103475 CBP42_RS00005 -C15_RS0103475 SW2_RS03410 -C15_RS0103475 CTL2C_RS00005 -C15_RS0103475 L1224_RS03385 -C15_RS0103475 ECS102511_RS03400 -C15_RS0103475 L1440_RS03385 -C15_RS0103475 BKB96_RS03445 -C15_RS0103475 BKB99_RS03440 -C15_RS0103475 CBP44_RS00005 -C15_RS0103475 L2BUCH2_RS03385 -C15_RS0103475 BKB92_RS03435 -C15_RS0103475 CTB_RS03440 -C15_RS0103475 SOTONIA3_RS03420 -C15_RS0103475 E150_RS03410 -C15_RS0103475 CTO_RS03435 -C15_RS0103475 BBV13_RS03440 -C15_RS0103475 FCS84708_RS03400 -C15_RS0103475 L2BLST_RS03385 -C15_RS0103475 AQ244_RS04510 -C15_RS0103475 7618205 -C15_RS0103475 BBV16_RS03450 -C15_RS0103475 BW688_RS00005 -C15_RS0103475 119683 -C15_RS0103475 AQ199_RS04100 -C15_RS0103475 BKB93_RS03440 -C15_RS0103475 G9768_RS03400 -C15_RS0103475 gnl|Prokka|PADJNBJD_00669 -C15_RS0103475 L3404_RS03380 -C15_RS0103475 BKC02_RS03435 -C15_RS0103475 NILJEPDF_00670 -C15_RS0103475 LJHENM_03365 -C15_RS0103475 AOT15_RS04200 -C15_RS0103475 AP288_RS01770 -C15_RS0103475 AQ193_RS00585 -C15_RS0103475 JIEJKO_03370 -C15_RS0103475 BKC01_RS03435 -C15_RS0103475 QSDFRQ_00670 -C15_RS0103475 CTRC943_RS03385 -C15_RS0103475 BKC03_RS03435 -C15_RS0103475 CBP48_RS00005 -C15_RS0103475 CTJTET1_RS03420 -C15_RS0103475 KW39_RS03420 -C15_RS0103475 DU10_RS03450 -C15_RS0103475 SOTONK1_RS03400 -C15_RS0103475 ECS88FINAL_RS0103480 -C15_RS0103475 IaCS19096_RS03395 -C15_RS0103655 C15_RS0103655 -C15_RS0103655 A5291_RS03620 -C15_RS0103655 O169_RS03585 -C15_RS0103655 DU13_RS03620 -C15_RS0103655 KW36_RS03575 -C15_RS0103655 AKW53_RS00320 -C15_RS0103655 BKB95_RS03625 -C15_RS0103655 CBP42_RS00175 -C15_RS0103655 SW2_RS03580 -C15_RS0103655 CTL2C_RS00175 -C15_RS0103655 L1224_RS03555 -C15_RS0103655 ECS102511_RS03570 -C15_RS0103655 L1440_RS03555 -C15_RS0103655 BKB96_RS03615 -C15_RS0103655 BKB99_RS03610 -C15_RS0103655 CBP44_RS00175 -C15_RS0103655 L2BUCH2_RS03555 -C15_RS0103655 BKB92_RS03605 -C15_RS0103655 CTB_RS03615 -C15_RS0103655 SOTONIA3_RS03595 -C15_RS0103655 E150_RS03580 -C15_RS0103655 CTO_RS03610 -C15_RS0103655 BBV13_RS03615 -C15_RS0103655 FCS84708_RS03570 -C15_RS0103655 L2BLST_RS03555 -C15_RS0103655 AQ244_RS04335 -C15_RS0103655 BBV16_RS03625 -C15_RS0103655 BW688_RS00175 -C15_RS0103655 AQ199_RS04270 -C15_RS0103655 BKB93_RS03610 -C15_RS0103655 7618226 -C15_RS0103655 119717 -C15_RS0103655 G9768_RS03575 -C15_RS0103655 gnl|Prokka|PADJNBJD_00703 -C15_RS0103655 L3404_RS03550 -C15_RS0103655 BKC02_RS03605 -C15_RS0103655 NILJEPDF_00704 -C15_RS0103655 LJHENM_03535 -C15_RS0103655 AOT15_RS04375 -C15_RS0103655 AP288_RS01940 -C15_RS0103655 AQ193_RS00415 -C15_RS0103655 JIEJKO_03540 -C15_RS0103655 BKC01_RS03605 -C15_RS0103655 QSDFRQ_00704 -C15_RS0103655 CTRC943_RS03560 -C15_RS0103655 BKC03_RS03605 -C15_RS0103655 CBP48_RS00175 -C15_RS0103655 CTJTET1_RS03595 -C15_RS0103655 KW39_RS03590 -C15_RS0103655 DU10_RS03620 -C15_RS0103655 SOTONK1_RS03575 -C15_RS0103655 ECS88FINAL_RS0103665 -C15_RS0103655 IaCS19096_RS03570 -C15_RS0103860 C15_RS0103860 -C15_RS0103860 ECS88FINAL_RS0103860 -C15_RS0103860 O169_RS03765 -C15_RS0103860 KW36_RS03755 -C15_RS0103860 BKB95_RS03810 -C15_RS0103860 CBP42_RS00360 -C15_RS0103860 SW2_RS03760 -C15_RS0103860 CTL2C_RS00355 -C15_RS0103860 L1224_RS03735 -C15_RS0103860 ECS102511_RS03750 -C15_RS0103860 BKB96_RS03795 -C15_RS0103860 BKB99_RS03790 -C15_RS0103860 L1440_RS03735 -C15_RS0103860 CBP44_RS00360 -C15_RS0103860 L2BUCH2_RS03735 -C15_RS0103860 BKB92_RS03790 -C15_RS0103860 CTB_RS03795 -C15_RS0103860 SOTONIA3_RS03775 -C15_RS0103860 E150_RS03760 -C15_RS0103860 CTO_RS03790 -C15_RS0103860 BBV13_RS03795 -C15_RS0103860 FCS84708_RS03750 -C15_RS0103860 BBV16_RS03805 -C15_RS0103860 L2BLST_RS03735 -C15_RS0103860 AQ244_RS04155 -C15_RS0103860 119754 -C15_RS0103860 BW688_RS00360 -C15_RS0103860 7618250 -C15_RS0103860 AQ199_RS04450 -C15_RS0103860 BKB93_RS03795 -C15_RS0103860 G9768_RS03755 -C15_RS0103860 gnl|Prokka|PADJNBJD_00739 -C15_RS0103860 L3404_RS03730 -C15_RS0103860 AQ193_RS00235 -C15_RS0103860 BKC02_RS03790 -C15_RS0103860 NILJEPDF_00740 -C15_RS0103860 LJHENM_03725 -C15_RS0103860 AOT15_RS04555 -C15_RS0103860 AP288_RS02125 -C15_RS0103860 JIEJKO_03725 -C15_RS0103860 BKC01_RS03795 -C15_RS0103860 QSDFRQ_00740 -C15_RS0103860 CTRC943_RS03740 -C15_RS0103860 AKW53_RS00495 -C15_RS0103860 BKC03_RS03790 -C15_RS0103860 CTJTET1_RS03775 -C15_RS0103860 KW39_RS03770 -C15_RS0103860 DU10_RS03805 -C15_RS0103860 CBP48_RS00360 -C15_RS0103860 A5291_RS03800 -C15_RS0103860 SOTONK1_RS03755 -C15_RS0103860 IaCS19096_RS03750 -C15_RS0103860 DU13_RS03805 -C15_RS0104025 C15_RS0104025 -C15_RS0104025 ECS88FINAL_RS0104030 -C15_RS0104025 O169_RS03930 -C15_RS0104025 KW36_RS03920 -C15_RS0104025 BKB95_RS03975 -C15_RS0104025 CBP42_RS00525 -C15_RS0104025 CTL2C_RS00520 -C15_RS0104025 L1224_RS03900 -C15_RS0104025 SW2_RS03925 -C15_RS0104025 L1440_RS03895 -C15_RS0104025 ECS102511_RS03915 -C15_RS0104025 BKB96_RS03960 -C15_RS0104025 BKB99_RS03955 -C15_RS0104025 CBP44_RS00525 -C15_RS0104025 L2BUCH2_RS03900 -C15_RS0104025 BKB92_RS03955 -C15_RS0104025 CTB_RS03960 -C15_RS0104025 SOTONIA3_RS03940 -C15_RS0104025 E150_RS03925 -C15_RS0104025 CTO_RS03955 -C15_RS0104025 BBV13_RS03960 -C15_RS0104025 FCS84708_RS03915 -C15_RS0104025 L2BLST_RS03900 -C15_RS0104025 BBV16_RS03970 -C15_RS0104025 7618703 -C15_RS0104025 120023 -C15_RS0104025 AQ244_RS03990 -C15_RS0104025 BW688_RS00525 -C15_RS0104025 AQ199_RS04615 -C15_RS0104025 BKB93_RS03960 -C15_RS0104025 G9768_RS03920 -C15_RS0104025 gnl|Prokka|PADJNBJD_00771 -C15_RS0104025 L3404_RS03895 -C15_RS0104025 NILJEPDF_00772 -C15_RS0104025 AQ193_RS00070 -C15_RS0104025 BKC02_RS03955 -C15_RS0104025 LJHENM_03885 -C15_RS0104025 AOT15_RS04720 -C15_RS0104025 AP288_RS02290 -C15_RS0104025 JIEJKO_03885 -C15_RS0104025 QSDFRQ_00772 -C15_RS0104025 BKC01_RS03960 -C15_RS0104025 CTRC943_RS03905 -C15_RS0104025 AKW53_RS00660 -C15_RS0104025 BKC03_RS03955 -C15_RS0104025 CBP48_RS00525 -C15_RS0104025 CTJTET1_RS03940 -C15_RS0104025 KW39_RS03935 -C15_RS0104025 DU10_RS03970 -C15_RS0104025 A5291_RS03965 -C15_RS0104025 SOTONK1_RS03920 -C15_RS0104025 IaCS19096_RS03915 -C15_RS0104025 DU13_RS03970 -C15_RS0104230 C15_RS0104230 -C15_RS0104230 O169_RS04130 -C15_RS0104230 KW36_RS04120 -C15_RS0104230 BKB95_RS04175 -C15_RS0104230 CBP42_RS00725 -C15_RS0104230 CTL2C_RS00720 -C15_RS0104230 L1224_RS04100 -C15_RS0104230 BKB96_RS04160 -C15_RS0104230 SW2_RS04125 -C15_RS0104230 L1440_RS04095 -C15_RS0104230 ECS102511_RS04115 -C15_RS0104230 BKB99_RS04155 -C15_RS0104230 CBP44_RS00725 -C15_RS0104230 CTB_RS04155 -C15_RS0104230 L2BUCH2_RS04100 -C15_RS0104230 BKB92_RS04155 -C15_RS0104230 SOTONIA3_RS04140 -C15_RS0104230 CTO_RS04150 -C15_RS0104230 AP288_RS02420 -C15_RS0104230 E150_RS04125 -C15_RS0104230 BBV13_RS04160 -C15_RS0104230 119797 -C15_RS0104230 FCS84708_RS04115 -C15_RS0104230 AQ199_RS00045 -C15_RS0104230 7618278 -C15_RS0104230 L2BLST_RS04100 -C15_RS0104230 BBV16_RS04170 -C15_RS0104230 BW688_RS00725 -C15_RS0104230 gnl|Prokka|PADJNBJD_00809 -C15_RS0104230 BKB93_RS04160 -C15_RS0104230 NILJEPDF_00810 -C15_RS0104230 G9768_RS04120 -C15_RS0104230 L3404_RS04095 -C15_RS0104230 LJHENM_04075 -C15_RS0104230 JIEJKO_04075 -C15_RS0104230 BKC02_RS04155 -C15_RS0104230 QSDFRQ_00810 -C15_RS0104230 AKW53_RS00835 -C15_RS0104230 BKC01_RS04160 -C15_RS0104230 CTRC943_RS04105 -C15_RS0104230 AOT15_RS01705 -C15_RS0104230 AQ193_RS04655 -C15_RS0104230 CTJTET1_RS04295 -C15_RS0104230 AQ244_RS02645 -C15_RS0104230 KW39_RS04135 -C15_RS0104230 BKC03_RS04155 -C15_RS0104230 CBP48_RS00725 -C15_RS0104230 A5291_RS04160 -C15_RS0104230 ECS88FINAL_RS0104205 -C15_RS0104230 DU10_RS04170 -C15_RS0104230 SOTONK1_RS04120 -C15_RS0104230 IaCS19096_RS04115 -C15_RS0104230 DU13_RS04170 -C15_RS0104740 C15_RS0104740 -C15_RS0104740 DU10_RS04685 -C15_RS0104740 O169_RS04630 -C15_RS0104740 KW36_RS04610 -C15_RS0104740 DU13_RS04685 -C15_RS0104740 CTL2C_RS01210 -C15_RS0104740 BKB95_RS04685 -C15_RS0104740 CBP42_RS01240 -C15_RS0104740 L1224_RS04590 -C15_RS0104740 BKB96_RS04670 -C15_RS0104740 L1440_RS04585 -C15_RS0104740 BKB99_RS04665 -C15_RS0104740 SW2_RS04620 -C15_RS0104740 ECS102511_RS04615 -C15_RS0104740 CBP44_RS01240 -C15_RS0104740 CTB_RS04640 -C15_RS0104740 L2BUCH2_RS04590 -C15_RS0104740 SOTONIA3_RS04625 -C15_RS0104740 CTO_RS04635 -C15_RS0104740 AP288_RS02920 -C15_RS0104740 BBV13_RS04655 -C15_RS0104740 BKB92_RS04670 -C15_RS0104740 BBV16_RS04660 -C15_RS0104740 E150_RS04625 -C15_RS0104740 gnl|Prokka|PADJNBJD_00905 -C15_RS0104740 L2BLST_RS04590 -C15_RS0104740 FCS84708_RS04610 -C15_RS0104740 AQ199_RS00545 -C15_RS0104740 NILJEPDF_00906 -C15_RS0104740 BW688_RS01240 -C15_RS0104740 119935 -C15_RS0104740 JIEJKO_04555 -C15_RS0104740 7618760 -C15_RS0104740 QSDFRQ_00906 -C15_RS0104740 G9768_RS04610 -C15_RS0104740 LJHENM_04565 -C15_RS0104740 L3404_RS04585 -C15_RS0104740 BKB93_RS04675 -C15_RS0104740 BKC02_RS04665 -C15_RS0104740 AKW53_RS01335 -C15_RS0104740 AQ193_RS04155 -C15_RS0104740 BKC01_RS04670 -C15_RS0104740 CTRC943_RS04595 -C15_RS0104740 AOT15_RS02190 -C15_RS0104740 CTJTET1_RS04780 -C15_RS0104740 KW39_RS04630 -C15_RS0104740 AQ244_RS02140 -C15_RS0104740 BKC03_RS04665 -C15_RS0104740 CBP48_RS01240 -C15_RS0104740 A5291_RS04645 -C15_RS0104740 SOTONK1_RS04610 -C15_RS0104740 ECS88FINAL_RS0104720 -C15_RS0104740 IaCS19096_RS04605 -SW2_RS00015 SW2_RS00015 -SW2_RS00015 ECS102511_RS00015 -SW2_RS00015 CTB_RS00015 -SW2_RS00015 CTL2C_RS01380 -SW2_RS00015 CBP42_RS01405 -SW2_RS00015 L1224_RS00015 -SW2_RS00015 BKB96_RS00015 -SW2_RS00015 BKB99_RS00015 -SW2_RS00015 CTO_RS00015 -SW2_RS00015 SOTONIA3_RS00015 -SW2_RS00015 L1440_RS00015 -SW2_RS00015 BKB92_RS00015 -SW2_RS00015 119202 -SW2_RS00015 CBP44_RS01405 -SW2_RS00015 E150_RS00015 -SW2_RS00015 L2BUCH2_RS00015 -SW2_RS00015 AOT15_RS00940 -SW2_RS00015 BKB93_RS00015 -SW2_RS00015 FCS84708_RS00015 -SW2_RS00015 AP288_RS03085 -SW2_RS00015 BBV13_RS00015 -SW2_RS00015 G9768_RS00015 -SW2_RS00015 BW688_RS01405 -SW2_RS00015 L2BLST_RS00015 -SW2_RS00015 AQ199_RS00710 -SW2_RS00015 BKC02_RS00015 -SW2_RS00015 BKC01_RS00015 -SW2_RS00015 7618353 -SW2_RS00015 gnl|Prokka|PADJNBJD_00003 -SW2_RS00015 LJHENM_00015 -SW2_RS00015 A5291_RS00015 -SW2_RS00015 SOTONK1_RS00015 -SW2_RS00015 BBV16_RS00015 -SW2_RS00015 JIEJKO_00010 -SW2_RS00015 NILJEPDF_00003 -SW2_RS00015 L3404_RS00015 -SW2_RS00015 IaCS19096_RS00015 -SW2_RS00015 BKC03_RS00015 -SW2_RS00015 C15_RS0100015 -SW2_RS00015 QSDFRQ_00003 -SW2_RS00015 CTJTET1_RS00015 -SW2_RS00015 AKW53_RS01500 -SW2_RS00015 DU10_RS00015 -SW2_RS00015 CTRC943_RS00015 -SW2_RS00015 AQ193_RS03990 -SW2_RS00015 O169_RS00015 -SW2_RS00015 CBP48_RS01405 -SW2_RS00015 ECS88FINAL_RS0100015 -SW2_RS00015 DU13_RS00015 -SW2_RS00015 KW39_RS00015 -SW2_RS00015 AQ244_RS01975 -SW2_RS00015 BKB95_RS00015 -SW2_RS00015 KW36_RS00015 -SW2_RS00180 SW2_RS00180 -SW2_RS00180 ECS102511_RS00180 -SW2_RS00180 CTB_RS00180 -SW2_RS00180 CTL2C_RS01545 -SW2_RS00180 CBP42_RS01575 -SW2_RS00180 L1224_RS00180 -SW2_RS00180 BKB96_RS00185 -SW2_RS00180 BKB99_RS00185 -SW2_RS00180 CTO_RS00180 -SW2_RS00180 SOTONIA3_RS00180 -SW2_RS00180 L1440_RS00180 -SW2_RS00180 BKB92_RS00185 -SW2_RS00180 119235 -SW2_RS00180 CBP44_RS01580 -SW2_RS00180 E150_RS00180 -SW2_RS00180 L2BUCH2_RS00180 -SW2_RS00180 BKB93_RS00185 -SW2_RS00180 FCS84708_RS00180 -SW2_RS00180 AP288_RS03250 -SW2_RS00180 BBV13_RS00185 -SW2_RS00180 G9768_RS00180 -SW2_RS00180 AQ199_RS00875 -SW2_RS00180 BW688_RS01575 -SW2_RS00180 L2BLST_RS00180 -SW2_RS00180 BKC02_RS00185 -SW2_RS00180 BBV16_RS00185 -SW2_RS00180 BKC01_RS00185 -SW2_RS00180 gnl|Prokka|PADJNBJD_00037 -SW2_RS00180 LJHENM_00185 -SW2_RS00180 A5291_RS00180 -SW2_RS00180 SOTONK1_RS00180 -SW2_RS00180 JIEJKO_00180 -SW2_RS00180 7618374 -SW2_RS00180 NILJEPDF_00037 -SW2_RS00180 L3404_RS00180 -SW2_RS00180 IaCS19096_RS00180 -SW2_RS00180 AKW53_RS01670 -SW2_RS00180 BKC03_RS00185 -SW2_RS00180 C15_RS0100180 -SW2_RS00180 QSDFRQ_00037 -SW2_RS00180 CTJTET1_RS00180 -SW2_RS00180 AQ193_RS03825 -SW2_RS00180 DU10_RS00185 -SW2_RS00180 CTRC943_RS00180 -SW2_RS00180 O169_RS00180 -SW2_RS00180 AQ244_RS01810 -SW2_RS00180 CBP48_RS01575 -SW2_RS00180 ECS88FINAL_RS0100185 -SW2_RS00180 DU13_RS00185 -SW2_RS00180 KW39_RS00180 -SW2_RS00180 KW36_RS00180 -SW2_RS00180 BKB95_RS00185 -SW2_RS00355 SW2_RS00355 -SW2_RS00355 ECS102511_RS00355 -SW2_RS00355 CTB_RS00355 -SW2_RS00355 CTL2C_RS01720 -SW2_RS00355 CBP42_RS01755 -SW2_RS00355 BKB96_RS00365 -SW2_RS00355 L1224_RS00355 -SW2_RS00355 BKB99_RS00365 -SW2_RS00355 CTO_RS00355 -SW2_RS00355 L1440_RS00355 -SW2_RS00355 BKB92_RS00365 -SW2_RS00355 SOTONIA3_RS00355 -SW2_RS00355 CBP44_RS01760 -SW2_RS00355 119259 -SW2_RS00355 E150_RS00355 -SW2_RS00355 AOT15_RS00600 -SW2_RS00355 L2BUCH2_RS00355 -SW2_RS00355 BKB93_RS00365 -SW2_RS00355 FCS84708_RS00355 -SW2_RS00355 AP288_RS03425 -SW2_RS00355 BBV13_RS00360 -SW2_RS00355 AQ199_RS01050 -SW2_RS00355 BW688_RS01755 -SW2_RS00355 G9768_RS00355 -SW2_RS00355 L2BLST_RS00355 -SW2_RS00355 BKC02_RS00365 -SW2_RS00355 BBV16_RS00360 -SW2_RS00355 gnl|Prokka|PADJNBJD_00070 -SW2_RS00355 NILJEPDF_00070 -SW2_RS00355 LJHENM_00355 -SW2_RS00355 A5291_RS00355 -SW2_RS00355 BKC01_RS00365 -SW2_RS00355 SOTONK1_RS00355 -SW2_RS00355 L3404_RS00355 -SW2_RS00355 JIEJKO_00355 -SW2_RS00355 AKW53_RS01845 -SW2_RS00355 QSDFRQ_00070 -SW2_RS00355 IaCS19096_RS00355 -SW2_RS00355 BKC03_RS00365 -SW2_RS00355 C15_RS0100365 -SW2_RS00355 DU10_RS00365 -SW2_RS00355 7618390 -SW2_RS00355 CTRC943_RS00355 -SW2_RS00355 CTJTET1_RS00355 -SW2_RS00355 AQ193_RS03640 -SW2_RS00355 AQ244_RS01635 -SW2_RS00355 O169_RS00355 -SW2_RS00355 KW36_RS00355 -SW2_RS00355 DU13_RS00370 -SW2_RS00355 CBP48_RS01755 -SW2_RS00355 ECS88FINAL_RS0100370 -SW2_RS00355 KW39_RS00355 -SW2_RS00355 BKB95_RS00365 -SW2_RS00520 SW2_RS00520 -SW2_RS00520 BKB95_RS00530 -SW2_RS00520 ECS102511_RS00520 -SW2_RS00520 CTB_RS00520 -SW2_RS00520 CTL2C_RS01885 -SW2_RS00520 CBP42_RS01920 -SW2_RS00520 AQ244_RS02695 -SW2_RS00520 BKB96_RS00530 -SW2_RS00520 L1224_RS00520 -SW2_RS00520 BKB99_RS00530 -SW2_RS00520 BKB92_RS00530 -SW2_RS00520 CTO_RS00520 -SW2_RS00520 L1440_RS00520 -SW2_RS00520 SOTONIA3_RS00520 -SW2_RS00520 AOT15_RS00435 -SW2_RS00520 E150_RS00520 -SW2_RS00520 CBP44_RS01925 -SW2_RS00520 119279 -SW2_RS00520 L2BUCH2_RS00520 -SW2_RS00520 BKB93_RS00530 -SW2_RS00520 FCS84708_RS00520 -SW2_RS00520 AP288_RS03590 -SW2_RS00520 BBV13_RS00525 -SW2_RS00520 AQ199_RS01215 -SW2_RS00520 L2BLST_RS00520 -SW2_RS00520 BW688_RS01920 -SW2_RS00520 G9768_RS00520 -SW2_RS00520 BBV16_RS00525 -SW2_RS00520 BKC02_RS00530 -SW2_RS00520 gnl|Prokka|PADJNBJD_00102 -SW2_RS00520 LJHENM_00510 -SW2_RS00520 NILJEPDF_00102 -SW2_RS00520 BKC01_RS00530 -SW2_RS00520 A5291_RS00520 -SW2_RS00520 AKW53_RS02015 -SW2_RS00520 JIEJKO_00515 -SW2_RS00520 SOTONK1_RS00520 -SW2_RS00520 L3404_RS00520 -SW2_RS00520 QSDFRQ_00102 -SW2_RS00520 IaCS19096_RS00520 -SW2_RS00520 BKC03_RS00530 -SW2_RS00520 DU10_RS00530 -SW2_RS00520 C15_RS0100530 -SW2_RS00520 AQ193_RS03475 -SW2_RS00520 7618403 -SW2_RS00520 CTRC943_RS00520 -SW2_RS00520 CTJTET1_RS00520 -SW2_RS00520 O169_RS00520 -SW2_RS00520 DU13_RS00535 -SW2_RS00520 ECS88FINAL_RS0100535 -SW2_RS00520 KW39_RS00520 -SW2_RS00520 KW36_RS00520 -SW2_RS00520 CBP48_RS01920 -SW2_RS00690 SW2_RS00690 -SW2_RS00690 BKB95_RS00700 -SW2_RS00690 ECS102511_RS00690 -SW2_RS00690 CTL2C_RS02055 -SW2_RS00690 CTB_RS00695 -SW2_RS00690 L1224_RS00690 -SW2_RS00690 AQ244_RS02865 -SW2_RS00690 BKB96_RS00700 -SW2_RS00690 CBP42_RS02090 -SW2_RS00690 BKB99_RS00700 -SW2_RS00690 L1440_RS00690 -SW2_RS00690 BKB92_RS00700 -SW2_RS00690 CTO_RS00695 -SW2_RS00690 SOTONIA3_RS00690 -SW2_RS00690 AOT15_RS00265 -SW2_RS00690 E150_RS00690 -SW2_RS00690 L2BUCH2_RS00690 -SW2_RS00690 CBP44_RS02095 -SW2_RS00690 FCS84708_RS00690 -SW2_RS00690 AP288_RS03760 -SW2_RS00690 BKB93_RS00700 -SW2_RS00690 119310 -SW2_RS00690 AQ199_RS01385 -SW2_RS00690 BBV13_RS00700 -SW2_RS00690 G9768_RS00690 -SW2_RS00690 L2BLST_RS00690 -SW2_RS00690 BW688_RS02090 -SW2_RS00690 BBV16_RS00700 -SW2_RS00690 BKC02_RS00700 -SW2_RS00690 gnl|Prokka|PADJNBJD_00136 -SW2_RS00690 LJHENM_00680 -SW2_RS00690 AKW53_RS02185 -SW2_RS00690 BKC01_RS00700 -SW2_RS00690 NILJEPDF_00136 -SW2_RS00690 A5291_RS00695 -SW2_RS00690 L3404_RS00690 -SW2_RS00690 SOTONK1_RS00690 -SW2_RS00690 JIEJKO_00685 -SW2_RS00690 QSDFRQ_00136 -SW2_RS00690 IaCS19096_RS00690 -SW2_RS00690 AQ193_RS03305 -SW2_RS00690 BKC03_RS00700 -SW2_RS00690 C15_RS0100715 -SW2_RS00690 CTRC943_RS00690 -SW2_RS00690 CTJTET1_RS00690 -SW2_RS00690 KW39_RS00690 -SW2_RS00690 DU10_RS00700 -SW2_RS00690 ECS88FINAL_RS0100715 -SW2_RS00690 O169_RS00690 -SW2_RS00690 DU13_RS00705 -SW2_RS00690 7618423 -SW2_RS00690 KW36_RS00690 -SW2_RS00690 CBP48_RS02090 -SW2_RS00870 SW2_RS00870 -SW2_RS00870 BKB99_RS00870 -SW2_RS00870 ECS102511_RS00870 -SW2_RS00870 CBP48_RS02270 -SW2_RS00870 CTL2C_RS02230 -SW2_RS00870 L1224_RS00860 -SW2_RS00870 AQ244_RS03050 -SW2_RS00870 SOTONIA3_RS00885 -SW2_RS00870 L1440_RS00860 -SW2_RS00870 BKB92_RS00875 -SW2_RS00870 CBP42_RS02270 -SW2_RS00870 CTB_RS00895 -SW2_RS00870 E150_RS00870 -SW2_RS00870 AOT15_RS00085 -SW2_RS00870 CTO_RS00895 -SW2_RS00870 L2BUCH2_RS00865 -SW2_RS00870 FCS84708_RS00870 -SW2_RS00870 AP288_RS03940 -SW2_RS00870 BKB93_RS00875 -SW2_RS00870 AQ199_RS01565 -SW2_RS00870 CBP44_RS02275 -SW2_RS00870 G9768_RS00875 -SW2_RS00870 L2BLST_RS00865 -SW2_RS00870 BW688_RS02270 -SW2_RS00870 BKC02_RS00870 -SW2_RS00870 BBV13_RS00900 -SW2_RS00870 BKC01_RS00870 -SW2_RS00870 119348 -SW2_RS00870 AKW53_RS02365 -SW2_RS00870 BBV16_RS00900 -SW2_RS00870 L3404_RS00860 -SW2_RS00870 BKC03_RS00870 -SW2_RS00870 gnl|Prokka|PADJNBJD_00171 -SW2_RS00870 CTJTET1_RS00885 -SW2_RS00870 DU10_RS00885 -SW2_RS00870 NILJEPDF_00171 -SW2_RS00870 C15_RS0100905 -SW2_RS00870 LJHENM_00860 -SW2_RS00870 SOTONK1_RS00870 -SW2_RS00870 KW39_RS00875 -SW2_RS00870 IaCS19096_RS00870 -SW2_RS00870 JIEJKO_00860 -SW2_RS00870 CTRC943_RS00865 -SW2_RS00870 ECS88FINAL_RS0100890 -SW2_RS00870 O169_RS00875 -SW2_RS00870 DU13_RS00880 -SW2_RS00870 QSDFRQ_00171 -SW2_RS00870 A5291_RS00895 -SW2_RS00870 7618444 -SW2_RS00870 AQ193_RS03120 -SW2_RS00870 BKB95_RS00885 -SW2_RS00870 KW36_RS00870 -SW2_RS00870 BKB96_RS00870 -SW2_RS01045 SW2_RS01045 -SW2_RS01045 BKB95_RS01065 -SW2_RS01045 CBP48_RS02440 -SW2_RS01045 KW36_RS01050 -SW2_RS01045 ECS102511_RS01045 -SW2_RS01045 BKB96_RS01050 -SW2_RS01045 CTL2C_RS02400 -SW2_RS01045 BKB99_RS01050 -SW2_RS01045 L1224_RS01030 -SW2_RS01045 L1440_RS01030 -SW2_RS01045 AQ244_RS03230 -SW2_RS01045 BKB92_RS01050 -SW2_RS01045 CBP42_RS02440 -SW2_RS01045 SOTONIA3_RS01065 -SW2_RS01045 E150_RS01045 -SW2_RS01045 CTB_RS01075 -SW2_RS01045 L2BUCH2_RS01035 -SW2_RS01045 CTO_RS01075 -SW2_RS01045 FCS84708_RS01045 -SW2_RS01045 AP288_RS04115 -SW2_RS01045 BKB93_RS01050 -SW2_RS01045 CBP44_RS02445 -SW2_RS01045 AQ199_RS01740 -SW2_RS01045 L2BLST_RS01035 -SW2_RS01045 AOT15_RS01315 -SW2_RS01045 BW688_RS02445 -SW2_RS01045 BBV13_RS01080 -SW2_RS01045 G9768_RS01055 -SW2_RS01045 BKC02_RS01050 -SW2_RS01045 L3404_RS01030 -SW2_RS01045 AKW53_RS02540 -SW2_RS01045 BBV16_RS01080 -SW2_RS01045 BKC01_RS01050 -SW2_RS01045 119371 -SW2_RS01045 DU10_RS01060 -SW2_RS01045 gnl|Prokka|PADJNBJD_00206 -SW2_RS01045 BKC03_RS01050 -SW2_RS01045 NILJEPDF_00206 -SW2_RS01045 LJHENM_01035 -SW2_RS01045 CTRC943_RS01035 -SW2_RS01045 CTJTET1_RS01065 -SW2_RS01045 C15_RS0101085 -SW2_RS01045 SOTONK1_RS01050 -SW2_RS01045 ECS88FINAL_RS0101070 -SW2_RS01045 KW39_RS01055 -SW2_RS01045 JIEJKO_01035 -SW2_RS01045 A5291_RS01075 -SW2_RS01045 IaCS19096_RS01050 -SW2_RS01045 7618459 -SW2_RS01045 QSDFRQ_00206 -SW2_RS01045 O169_RS01055 -SW2_RS01045 AQ193_RS02945 -SW2_RS01045 DU13_RS01060 -SW2_RS01225 SW2_RS01225 -SW2_RS01225 BKB95_RS01245 -SW2_RS01225 CBP48_RS02620 -SW2_RS01225 KW36_RS01230 -SW2_RS01225 ECS102511_RS01225 -SW2_RS01225 BKB96_RS01230 -SW2_RS01225 CTL2C_RS02580 -SW2_RS01225 BKB99_RS01230 -SW2_RS01225 L1224_RS01210 -SW2_RS01225 L1440_RS01210 -SW2_RS01225 AQ244_RS03410 -SW2_RS01225 BKB92_RS01230 -SW2_RS01225 CBP42_RS02620 -SW2_RS01225 SOTONIA3_RS01245 -SW2_RS01225 CTB_RS01255 -SW2_RS01225 E150_RS01225 -SW2_RS01225 L2BUCH2_RS01215 -SW2_RS01225 CTO_RS01255 -SW2_RS01225 FCS84708_RS01225 -SW2_RS01225 AP288_RS04295 -SW2_RS01225 BKB93_RS01230 -SW2_RS01225 CBP44_RS02625 -SW2_RS01225 AQ199_RS01920 -SW2_RS01225 L2BLST_RS01215 -SW2_RS01225 AOT15_RS01135 -SW2_RS01225 BW688_RS02625 -SW2_RS01225 BBV13_RS01260 -SW2_RS01225 G9768_RS01235 -SW2_RS01225 BKC02_RS01230 -SW2_RS01225 L3404_RS01210 -SW2_RS01225 AKW53_RS02720 -SW2_RS01225 BBV16_RS01260 -SW2_RS01225 BKC01_RS01230 -SW2_RS01225 119396 -SW2_RS01225 gnl|Prokka|PADJNBJD_00241 -SW2_RS01225 DU10_RS01240 -SW2_RS01225 NILJEPDF_00241 -SW2_RS01225 LJHENM_01210 -SW2_RS01225 BKC03_RS01230 -SW2_RS01225 CTRC943_RS01215 -SW2_RS01225 CTJTET1_RS01245 -SW2_RS01225 KW39_RS01235 -SW2_RS01225 JIEJKO_01210 -SW2_RS01225 C15_RS0101265 -SW2_RS01225 SOTONK1_RS01230 -SW2_RS01225 ECS88FINAL_RS0101250 -SW2_RS01225 QSDFRQ_00241 -SW2_RS01225 A5291_RS01255 -SW2_RS01225 IaCS19096_RS01230 -SW2_RS01225 O169_RS01235 -SW2_RS01225 AQ193_RS02765 -SW2_RS01225 DU13_RS01240 -SW2_RS01225 7618475 -SW2_RS01385 SW2_RS01385 -SW2_RS01385 BKB95_RS01410 -SW2_RS01385 CBP48_RS02785 -SW2_RS01385 KW36_RS01390 -SW2_RS01385 ECS102511_RS01385 -SW2_RS01385 AOT15_RS02390 -SW2_RS01385 BKB96_RS01395 -SW2_RS01385 CTL2C_RS02740 -SW2_RS01385 BKB99_RS01395 -SW2_RS01385 L1224_RS01370 -SW2_RS01385 L1440_RS01370 -SW2_RS01385 AQ244_RS03575 -SW2_RS01385 CBP42_RS02785 -SW2_RS01385 SOTONIA3_RS01405 -SW2_RS01385 BKB92_RS01400 -SW2_RS01385 CTB_RS01420 -SW2_RS01385 E150_RS01390 -SW2_RS01385 L2BUCH2_RS01375 -SW2_RS01385 CTO_RS01415 -SW2_RS01385 FCS84708_RS01385 -SW2_RS01385 AP288_RS04455 -SW2_RS01385 BKB93_RS01400 -SW2_RS01385 CBP44_RS02790 -SW2_RS01385 AQ199_RS02080 -SW2_RS01385 L2BLST_RS01375 -SW2_RS01385 BBV13_RS01425 -SW2_RS01385 BW688_RS02790 -SW2_RS01385 G9768_RS01395 -SW2_RS01385 BKC02_RS01395 -SW2_RS01385 BBV16_RS01425 -SW2_RS01385 L3404_RS01370 -SW2_RS01385 AKW53_RS02880 -SW2_RS01385 BKC01_RS01400 -SW2_RS01385 gnl|Prokka|PADJNBJD_00273 -SW2_RS01385 DU10_RS01405 -SW2_RS01385 NILJEPDF_00273 -SW2_RS01385 LJHENM_01375 -SW2_RS01385 BKC03_RS01395 -SW2_RS01385 CTRC943_RS01375 -SW2_RS01385 CTJTET1_RS01405 -SW2_RS01385 KW39_RS01395 -SW2_RS01385 JIEJKO_01375 -SW2_RS01385 120460 -SW2_RS01385 C15_RS0101430 -SW2_RS01385 SOTONK1_RS01395 -SW2_RS01385 ECS88FINAL_RS0101415 -SW2_RS01385 QSDFRQ_00273 -SW2_RS01385 IaCS19096_RS01390 -SW2_RS01385 AQ193_RS02600 -SW2_RS01385 A5291_RS01420 -SW2_RS01385 O169_RS01400 -SW2_RS01385 DU13_RS01405 -SW2_RS01385 7618904 -SW2_RS01545 SW2_RS01545 -SW2_RS01545 BKB95_RS01570 -SW2_RS01545 CBP48_RS02945 -SW2_RS01545 7618926 -SW2_RS01545 KW36_RS01550 -SW2_RS01545 ECS102511_RS01545 -SW2_RS01545 AOT15_RS02550 -SW2_RS01545 BKB96_RS01555 -SW2_RS01545 CTL2C_RS02900 -SW2_RS01545 BKB99_RS01555 -SW2_RS01545 L1224_RS01530 -SW2_RS01545 L1440_RS01530 -SW2_RS01545 AQ244_RS03735 -SW2_RS01545 CBP42_RS02945 -SW2_RS01545 SOTONIA3_RS01565 -SW2_RS01545 BKB92_RS01560 -SW2_RS01545 CTB_RS01580 -SW2_RS01545 E150_RS01550 -SW2_RS01545 L2BUCH2_RS01535 -SW2_RS01545 CTO_RS01575 -SW2_RS01545 FCS84708_RS01545 -SW2_RS01545 AP288_RS04615 -SW2_RS01545 BKB93_RS01560 -SW2_RS01545 CBP44_RS02950 -SW2_RS01545 AQ199_RS02240 -SW2_RS01545 L2BLST_RS01535 -SW2_RS01545 BBV13_RS01585 -SW2_RS01545 BW688_RS02955 -SW2_RS01545 G9768_RS01555 -SW2_RS01545 BKC02_RS01555 -SW2_RS01545 AKW53_RS03045 -SW2_RS01545 BBV16_RS01585 -SW2_RS01545 L3404_RS01530 -SW2_RS01545 BKC01_RS01560 -SW2_RS01545 gnl|Prokka|PADJNBJD_00305 -SW2_RS01545 NILJEPDF_00305 -SW2_RS01545 LJHENM_01535 -SW2_RS01545 BKC03_RS01555 -SW2_RS01545 DU10_RS01570 -SW2_RS01545 CTRC943_RS01535 -SW2_RS01545 CTJTET1_RS01565 -SW2_RS01545 KW39_RS01555 -SW2_RS01545 JIEJKO_01535 -SW2_RS01545 C15_RS0101600 -SW2_RS01545 SOTONK1_RS01555 -SW2_RS01545 ECS88FINAL_RS0101580 -SW2_RS01545 120426 -SW2_RS01545 QSDFRQ_00305 -SW2_RS01545 IaCS19096_RS01550 -SW2_RS01545 AQ193_RS02440 -SW2_RS01545 A5291_RS01580 -SW2_RS01545 O169_RS01560 -SW2_RS01545 DU13_RS01565 -SW2_RS01875 SW2_RS01875 -SW2_RS01875 BKB99_RS01880 -SW2_RS01875 L1440_RS01850 -SW2_RS01875 ECS102511_RS01875 -SW2_RS01875 CBP42_RS03290 -SW2_RS01875 CTB_RS01900 -SW2_RS01875 SOTONIA3_RS01885 -SW2_RS01875 L2BUCH2_RS01850 -SW2_RS01875 BKB92_RS01890 -SW2_RS01875 CTO_RS01900 -SW2_RS01875 E150_RS01880 -SW2_RS01875 L2BLST_RS01850 -SW2_RS01875 FCS84708_RS01870 -SW2_RS01875 BW688_RS03280 -SW2_RS01875 BKB93_RS01890 -SW2_RS01875 CBP44_RS03285 -SW2_RS01875 BBV13_RS01905 -SW2_RS01875 AP288_RS01205 -SW2_RS01875 AQ199_RS02570 -SW2_RS01875 G9768_RS01875 -SW2_RS01875 L3404_RS01850 -SW2_RS01875 BBV16_RS01905 -SW2_RS01875 BKC02_RS01880 -SW2_RS01875 AQ244_RS01235 -SW2_RS01875 BKC01_RS01880 -SW2_RS01875 AKW53_RS03375 -SW2_RS01875 gnl|Prokka|PADJNBJD_00369 -SW2_RS01875 NILJEPDF_00369 -SW2_RS01875 CTRC943_RS01855 -SW2_RS01875 LJHENM_01860 -SW2_RS01875 JIEJKO_01855 -SW2_RS01875 BKC03_RS01880 -SW2_RS01875 CTJTET1_RS01885 -SW2_RS01875 DU10_RS01900 -SW2_RS01875 QSDFRQ_00369 -SW2_RS01875 C15_RS0101915 -SW2_RS01875 SOTONK1_RS01875 -SW2_RS01875 A5291_RS01900 -SW2_RS01875 KW39_RS01885 -SW2_RS01875 IaCS19096_RS01870 -SW2_RS01875 ECS88FINAL_RS0101905 -SW2_RS01875 DU13_RS01895 -SW2_RS01875 O169_RS01885 -SW2_RS01875 AQ193_RS02110 -SW2_RS01875 120358 -SW2_RS01875 7618962 -SW2_RS01875 CTL2C_RS03220 -SW2_RS01875 BKB95_RS01895 -SW2_RS01875 CBP48_RS03280 -SW2_RS01875 L1224_RS01850 -SW2_RS01875 KW36_RS01870 -SW2_RS01875 AOT15_RS02870 -SW2_RS01875 BKB96_RS01880 -SW2_RS02040 SW2_RS02040 -SW2_RS02040 BKB99_RS02045 -SW2_RS02040 L1440_RS02015 -SW2_RS02040 ECS102511_RS02040 -SW2_RS02040 CTB_RS02065 -SW2_RS02040 CBP42_RS03460 -SW2_RS02040 SOTONIA3_RS02050 -SW2_RS02040 L2BUCH2_RS02015 -SW2_RS02040 BKB92_RS02055 -SW2_RS02040 CTO_RS02065 -SW2_RS02040 E150_RS02045 -SW2_RS02040 L2BLST_RS02015 -SW2_RS02040 BW688_RS03445 -SW2_RS02040 FCS84708_RS02035 -SW2_RS02040 BBV13_RS02070 -SW2_RS02040 BKB93_RS02055 -SW2_RS02040 CBP44_RS03455 -SW2_RS02040 AP288_RS01040 -SW2_RS02040 AQ199_RS02735 -SW2_RS02040 G9768_RS02040 -SW2_RS02040 BBV16_RS02070 -SW2_RS02040 L3404_RS02015 -SW2_RS02040 BKC02_RS02045 -SW2_RS02040 AQ244_RS01070 -SW2_RS02040 BKC01_RS02045 -SW2_RS02040 AKW53_RS03540 -SW2_RS02040 gnl|Prokka|PADJNBJD_00402 -SW2_RS02040 NILJEPDF_00402 -SW2_RS02040 CTRC943_RS02020 -SW2_RS02040 LJHENM_02025 -SW2_RS02040 JIEJKO_02020 -SW2_RS02040 BKC03_RS02045 -SW2_RS02040 CTJTET1_RS02050 -SW2_RS02040 QSDFRQ_00402 -SW2_RS02040 C15_RS0102085 -SW2_RS02040 A5291_RS02065 -SW2_RS02040 SOTONK1_RS02040 -SW2_RS02040 DU10_RS02070 -SW2_RS02040 KW39_RS02050 -SW2_RS02040 IaCS19096_RS02035 -SW2_RS02040 ECS88FINAL_RS0102080 -SW2_RS02040 O169_RS02050 -SW2_RS02040 AQ193_RS01945 -SW2_RS02040 DU13_RS02065 -SW2_RS02040 7618542 -SW2_RS02040 CTL2C_RS03385 -SW2_RS02040 CBP48_RS03450 -SW2_RS02040 119502 -SW2_RS02040 L1224_RS02015 -SW2_RS02040 KW36_RS02035 -SW2_RS02040 AOT15_RS03035 -SW2_RS02040 BKB95_RS02065 -SW2_RS02040 BKB96_RS02045 -SW2_RS02205 SW2_RS02205 -SW2_RS02205 L1440_RS02180 -SW2_RS02205 CTB_RS02230 -SW2_RS02205 SOTONIA3_RS04885 -SW2_RS02205 CTO_RS02230 -SW2_RS02205 L2BLST_RS04850 -SW2_RS02205 BBV13_RS04870 -SW2_RS02205 BKB93_RS02225 -SW2_RS02205 BBV16_RS02240 -SW2_RS02205 A5291_RS04905 -SW2_RS02205 BKB96_RS02215 -SW2_RS02205 CTL2C_RS03550 -SW2_RS02205 L1224_RS04850 -SW2_RS02365 SW2_RS02365 -SW2_RS02365 ECS102511_RS02360 -SW2_RS02365 L1440_RS02340 -SW2_RS02365 CBP42_RS03790 -SW2_RS02365 CTB_RS02390 -SW2_RS02365 L2BUCH2_RS02335 -SW2_RS02365 BKB92_RS02385 -SW2_RS02365 SOTONIA3_RS02375 -SW2_RS02365 CTO_RS02390 -SW2_RS02365 E150_RS02365 -SW2_RS02365 BW688_RS03775 -SW2_RS02365 L2BLST_RS02340 -SW2_RS02365 FCS84708_RS02355 -SW2_RS02365 BBV13_RS02395 -SW2_RS02365 CBP44_RS03785 -SW2_RS02365 BKB93_RS02390 -SW2_RS02365 AQ199_RS03055 -SW2_RS02365 G9768_RS02360 -SW2_RS02365 AP288_RS00720 -SW2_RS02365 BBV16_RS02400 -SW2_RS02365 L3404_RS02335 -SW2_RS02365 BKC02_RS02375 -SW2_RS02365 AKW53_RS03860 -SW2_RS02365 BKC01_RS02375 -SW2_RS02365 gnl|Prokka|PADJNBJD_00466 -SW2_RS02365 NILJEPDF_00466 -SW2_RS02365 LJHENM_02350 -SW2_RS02365 CTRC943_RS02340 -SW2_RS02365 AQ244_RS00750 -SW2_RS02365 JIEJKO_02350 -SW2_RS02365 BKC03_RS02375 -SW2_RS02365 QSDFRQ_00466 -SW2_RS02365 CTJTET1_RS02370 -SW2_RS02365 C15_RS0102410 -SW2_RS02365 SOTONK1_RS02360 -SW2_RS02365 DU10_RS02400 -SW2_RS02365 A5291_RS02390 -SW2_RS02365 KW39_RS02370 -SW2_RS02365 IaCS19096_RS02355 -SW2_RS02365 ECS88FINAL_RS0102410 -SW2_RS02365 O169_RS02370 -SW2_RS02365 DU13_RS02395 -SW2_RS02365 7619008 -SW2_RS02365 AQ193_RS01625 -SW2_RS02365 BKB96_RS02380 -SW2_RS02365 BKB99_RS02375 -SW2_RS02365 CBP48_RS03780 -SW2_RS02365 120284 -SW2_RS02365 CTL2C_RS03710 -SW2_RS02365 KW36_RS02355 -SW2_RS02365 AOT15_RS03355 -SW2_RS02365 BKB95_RS02395 -SW2_RS02365 L1224_RS02340 -SW2_RS02555 SW2_RS02555 -SW2_RS02555 L1224_RS02530 -SW2_RS02555 ECS102511_RS02550 -SW2_RS02555 BKB95_RS02585 -SW2_RS02555 L1440_RS02530 -SW2_RS02555 119592 -SW2_RS02555 CBP42_RS03980 -SW2_RS02555 L2BUCH2_RS02530 -SW2_RS02555 BKB92_RS02575 -SW2_RS02555 CTB_RS02585 -SW2_RS02555 SOTONIA3_RS02565 -SW2_RS02555 E150_RS02555 -SW2_RS02555 AKW53_RS04665 -SW2_RS02555 BW688_RS03970 -SW2_RS02555 CTO_RS02585 -SW2_RS02555 FCS84708_RS02545 -SW2_RS02555 L2BLST_RS02530 -SW2_RS02555 BBV13_RS02590 -SW2_RS02555 CBP44_RS03975 -SW2_RS02555 AQ199_RS03245 -SW2_RS02555 BKB93_RS02580 -SW2_RS02555 AP288_RS00530 -SW2_RS02555 BBV16_RS02600 -SW2_RS02555 G9768_RS02550 -SW2_RS02555 L3404_RS02525 -SW2_RS02555 BKC02_RS02570 -SW2_RS02555 gnl|Prokka|PADJNBJD_00502 -SW2_RS02555 AQ244_RS00560 -SW2_RS02555 NILJEPDF_00502 -SW2_RS02555 LJHENM_02525 -SW2_RS02555 BKC01_RS02570 -SW2_RS02555 CTRC943_RS02530 -SW2_RS02555 JIEJKO_02530 -SW2_RS02555 QSDFRQ_00502 -SW2_RS02555 SOTONK1_RS02550 -SW2_RS02555 BKC03_RS02570 -SW2_RS02555 CTJTET1_RS02560 -SW2_RS02555 KW39_RS02560 -SW2_RS02555 ECS88FINAL_RS0102600 -SW2_RS02555 IaCS19096_RS02545 -SW2_RS02555 DU10_RS02590 -SW2_RS02555 C15_RS0102605 -SW2_RS02555 O169_RS02560 -SW2_RS02555 A5291_RS02585 -SW2_RS02555 AQ193_RS01435 -SW2_RS02555 DU13_RS02585 -SW2_RS02555 7618600 -SW2_RS02555 CBP48_RS03970 -SW2_RS02555 CTL2C_RS03900 -SW2_RS02555 KW36_RS02545 -SW2_RS02555 AOT15_RS03545 -SW2_RS02555 BKB96_RS02575 -SW2_RS02555 BKB99_RS02570 -SW2_RS02720 SW2_RS02720 -SW2_RS02720 L1224_RS02695 -SW2_RS02720 ECS102511_RS02715 -SW2_RS02720 L1440_RS02695 -SW2_RS02720 120222 -SW2_RS02720 CBP42_RS04150 -SW2_RS02720 L2BUCH2_RS02695 -SW2_RS02720 SOTONIA3_RS02730 -SW2_RS02720 BKB92_RS02745 -SW2_RS02720 CTB_RS02750 -SW2_RS02720 E150_RS02720 -SW2_RS02720 AKW53_RS04500 -SW2_RS02720 BW688_RS04140 -SW2_RS02720 CTO_RS02750 -SW2_RS02720 FCS84708_RS02710 -SW2_RS02720 L2BLST_RS02695 -SW2_RS02720 BBV13_RS02755 -SW2_RS02720 CBP44_RS04145 -SW2_RS02720 AQ199_RS03410 -SW2_RS02720 BKB93_RS02750 -SW2_RS02720 AP288_RS00365 -SW2_RS02720 BBV16_RS02765 -SW2_RS02720 G9768_RS02715 -SW2_RS02720 L3404_RS02690 -SW2_RS02720 BKC02_RS02740 -SW2_RS02720 gnl|Prokka|PADJNBJD_00535 -SW2_RS02720 NILJEPDF_00535 -SW2_RS02720 AQ244_RS00395 -SW2_RS02720 BKC01_RS02740 -SW2_RS02720 LJHENM_02695 -SW2_RS02720 CTRC943_RS02695 -SW2_RS02720 AOT15_RS01515 -SW2_RS02720 QSDFRQ_00535 -SW2_RS02720 JIEJKO_02700 -SW2_RS02720 SOTONK1_RS02715 -SW2_RS02720 CTJTET1_RS02725 -SW2_RS02720 BKC03_RS02740 -SW2_RS02720 KW39_RS02725 -SW2_RS02720 C15_RS0102785 -SW2_RS02720 ECS88FINAL_RS0102780 -SW2_RS02720 IaCS19096_RS02710 -SW2_RS02720 DU10_RS02760 -SW2_RS02720 O169_RS02725 -SW2_RS02720 A5291_RS02750 -SW2_RS02720 AQ193_RS01270 -SW2_RS02720 DU13_RS02755 -SW2_RS02720 CBP48_RS04140 -SW2_RS02720 7619046 -SW2_RS02720 CTL2C_RS04065 -SW2_RS02720 KW36_RS02710 -SW2_RS02720 BKB95_RS02755 -SW2_RS02720 BKB96_RS02745 -SW2_RS02720 BKB99_RS02740 -SW2_RS02880 SW2_RS02880 -SW2_RS02880 L1224_RS02855 -SW2_RS02880 ECS102511_RS02875 -SW2_RS02880 L1440_RS02855 -SW2_RS02880 CBP42_RS04310 -SW2_RS02880 120172 -SW2_RS02880 L2BUCH2_RS02855 -SW2_RS02880 SOTONIA3_RS02890 -SW2_RS02880 BKB92_RS02905 -SW2_RS02880 CTB_RS02910 -SW2_RS02880 E150_RS02880 -SW2_RS02880 BW688_RS04300 -SW2_RS02880 CTO_RS02910 -SW2_RS02880 FCS84708_RS02870 -SW2_RS02880 L2BLST_RS02855 -SW2_RS02880 BBV13_RS02915 -SW2_RS02880 CBP44_RS04305 -SW2_RS02880 AQ199_RS03570 -SW2_RS02880 BKB93_RS02910 -SW2_RS02880 AP288_RS00205 -SW2_RS02880 BBV16_RS02925 -SW2_RS02880 G9768_RS02875 -SW2_RS02880 L3404_RS02850 -SW2_RS02880 BKC02_RS02900 -SW2_RS02880 gnl|Prokka|PADJNBJD_00567 -SW2_RS02880 AOT15_RS03675 -SW2_RS02880 NILJEPDF_00567 -SW2_RS02880 AQ244_RS00235 -SW2_RS02880 BKC01_RS02900 -SW2_RS02880 LJHENM_02855 -SW2_RS02880 CTRC943_RS02855 -SW2_RS02880 QSDFRQ_00567 -SW2_RS02880 JIEJKO_02860 -SW2_RS02880 SOTONK1_RS02875 -SW2_RS02880 CTJTET1_RS02885 -SW2_RS02880 BKC03_RS02900 -SW2_RS02880 KW39_RS02885 -SW2_RS02880 C15_RS0102945 -SW2_RS02880 ECS88FINAL_RS0102940 -SW2_RS02880 IaCS19096_RS02870 -SW2_RS02880 DU10_RS02920 -SW2_RS02880 O169_RS02885 -SW2_RS02880 A5291_RS02910 -SW2_RS02880 AQ193_RS01110 -SW2_RS02880 DU13_RS02915 -SW2_RS02880 CBP48_RS04300 -SW2_RS02880 CTL2C_RS04225 -SW2_RS02880 KW36_RS02870 -SW2_RS02880 AKW53_RS04100 -SW2_RS02880 BKB95_RS02915 -SW2_RS02880 BKB96_RS02905 -SW2_RS02880 BKB99_RS02900 -SW2_RS02880 7619078 -SW2_RS03040 SW2_RS03040 -SW2_RS03040 L1440_RS03010 -SW2_RS03040 ECS102511_RS03035 -SW2_RS03040 CBP42_RS04475 -SW2_RS03040 L2BUCH2_RS03010 -SW2_RS03040 CTB_RS03070 -SW2_RS03040 SOTONIA3_RS03055 -SW2_RS03040 BKB92_RS03070 -SW2_RS03040 BW688_RS04465 -SW2_RS03040 120158 -SW2_RS03040 E150_RS03040 -SW2_RS03040 CTO_RS03070 -SW2_RS03040 L2BLST_RS03010 -SW2_RS03040 CBP44_RS04470 -SW2_RS03040 FCS84708_RS03035 -SW2_RS03040 BBV13_RS03075 -SW2_RS03040 AQ199_RS03735 -SW2_RS03040 BBV16_RS03085 -SW2_RS03040 BKB93_RS03075 -SW2_RS03040 AP288_RS00045 -SW2_RS03040 G9768_RS03040 -SW2_RS03040 L3404_RS03005 -SW2_RS03040 gnl|Prokka|PADJNBJD_00598 -SW2_RS03040 NILJEPDF_00598 -SW2_RS03040 LJHENM_03005 -SW2_RS03040 BKC02_RS03070 -SW2_RS03040 AOT15_RS03840 -SW2_RS03040 CTRC943_RS03010 -SW2_RS03040 AQ244_RS00070 -SW2_RS03040 BKC01_RS03070 -SW2_RS03040 QSDFRQ_00598 -SW2_RS03040 JIEJKO_03015 -SW2_RS03040 SOTONK1_RS03040 -SW2_RS03040 CTJTET1_RS03050 -SW2_RS03040 BKC03_RS03070 -SW2_RS03040 KW39_RS03050 -SW2_RS03040 C15_RS0103105 -SW2_RS03040 ECS88FINAL_RS0103100 -SW2_RS03040 IaCS19096_RS03035 -SW2_RS03040 DU10_RS03085 -SW2_RS03040 A5291_RS03070 -SW2_RS03040 O169_RS03045 -SW2_RS03040 CTL2C_RS04380 -SW2_RS03040 AQ193_RS00950 -SW2_RS03040 DU13_RS03080 -SW2_RS03040 CBP48_RS04470 -SW2_RS03040 L1224_RS03010 -SW2_RS03040 KW36_RS03035 -SW2_RS03040 BKB95_RS03080 -SW2_RS03040 AKW53_RS04265 -SW2_RS03040 BKB96_RS03075 -SW2_RS03040 BKB99_RS03070 -SW2_RS03040 7619087 -SW2_RS03380 SW2_RS03380 -SW2_RS03380 L1224_RS03355 -SW2_RS03380 ECS102511_RS03370 -SW2_RS03380 L1440_RS03355 -SW2_RS03380 BKB96_RS03415 -SW2_RS03380 BKB99_RS03410 -SW2_RS03380 CBP42_RS04810 -SW2_RS03380 L2BUCH2_RS03355 -SW2_RS03380 CTB_RS03410 -SW2_RS03380 SOTONIA3_RS03390 -SW2_RS03380 E150_RS03380 -SW2_RS03380 CTO_RS03405 -SW2_RS03380 BBV13_RS03410 -SW2_RS03380 BW688_RS04800 -SW2_RS03380 FCS84708_RS03370 -SW2_RS03380 L2BLST_RS03355 -SW2_RS03380 CBP44_RS04805 -SW2_RS03380 120099 -SW2_RS03380 BBV16_RS03420 -SW2_RS03380 AQ199_RS04070 -SW2_RS03380 G9768_RS03370 -SW2_RS03380 gnl|Prokka|PADJNBJD_00663 -SW2_RS03380 L3404_RS03350 -SW2_RS03380 BKC02_RS03405 -SW2_RS03380 NILJEPDF_00664 -SW2_RS03380 LJHENM_03335 -SW2_RS03380 AOT15_RS04170 -SW2_RS03380 AP288_RS01740 -SW2_RS03380 JIEJKO_03340 -SW2_RS03380 BKC01_RS03405 -SW2_RS03380 QSDFRQ_00664 -SW2_RS03380 CTRC943_RS03355 -SW2_RS03380 AQ244_RS04540 -SW2_RS03380 BKC03_RS03405 -SW2_RS03380 CTJTET1_RS03390 -SW2_RS03380 KW39_RS03390 -SW2_RS03380 DU10_RS03420 -SW2_RS03380 SOTONK1_RS03370 -SW2_RS03380 ECS88FINAL_RS0103445 -SW2_RS03380 IaCS19096_RS03365 -SW2_RS03380 C15_RS0103440 -SW2_RS03380 A5291_RS03415 -SW2_RS03380 O169_RS03385 -SW2_RS03380 DU13_RS03420 -SW2_RS03380 AKW53_RS00120 -SW2_RS03380 AQ193_RS00615 -SW2_RS03380 KW36_RS03370 -SW2_RS03380 CTL2C_RS04725 -SW2_RS03380 BKB95_RS03425 -SW2_RS03380 CBP48_RS04805 -SW2_RS03380 7619123 -SW2_RS03380 BKB93_RS03410 -SW2_RS03555 SW2_RS03555 -SW2_RS03555 CTL2C_RS00150 -SW2_RS03555 L1224_RS03530 -SW2_RS03555 ECS102511_RS03545 -SW2_RS03555 L1440_RS03530 -SW2_RS03555 BKB96_RS03590 -SW2_RS03555 BKB99_RS03585 -SW2_RS03555 CBP44_RS00150 -SW2_RS03555 L2BUCH2_RS03530 -SW2_RS03555 BKB92_RS03580 -SW2_RS03555 CTB_RS03590 -SW2_RS03555 SOTONIA3_RS03570 -SW2_RS03555 E150_RS03555 -SW2_RS03555 CTO_RS03585 -SW2_RS03555 BBV13_RS03590 -SW2_RS03555 FCS84708_RS03545 -SW2_RS03555 L2BLST_RS03530 -SW2_RS03555 BBV16_RS03600 -SW2_RS03555 BW688_RS00150 -SW2_RS03555 AQ199_RS04245 -SW2_RS03555 BKB93_RS03585 -SW2_RS03555 7618223 -SW2_RS03555 119712 -SW2_RS03555 G9768_RS03550 -SW2_RS03555 gnl|Prokka|PADJNBJD_00698 -SW2_RS03555 L3404_RS03525 -SW2_RS03555 BKC02_RS03580 -SW2_RS03555 NILJEPDF_00699 -SW2_RS03555 LJHENM_03510 -SW2_RS03555 AOT15_RS04350 -SW2_RS03555 AP288_RS01915 -SW2_RS03555 JIEJKO_03515 -SW2_RS03555 BKC01_RS03580 -SW2_RS03555 QSDFRQ_00699 -SW2_RS03555 CTRC943_RS03535 -SW2_RS03555 AQ244_RS04360 -SW2_RS03555 BKC03_RS03580 -SW2_RS03555 CBP48_RS00150 -SW2_RS03555 CTJTET1_RS03570 -SW2_RS03555 KW39_RS03565 -SW2_RS03555 DU10_RS03595 -SW2_RS03555 SOTONK1_RS03550 -SW2_RS03555 ECS88FINAL_RS0103635 -SW2_RS03555 IaCS19096_RS03545 -SW2_RS03555 C15_RS0103625 -SW2_RS03555 A5291_RS03595 -SW2_RS03555 O169_RS03560 -SW2_RS03555 DU13_RS03595 -SW2_RS03555 KW36_RS03550 -SW2_RS03555 AKW53_RS00295 -SW2_RS03555 AQ193_RS00440 -SW2_RS03555 BKB95_RS03600 -SW2_RS03555 CBP42_RS00150 -SW2_RS03730 SW2_RS03730 -SW2_RS03730 CTL2C_RS00325 -SW2_RS03730 L1224_RS03705 -SW2_RS03730 ECS102511_RS03720 -SW2_RS03730 BKB96_RS03765 -SW2_RS03730 BKB99_RS03760 -SW2_RS03730 L1440_RS03705 -SW2_RS03730 CBP44_RS00330 -SW2_RS03730 L2BUCH2_RS03705 -SW2_RS03730 BKB92_RS03760 -SW2_RS03730 CTB_RS03765 -SW2_RS03730 SOTONIA3_RS03745 -SW2_RS03730 E150_RS03730 -SW2_RS03730 CTO_RS03760 -SW2_RS03730 BBV13_RS03765 -SW2_RS03730 FCS84708_RS03720 -SW2_RS03730 BBV16_RS03775 -SW2_RS03730 L2BLST_RS03705 -SW2_RS03730 120056 -SW2_RS03730 BW688_RS00330 -SW2_RS03730 7618683 -SW2_RS03730 AQ199_RS04420 -SW2_RS03730 BKB93_RS03765 -SW2_RS03730 G9768_RS03725 -SW2_RS03730 gnl|Prokka|PADJNBJD_00733 -SW2_RS03730 L3404_RS03700 -SW2_RS03730 BKC02_RS03760 -SW2_RS03730 NILJEPDF_00734 -SW2_RS03730 LJHENM_03695 -SW2_RS03730 AOT15_RS04525 -SW2_RS03730 AP288_RS02095 -SW2_RS03730 JIEJKO_03695 -SW2_RS03730 BKC01_RS03765 -SW2_RS03730 QSDFRQ_00734 -SW2_RS03730 CTRC943_RS03710 -SW2_RS03730 AKW53_RS00465 -SW2_RS03730 BKC03_RS03760 -SW2_RS03730 CTJTET1_RS03745 -SW2_RS03730 KW39_RS03740 -SW2_RS03730 AQ244_RS04185 -SW2_RS03730 DU10_RS03775 -SW2_RS03730 CBP48_RS00330 -SW2_RS03730 A5291_RS03770 -SW2_RS03730 SOTONK1_RS03725 -SW2_RS03730 IaCS19096_RS03720 -SW2_RS03730 DU13_RS03775 -SW2_RS03730 C15_RS0103830 -SW2_RS03730 ECS88FINAL_RS0103830 -SW2_RS03730 O169_RS03735 -SW2_RS03730 KW36_RS03725 -SW2_RS03730 AQ193_RS00265 -SW2_RS03730 BKB95_RS03780 -SW2_RS03730 CBP42_RS00330 -SW2_RS03895 SW2_RS03895 -SW2_RS03895 L1440_RS03865 -SW2_RS03895 ECS102511_RS03885 -SW2_RS03895 BKB96_RS03930 -SW2_RS03895 BKB99_RS03925 -SW2_RS03895 CBP44_RS00495 -SW2_RS03895 L2BUCH2_RS03870 -SW2_RS03895 BKB92_RS03925 -SW2_RS03895 CTB_RS03930 -SW2_RS03895 SOTONIA3_RS03910 -SW2_RS03895 E150_RS03895 -SW2_RS03895 CTO_RS03925 -SW2_RS03895 BBV13_RS03930 -SW2_RS03895 FCS84708_RS03885 -SW2_RS03895 L2BLST_RS03870 -SW2_RS03895 BBV16_RS03940 -SW2_RS03895 7618700 -SW2_RS03895 120028 -SW2_RS03895 BW688_RS00495 -SW2_RS03895 AQ199_RS04585 -SW2_RS03895 BKB93_RS03930 -SW2_RS03895 G9768_RS03890 -SW2_RS03895 gnl|Prokka|PADJNBJD_00765 -SW2_RS03895 L3404_RS03865 -SW2_RS03895 NILJEPDF_00766 -SW2_RS03895 BKC02_RS03925 -SW2_RS03895 LJHENM_03855 -SW2_RS03895 AOT15_RS04690 -SW2_RS03895 AP288_RS02260 -SW2_RS03895 JIEJKO_03855 -SW2_RS03895 QSDFRQ_00766 -SW2_RS03895 BKC01_RS03930 -SW2_RS03895 CTRC943_RS03875 -SW2_RS03895 AKW53_RS00630 -SW2_RS03895 BKC03_RS03925 -SW2_RS03895 CBP48_RS00495 -SW2_RS03895 CTJTET1_RS03910 -SW2_RS03895 KW39_RS03905 -SW2_RS03895 AQ244_RS04020 -SW2_RS03895 DU10_RS03940 -SW2_RS03895 A5291_RS03935 -SW2_RS03895 SOTONK1_RS03890 -SW2_RS03895 IaCS19096_RS03885 -SW2_RS03895 DU13_RS03940 -SW2_RS03895 C15_RS0103995 -SW2_RS03895 ECS88FINAL_RS0104000 -SW2_RS03895 O169_RS03900 -SW2_RS03895 KW36_RS03890 -SW2_RS03895 AQ193_RS00100 -SW2_RS03895 BKB95_RS03945 -SW2_RS03895 CBP42_RS00495 -SW2_RS03895 CTL2C_RS00490 -SW2_RS03895 L1224_RS03870 -SW2_RS04090 SW2_RS04090 -SW2_RS04090 L1440_RS04060 -SW2_RS04090 ECS102511_RS04080 -SW2_RS04090 BKB99_RS04120 -SW2_RS04090 AQ193_RS04690 -SW2_RS04090 AQ244_RS02680 -SW2_RS04090 CBP44_RS00690 -SW2_RS04090 CTB_RS04120 -SW2_RS04090 L2BUCH2_RS04065 -SW2_RS04090 BKB92_RS04120 -SW2_RS04090 SOTONIA3_RS04105 -SW2_RS04090 CTO_RS04115 -SW2_RS04090 AP288_RS02385 -SW2_RS04090 E150_RS04090 -SW2_RS04090 BBV13_RS04125 -SW2_RS04090 119997 -SW2_RS04090 FCS84708_RS04080 -SW2_RS04090 AQ199_RS00010 -SW2_RS04090 7618720 -SW2_RS04090 L2BLST_RS04065 -SW2_RS04090 BBV16_RS04135 -SW2_RS04090 BW688_RS00690 -SW2_RS04090 gnl|Prokka|PADJNBJD_00802 -SW2_RS04090 BKB93_RS04125 -SW2_RS04090 NILJEPDF_00803 -SW2_RS04090 G9768_RS04085 -SW2_RS04090 L3404_RS04060 -SW2_RS04090 LJHENM_04040 -SW2_RS04090 JIEJKO_04040 -SW2_RS04090 BKC02_RS04120 -SW2_RS04090 QSDFRQ_00803 -SW2_RS04090 AKW53_RS00800 -SW2_RS04090 BKC01_RS04125 -SW2_RS04090 CTRC943_RS04070 -SW2_RS04090 AOT15_RS01670 -SW2_RS04090 CTJTET1_RS04260 -SW2_RS04090 KW39_RS04100 -SW2_RS04090 BKC03_RS04120 -SW2_RS04090 CBP48_RS00690 -SW2_RS04090 A5291_RS04125 -SW2_RS04090 ECS88FINAL_RS0104165 -SW2_RS04090 DU10_RS04135 -SW2_RS04090 SOTONK1_RS04085 -SW2_RS04090 IaCS19096_RS04080 -SW2_RS04090 DU13_RS04135 -SW2_RS04090 C15_RS0104190 -SW2_RS04090 O169_RS04095 -SW2_RS04090 KW36_RS04085 -SW2_RS04090 BKB95_RS04140 -SW2_RS04090 CBP42_RS00690 -SW2_RS04090 CTL2C_RS00685 -SW2_RS04090 L1224_RS04065 -SW2_RS04090 BKB96_RS04125 -SW2_RS04255 SW2_RS04255 -SW2_RS04255 ECS102511_RS04245 -SW2_RS04255 AQ193_RS04525 -SW2_RS04255 CBP44_RS00855 -SW2_RS04255 CTB_RS04280 -SW2_RS04255 L2BUCH2_RS04225 -SW2_RS04255 SOTONIA3_RS04265 -SW2_RS04255 BKB92_RS04285 -SW2_RS04255 CTO_RS04275 -SW2_RS04255 AP288_RS02550 -SW2_RS04255 BBV13_RS04290 -SW2_RS04255 E150_RS04255 -SW2_RS04255 119978 -SW2_RS04255 FCS84708_RS04245 -SW2_RS04255 AQ199_RS00175 -SW2_RS04255 BBV16_RS04295 -SW2_RS04255 7618732 -SW2_RS04255 BW688_RS00855 -SW2_RS04255 gnl|Prokka|PADJNBJD_00834 -SW2_RS04255 NILJEPDF_00835 -SW2_RS04255 G9768_RS04250 -SW2_RS04255 L3404_RS04220 -SW2_RS04255 BKB93_RS04290 -SW2_RS04255 LJHENM_04200 -SW2_RS04255 JIEJKO_04200 -SW2_RS04255 BKC02_RS04285 -SW2_RS04255 QSDFRQ_00835 -SW2_RS04255 AKW53_RS00965 -SW2_RS04255 BKC01_RS04290 -SW2_RS04255 CTRC943_RS04230 -SW2_RS04255 AOT15_RS01830 -SW2_RS04255 CTJTET1_RS04420 -SW2_RS04255 BKC03_RS04285 -SW2_RS04255 CBP48_RS00855 -SW2_RS04255 A5291_RS04285 -SW2_RS04255 KW39_RS04265 -SW2_RS04255 SOTONK1_RS04250 -SW2_RS04255 ECS88FINAL_RS0104340 -SW2_RS04255 IaCS19096_RS04240 -SW2_RS04255 DU10_RS04300 -SW2_RS04255 C15_RS0104365 -SW2_RS04255 DU13_RS04300 -SW2_RS04255 O169_RS04260 -SW2_RS04255 KW36_RS04245 -SW2_RS04255 BKB95_RS04305 -SW2_RS04255 CBP42_RS00855 -SW2_RS04255 CTL2C_RS00845 -SW2_RS04255 L1224_RS04225 -SW2_RS04255 BKB96_RS04290 -SW2_RS04255 L1440_RS04220 -SW2_RS04255 BKB99_RS04285 -SW2_RS04420 SW2_RS04420 -SW2_RS04420 ECS102511_RS04415 -SW2_RS04420 AQ193_RS04355 -SW2_RS04420 AQ244_RS02340 -SW2_RS04420 CBP44_RS01030 -SW2_RS04420 CTB_RS04440 -SW2_RS04420 L2BUCH2_RS04390 -SW2_RS04420 SOTONIA3_RS04425 -SW2_RS04420 CTO_RS04435 -SW2_RS04420 BKB92_RS04460 -SW2_RS04420 AP288_RS02720 -SW2_RS04420 BBV13_RS04450 -SW2_RS04420 E150_RS04425 -SW2_RS04420 gnl|Prokka|PADJNBJD_00864 -SW2_RS04420 L2BLST_RS04390 -SW2_RS04420 BBV16_RS04455 -SW2_RS04420 119853 -SW2_RS04420 FCS84708_RS04410 -SW2_RS04420 AQ199_RS00345 -SW2_RS04420 7618315 -SW2_RS04420 NILJEPDF_00865 -SW2_RS04420 BW688_RS01030 -SW2_RS04420 LJHENM_04355 -SW2_RS04420 JIEJKO_04350 -SW2_RS04420 QSDFRQ_00865 -SW2_RS04420 G9768_RS04410 -SW2_RS04420 L3404_RS04385 -SW2_RS04420 BKB93_RS04465 -SW2_RS04420 BKC02_RS04455 -SW2_RS04420 AKW53_RS01135 -SW2_RS04420 BKC01_RS04460 -SW2_RS04420 CTRC943_RS04395 -SW2_RS04420 AOT15_RS01990 -SW2_RS04420 CTJTET1_RS04580 -SW2_RS04420 KW39_RS04430 -SW2_RS04420 BKC03_RS04455 -SW2_RS04420 CBP48_RS01030 -SW2_RS04420 A5291_RS04445 -SW2_RS04420 SOTONK1_RS04410 -SW2_RS04420 ECS88FINAL_RS0104500 -SW2_RS04420 IaCS19096_RS04405 -SW2_RS04420 C15_RS0104520 -SW2_RS04420 DU10_RS04475 -SW2_RS04420 O169_RS04430 -SW2_RS04420 KW36_RS04410 -SW2_RS04420 DU13_RS04475 -SW2_RS04420 BKB95_RS04475 -SW2_RS04420 CBP42_RS01030 -SW2_RS04420 CTL2C_RS01010 -SW2_RS04420 L1224_RS04390 -SW2_RS04420 BKB96_RS04460 -SW2_RS04420 L1440_RS04385 -SW2_RS04420 BKB99_RS04455 -SW2_RS04585 SW2_RS04585 -SW2_RS04585 ECS102511_RS04580 -SW2_RS04585 AQ193_RS04190 -SW2_RS04585 CBP44_RS01205 -SW2_RS04585 CTB_RS04605 -SW2_RS04585 L2BUCH2_RS04555 -SW2_RS04585 AQ244_RS02175 -SW2_RS04585 SOTONIA3_RS04590 -SW2_RS04585 CTO_RS04600 -SW2_RS04585 AP288_RS02885 -SW2_RS04585 BBV13_RS04620 -SW2_RS04585 BKB92_RS04635 -SW2_RS04585 BBV16_RS04625 -SW2_RS04585 E150_RS04590 -SW2_RS04585 gnl|Prokka|PADJNBJD_00898 -SW2_RS04585 L2BLST_RS04555 -SW2_RS04585 FCS84708_RS04575 -SW2_RS04585 AQ199_RS00510 -SW2_RS04585 NILJEPDF_00899 -SW2_RS04585 BW688_RS01205 -SW2_RS04585 119943 -SW2_RS04585 JIEJKO_04520 -SW2_RS04585 7618755 -SW2_RS04585 QSDFRQ_00899 -SW2_RS04585 G9768_RS04575 -SW2_RS04585 LJHENM_04530 -SW2_RS04585 L3404_RS04550 -SW2_RS04585 BKB93_RS04640 -SW2_RS04585 BKC02_RS04630 -SW2_RS04585 AKW53_RS01300 -SW2_RS04585 BKC01_RS04635 -SW2_RS04585 CTRC943_RS04560 -SW2_RS04585 AOT15_RS02155 -SW2_RS04585 CTJTET1_RS04745 -SW2_RS04585 KW39_RS04595 -SW2_RS04585 BKC03_RS04630 -SW2_RS04585 CBP48_RS01205 -SW2_RS04585 A5291_RS04610 -SW2_RS04585 SOTONK1_RS04575 -SW2_RS04585 ECS88FINAL_RS0104685 -SW2_RS04585 IaCS19096_RS04570 -SW2_RS04585 C15_RS0104705 -SW2_RS04585 DU10_RS04650 -SW2_RS04585 O169_RS04595 -SW2_RS04585 KW36_RS04575 -SW2_RS04585 DU13_RS04650 -SW2_RS04585 CTL2C_RS01175 -SW2_RS04585 BKB95_RS04650 -SW2_RS04585 CBP42_RS01205 -SW2_RS04585 L1224_RS04555 -SW2_RS04585 BKB96_RS04635 -SW2_RS04585 L1440_RS04550 -SW2_RS04585 BKB99_RS04630 -CTL2C_RS00495 CTL2C_RS00495 -CTL2C_RS00495 L1224_RS03875 -CTL2C_RS00495 SW2_RS03900 -CTL2C_RS00495 L1440_RS03870 -CTL2C_RS00495 ECS102511_RS03890 -CTL2C_RS00495 BKB96_RS03935 -CTL2C_RS00495 BKB99_RS03930 -CTL2C_RS00495 CBP44_RS00500 -CTL2C_RS00495 L2BUCH2_RS03875 -CTL2C_RS00495 BKB92_RS03930 -CTL2C_RS00495 CTB_RS03935 -CTL2C_RS00495 SOTONIA3_RS03915 -CTL2C_RS00495 E150_RS03900 -CTL2C_RS00495 CTO_RS03930 -CTL2C_RS00495 BBV13_RS03935 -CTL2C_RS00495 FCS84708_RS03890 -CTL2C_RS00495 L2BLST_RS03875 -CTL2C_RS00495 BBV16_RS03945 -CTL2C_RS00495 7618701 -CTL2C_RS00495 120026 -CTL2C_RS00495 BW688_RS00500 -CTL2C_RS00495 AQ199_RS04590 -CTL2C_RS00495 BKB93_RS03935 -CTL2C_RS00495 G9768_RS03895 -CTL2C_RS00495 gnl|Prokka|PADJNBJD_00766 -CTL2C_RS00495 L3404_RS03870 -CTL2C_RS00495 NILJEPDF_00767 -CTL2C_RS00495 BKC02_RS03930 -CTL2C_RS00495 LJHENM_03860 -CTL2C_RS00495 AOT15_RS04695 -CTL2C_RS00495 AP288_RS02265 -CTL2C_RS00495 JIEJKO_03860 -CTL2C_RS00495 QSDFRQ_00767 -CTL2C_RS00495 BKC01_RS03935 -CTL2C_RS00495 CTRC943_RS03880 -CTL2C_RS00495 AKW53_RS00635 -CTL2C_RS00495 AQ244_RS04015 -CTL2C_RS00495 BKC03_RS03930 -CTL2C_RS00495 CBP48_RS00500 -CTL2C_RS00495 CTJTET1_RS03915 -CTL2C_RS00495 KW39_RS03910 -CTL2C_RS00495 DU10_RS03945 -CTL2C_RS00495 A5291_RS03940 -CTL2C_RS00495 SOTONK1_RS03895 -CTL2C_RS00495 IaCS19096_RS03890 -CTL2C_RS00495 DU13_RS03945 -CTL2C_RS00495 C15_RS0104000 -CTL2C_RS00495 ECS88FINAL_RS0104005 -CTL2C_RS00495 O169_RS03905 -CTL2C_RS00495 KW36_RS03895 -CTL2C_RS00495 AQ193_RS00095 -CTL2C_RS00495 BKB95_RS03950 -CTL2C_RS00495 CBP42_RS00500 -CTL2C_RS00690 CTL2C_RS00690 -CTL2C_RS00690 L1224_RS04070 -CTL2C_RS00690 AQ193_RS04685 -CTL2C_RS00690 BKB96_RS04130 -CTL2C_RS00690 SW2_RS04095 -CTL2C_RS00690 L1440_RS04065 -CTL2C_RS00690 ECS102511_RS04085 -CTL2C_RS00690 AQ244_RS02675 -CTL2C_RS00690 BKB99_RS04125 -CTL2C_RS00690 CBP44_RS00695 -CTL2C_RS00690 CTB_RS04125 -CTL2C_RS00690 L2BUCH2_RS04070 -CTL2C_RS00690 BKB92_RS04125 -CTL2C_RS00690 SOTONIA3_RS04110 -CTL2C_RS00690 CTO_RS04120 -CTL2C_RS00690 AP288_RS02390 -CTL2C_RS00690 E150_RS04095 -CTL2C_RS00690 BBV13_RS04130 -CTL2C_RS00690 119794 -CTL2C_RS00690 FCS84708_RS04085 -CTL2C_RS00690 AQ199_RS00015 -CTL2C_RS00690 7618276 -CTL2C_RS00690 L2BLST_RS04070 -CTL2C_RS00690 BBV16_RS04140 -CTL2C_RS00690 BW688_RS00695 -CTL2C_RS00690 gnl|Prokka|PADJNBJD_00803 -CTL2C_RS00690 BKB93_RS04130 -CTL2C_RS00690 NILJEPDF_00804 -CTL2C_RS00690 G9768_RS04090 -CTL2C_RS00690 L3404_RS04065 -CTL2C_RS00690 LJHENM_04045 -CTL2C_RS00690 JIEJKO_04045 -CTL2C_RS00690 BKC02_RS04125 -CTL2C_RS00690 QSDFRQ_00804 -CTL2C_RS00690 AKW53_RS00805 -CTL2C_RS00690 BKC01_RS04130 -CTL2C_RS00690 CTRC943_RS04075 -CTL2C_RS00690 AOT15_RS01675 -CTL2C_RS00690 CTJTET1_RS04265 -CTL2C_RS00690 KW39_RS04105 -CTL2C_RS00690 BKC03_RS04125 -CTL2C_RS00690 CBP48_RS00695 -CTL2C_RS00690 A5291_RS04130 -CTL2C_RS00690 ECS88FINAL_RS0104175 -CTL2C_RS00690 DU10_RS04140 -CTL2C_RS00690 SOTONK1_RS04090 -CTL2C_RS00690 IaCS19096_RS04085 -CTL2C_RS00690 DU13_RS04140 -CTL2C_RS00690 C15_RS0104200 -CTL2C_RS00690 O169_RS04100 -CTL2C_RS00690 KW36_RS04090 -CTL2C_RS00690 BKB95_RS04145 -CTL2C_RS00690 CBP42_RS00695 -CTL2C_RS00855 CTL2C_RS00855 -CTL2C_RS00855 L1224_RS04235 -CTL2C_RS00855 BKB96_RS04300 -CTL2C_RS00855 L1440_RS04230 -CTL2C_RS00855 BKB99_RS04295 -CTL2C_RS00855 SW2_RS04265 -CTL2C_RS00855 ECS102511_RS04255 -CTL2C_RS00855 AQ244_RS02500 -CTL2C_RS00855 CBP44_RS00865 -CTL2C_RS00855 CTB_RS04290 -CTL2C_RS00855 L2BUCH2_RS04235 -CTL2C_RS00855 SOTONIA3_RS04275 -CTL2C_RS00855 BKB92_RS04295 -CTL2C_RS00855 CTO_RS04285 -CTL2C_RS00855 AP288_RS02560 -CTL2C_RS00855 BBV13_RS04300 -CTL2C_RS00855 E150_RS04265 -CTL2C_RS00855 L2BLST_RS04235 -CTL2C_RS00855 119977 -CTL2C_RS00855 FCS84708_RS04255 -CTL2C_RS00855 AQ199_RS00185 -CTL2C_RS00855 BBV16_RS04305 -CTL2C_RS00855 7618733 -CTL2C_RS00855 BW688_RS00865 -CTL2C_RS00855 gnl|Prokka|PADJNBJD_00836 -CTL2C_RS00855 NILJEPDF_00837 -CTL2C_RS00855 G9768_RS04260 -CTL2C_RS00855 L3404_RS04230 -CTL2C_RS00855 BKB93_RS04300 -CTL2C_RS00855 LJHENM_04210 -CTL2C_RS00855 JIEJKO_04210 -CTL2C_RS00855 BKC02_RS04295 -CTL2C_RS00855 QSDFRQ_00837 -CTL2C_RS00855 AKW53_RS00975 -CTL2C_RS00855 BKC01_RS04300 -CTL2C_RS00855 CTRC943_RS04240 -CTL2C_RS00855 AOT15_RS01840 -CTL2C_RS00855 CTJTET1_RS04430 -CTL2C_RS00855 BKC03_RS04295 -CTL2C_RS00855 CBP48_RS00865 -CTL2C_RS00855 A5291_RS04295 -CTL2C_RS00855 KW39_RS04275 -CTL2C_RS00855 SOTONK1_RS04260 -CTL2C_RS00855 ECS88FINAL_RS0104355 -CTL2C_RS00855 IaCS19096_RS04250 -CTL2C_RS00855 DU10_RS04310 -CTL2C_RS00855 C15_RS0104375 -CTL2C_RS00855 DU13_RS04310 -CTL2C_RS00855 O169_RS04270 -CTL2C_RS00855 KW36_RS04255 -CTL2C_RS00855 AQ193_RS04515 -CTL2C_RS00855 BKB95_RS04315 -CTL2C_RS00855 CBP42_RS00865 -CTL2C_RS01020 CTL2C_RS01020 -CTL2C_RS01020 L1224_RS04400 -CTL2C_RS01020 BKB96_RS04470 -CTL2C_RS01020 L1440_RS04395 -CTL2C_RS01020 AQ244_RS02330 -CTL2C_RS01020 BKB99_RS04465 -CTL2C_RS01020 SW2_RS04430 -CTL2C_RS01020 ECS102511_RS04425 -CTL2C_RS01020 CBP44_RS01040 -CTL2C_RS01020 CTB_RS04450 -CTL2C_RS01020 L2BUCH2_RS04400 -CTL2C_RS01020 SOTONIA3_RS04435 -CTL2C_RS01020 CTO_RS04445 -CTL2C_RS01020 BKB92_RS04470 -CTL2C_RS01020 AP288_RS02730 -CTL2C_RS01020 BBV13_RS04460 -CTL2C_RS01020 E150_RS04435 -CTL2C_RS01020 gnl|Prokka|PADJNBJD_00866 -CTL2C_RS01020 L2BLST_RS04400 -CTL2C_RS01020 BBV16_RS04465 -CTL2C_RS01020 FCS84708_RS04420 -CTL2C_RS01020 AQ199_RS00355 -CTL2C_RS01020 119856 -CTL2C_RS01020 NILJEPDF_00867 -CTL2C_RS01020 BW688_RS01040 -CTL2C_RS01020 7618317 -CTL2C_RS01020 LJHENM_04365 -CTL2C_RS01020 JIEJKO_04360 -CTL2C_RS01020 QSDFRQ_00867 -CTL2C_RS01020 G9768_RS04420 -CTL2C_RS01020 L3404_RS04395 -CTL2C_RS01020 BKB93_RS04475 -CTL2C_RS01020 BKC02_RS04465 -CTL2C_RS01020 AKW53_RS01145 -CTL2C_RS01020 BKC01_RS04470 -CTL2C_RS01020 CTRC943_RS04405 -CTL2C_RS01020 AOT15_RS02000 -CTL2C_RS01020 CTJTET1_RS04590 -CTL2C_RS01020 KW39_RS04440 -CTL2C_RS01020 BKC03_RS04465 -CTL2C_RS01020 CBP48_RS01040 -CTL2C_RS01020 A5291_RS04455 -CTL2C_RS01020 SOTONK1_RS04420 -CTL2C_RS01020 ECS88FINAL_RS0104515 -CTL2C_RS01020 IaCS19096_RS04415 -CTL2C_RS01020 C15_RS0104535 -CTL2C_RS01020 DU10_RS04485 -CTL2C_RS01020 O169_RS04440 -CTL2C_RS01020 KW36_RS04420 -CTL2C_RS01020 DU13_RS04485 -CTL2C_RS01020 AQ193_RS04345 -CTL2C_RS01020 BKB95_RS04485 -CTL2C_RS01020 CBP42_RS01040 -CTL2C_RS01190 CTL2C_RS01190 -CTL2C_RS01190 BKB95_RS04665 -CTL2C_RS01190 CBP42_RS01220 -CTL2C_RS01190 L1224_RS04570 -CTL2C_RS01190 AQ244_RS02160 -CTL2C_RS01190 BKB96_RS04650 -CTL2C_RS01190 L1440_RS04565 -CTL2C_RS01190 BKB99_RS04645 -CTL2C_RS01190 SW2_RS04600 -CTL2C_RS01190 ECS102511_RS04595 -CTL2C_RS01190 CBP44_RS01220 -CTL2C_RS01190 L2BUCH2_RS04570 -CTL2C_RS01190 SOTONIA3_RS04605 -CTL2C_RS01190 AP288_RS02900 -CTL2C_RS01190 BKB92_RS04650 -CTL2C_RS01190 E150_RS04605 -CTL2C_RS01190 gnl|Prokka|PADJNBJD_00901 -CTL2C_RS01190 L2BLST_RS04570 -CTL2C_RS01190 FCS84708_RS04590 -CTL2C_RS01190 AQ199_RS00525 -CTL2C_RS01190 NILJEPDF_00902 -CTL2C_RS01190 BW688_RS01220 -CTL2C_RS01190 119891 -CTL2C_RS01190 JIEJKO_04535 -CTL2C_RS01190 QSDFRQ_00902 -CTL2C_RS01190 G9768_RS04590 -CTL2C_RS01190 LJHENM_04545 -CTL2C_RS01190 L3404_RS04565 -CTL2C_RS01190 BKB93_RS04655 -CTL2C_RS01190 BKC02_RS04645 -CTL2C_RS01190 AKW53_RS01315 -CTL2C_RS01190 BKC01_RS04650 -CTL2C_RS01190 CTRC943_RS04575 -CTL2C_RS01190 AOT15_RS02170 -CTL2C_RS01190 CTJTET1_RS04760 -CTL2C_RS01190 KW39_RS04610 -CTL2C_RS01190 BKC03_RS04645 -CTL2C_RS01190 CBP48_RS01220 -CTL2C_RS01190 SOTONK1_RS04590 -CTL2C_RS01190 ECS88FINAL_RS0104700 -CTL2C_RS01190 IaCS19096_RS04585 -CTL2C_RS01190 C15_RS0104720 -CTL2C_RS01190 DU10_RS04665 -CTL2C_RS01190 O169_RS04610 -CTL2C_RS01190 KW36_RS04590 -CTL2C_RS01190 DU13_RS04665 -CTL2C_RS01190 AQ193_RS04175 -CTL2C_RS01190 BBV16_RS04640 F -CTL2C_RS01190 BBV13_RS04635 F -CTL2C_RS01190 CTB_RS04620 F -CTL2C_RS01190 CTO_RS04615 F -CTL2C_RS01190 7618340 F -CTL2C_RS01190 A5291_RS04625 F -CTL2C_RS01370 CTL2C_RS01370 -CTL2C_RS01370 CBP42_RS01395 -CTL2C_RS01370 L1224_RS00005 -CTL2C_RS01370 L1440_RS00005 -CTL2C_RS01370 CBP44_RS01395 -CTL2C_RS01370 L2BUCH2_RS00005 -CTL2C_RS01370 BW688_RS01395 -CTL2C_RS01370 L2BLST_RS00005 -CTL2C_RS01370 7618352 -CTL2C_RS01370 L3404_RS00005 -CTL2C_RS01370 CTRC943_RS00005 -CTL2C_RS01370 CBP48_RS01395 -CTL2C_RS01370 SOTONIA3_RS00005 -CTL2C_RS01370 CTB_RS00005 -CTL2C_RS01370 BKB96_RS00005 -CTL2C_RS01370 BKB99_RS00005 -CTL2C_RS01370 CTO_RS00005 -CTL2C_RS01370 BKB92_RS00005 -CTL2C_RS01370 E150_RS00005 -CTL2C_RS01370 BKB93_RS00005 -CTL2C_RS01370 FCS84708_RS00005 -CTL2C_RS01370 AP288_RS03075 -CTL2C_RS01370 BBV13_RS00005 -CTL2C_RS01370 G9768_RS00005 -CTL2C_RS01370 AOT15_RS00950 -CTL2C_RS01370 AQ199_RS00700 -CTL2C_RS01370 BKC02_RS00005 -CTL2C_RS01370 BKC01_RS00005 -CTL2C_RS01370 A5291_RS00005 -CTL2C_RS01370 SOTONK1_RS00005 -CTL2C_RS01370 BBV16_RS00005 -CTL2C_RS01370 NILJEPDF_00001 -CTL2C_RS01370 IaCS19096_RS00005 -CTL2C_RS01370 BKC03_RS00005 -CTL2C_RS01370 C15_RS0100005 -CTL2C_RS01370 QSDFRQ_00001 -CTL2C_RS01370 CTJTET1_RS00005 -CTL2C_RS01370 AKW53_RS01490 -CTL2C_RS01370 O169_RS00005 -CTL2C_RS01370 ECS88FINAL_RS0100005 -CTL2C_RS01370 KW39_RS00005 -CTL2C_RS01370 BKB95_RS00005 -CTL2C_RS01370 KW36_RS00005 -CTL2C_RS01370 AQ193_RS04000 -CTL2C_RS01370 SW2_RS00005 -CTL2C_RS01370 ECS102511_RS00005 -CTL2C_RS01370 AQ244_RS01985 -CTL2C_RS01370 JIEJKO_04705 F -CTL2C_RS01370 gnl|Prokka|PADJNBJD_00001 F -CTL2C_RS01705 CTL2C_RS01705 -CTL2C_RS01705 CTB_RS00340 -CTL2C_RS01705 CBP42_RS01735 -CTL2C_RS01705 BKB96_RS00345 -CTL2C_RS01705 L1224_RS00340 -CTL2C_RS01705 BKB99_RS00345 -CTL2C_RS01705 CTO_RS00340 -CTL2C_RS01705 L1440_RS00340 -CTL2C_RS01705 BKB92_RS00345 -CTL2C_RS01705 SOTONIA3_RS00340 -CTL2C_RS01705 CBP44_RS01740 -CTL2C_RS01705 120620 -CTL2C_RS01705 E150_RS00340 -CTL2C_RS01705 L2BUCH2_RS00340 -CTL2C_RS01705 BKB93_RS00345 -CTL2C_RS01705 FCS84708_RS00340 -CTL2C_RS01705 AP288_RS03410 -CTL2C_RS01705 BBV13_RS00345 -CTL2C_RS01705 AOT15_RS00615 -CTL2C_RS01705 AQ199_RS01035 -CTL2C_RS01705 BW688_RS01735 -CTL2C_RS01705 G9768_RS00340 -CTL2C_RS01705 L2BLST_RS00340 -CTL2C_RS01705 BKC02_RS00345 -CTL2C_RS01705 BBV16_RS00345 -CTL2C_RS01705 gnl|Prokka|PADJNBJD_00067 -CTL2C_RS01705 NILJEPDF_00067 -CTL2C_RS01705 LJHENM_00340 -CTL2C_RS01705 A5291_RS00340 -CTL2C_RS01705 BKC01_RS00345 -CTL2C_RS01705 SOTONK1_RS00340 -CTL2C_RS01705 L3404_RS00340 -CTL2C_RS01705 JIEJKO_00340 -CTL2C_RS01705 AKW53_RS01830 -CTL2C_RS01705 QSDFRQ_00067 -CTL2C_RS01705 IaCS19096_RS00340 -CTL2C_RS01705 BKC03_RS00345 -CTL2C_RS01705 C15_RS0100345 -CTL2C_RS01705 DU10_RS00345 -CTL2C_RS01705 7618807 -CTL2C_RS01705 CTRC943_RS00340 -CTL2C_RS01705 CTJTET1_RS00340 -CTL2C_RS01705 O169_RS00340 -CTL2C_RS01705 KW36_RS00340 -CTL2C_RS01705 DU13_RS00350 -CTL2C_RS01705 CBP48_RS01735 -CTL2C_RS01705 ECS88FINAL_RS0100355 -CTL2C_RS01705 KW39_RS00340 -CTL2C_RS01705 BKB95_RS00345 -CTL2C_RS01705 SW2_RS00340 -CTL2C_RS01705 AQ193_RS03655 -CTL2C_RS01705 AQ244_RS01650 -CTL2C_RS01705 ECS102511_RS00340 -CTL2C_RS01865 CTL2C_RS01865 -CTL2C_RS01865 CBP42_RS01900 -CTL2C_RS01865 L1224_RS00500 -CTL2C_RS01865 L1440_RS00500 -CTL2C_RS01865 CBP44_RS01905 -CTL2C_RS01865 L2BUCH2_RS00500 -CTL2C_RS01865 FCS84708_RS00500 -CTL2C_RS01865 L2BLST_RS00500 -CTL2C_RS01865 BW688_RS01900 -CTL2C_RS01865 L3404_RS00500 -CTL2C_RS01865 DU10_RS00510 -CTL2C_RS01865 7618827 -CTL2C_RS01865 CTRC943_RS00500 -CTL2C_RS01865 ECS88FINAL_RS0100515 -CTL2C_RS01865 KW39_RS00500 -CTL2C_RS01865 CBP48_RS01900 -CTL2C_RS01865 ECS102511_RS00500 -CTL2C_RS01865 CTB_RS00500 -CTL2C_RS01865 BKB96_RS00510 -CTL2C_RS01865 BKB99_RS00510 -CTL2C_RS01865 BKB92_RS00510 -CTL2C_RS01865 CTO_RS00500 -CTL2C_RS01865 SOTONIA3_RS00500 -CTL2C_RS01865 E150_RS00500 -CTL2C_RS01865 120589 -CTL2C_RS01865 BKB93_RS00510 -CTL2C_RS01865 AP288_RS03570 -CTL2C_RS01865 AQ199_RS01195 -CTL2C_RS01865 AOT15_RS00455 -CTL2C_RS01865 G9768_RS00500 -CTL2C_RS01865 BKC02_RS00510 -CTL2C_RS01865 gnl|Prokka|PADJNBJD_00098 -CTL2C_RS01865 LJHENM_00490 -CTL2C_RS01865 NILJEPDF_00098 -CTL2C_RS01865 BKC01_RS00510 -CTL2C_RS01865 A5291_RS00500 -CTL2C_RS01865 JIEJKO_00495 -CTL2C_RS01865 SOTONK1_RS00500 -CTL2C_RS01865 AKW53_RS01990 -CTL2C_RS01865 QSDFRQ_00098 -CTL2C_RS01865 BKC03_RS00510 -CTL2C_RS01865 C15_RS0100510 -CTL2C_RS01865 CTJTET1_RS00500 -CTL2C_RS01865 O169_RS00500 -CTL2C_RS01865 DU13_RS00515 -CTL2C_RS01865 KW36_RS00500 -CTL2C_RS01865 SW2_RS00500 -CTL2C_RS01865 BKB95_RS00510 -CTL2C_RS01865 AQ244_RS01490 -CTL2C_RS01865 AQ193_RS03495 -CTL2C_RS01865 BBV16_RS00505 -CTL2C_RS01865 BBV13_RS00505 -CTL2C_RS01865 IaCS19096_RS00500 -CTL2C_RS02035 CTL2C_RS02035 -CTL2C_RS02035 CTB_RS00675 -CTL2C_RS02035 L1224_RS00670 -CTL2C_RS02035 AQ244_RS02845 -CTL2C_RS02035 BKB96_RS00680 -CTL2C_RS02035 CBP42_RS02070 -CTL2C_RS02035 BKB99_RS00680 -CTL2C_RS02035 L1440_RS00670 -CTL2C_RS02035 BKB92_RS00680 -CTL2C_RS02035 CTO_RS00675 -CTL2C_RS02035 SOTONIA3_RS00670 -CTL2C_RS02035 E150_RS00670 -CTL2C_RS02035 L2BUCH2_RS00670 -CTL2C_RS02035 CBP44_RS02075 -CTL2C_RS02035 FCS84708_RS00670 -CTL2C_RS02035 AP288_RS03740 -CTL2C_RS02035 BKB93_RS00680 -CTL2C_RS02035 119309 -CTL2C_RS02035 AOT15_RS00285 -CTL2C_RS02035 AQ199_RS01365 -CTL2C_RS02035 BBV13_RS00680 -CTL2C_RS02035 G9768_RS00670 -CTL2C_RS02035 L2BLST_RS00670 -CTL2C_RS02035 BW688_RS02070 -CTL2C_RS02035 BBV16_RS00680 -CTL2C_RS02035 BKC02_RS00680 -CTL2C_RS02035 gnl|Prokka|PADJNBJD_00132 -CTL2C_RS02035 LJHENM_00660 -CTL2C_RS02035 AKW53_RS02165 -CTL2C_RS02035 BKC01_RS00680 -CTL2C_RS02035 NILJEPDF_00132 -CTL2C_RS02035 A5291_RS00675 -CTL2C_RS02035 L3404_RS00670 -CTL2C_RS02035 SOTONK1_RS00670 -CTL2C_RS02035 JIEJKO_00665 -CTL2C_RS02035 QSDFRQ_00132 -CTL2C_RS02035 IaCS19096_RS00670 -CTL2C_RS02035 BKC03_RS00680 -CTL2C_RS02035 C15_RS0100695 -CTL2C_RS02035 CTRC943_RS00670 -CTL2C_RS02035 CTJTET1_RS00670 -CTL2C_RS02035 KW39_RS00670 -CTL2C_RS02035 DU10_RS00680 -CTL2C_RS02035 ECS88FINAL_RS0100695 -CTL2C_RS02035 O169_RS00670 -CTL2C_RS02035 DU13_RS00685 -CTL2C_RS02035 7618422 -CTL2C_RS02035 KW36_RS00670 -CTL2C_RS02035 CBP48_RS02070 -CTL2C_RS02035 SW2_RS00670 -CTL2C_RS02035 BKB95_RS00680 -CTL2C_RS02035 ECS102511_RS00670 -CTL2C_RS02035 AQ193_RS03325 -CTL2C_RS02215 CTL2C_RS02215 -CTL2C_RS02215 CTB_RS00850 -CTL2C_RS02215 L1224_RS00850 -CTL2C_RS02215 AQ244_RS03020 -CTL2C_RS02215 CTO_RS00850 -CTL2C_RS02215 L1440_RS00850 -CTL2C_RS02215 BKB92_RS00855 -CTL2C_RS02215 SOTONIA3_RS00850 -CTL2C_RS02215 CBP42_RS02255 -CTL2C_RS02215 E150_RS00845 -CTL2C_RS02215 L2BUCH2_RS00855 -CTL2C_RS02215 FCS84708_RS00845 -CTL2C_RS02215 AP288_RS03915 -CTL2C_RS02215 BKB93_RS00855 -CTL2C_RS02215 AOT15_RS00110 -CTL2C_RS02215 BBV13_RS00855 -CTL2C_RS02215 CBP44_RS02260 -CTL2C_RS02215 AQ199_RS01540 -CTL2C_RS02215 BW688_RS02255 -CTL2C_RS02215 G9768_RS00850 -CTL2C_RS02215 L2BLST_RS00855 -CTL2C_RS02215 119340 -CTL2C_RS02215 BBV16_RS00855 -CTL2C_RS02215 BKC02_RS00855 -CTL2C_RS02215 AKW53_RS02340 -CTL2C_RS02215 BKC01_RS00855 -CTL2C_RS02215 A5291_RS00850 -CTL2C_RS02215 L3404_RS00850 -CTL2C_RS02215 SOTONK1_RS00845 -CTL2C_RS02215 BKC03_RS00855 -CTL2C_RS02215 CTJTET1_RS00850 -CTL2C_RS02215 KW39_RS00845 -CTL2C_RS02215 DU10_RS00860 -CTL2C_RS02215 C15_RS01000000104910 -CTL2C_RS02215 CTRC943_RS00850 -CTL2C_RS02215 ECS88FINAL_RS01000000104900 -CTL2C_RS02215 IaCS19096_RS00845 -CTL2C_RS02215 O169_RS00845 -CTL2C_RS02215 DU13_RS00860 -CTL2C_RS02215 7618442 -CTL2C_RS02215 KW36_RS00845 -CTL2C_RS02215 BKB95_RS00860 -CTL2C_RS02215 SW2_RS00845 -CTL2C_RS02215 ECS102511_RS00845 -CTL2C_RS02215 BKB96_RS00855 -CTL2C_RS02215 CBP48_RS02255 -CTL2C_RS02215 AQ193_RS03150 -CTL2C_RS02215 BKB99_RS00855 -CTL2C_RS02390 CTL2C_RS02390 -CTL2C_RS02390 BKB99_RS01040 -CTL2C_RS02390 L1224_RS01020 -CTL2C_RS02390 L1440_RS01020 -CTL2C_RS02390 AQ244_RS03220 -CTL2C_RS02390 BKB92_RS01040 -CTL2C_RS02390 CBP42_RS02430 -CTL2C_RS02390 SOTONIA3_RS01055 -CTL2C_RS02390 E150_RS01035 -CTL2C_RS02390 CTB_RS01065 -CTL2C_RS02390 L2BUCH2_RS01025 -CTL2C_RS02390 CTO_RS01065 -CTL2C_RS02390 FCS84708_RS01035 -CTL2C_RS02390 AP288_RS04105 -CTL2C_RS02390 BKB93_RS01040 -CTL2C_RS02390 CBP44_RS02435 -CTL2C_RS02390 AQ199_RS01730 -CTL2C_RS02390 L2BLST_RS01025 -CTL2C_RS02390 BW688_RS02435 -CTL2C_RS02390 BBV13_RS01070 -CTL2C_RS02390 G9768_RS01045 -CTL2C_RS02390 BKC02_RS01040 -CTL2C_RS02390 AOT15_RS01325 -CTL2C_RS02390 L3404_RS01020 -CTL2C_RS02390 AKW53_RS02530 -CTL2C_RS02390 BBV16_RS01070 -CTL2C_RS02390 BKC01_RS01040 -CTL2C_RS02390 119368 -CTL2C_RS02390 DU10_RS01050 -CTL2C_RS02390 gnl|Prokka|PADJNBJD_00204 -CTL2C_RS02390 BKC03_RS01040 -CTL2C_RS02390 NILJEPDF_00204 -CTL2C_RS02390 LJHENM_01025 -CTL2C_RS02390 CTRC943_RS01025 -CTL2C_RS02390 CTJTET1_RS01055 -CTL2C_RS02390 C15_RS0101075 -CTL2C_RS02390 SOTONK1_RS01040 -CTL2C_RS02390 ECS88FINAL_RS0101060 -CTL2C_RS02390 KW39_RS01045 -CTL2C_RS02390 JIEJKO_01025 -CTL2C_RS02390 A5291_RS01065 -CTL2C_RS02390 IaCS19096_RS01040 -CTL2C_RS02390 7618457 -CTL2C_RS02390 QSDFRQ_00204 -CTL2C_RS02390 O169_RS01045 -CTL2C_RS02390 DU13_RS01050 -CTL2C_RS02390 SW2_RS01035 -CTL2C_RS02390 BKB95_RS01055 -CTL2C_RS02390 CBP48_RS02430 -CTL2C_RS02390 KW36_RS01040 -CTL2C_RS02390 ECS102511_RS01035 -CTL2C_RS02390 AQ193_RS02955 -CTL2C_RS02390 BKB96_RS01040 -CTL2C_RS02570 CTL2C_RS02570 -CTL2C_RS02570 BKB99_RS01220 -CTL2C_RS02570 L1224_RS01200 -CTL2C_RS02570 L1440_RS01200 -CTL2C_RS02570 AQ244_RS03400 -CTL2C_RS02570 BKB92_RS01220 -CTL2C_RS02570 CBP42_RS02610 -CTL2C_RS02570 SOTONIA3_RS01235 -CTL2C_RS02570 CTB_RS01245 -CTL2C_RS02570 E150_RS01215 -CTL2C_RS02570 L2BUCH2_RS01205 -CTL2C_RS02570 CTO_RS01245 -CTL2C_RS02570 FCS84708_RS01215 -CTL2C_RS02570 AP288_RS04285 -CTL2C_RS02570 BKB93_RS01220 -CTL2C_RS02570 CBP44_RS02615 -CTL2C_RS02570 AQ199_RS01910 -CTL2C_RS02570 L2BLST_RS01205 -CTL2C_RS02570 BW688_RS02615 -CTL2C_RS02570 BBV13_RS01250 -CTL2C_RS02570 G9768_RS01225 -CTL2C_RS02570 BKC02_RS01220 -CTL2C_RS02570 AOT15_RS01145 -CTL2C_RS02570 L3404_RS01200 -CTL2C_RS02570 AKW53_RS02710 -CTL2C_RS02570 BBV16_RS01250 -CTL2C_RS02570 BKC01_RS01220 -CTL2C_RS02570 119392 -CTL2C_RS02570 gnl|Prokka|PADJNBJD_00239 -CTL2C_RS02570 DU10_RS01230 -CTL2C_RS02570 NILJEPDF_00239 -CTL2C_RS02570 LJHENM_01200 -CTL2C_RS02570 BKC03_RS01220 -CTL2C_RS02570 CTRC943_RS01205 -CTL2C_RS02570 CTJTET1_RS01235 -CTL2C_RS02570 KW39_RS01225 -CTL2C_RS02570 JIEJKO_01200 -CTL2C_RS02570 C15_RS0101255 -CTL2C_RS02570 SOTONK1_RS01220 -CTL2C_RS02570 ECS88FINAL_RS0101240 -CTL2C_RS02570 QSDFRQ_00239 -CTL2C_RS02570 A5291_RS01245 -CTL2C_RS02570 IaCS19096_RS01220 -CTL2C_RS02570 O169_RS01225 -CTL2C_RS02570 DU13_RS01230 -CTL2C_RS02570 7618473 -CTL2C_RS02570 SW2_RS01215 -CTL2C_RS02570 BKB95_RS01235 -CTL2C_RS02570 CBP48_RS02610 -CTL2C_RS02570 KW36_RS01220 -CTL2C_RS02570 ECS102511_RS01215 -CTL2C_RS02570 AQ193_RS02775 -CTL2C_RS02570 BKB96_RS01220 -CTL2C_RS02730 CTL2C_RS02730 -CTL2C_RS02730 BKB99_RS01385 -CTL2C_RS02730 L1224_RS01360 -CTL2C_RS02730 L1440_RS01360 -CTL2C_RS02730 AQ244_RS03565 -CTL2C_RS02730 CBP42_RS02775 -CTL2C_RS02730 SOTONIA3_RS01395 -CTL2C_RS02730 BKB92_RS01390 -CTL2C_RS02730 CTB_RS01410 -CTL2C_RS02730 E150_RS01380 -CTL2C_RS02730 L2BUCH2_RS01365 -CTL2C_RS02730 CTO_RS01405 -CTL2C_RS02730 FCS84708_RS01375 -CTL2C_RS02730 AP288_RS04445 -CTL2C_RS02730 BKB93_RS01390 -CTL2C_RS02730 CBP44_RS02780 -CTL2C_RS02730 AQ199_RS02070 -CTL2C_RS02730 L2BLST_RS01365 -CTL2C_RS02730 BBV13_RS01415 -CTL2C_RS02730 BW688_RS02780 -CTL2C_RS02730 G9768_RS01385 -CTL2C_RS02730 BKC02_RS01385 -CTL2C_RS02730 BBV16_RS01415 -CTL2C_RS02730 L3404_RS01360 -CTL2C_RS02730 AKW53_RS02870 -CTL2C_RS02730 BKC01_RS01390 -CTL2C_RS02730 gnl|Prokka|PADJNBJD_00271 -CTL2C_RS02730 DU10_RS01395 -CTL2C_RS02730 NILJEPDF_00271 -CTL2C_RS02730 LJHENM_01365 -CTL2C_RS02730 BKC03_RS01385 -CTL2C_RS02730 CTRC943_RS01365 -CTL2C_RS02730 CTJTET1_RS01395 -CTL2C_RS02730 KW39_RS01385 -CTL2C_RS02730 JIEJKO_01365 -CTL2C_RS02730 119423 -CTL2C_RS02730 C15_RS0101420 -CTL2C_RS02730 SOTONK1_RS01385 -CTL2C_RS02730 ECS88FINAL_RS0101405 -CTL2C_RS02730 QSDFRQ_00271 -CTL2C_RS02730 IaCS19096_RS01380 -CTL2C_RS02730 A5291_RS01410 -CTL2C_RS02730 O169_RS01390 -CTL2C_RS02730 DU13_RS01395 -CTL2C_RS02730 7618493 -CTL2C_RS02730 SW2_RS01375 -CTL2C_RS02730 AQ193_RS02610 -CTL2C_RS02730 BKB95_RS01400 -CTL2C_RS02730 CBP48_RS02775 -CTL2C_RS02730 KW36_RS01380 -CTL2C_RS02730 ECS102511_RS01375 -CTL2C_RS02730 AOT15_RS02380 -CTL2C_RS02730 BKB96_RS01385 -CTL2C_RS02890 CTL2C_RS02890 -CTL2C_RS02890 BKB99_RS01545 -CTL2C_RS02890 L1224_RS01520 -CTL2C_RS02890 L1440_RS01520 -CTL2C_RS02890 AQ244_RS03725 -CTL2C_RS02890 CBP42_RS02935 -CTL2C_RS02890 SOTONIA3_RS01555 -CTL2C_RS02890 BKB92_RS01550 -CTL2C_RS02890 CTB_RS01570 -CTL2C_RS02890 E150_RS01540 -CTL2C_RS02890 L2BUCH2_RS01525 -CTL2C_RS02890 CTO_RS01565 -CTL2C_RS02890 FCS84708_RS01535 -CTL2C_RS02890 AP288_RS04605 -CTL2C_RS02890 BKB93_RS01550 -CTL2C_RS02890 CBP44_RS02940 -CTL2C_RS02890 AQ199_RS02230 -CTL2C_RS02890 L2BLST_RS01525 -CTL2C_RS02890 BBV13_RS01575 -CTL2C_RS02890 BW688_RS02945 -CTL2C_RS02890 G9768_RS01545 -CTL2C_RS02890 BKC02_RS01545 -CTL2C_RS02890 AKW53_RS03035 -CTL2C_RS02890 BBV16_RS01575 -CTL2C_RS02890 L3404_RS01520 -CTL2C_RS02890 BKC01_RS01550 -CTL2C_RS02890 gnl|Prokka|PADJNBJD_00303 -CTL2C_RS02890 NILJEPDF_00303 -CTL2C_RS02890 LJHENM_01525 -CTL2C_RS02890 BKC03_RS01545 -CTL2C_RS02890 DU10_RS01560 -CTL2C_RS02890 CTRC943_RS01525 -CTL2C_RS02890 CTJTET1_RS01555 -CTL2C_RS02890 KW39_RS01545 -CTL2C_RS02890 JIEJKO_01525 -CTL2C_RS02890 C15_RS0101590 -CTL2C_RS02890 SOTONK1_RS01545 -CTL2C_RS02890 ECS88FINAL_RS0101570 -CTL2C_RS02890 120429 -CTL2C_RS02890 QSDFRQ_00303 -CTL2C_RS02890 IaCS19096_RS01540 -CTL2C_RS02890 A5291_RS01570 -CTL2C_RS02890 O169_RS01550 -CTL2C_RS02890 DU13_RS01555 -CTL2C_RS02890 SW2_RS01535 -CTL2C_RS02890 AQ193_RS02450 -CTL2C_RS02890 BKB95_RS01560 -CTL2C_RS02890 CBP48_RS02935 -CTL2C_RS02890 7618924 -CTL2C_RS02890 KW36_RS01540 -CTL2C_RS02890 ECS102511_RS01535 -CTL2C_RS02890 AOT15_RS02540 -CTL2C_RS02890 BKB96_RS01545 -CTL2C_RS03230 CTL2C_RS03230 -CTL2C_RS03230 BKB95_RS01905 -CTL2C_RS03230 CBP48_RS03290 -CTL2C_RS03230 L1224_RS01860 -CTL2C_RS03230 KW36_RS01880 -CTL2C_RS03230 AOT15_RS02880 -CTL2C_RS03230 BKB96_RS01890 -CTL2C_RS03230 SW2_RS01885 -CTL2C_RS03230 BKB99_RS01890 -CTL2C_RS03230 L1440_RS01860 -CTL2C_RS03230 ECS102511_RS01885 -CTL2C_RS03230 CBP42_RS03300 -CTL2C_RS03230 CTB_RS01910 -CTL2C_RS03230 SOTONIA3_RS01895 -CTL2C_RS03230 L2BUCH2_RS01860 -CTL2C_RS03230 BKB92_RS01900 -CTL2C_RS03230 CTO_RS01910 -CTL2C_RS03230 E150_RS01890 -CTL2C_RS03230 AP288_RS01195 -CTL2C_RS03230 L2BLST_RS01860 -CTL2C_RS03230 FCS84708_RS01880 -CTL2C_RS03230 BW688_RS03290 -CTL2C_RS03230 BKB93_RS01900 -CTL2C_RS03230 CBP44_RS03295 -CTL2C_RS03230 BBV13_RS01915 -CTL2C_RS03230 AQ199_RS02580 -CTL2C_RS03230 AQ244_RS01225 -CTL2C_RS03230 G9768_RS01885 -CTL2C_RS03230 L3404_RS01860 -CTL2C_RS03230 BBV16_RS01915 -CTL2C_RS03230 BKC02_RS01890 -CTL2C_RS03230 BKC01_RS01890 -CTL2C_RS03230 AKW53_RS03385 -CTL2C_RS03230 gnl|Prokka|PADJNBJD_00371 -CTL2C_RS03230 NILJEPDF_00371 -CTL2C_RS03230 CTRC943_RS01865 -CTL2C_RS03230 LJHENM_01870 -CTL2C_RS03230 JIEJKO_01865 -CTL2C_RS03230 BKC03_RS01890 -CTL2C_RS03230 CTJTET1_RS01895 -CTL2C_RS03230 AQ193_RS02100 -CTL2C_RS03230 DU10_RS01910 -CTL2C_RS03230 QSDFRQ_00371 -CTL2C_RS03230 C15_RS0101930 -CTL2C_RS03230 SOTONK1_RS01885 -CTL2C_RS03230 A5291_RS01910 -CTL2C_RS03230 KW39_RS01895 -CTL2C_RS03230 IaCS19096_RS01880 -CTL2C_RS03230 ECS88FINAL_RS0101920 -CTL2C_RS03230 DU13_RS01905 -CTL2C_RS03230 O169_RS01895 -CTL2C_RS03230 120355 -CTL2C_RS03230 7618964 -CTL2C_RS03395 CTL2C_RS03395 -CTL2C_RS03395 CBP48_RS03460 -CTL2C_RS03395 120325 -CTL2C_RS03395 L1224_RS02025 -CTL2C_RS03395 KW36_RS02045 -CTL2C_RS03395 AOT15_RS03045 -CTL2C_RS03395 BKB95_RS02075 -CTL2C_RS03395 BKB96_RS02055 -CTL2C_RS03395 SW2_RS02050 -CTL2C_RS03395 BKB99_RS02055 -CTL2C_RS03395 L1440_RS02025 -CTL2C_RS03395 ECS102511_RS02050 -CTL2C_RS03395 CTB_RS02075 -CTL2C_RS03395 CBP42_RS03470 -CTL2C_RS03395 SOTONIA3_RS02060 -CTL2C_RS03395 L2BUCH2_RS02025 -CTL2C_RS03395 BKB92_RS02065 -CTL2C_RS03395 CTO_RS02075 -CTL2C_RS03395 E150_RS02055 -CTL2C_RS03395 AP288_RS01030 -CTL2C_RS03395 L2BLST_RS02025 -CTL2C_RS03395 BW688_RS03455 -CTL2C_RS03395 FCS84708_RS02045 -CTL2C_RS03395 BBV13_RS02080 -CTL2C_RS03395 BKB93_RS02065 -CTL2C_RS03395 CBP44_RS03465 -CTL2C_RS03395 AQ199_RS02745 -CTL2C_RS03395 AQ244_RS01060 -CTL2C_RS03395 G9768_RS02050 -CTL2C_RS03395 BBV16_RS02080 -CTL2C_RS03395 L3404_RS02025 -CTL2C_RS03395 BKC02_RS02055 -CTL2C_RS03395 BKC01_RS02055 -CTL2C_RS03395 AKW53_RS03550 -CTL2C_RS03395 gnl|Prokka|PADJNBJD_00404 -CTL2C_RS03395 NILJEPDF_00404 -CTL2C_RS03395 CTRC943_RS02030 -CTL2C_RS03395 LJHENM_02035 -CTL2C_RS03395 JIEJKO_02030 -CTL2C_RS03395 BKC03_RS02055 -CTL2C_RS03395 CTJTET1_RS02060 -CTL2C_RS03395 AQ193_RS01935 -CTL2C_RS03395 QSDFRQ_00404 -CTL2C_RS03395 C15_RS0102095 -CTL2C_RS03395 A5291_RS02075 -CTL2C_RS03395 SOTONK1_RS02050 -CTL2C_RS03395 DU10_RS02080 -CTL2C_RS03395 KW39_RS02060 -CTL2C_RS03395 IaCS19096_RS02045 -CTL2C_RS03395 ECS88FINAL_RS0102090 -CTL2C_RS03395 O169_RS02060 -CTL2C_RS03395 DU13_RS02075 -CTL2C_RS03395 7618982 -CTL2C_RS03560 CTL2C_RS03560 -CTL2C_RS03560 KW36_RS02205 -CTL2C_RS03560 AOT15_RS03205 -CTL2C_RS03560 BKB95_RS02240 -CTL2C_RS03560 119534 -CTL2C_RS03560 L1224_RS02190 -CTL2C_RS03560 SW2_RS02215 -CTL2C_RS03560 ECS102511_RS02210 -CTL2C_RS03560 L1440_RS02190 -CTL2C_RS03560 CBP42_RS03635 -CTL2C_RS03560 CTB_RS02240 -CTL2C_RS03560 L2BUCH2_RS02185 -CTL2C_RS03560 BKB92_RS02230 -CTL2C_RS03560 SOTONIA3_RS02225 -CTL2C_RS03560 CTO_RS02240 -CTL2C_RS03560 E150_RS02215 -CTL2C_RS03560 BW688_RS03620 -CTL2C_RS03560 L2BLST_RS02190 -CTL2C_RS03560 FCS84708_RS02205 -CTL2C_RS03560 AP288_RS00870 -CTL2C_RS03560 BBV13_RS02245 -CTL2C_RS03560 CBP44_RS03630 -CTL2C_RS03560 BKB93_RS02235 -CTL2C_RS03560 AQ199_RS02905 -CTL2C_RS03560 G9768_RS02210 -CTL2C_RS03560 BBV16_RS02250 -CTL2C_RS03560 L3404_RS02185 -CTL2C_RS03560 BKC02_RS02220 -CTL2C_RS03560 AQ244_RS00900 -CTL2C_RS03560 BKC01_RS02220 -CTL2C_RS03560 AKW53_RS03710 -CTL2C_RS03560 gnl|Prokka|PADJNBJD_00436 -CTL2C_RS03560 NILJEPDF_00436 -CTL2C_RS03560 CTRC943_RS02190 -CTL2C_RS03560 LJHENM_02200 -CTL2C_RS03560 JIEJKO_02195 -CTL2C_RS03560 BKC03_RS02220 -CTL2C_RS03560 CTJTET1_RS02220 -CTL2C_RS03560 QSDFRQ_00436 -CTL2C_RS03560 C15_RS0102255 -CTL2C_RS03560 SOTONK1_RS02210 -CTL2C_RS03560 DU10_RS02245 -CTL2C_RS03560 A5291_RS02240 -CTL2C_RS03560 KW39_RS02220 -CTL2C_RS03560 IaCS19096_RS02205 -CTL2C_RS03560 AQ193_RS01775 -CTL2C_RS03560 ECS88FINAL_RS0102255 -CTL2C_RS03560 O169_RS02220 -CTL2C_RS03560 DU13_RS02240 -CTL2C_RS03560 7618563 -CTL2C_RS03560 BKB96_RS02225 -CTL2C_RS03560 BKB99_RS02220 -CTL2C_RS03560 CBP48_RS03625 -CTL2C_RS03720 CTL2C_RS03720 -CTL2C_RS03720 KW36_RS02365 -CTL2C_RS03720 AOT15_RS03365 -CTL2C_RS03720 BKB95_RS02405 -CTL2C_RS03720 L1224_RS02350 -CTL2C_RS03720 SW2_RS02375 -CTL2C_RS03720 ECS102511_RS02370 -CTL2C_RS03720 L1440_RS02350 -CTL2C_RS03720 CBP42_RS03800 -CTL2C_RS03720 CTB_RS02400 -CTL2C_RS03720 L2BUCH2_RS02345 -CTL2C_RS03720 BKB92_RS02395 -CTL2C_RS03720 SOTONIA3_RS02385 -CTL2C_RS03720 CTO_RS02400 -CTL2C_RS03720 E150_RS02375 -CTL2C_RS03720 BW688_RS03785 -CTL2C_RS03720 L2BLST_RS02350 -CTL2C_RS03720 FCS84708_RS02365 -CTL2C_RS03720 AP288_RS00710 -CTL2C_RS03720 BBV13_RS02405 -CTL2C_RS03720 CBP44_RS03795 -CTL2C_RS03720 BKB93_RS02400 -CTL2C_RS03720 AQ199_RS03065 -CTL2C_RS03720 G9768_RS02370 -CTL2C_RS03720 BBV16_RS02410 -CTL2C_RS03720 L3404_RS02345 -CTL2C_RS03720 BKC02_RS02385 -CTL2C_RS03720 AQ244_RS00740 -CTL2C_RS03720 AKW53_RS03870 -CTL2C_RS03720 BKC01_RS02385 -CTL2C_RS03720 gnl|Prokka|PADJNBJD_00468 -CTL2C_RS03720 NILJEPDF_00468 -CTL2C_RS03720 LJHENM_02360 -CTL2C_RS03720 CTRC943_RS02350 -CTL2C_RS03720 JIEJKO_02360 -CTL2C_RS03720 BKC03_RS02385 -CTL2C_RS03720 QSDFRQ_00468 -CTL2C_RS03720 CTJTET1_RS02380 -CTL2C_RS03720 C15_RS0102420 -CTL2C_RS03720 SOTONK1_RS02370 -CTL2C_RS03720 DU10_RS02410 -CTL2C_RS03720 A5291_RS02400 -CTL2C_RS03720 KW39_RS02380 -CTL2C_RS03720 IaCS19096_RS02365 -CTL2C_RS03720 AQ193_RS01615 -CTL2C_RS03720 ECS88FINAL_RS0102420 -CTL2C_RS03720 O169_RS02380 -CTL2C_RS03720 DU13_RS02405 -CTL2C_RS03720 7618579 -CTL2C_RS03720 BKB96_RS02390 -CTL2C_RS03720 BKB99_RS02385 -CTL2C_RS03720 CBP48_RS03790 -CTL2C_RS03720 119559 -CTL2C_RS03905 CTL2C_RS03905 -CTL2C_RS03905 KW36_RS02550 -CTL2C_RS03905 BKB96_RS02580 -CTL2C_RS03905 BKB99_RS02575 -CTL2C_RS03905 SW2_RS02560 -CTL2C_RS03905 L1224_RS02535 -CTL2C_RS03905 ECS102511_RS02555 -CTL2C_RS03905 BKB95_RS02590 -CTL2C_RS03905 L1440_RS02535 -CTL2C_RS03905 119593 -CTL2C_RS03905 CBP42_RS03985 -CTL2C_RS03905 L2BUCH2_RS02535 -CTL2C_RS03905 BKB92_RS02580 -CTL2C_RS03905 CTB_RS02590 -CTL2C_RS03905 SOTONIA3_RS02570 -CTL2C_RS03905 AKW53_RS04660 -CTL2C_RS03905 E150_RS02560 -CTL2C_RS03905 BW688_RS03975 -CTL2C_RS03905 CTO_RS02590 -CTL2C_RS03905 FCS84708_RS02550 -CTL2C_RS03905 L2BLST_RS02535 -CTL2C_RS03905 BBV13_RS02595 -CTL2C_RS03905 CBP44_RS03980 -CTL2C_RS03905 AP288_RS00525 -CTL2C_RS03905 AQ199_RS03250 -CTL2C_RS03905 BKB93_RS02585 -CTL2C_RS03905 BBV16_RS02605 -CTL2C_RS03905 G9768_RS02555 -CTL2C_RS03905 L3404_RS02530 -CTL2C_RS03905 AQ244_RS00555 -CTL2C_RS03905 BKC02_RS02575 -CTL2C_RS03905 gnl|Prokka|PADJNBJD_00503 -CTL2C_RS03905 NILJEPDF_00503 -CTL2C_RS03905 LJHENM_02530 -CTL2C_RS03905 BKC01_RS02575 -CTL2C_RS03905 CTRC943_RS02535 -CTL2C_RS03905 JIEJKO_02535 -CTL2C_RS03905 QSDFRQ_00503 -CTL2C_RS03905 SOTONK1_RS02555 -CTL2C_RS03905 BKC03_RS02575 -CTL2C_RS03905 CTJTET1_RS02565 -CTL2C_RS03905 KW39_RS02565 -CTL2C_RS03905 ECS88FINAL_RS0102605 -CTL2C_RS03905 IaCS19096_RS02550 -CTL2C_RS03905 DU10_RS02595 -CTL2C_RS03905 C15_RS0102610 -CTL2C_RS03905 O169_RS02565 -CTL2C_RS03905 AQ193_RS01430 -CTL2C_RS03905 A5291_RS02590 -CTL2C_RS03905 AOT15_RS03540 -CTL2C_RS03905 DU13_RS02590 -CTL2C_RS03905 7618601 -CTL2C_RS03905 CBP48_RS03975 -CTL2C_RS04070 CTL2C_RS04070 -CTL2C_RS04070 KW36_RS02715 -CTL2C_RS04070 BKB95_RS02760 -CTL2C_RS04070 BKB96_RS02750 -CTL2C_RS04070 BKB99_RS02745 -CTL2C_RS04070 SW2_RS02725 -CTL2C_RS04070 L1224_RS02700 -CTL2C_RS04070 ECS102511_RS02720 -CTL2C_RS04070 L1440_RS02700 -CTL2C_RS04070 120220 -CTL2C_RS04070 CBP42_RS04155 -CTL2C_RS04070 L2BUCH2_RS02700 -CTL2C_RS04070 SOTONIA3_RS02735 -CTL2C_RS04070 BKB92_RS02750 -CTL2C_RS04070 CTB_RS02755 -CTL2C_RS04070 AKW53_RS04495 -CTL2C_RS04070 E150_RS02725 -CTL2C_RS04070 BW688_RS04145 -CTL2C_RS04070 CTO_RS02755 -CTL2C_RS04070 FCS84708_RS02715 -CTL2C_RS04070 L2BLST_RS02700 -CTL2C_RS04070 BBV13_RS02760 -CTL2C_RS04070 CBP44_RS04150 -CTL2C_RS04070 AP288_RS00360 -CTL2C_RS04070 AQ199_RS03415 -CTL2C_RS04070 BKB93_RS02755 -CTL2C_RS04070 BBV16_RS02770 -CTL2C_RS04070 G9768_RS02720 -CTL2C_RS04070 L3404_RS02695 -CTL2C_RS04070 AQ244_RS00390 -CTL2C_RS04070 BKC02_RS02745 -CTL2C_RS04070 gnl|Prokka|PADJNBJD_00536 -CTL2C_RS04070 NILJEPDF_00536 -CTL2C_RS04070 BKC01_RS02745 -CTL2C_RS04070 LJHENM_02700 -CTL2C_RS04070 CTRC943_RS02700 -CTL2C_RS04070 AOT15_RS01520 -CTL2C_RS04070 QSDFRQ_00536 -CTL2C_RS04070 JIEJKO_02705 -CTL2C_RS04070 SOTONK1_RS02720 -CTL2C_RS04070 CTJTET1_RS02730 -CTL2C_RS04070 BKC03_RS02745 -CTL2C_RS04070 KW39_RS02730 -CTL2C_RS04070 C15_RS0102790 -CTL2C_RS04070 ECS88FINAL_RS0102785 -CTL2C_RS04070 IaCS19096_RS02715 -CTL2C_RS04070 DU10_RS02765 -CTL2C_RS04070 O169_RS02730 -CTL2C_RS04070 AQ193_RS01265 -CTL2C_RS04070 A5291_RS02755 -CTL2C_RS04070 DU13_RS02760 -CTL2C_RS04070 CBP48_RS04145 -CTL2C_RS04070 7619047 -CTL2C_RS04230 CTL2C_RS04230 -CTL2C_RS04230 KW36_RS02875 -CTL2C_RS04230 AKW53_RS04105 -CTL2C_RS04230 BKB95_RS02920 -CTL2C_RS04230 BKB96_RS02910 -CTL2C_RS04230 BKB99_RS02905 -CTL2C_RS04230 7619079 -CTL2C_RS04230 SW2_RS02885 -CTL2C_RS04230 L1224_RS02860 -CTL2C_RS04230 ECS102511_RS02880 -CTL2C_RS04230 L1440_RS02860 -CTL2C_RS04230 CBP42_RS04315 -CTL2C_RS04230 120170 -CTL2C_RS04230 L2BUCH2_RS02860 -CTL2C_RS04230 SOTONIA3_RS02895 -CTL2C_RS04230 BKB92_RS02910 -CTL2C_RS04230 CTB_RS02915 -CTL2C_RS04230 E150_RS02885 -CTL2C_RS04230 BW688_RS04305 -CTL2C_RS04230 CTO_RS02915 -CTL2C_RS04230 FCS84708_RS02875 -CTL2C_RS04230 L2BLST_RS02860 -CTL2C_RS04230 BBV13_RS02920 -CTL2C_RS04230 CBP44_RS04310 -CTL2C_RS04230 AP288_RS00200 -CTL2C_RS04230 AQ199_RS03575 -CTL2C_RS04230 BKB93_RS02915 -CTL2C_RS04230 BBV16_RS02930 -CTL2C_RS04230 G9768_RS02880 -CTL2C_RS04230 L3404_RS02855 -CTL2C_RS04230 AQ244_RS00230 -CTL2C_RS04230 BKC02_RS02905 -CTL2C_RS04230 gnl|Prokka|PADJNBJD_00568 -CTL2C_RS04230 AOT15_RS03680 -CTL2C_RS04230 NILJEPDF_00568 -CTL2C_RS04230 BKC01_RS02905 -CTL2C_RS04230 LJHENM_02860 -CTL2C_RS04230 CTRC943_RS02860 -CTL2C_RS04230 QSDFRQ_00568 -CTL2C_RS04230 JIEJKO_02865 -CTL2C_RS04230 SOTONK1_RS02880 -CTL2C_RS04230 CTJTET1_RS02890 -CTL2C_RS04230 BKC03_RS02905 -CTL2C_RS04230 KW39_RS02890 -CTL2C_RS04230 C15_RS0102950 -CTL2C_RS04230 ECS88FINAL_RS0102945 -CTL2C_RS04230 IaCS19096_RS02875 -CTL2C_RS04230 DU10_RS02925 -CTL2C_RS04230 O169_RS02890 -CTL2C_RS04230 AQ193_RS01105 -CTL2C_RS04230 A5291_RS02915 -CTL2C_RS04230 DU13_RS02920 -CTL2C_RS04230 CBP48_RS04305 -CTL2C_RS04395 CTL2C_RS04395 -CTL2C_RS04395 DU13_RS03095 -CTL2C_RS04395 CBP48_RS04485 -CTL2C_RS04395 L1224_RS03025 -CTL2C_RS04395 KW36_RS03050 -CTL2C_RS04395 BKB95_RS03095 -CTL2C_RS04395 AKW53_RS04280 -CTL2C_RS04395 BKB96_RS03090 -CTL2C_RS04395 BKB99_RS03085 -CTL2C_RS04395 7619090 -CTL2C_RS04395 SW2_RS03055 -CTL2C_RS04395 L1440_RS03025 -CTL2C_RS04395 ECS102511_RS03050 -CTL2C_RS04395 CBP42_RS04490 -CTL2C_RS04395 L2BUCH2_RS03025 -CTL2C_RS04395 CTB_RS03085 -CTL2C_RS04395 SOTONIA3_RS03070 -CTL2C_RS04395 BKB92_RS03085 -CTL2C_RS04395 BW688_RS04480 -CTL2C_RS04395 120153 -CTL2C_RS04395 E150_RS03055 -CTL2C_RS04395 AP288_RS00030 -CTL2C_RS04395 CTO_RS03085 -CTL2C_RS04395 L2BLST_RS03025 -CTL2C_RS04395 CBP44_RS04485 -CTL2C_RS04395 FCS84708_RS03050 -CTL2C_RS04395 BBV13_RS03090 -CTL2C_RS04395 AQ199_RS03750 -CTL2C_RS04395 AQ244_RS00055 -CTL2C_RS04395 BBV16_RS03100 -CTL2C_RS04395 BKB93_RS03090 -CTL2C_RS04395 G9768_RS03055 -CTL2C_RS04395 L3404_RS03020 -CTL2C_RS04395 gnl|Prokka|PADJNBJD_00601 -CTL2C_RS04395 NILJEPDF_00601 -CTL2C_RS04395 LJHENM_03020 -CTL2C_RS04395 BKC02_RS03085 -CTL2C_RS04395 AOT15_RS03855 -CTL2C_RS04395 CTRC943_RS03025 -CTL2C_RS04395 BKC01_RS03085 -CTL2C_RS04395 QSDFRQ_00601 -CTL2C_RS04395 JIEJKO_03030 -CTL2C_RS04395 AQ193_RS00935 -CTL2C_RS04395 SOTONK1_RS03055 -CTL2C_RS04395 CTJTET1_RS03065 -CTL2C_RS04395 BKC03_RS03085 -CTL2C_RS04395 KW39_RS03065 -CTL2C_RS04395 C15_RS0103120 -CTL2C_RS04395 ECS88FINAL_RS0103115 -CTL2C_RS04395 IaCS19096_RS03050 -CTL2C_RS04395 DU10_RS03100 -CTL2C_RS04395 A5291_RS03085 -CTL2C_RS04395 O169_RS03060 -CTL2C_RS04560 CTL2C_RS04560 -CTL2C_RS04560 AKW53_RS04440 -CTL2C_RS04560 CBP48_RS04645 -CTL2C_RS04560 7618645 -CTL2C_RS04560 SW2_RS03220 -CTL2C_RS04560 L1224_RS03190 -CTL2C_RS04560 KW36_RS03215 -CTL2C_RS04560 ECS102511_RS03215 -CTL2C_RS04560 L1440_RS03190 -CTL2C_RS04560 BKB95_RS03260 -CTL2C_RS04560 BKB96_RS03255 -CTL2C_RS04560 BKB99_RS03250 -CTL2C_RS04560 CBP42_RS04650 -CTL2C_RS04560 L2BUCH2_RS03190 -CTL2C_RS04560 BKB92_RS03245 -CTL2C_RS04560 CTB_RS03255 -CTL2C_RS04560 E150_RS03220 -CTL2C_RS04560 SOTONIA3_RS03235 -CTL2C_RS04560 BW688_RS04640 -CTL2C_RS04560 CTO_RS03250 -CTL2C_RS04560 FCS84708_RS03215 -CTL2C_RS04560 L2BLST_RS03190 -CTL2C_RS04560 BBV13_RS03255 -CTL2C_RS04560 CBP44_RS04645 -CTL2C_RS04560 119661 -CTL2C_RS04560 AQ199_RS03915 -CTL2C_RS04560 BKB93_RS03250 -CTL2C_RS04560 BBV16_RS03265 -CTL2C_RS04560 G9768_RS03215 -CTL2C_RS04560 L3404_RS03185 -CTL2C_RS04560 gnl|Prokka|PADJNBJD_00632 -CTL2C_RS04560 AQ244_RS04700 -CTL2C_RS04560 AP288_RS01585 -CTL2C_RS04560 BKC02_RS03245 -CTL2C_RS04560 NILJEPDF_00633 -CTL2C_RS04560 LJHENM_03180 -CTL2C_RS04560 AOT15_RS04015 -CTL2C_RS04560 CTRC943_RS03190 -CTL2C_RS04560 JIEJKO_03185 -CTL2C_RS04560 BKC01_RS03245 -CTL2C_RS04560 QSDFRQ_00633 -CTL2C_RS04560 KW39_RS03230 -CTL2C_RS04560 BKC03_RS03245 -CTL2C_RS04560 CTJTET1_RS03230 -CTL2C_RS04560 ECS88FINAL_RS0103280 -CTL2C_RS04560 DU10_RS03260 -CTL2C_RS04560 SOTONK1_RS03215 -CTL2C_RS04560 O169_RS03225 -CTL2C_RS04560 IaCS19096_RS03210 -CTL2C_RS04560 AQ193_RS00770 -CTL2C_RS04560 C15_RS0103280 -CTL2C_RS04560 A5291_RS03255 -CTL2C_RS04560 DU13_RS03255 -CTL2C_RS04730 CTL2C_RS04730 -CTL2C_RS04730 BKB95_RS03430 -CTL2C_RS04730 CBP48_RS04810 -CTL2C_RS04730 7619124 -CTL2C_RS04730 SW2_RS03385 -CTL2C_RS04730 L1224_RS03360 -CTL2C_RS04730 ECS102511_RS03375 -CTL2C_RS04730 L1440_RS03360 -CTL2C_RS04730 BKB96_RS03420 -CTL2C_RS04730 BKB99_RS03415 -CTL2C_RS04730 CBP42_RS04815 -CTL2C_RS04730 L2BUCH2_RS03360 -CTL2C_RS04730 BKB92_RS03410 -CTL2C_RS04730 CTB_RS03415 -CTL2C_RS04730 SOTONIA3_RS03395 -CTL2C_RS04730 E150_RS03385 -CTL2C_RS04730 CTO_RS03410 -CTL2C_RS04730 BBV13_RS03415 -CTL2C_RS04730 BW688_RS04805 -CTL2C_RS04730 FCS84708_RS03375 -CTL2C_RS04730 L2BLST_RS03360 -CTL2C_RS04730 CBP44_RS04810 -CTL2C_RS04730 120098 -CTL2C_RS04730 BBV16_RS03425 -CTL2C_RS04730 AQ199_RS04075 -CTL2C_RS04730 BKB93_RS03415 -CTL2C_RS04730 G9768_RS03375 -CTL2C_RS04730 gnl|Prokka|PADJNBJD_00664 -CTL2C_RS04730 L3404_RS03355 -CTL2C_RS04730 BKC02_RS03410 -CTL2C_RS04730 NILJEPDF_00665 -CTL2C_RS04730 LJHENM_03340 -CTL2C_RS04730 AOT15_RS04175 -CTL2C_RS04730 AP288_RS01745 -CTL2C_RS04730 AQ244_RS04535 -CTL2C_RS04730 JIEJKO_03345 -CTL2C_RS04730 BKC01_RS03410 -CTL2C_RS04730 QSDFRQ_00665 -CTL2C_RS04730 CTRC943_RS03360 -CTL2C_RS04730 BKC03_RS03410 -CTL2C_RS04730 CTJTET1_RS03395 -CTL2C_RS04730 KW39_RS03395 -CTL2C_RS04730 DU10_RS03425 -CTL2C_RS04730 SOTONK1_RS03375 -CTL2C_RS04730 ECS88FINAL_RS0103450 -CTL2C_RS04730 IaCS19096_RS03370 -CTL2C_RS04730 C15_RS0103445 -CTL2C_RS04730 A5291_RS03420 -CTL2C_RS04730 O169_RS03390 -CTL2C_RS04730 AQ193_RS00610 -CTL2C_RS04730 DU13_RS03425 -CTL2C_RS04730 AKW53_RS00125 -CTL2C_RS04730 KW36_RS03375 -CTO_RS00145 CTO_RS00145 -CTO_RS00145 SOTONIA3_RS00145 -CTO_RS00145 L1440_RS00145 -CTO_RS00145 BKB92_RS00150 -CTO_RS00145 119227 -CTO_RS00145 AQ193_RS03860 -CTO_RS00145 AQ244_RS01845 -CTO_RS00145 CBP44_RS01545 -CTO_RS00145 E150_RS00145 -CTO_RS00145 L2BUCH2_RS00145 -CTO_RS00145 BKB93_RS00150 -CTO_RS00145 FCS84708_RS00145 -CTO_RS00145 AP288_RS03215 -CTO_RS00145 BBV13_RS00150 -CTO_RS00145 G9768_RS00145 -CTO_RS00145 AQ199_RS00840 -CTO_RS00145 BW688_RS01540 -CTO_RS00145 L2BLST_RS00145 -CTO_RS00145 BKC02_RS00150 -CTO_RS00145 BBV16_RS00150 -CTO_RS00145 BKC01_RS00150 -CTO_RS00145 gnl|Prokka|PADJNBJD_00030 -CTO_RS00145 LJHENM_00150 -CTO_RS00145 A5291_RS00145 -CTO_RS00145 SOTONK1_RS00145 -CTO_RS00145 JIEJKO_00145 -CTO_RS00145 7618369 -CTO_RS00145 NILJEPDF_00030 -CTO_RS00145 L3404_RS00145 -CTO_RS00145 IaCS19096_RS00145 -CTO_RS00145 AKW53_RS01635 -CTO_RS00145 BKC03_RS00150 -CTO_RS00145 C15_RS0100145 -CTO_RS00145 AOT15_RS00810 -CTO_RS00145 QSDFRQ_00030 -CTO_RS00145 CTJTET1_RS00145 -CTO_RS00145 DU10_RS00150 -CTO_RS00145 CTRC943_RS00145 -CTO_RS00145 O169_RS00145 -CTO_RS00145 CBP48_RS01540 -CTO_RS00145 ECS88FINAL_RS0100150 -CTO_RS00145 DU13_RS00150 -CTO_RS00145 KW39_RS00145 -CTO_RS00145 KW36_RS00145 -CTO_RS00145 BKB95_RS00150 -CTO_RS00145 SW2_RS00145 -CTO_RS00145 ECS102511_RS00145 -CTO_RS00145 CTB_RS00145 -CTO_RS00145 CTL2C_RS01510 -CTO_RS00145 CBP42_RS01540 -CTO_RS00145 L1224_RS00145 -CTO_RS00145 BKB96_RS00150 -CTO_RS00145 BKB99_RS00150 -CTO_RS00320 CTO_RS00320 -CTO_RS00320 L1440_RS00320 -CTO_RS00320 BKB92_RS00325 -CTO_RS00320 SOTONIA3_RS00320 -CTO_RS00320 AQ193_RS03675 -CTO_RS00320 AQ244_RS01670 -CTO_RS00320 CBP44_RS01720 -CTO_RS00320 119253 -CTO_RS00320 E150_RS00320 -CTO_RS00320 L2BUCH2_RS00320 -CTO_RS00320 BKB93_RS00325 -CTO_RS00320 FCS84708_RS00320 -CTO_RS00320 AP288_RS03390 -CTO_RS00320 BBV13_RS00325 -CTO_RS00320 AQ199_RS01015 -CTO_RS00320 BW688_RS01715 -CTO_RS00320 G9768_RS00320 -CTO_RS00320 L2BLST_RS00320 -CTO_RS00320 BKC02_RS00325 -CTO_RS00320 BBV16_RS00325 -CTO_RS00320 gnl|Prokka|PADJNBJD_00063 -CTO_RS00320 NILJEPDF_00063 -CTO_RS00320 LJHENM_00320 -CTO_RS00320 A5291_RS00320 -CTO_RS00320 BKC01_RS00325 -CTO_RS00320 SOTONK1_RS00320 -CTO_RS00320 L3404_RS00320 -CTO_RS00320 JIEJKO_00320 -CTO_RS00320 AKW53_RS01810 -CTO_RS00320 QSDFRQ_00063 -CTO_RS00320 IaCS19096_RS00320 -CTO_RS00320 AOT15_RS00635 -CTO_RS00320 BKC03_RS00325 -CTO_RS00320 C15_RS0100325 -CTO_RS00320 DU10_RS00325 -CTO_RS00320 7618386 -CTO_RS00320 CTRC943_RS00320 -CTO_RS00320 CTJTET1_RS00320 -CTO_RS00320 O169_RS00320 -CTO_RS00320 KW36_RS00320 -CTO_RS00320 DU13_RS00330 -CTO_RS00320 CBP48_RS01715 -CTO_RS00320 ECS88FINAL_RS0100330 -CTO_RS00320 KW39_RS00320 -CTO_RS00320 BKB95_RS00325 -CTO_RS00320 SW2_RS00320 -CTO_RS00320 ECS102511_RS00320 -CTO_RS00320 CTB_RS00320 -CTO_RS00320 CTL2C_RS01685 -CTO_RS00320 CBP42_RS01715 -CTO_RS00320 BKB96_RS00325 -CTO_RS00320 L1224_RS00320 -CTO_RS00320 BKB99_RS00325 -CTO_RS00480 CTO_RS00480 -CTO_RS00480 L1440_RS00480 -CTO_RS00480 SOTONIA3_RS00480 -CTO_RS00480 AQ244_RS01510 -CTO_RS00480 E150_RS00480 -CTO_RS00480 AQ193_RS03515 -CTO_RS00480 CBP44_RS01885 -CTO_RS00480 119276 -CTO_RS00480 L2BUCH2_RS00480 -CTO_RS00480 BKB93_RS00490 -CTO_RS00480 FCS84708_RS00480 -CTO_RS00480 AP288_RS03550 -CTO_RS00480 AQ199_RS01175 -CTO_RS00480 BBV13_RS00485 -CTO_RS00480 L2BLST_RS00480 -CTO_RS00480 BW688_RS01880 -CTO_RS00480 G9768_RS00480 -CTO_RS00480 BKC02_RS00490 -CTO_RS00480 gnl|Prokka|PADJNBJD_00094 -CTO_RS00480 LJHENM_00470 -CTO_RS00480 BBV16_RS00485 -CTO_RS00480 NILJEPDF_00094 -CTO_RS00480 BKC01_RS00490 -CTO_RS00480 A5291_RS00480 -CTO_RS00480 JIEJKO_00475 -CTO_RS00480 SOTONK1_RS00480 -CTO_RS00480 L3404_RS00480 -CTO_RS00480 AKW53_RS01970 -CTO_RS00480 QSDFRQ_00094 -CTO_RS00480 IaCS19096_RS00480 -CTO_RS00480 AOT15_RS00475 -CTO_RS00480 BKC03_RS00490 -CTO_RS00480 DU10_RS00490 -CTO_RS00480 C15_RS0100490 -CTO_RS00480 7618401 -CTO_RS00480 CTRC943_RS00480 -CTO_RS00480 CTJTET1_RS00480 -CTO_RS00480 O169_RS00480 -CTO_RS00480 DU13_RS00495 -CTO_RS00480 ECS88FINAL_RS0100495 -CTO_RS00480 KW39_RS00480 -CTO_RS00480 KW36_RS00480 -CTO_RS00480 CBP48_RS01880 -CTO_RS00480 SW2_RS00480 -CTO_RS00480 BKB95_RS00490 -CTO_RS00480 ECS102511_RS00480 -CTO_RS00480 CTB_RS00480 -CTO_RS00480 CTL2C_RS01845 -CTO_RS00480 CBP42_RS01880 -CTO_RS00480 BKB96_RS00490 -CTO_RS00480 L1224_RS00480 -CTO_RS00480 BKB99_RS00490 -CTO_RS00480 BKB92_RS00490 -CTO_RS00650 CTO_RS00650 -CTO_RS00650 SOTONIA3_RS00645 -CTO_RS00650 E150_RS00645 -CTO_RS00650 L2BUCH2_RS00645 -CTO_RS00650 AQ193_RS03350 -CTO_RS00650 CBP44_RS02050 -CTO_RS00650 FCS84708_RS00645 -CTO_RS00650 AP288_RS03715 -CTO_RS00650 BKB93_RS00655 -CTO_RS00650 119304 -CTO_RS00650 AQ199_RS01340 -CTO_RS00650 BBV13_RS00655 -CTO_RS00650 G9768_RS00645 -CTO_RS00650 L2BLST_RS00645 -CTO_RS00650 BW688_RS02045 -CTO_RS00650 BBV16_RS00655 -CTO_RS00650 BKC02_RS00655 -CTO_RS00650 gnl|Prokka|PADJNBJD_00127 -CTO_RS00650 LJHENM_00635 -CTO_RS00650 AKW53_RS02140 -CTO_RS00650 BKC01_RS00655 -CTO_RS00650 NILJEPDF_00127 -CTO_RS00650 A5291_RS00650 -CTO_RS00650 L3404_RS00645 -CTO_RS00650 SOTONK1_RS00645 -CTO_RS00650 JIEJKO_00640 -CTO_RS00650 QSDFRQ_00127 -CTO_RS00650 IaCS19096_RS00645 -CTO_RS00650 AOT15_RS00310 -CTO_RS00650 BKC03_RS00655 -CTO_RS00650 C15_RS0100670 -CTO_RS00650 CTRC943_RS00645 -CTO_RS00650 CTJTET1_RS00645 -CTO_RS00650 KW39_RS00645 -CTO_RS00650 DU10_RS00655 -CTO_RS00650 ECS88FINAL_RS0100670 -CTO_RS00650 O169_RS00645 -CTO_RS00650 DU13_RS00660 -CTO_RS00650 7618419 -CTO_RS00650 KW36_RS00645 -CTO_RS00650 CBP48_RS02045 -CTO_RS00650 SW2_RS00645 -CTO_RS00650 BKB95_RS00655 -CTO_RS00650 ECS102511_RS00645 -CTO_RS00650 CTL2C_RS02010 -CTO_RS00650 CTB_RS00650 -CTO_RS00650 L1224_RS00645 -CTO_RS00650 AQ244_RS02820 -CTO_RS00650 BKB96_RS00655 -CTO_RS00650 CBP42_RS02045 -CTO_RS00650 BKB99_RS00655 -CTO_RS00650 L1440_RS00645 -CTO_RS00650 BKB92_RS00655 -CTO_RS01015 CTO_RS01015 -CTO_RS01015 FCS84708_RS00985 -CTO_RS01015 AP288_RS04055 -CTO_RS01015 BKB93_RS00990 -CTO_RS01015 CBP44_RS02385 -CTO_RS01015 AQ199_RS01680 -CTO_RS01015 L2BLST_RS00975 -CTO_RS01015 BW688_RS02385 -CTO_RS01015 BBV13_RS01020 -CTO_RS01015 G9768_RS00995 -CTO_RS01015 BKC02_RS00990 -CTO_RS01015 L3404_RS00970 -CTO_RS01015 AKW53_RS02480 -CTO_RS01015 AQ193_RS03005 -CTO_RS01015 120522 -CTO_RS01015 BBV16_RS01020 -CTO_RS01015 BKC01_RS00990 -CTO_RS01015 DU10_RS01000 -CTO_RS01015 gnl|Prokka|PADJNBJD_00194 -CTO_RS01015 BKC03_RS00990 -CTO_RS01015 NILJEPDF_00194 -CTO_RS01015 LJHENM_00975 -CTO_RS01015 CTRC943_RS00975 -CTO_RS01015 CTJTET1_RS01005 -CTO_RS01015 C15_RS0101025 -CTO_RS01015 SOTONK1_RS00990 -CTO_RS01015 ECS88FINAL_RS0101010 -CTO_RS01015 KW39_RS00995 -CTO_RS01015 JIEJKO_00975 -CTO_RS01015 7618865 -CTO_RS01015 A5291_RS01015 -CTO_RS01015 IaCS19096_RS00990 -CTO_RS01015 QSDFRQ_00194 -CTO_RS01015 O169_RS00995 -CTO_RS01015 DU13_RS01000 -CTO_RS01015 SW2_RS00985 -CTO_RS01015 BKB95_RS01005 -CTO_RS01015 CBP48_RS02380 -CTO_RS01015 KW36_RS00990 -CTO_RS01015 ECS102511_RS00985 -CTO_RS01015 BKB96_RS00990 -CTO_RS01015 CTL2C_RS02340 -CTO_RS01015 BKB99_RS00990 -CTO_RS01015 L1224_RS00970 -CTO_RS01015 L1440_RS00970 -CTO_RS01015 AQ244_RS03170 -CTO_RS01015 BKB92_RS00990 -CTO_RS01015 CBP42_RS02380 -CTO_RS01015 SOTONIA3_RS01005 -CTO_RS01015 AOT15_RS01375 -CTO_RS01015 E150_RS00985 -CTO_RS01015 CTB_RS01015 -CTO_RS01015 L2BUCH2_RS00975 -CTO_RS01185 CTO_RS01185 -CTO_RS01185 FCS84708_RS01155 -CTO_RS01185 AP288_RS04225 -CTO_RS01185 BKB93_RS01160 -CTO_RS01185 CBP44_RS02555 -CTO_RS01185 AQ199_RS01850 -CTO_RS01185 L2BLST_RS01145 -CTO_RS01185 BW688_RS02555 -CTO_RS01185 BBV13_RS01190 -CTO_RS01185 G9768_RS01165 -CTO_RS01185 BKC02_RS01160 -CTO_RS01185 L3404_RS01140 -CTO_RS01185 AKW53_RS02650 -CTO_RS01185 AQ193_RS02835 -CTO_RS01185 BBV16_RS01190 -CTO_RS01185 BKC01_RS01160 -CTO_RS01185 120498 -CTO_RS01185 DU10_RS01170 -CTO_RS01185 gnl|Prokka|PADJNBJD_00228 -CTO_RS01185 BKC03_RS01160 -CTO_RS01185 NILJEPDF_00228 -CTO_RS01185 LJHENM_01145 -CTO_RS01185 CTRC943_RS01145 -CTO_RS01185 CTJTET1_RS01175 -CTO_RS01185 C15_RS0101195 -CTO_RS01185 SOTONK1_RS01160 -CTO_RS01185 ECS88FINAL_RS0101180 -CTO_RS01185 KW39_RS01165 -CTO_RS01185 JIEJKO_01145 -CTO_RS01185 A5291_RS01185 -CTO_RS01185 IaCS19096_RS01160 -CTO_RS01185 7618880 -CTO_RS01185 QSDFRQ_00228 -CTO_RS01185 O169_RS01165 -CTO_RS01185 DU13_RS01170 -CTO_RS01185 SW2_RS01155 -CTO_RS01185 BKB95_RS01175 -CTO_RS01185 CBP48_RS02550 -CTO_RS01185 KW36_RS01160 -CTO_RS01185 ECS102511_RS01155 -CTO_RS01185 BKB96_RS01160 -CTO_RS01185 CTL2C_RS02510 -CTO_RS01185 BKB99_RS01160 -CTO_RS01185 L1224_RS01140 -CTO_RS01185 L1440_RS01140 -CTO_RS01185 AQ244_RS03340 -CTO_RS01185 BKB92_RS01160 -CTO_RS01185 CBP42_RS02550 -CTO_RS01185 SOTONIA3_RS01175 -CTO_RS01185 AOT15_RS01205 -CTO_RS01185 E150_RS01155 -CTO_RS01185 CTB_RS01185 -CTO_RS01185 L2BUCH2_RS01145 -CTO_RS01355 CTO_RS01355 -CTO_RS01355 FCS84708_RS01325 -CTO_RS01355 AP288_RS04395 -CTO_RS01355 BKB93_RS01330 -CTO_RS01355 CBP44_RS02725 -CTO_RS01355 AQ199_RS02020 -CTO_RS01355 L2BLST_RS01315 -CTO_RS01355 BBV13_RS01360 -CTO_RS01355 BW688_RS02725 -CTO_RS01355 G9768_RS01335 -CTO_RS01355 BKC02_RS01330 -CTO_RS01355 BBV16_RS01360 -CTO_RS01355 L3404_RS01310 -CTO_RS01355 AKW53_RS02820 -CTO_RS01355 AQ193_RS02665 -CTO_RS01355 BKC01_RS01330 -CTO_RS01355 gnl|Prokka|PADJNBJD_00261 -CTO_RS01355 DU10_RS01340 -CTO_RS01355 NILJEPDF_00261 -CTO_RS01355 LJHENM_01310 -CTO_RS01355 BKC03_RS01330 -CTO_RS01355 CTRC943_RS01315 -CTO_RS01355 CTJTET1_RS01345 -CTO_RS01355 KW39_RS01335 -CTO_RS01355 JIEJKO_01310 -CTO_RS01355 120467 -CTO_RS01355 C15_RS0101365 -CTO_RS01355 SOTONK1_RS01330 -CTO_RS01355 ECS88FINAL_RS0101350 -CTO_RS01355 QSDFRQ_00261 -CTO_RS01355 A5291_RS01355 -CTO_RS01355 O169_RS01335 -CTO_RS01355 IaCS19096_RS01330 -CTO_RS01355 DU13_RS01340 -CTO_RS01355 7618900 -CTO_RS01355 SW2_RS01325 -CTO_RS01355 BKB95_RS01345 -CTO_RS01355 CBP48_RS02720 -CTO_RS01355 KW36_RS01330 -CTO_RS01355 ECS102511_RS01325 -CTO_RS01355 BKB96_RS01330 -CTO_RS01355 CTL2C_RS02680 -CTO_RS01355 BKB99_RS01330 -CTO_RS01355 L1224_RS01310 -CTO_RS01355 L1440_RS01310 -CTO_RS01355 AQ244_RS03510 -CTO_RS01355 BKB92_RS01330 -CTO_RS01355 CBP42_RS02720 -CTO_RS01355 SOTONIA3_RS01345 -CTO_RS01355 AOT15_RS01035 -CTO_RS01355 CTB_RS01355 -CTO_RS01355 E150_RS01325 -CTO_RS01355 L2BUCH2_RS01315 -CTO_RS01515 CTO_RS01515 -CTO_RS01515 FCS84708_RS01485 -CTO_RS01515 AP288_RS04555 -CTO_RS01515 BKB93_RS01500 -CTO_RS01515 CBP44_RS02890 -CTO_RS01515 AQ199_RS02180 -CTO_RS01515 L2BLST_RS01475 -CTO_RS01515 BBV13_RS01525 -CTO_RS01515 BW688_RS02895 -CTO_RS01515 G9768_RS01495 -CTO_RS01515 BKC02_RS01495 -CTO_RS01515 AKW53_RS02985 -CTO_RS01515 AQ193_RS02500 -CTO_RS01515 BBV16_RS01525 -CTO_RS01515 L3404_RS01470 -CTO_RS01515 BKC01_RS01500 -CTO_RS01515 gnl|Prokka|PADJNBJD_00293 -CTO_RS01515 DU10_RS01505 -CTO_RS01515 NILJEPDF_00293 -CTO_RS01515 LJHENM_01475 -CTO_RS01515 BKC03_RS01495 -CTO_RS01515 CTRC943_RS01475 -CTO_RS01515 CTJTET1_RS01505 -CTO_RS01515 KW39_RS01495 -CTO_RS01515 JIEJKO_01475 -CTO_RS01515 C15_RS0101530 -CTO_RS01515 SOTONK1_RS01495 -CTO_RS01515 ECS88FINAL_RS0101515 -CTO_RS01515 120442 -CTO_RS01515 QSDFRQ_00293 -CTO_RS01515 IaCS19096_RS01490 -CTO_RS01515 A5291_RS01520 -CTO_RS01515 O169_RS01500 -CTO_RS01515 DU13_RS01505 -CTO_RS01515 SW2_RS01485 -CTO_RS01515 BKB95_RS01510 -CTO_RS01515 CBP48_RS02885 -CTO_RS01515 7618916 -CTO_RS01515 KW36_RS01490 -CTO_RS01515 ECS102511_RS01485 -CTO_RS01515 AOT15_RS02490 -CTO_RS01515 BKB96_RS01495 -CTO_RS01515 CTL2C_RS02840 -CTO_RS01515 BKB99_RS01495 -CTO_RS01515 L1224_RS01470 -CTO_RS01515 L1440_RS01470 -CTO_RS01515 AQ244_RS03675 -CTO_RS01515 CBP42_RS02885 -CTO_RS01515 SOTONIA3_RS01505 -CTO_RS01515 BKB92_RS01500 -CTO_RS01515 CTB_RS01520 -CTO_RS01515 E150_RS01490 -CTO_RS01515 L2BUCH2_RS01475 -CTO_RS01675 CTO_RS01675 -CTO_RS01675 FCS84708_RS01645 -CTO_RS01675 CBP44_RS03050 -CTO_RS01675 BKB93_RS01660 -CTO_RS01675 L2BLST_RS01635 -CTO_RS01675 AQ199_RS02340 -CTO_RS01675 BW688_RS03055 -CTO_RS01675 BBV13_RS01685 -CTO_RS01675 G9768_RS01655 -CTO_RS01675 BKC02_RS01655 -CTO_RS01675 L3404_RS01630 -CTO_RS01675 AKW53_RS03145 -CTO_RS01675 AQ193_RS02340 -CTO_RS01675 BBV16_RS01685 -CTO_RS01675 BKC01_RS01660 -CTO_RS01675 gnl|Prokka|PADJNBJD_00325 -CTO_RS01675 NILJEPDF_00325 -CTO_RS01675 LJHENM_01635 -CTO_RS01675 CTRC943_RS01635 -CTO_RS01675 BKC03_RS01655 -CTO_RS01675 DU10_RS01670 -CTO_RS01675 CTJTET1_RS01665 -CTO_RS01675 KW39_RS01655 -CTO_RS01675 JIEJKO_01635 -CTO_RS01675 C15_RS0101695 -CTO_RS01675 SOTONK1_RS01655 -CTO_RS01675 ECS88FINAL_RS0101675 -CTO_RS01675 QSDFRQ_00325 -CTO_RS01675 IaCS19096_RS01650 -CTO_RS01675 A5291_RS01680 -CTO_RS01675 O169_RS01660 -CTO_RS01675 DU13_RS01665 -CTO_RS01675 120392 -CTO_RS01675 CBP48_RS03045 -CTO_RS01675 SW2_RS01645 -CTO_RS01675 BKB95_RS01670 -CTO_RS01675 7618941 -CTO_RS01675 CTL2C_RS03000 -CTO_RS01675 KW36_RS01650 -CTO_RS01675 ECS102511_RS01645 -CTO_RS01675 AOT15_RS02650 -CTO_RS01675 BKB96_RS01655 -CTO_RS01675 L1224_RS01630 -CTO_RS01675 BKB99_RS01655 -CTO_RS01675 L1440_RS01630 -CTO_RS01675 AP288_RS01435 -CTO_RS01675 CBP42_RS03045 -CTO_RS01675 SOTONIA3_RS01665 -CTO_RS01675 BKB92_RS01660 -CTO_RS01675 CTB_RS01680 -CTO_RS01675 AQ244_RS01465 -CTO_RS01675 E150_RS01650 -CTO_RS01675 L2BUCH2_RS01635 -CTO_RS01855 CTO_RS01855 -CTO_RS01855 E150_RS01835 -CTO_RS01855 L2BLST_RS01805 -CTO_RS01855 FCS84708_RS01825 -CTO_RS01855 BW688_RS03235 -CTO_RS01855 BKB93_RS01845 -CTO_RS01855 CBP44_RS03240 -CTO_RS01855 BBV13_RS01860 -CTO_RS01855 AQ193_RS02155 -CTO_RS01855 AQ199_RS02525 -CTO_RS01855 G9768_RS01830 -CTO_RS01855 L3404_RS01805 -CTO_RS01855 BBV16_RS01860 -CTO_RS01855 BKC02_RS01835 -CTO_RS01855 BKC01_RS01835 -CTO_RS01855 AKW53_RS03330 -CTO_RS01855 gnl|Prokka|PADJNBJD_00360 -CTO_RS01855 NILJEPDF_00360 -CTO_RS01855 CTRC943_RS01810 -CTO_RS01855 LJHENM_01815 -CTO_RS01855 JIEJKO_01810 -CTO_RS01855 BKC03_RS01835 -CTO_RS01855 CTJTET1_RS01840 -CTO_RS01855 DU10_RS01855 -CTO_RS01855 QSDFRQ_00360 -CTO_RS01855 C15_RS0101870 -CTO_RS01855 SOTONK1_RS01830 -CTO_RS01855 A5291_RS01855 -CTO_RS01855 KW39_RS01840 -CTO_RS01855 IaCS19096_RS01825 -CTO_RS01855 ECS88FINAL_RS0101860 -CTO_RS01855 DU13_RS01850 -CTO_RS01855 119468 -CTO_RS01855 O169_RS01840 -CTO_RS01855 7618522 -CTO_RS01855 CTL2C_RS03175 -CTO_RS01855 BKB95_RS01850 -CTO_RS01855 CBP48_RS03235 -CTO_RS01855 L1224_RS01805 -CTO_RS01855 KW36_RS01825 -CTO_RS01855 AOT15_RS02825 -CTO_RS01855 BKB96_RS01835 -CTO_RS01855 SW2_RS01830 -CTO_RS01855 AP288_RS01250 -CTO_RS01855 BKB99_RS01835 -CTO_RS01855 L1440_RS01805 -CTO_RS01855 ECS102511_RS01830 -CTO_RS01855 AQ244_RS01280 -CTO_RS01855 CBP42_RS03245 -CTO_RS01855 CTB_RS01855 -CTO_RS01855 SOTONIA3_RS01840 -CTO_RS01855 L2BUCH2_RS01805 -CTO_RS01855 BKB92_RS01845 -CTO_RS02025 CTO_RS02025 -CTO_RS02025 E150_RS02005 -CTO_RS02025 L2BLST_RS01975 -CTO_RS02025 BW688_RS03405 -CTO_RS02025 FCS84708_RS01995 -CTO_RS02025 AQ193_RS01985 -CTO_RS02025 BBV13_RS02030 -CTO_RS02025 BKB93_RS02015 -CTO_RS02025 CBP44_RS03415 -CTO_RS02025 AQ199_RS02695 -CTO_RS02025 G9768_RS02000 -CTO_RS02025 BBV16_RS02030 -CTO_RS02025 L3404_RS01975 -CTO_RS02025 BKC02_RS02005 -CTO_RS02025 BKC01_RS02005 -CTO_RS02025 AKW53_RS03500 -CTO_RS02025 gnl|Prokka|PADJNBJD_00394 -CTO_RS02025 NILJEPDF_00394 -CTO_RS02025 CTRC943_RS01980 -CTO_RS02025 LJHENM_01985 -CTO_RS02025 JIEJKO_01980 -CTO_RS02025 BKC03_RS02005 -CTO_RS02025 CTJTET1_RS02010 -CTO_RS02025 QSDFRQ_00394 -CTO_RS02025 C15_RS0102045 -CTO_RS02025 A5291_RS02025 -CTO_RS02025 SOTONK1_RS02000 -CTO_RS02025 DU10_RS02030 -CTO_RS02025 KW39_RS02010 -CTO_RS02025 IaCS19096_RS01995 -CTO_RS02025 ECS88FINAL_RS0102035 -CTO_RS02025 O169_RS02010 -CTO_RS02025 DU13_RS02025 -CTO_RS02025 7618973 -CTO_RS02025 120339 -CTO_RS02025 CTL2C_RS03345 -CTO_RS02025 AP288_RS01080 -CTO_RS02025 CBP48_RS03410 -CTO_RS02025 L1224_RS01975 -CTO_RS02025 KW36_RS01995 -CTO_RS02025 AOT15_RS02995 -CTO_RS02025 BKB95_RS02025 -CTO_RS02025 BKB96_RS02005 -CTO_RS02025 SW2_RS02000 -CTO_RS02025 BKB99_RS02005 -CTO_RS02025 L1440_RS01975 -CTO_RS02025 ECS102511_RS02000 -CTO_RS02025 AQ244_RS01110 -CTO_RS02025 CTB_RS02025 -CTO_RS02025 CBP42_RS03420 -CTO_RS02025 SOTONIA3_RS02010 -CTO_RS02025 L2BUCH2_RS01975 -CTO_RS02025 BKB92_RS02015 -CTO_RS02185 CTO_RS02185 -CTO_RS02185 E150_RS02165 -CTO_RS02185 L2BLST_RS02135 -CTO_RS02185 BBV13_RS02195 -CTO_RS02185 BW688_RS03570 -CTO_RS02185 FCS84708_RS02155 -CTO_RS02185 AQ193_RS01825 -CTO_RS02185 BKB93_RS02180 -CTO_RS02185 CBP44_RS03580 -CTO_RS02185 AQ199_RS02855 -CTO_RS02185 BBV16_RS02195 -CTO_RS02185 G9768_RS02160 -CTO_RS02185 L3404_RS02135 -CTO_RS02185 BKC02_RS02170 -CTO_RS02185 BKC01_RS02170 -CTO_RS02185 AKW53_RS03660 -CTO_RS02185 gnl|Prokka|PADJNBJD_00426 -CTO_RS02185 NILJEPDF_00426 -CTO_RS02185 CTRC943_RS02140 -CTO_RS02185 LJHENM_02150 -CTO_RS02185 JIEJKO_02145 -CTO_RS02185 BKC03_RS02170 -CTO_RS02185 CTJTET1_RS02170 -CTO_RS02185 QSDFRQ_00426 -CTO_RS02185 C15_RS0102205 -CTO_RS02185 A5291_RS02185 -CTO_RS02185 SOTONK1_RS02160 -CTO_RS02185 DU10_RS02195 -CTO_RS02185 KW39_RS02170 -CTO_RS02185 IaCS19096_RS02155 -CTO_RS02185 ECS88FINAL_RS0102200 -CTO_RS02185 O169_RS02170 -CTO_RS02185 DU13_RS02190 -CTO_RS02185 7618554 -CTO_RS02185 CTL2C_RS03505 -CTO_RS02185 AP288_RS00920 -CTO_RS02185 CBP48_RS03575 -CTO_RS02185 119521 -CTO_RS02185 L1224_RS02135 -CTO_RS02185 KW36_RS02155 -CTO_RS02185 AOT15_RS03155 -CTO_RS02185 BKB95_RS02190 -CTO_RS02185 BKB96_RS02170 -CTO_RS02185 SW2_RS02160 -CTO_RS02185 BKB99_RS02170 -CTO_RS02185 L1440_RS02135 -CTO_RS02185 ECS102511_RS02160 -CTO_RS02185 AQ244_RS00950 -CTO_RS02185 CTB_RS02185 -CTO_RS02185 CBP42_RS03585 -CTO_RS02185 SOTONIA3_RS02170 -CTO_RS02185 L2BUCH2_RS02135 -CTO_RS02185 BKB92_RS02180 -CTO_RS02690 CTO_RS02690 -CTO_RS02690 FCS84708_RS02650 -CTO_RS02690 L2BLST_RS02635 -CTO_RS02690 BBV13_RS02695 -CTO_RS02690 CBP44_RS04080 -CTO_RS02690 AQ199_RS03350 -CTO_RS02690 BKB93_RS02685 -CTO_RS02690 BBV16_RS02705 -CTO_RS02690 G9768_RS02655 -CTO_RS02690 L3404_RS02630 -CTO_RS02690 BKC02_RS02675 -CTO_RS02690 AQ193_RS01330 -CTO_RS02690 BKC01_RS02675 -CTO_RS02690 gnl|Prokka|PADJNBJD_00524 -CTO_RS02690 AOT15_RS03440 -CTO_RS02690 NILJEPDF_00524 -CTO_RS02690 LJHENM_02635 -CTO_RS02690 CTRC943_RS02635 -CTO_RS02690 SOTONK1_RS02655 -CTO_RS02690 CTJTET1_RS02665 -CTO_RS02690 JIEJKO_02640 -CTO_RS02690 BKC03_RS02675 -CTO_RS02690 QSDFRQ_00524 -CTO_RS02690 KW39_RS02665 -CTO_RS02690 C15_RS0102725 -CTO_RS02690 ECS88FINAL_RS0102720 -CTO_RS02690 IaCS19096_RS02650 -CTO_RS02690 DU10_RS02695 -CTO_RS02690 O169_RS02665 -CTO_RS02690 A5291_RS02690 -CTO_RS02690 DU13_RS02690 -CTO_RS02690 CBP48_RS04075 -CTO_RS02690 CTL2C_RS04005 -CTO_RS02690 KW36_RS02650 -CTO_RS02690 BKB95_RS02690 -CTO_RS02690 BKB96_RS02680 -CTO_RS02690 BKB99_RS02675 -CTO_RS02690 7619037 -CTO_RS02690 SW2_RS02660 -CTO_RS02690 L1224_RS02635 -CTO_RS02690 ECS102511_RS02655 -CTO_RS02690 AKW53_RS04560 -CTO_RS02690 L1440_RS02635 -CTO_RS02690 AP288_RS00425 -CTO_RS02690 CBP42_RS04085 -CTO_RS02690 120236 -CTO_RS02690 L2BUCH2_RS02635 -CTO_RS02690 SOTONIA3_RS02670 -CTO_RS02690 BKB92_RS02680 -CTO_RS02690 CTB_RS02690 -CTO_RS02690 E150_RS02660 -CTO_RS02690 AQ244_RS00455 -CTO_RS02690 BW688_RS04075 -CTO_RS02855 CTO_RS02855 -CTO_RS02855 FCS84708_RS02815 -CTO_RS02855 L2BLST_RS02800 -CTO_RS02855 BBV13_RS02860 -CTO_RS02855 CBP44_RS04250 -CTO_RS02855 AQ199_RS03515 -CTO_RS02855 BKB93_RS02855 -CTO_RS02855 BBV16_RS02870 -CTO_RS02855 G9768_RS02820 -CTO_RS02855 L3404_RS02795 -CTO_RS02855 BKC02_RS02845 -CTO_RS02855 gnl|Prokka|PADJNBJD_00556 -CTO_RS02855 AQ193_RS01165 -CTO_RS02855 NILJEPDF_00556 -CTO_RS02855 BKC01_RS02845 -CTO_RS02855 LJHENM_02800 -CTO_RS02855 CTRC943_RS02800 -CTO_RS02855 AOT15_RS01620 -CTO_RS02855 QSDFRQ_00556 -CTO_RS02855 JIEJKO_02805 -CTO_RS02855 SOTONK1_RS02820 -CTO_RS02855 CTJTET1_RS02830 -CTO_RS02855 BKC03_RS02845 -CTO_RS02855 KW39_RS02830 -CTO_RS02855 C15_RS0102890 -CTO_RS02855 ECS88FINAL_RS0102885 -CTO_RS02855 IaCS19096_RS02815 -CTO_RS02855 DU10_RS02865 -CTO_RS02855 O169_RS02830 -CTO_RS02855 A5291_RS02855 -CTO_RS02855 DU13_RS02860 -CTO_RS02855 CBP48_RS04245 -CTO_RS02855 7619067 -CTO_RS02855 CTL2C_RS04170 -CTO_RS02855 KW36_RS02815 -CTO_RS02855 AKW53_RS04045 -CTO_RS02855 BKB95_RS02860 -CTO_RS02855 BKB96_RS02850 -CTO_RS02855 BKB99_RS02845 -CTO_RS02855 SW2_RS02825 -CTO_RS02855 L1224_RS02800 -CTO_RS02855 ECS102511_RS02820 -CTO_RS02855 L1440_RS02800 -CTO_RS02855 120189 -CTO_RS02855 AP288_RS00260 -CTO_RS02855 CBP42_RS04255 -CTO_RS02855 L2BUCH2_RS02800 -CTO_RS02855 SOTONIA3_RS02835 -CTO_RS02855 BKB92_RS02850 -CTO_RS02855 CTB_RS02855 -CTO_RS02855 E150_RS02825 -CTO_RS02855 AQ244_RS00290 -CTO_RS02855 BW688_RS04245 -CTO_RS03020 CTO_RS03020 -CTO_RS03020 L2BLST_RS02960 -CTO_RS03020 CBP44_RS04420 -CTO_RS03020 FCS84708_RS02985 -CTO_RS03020 BBV13_RS03025 -CTO_RS03020 AQ199_RS03685 -CTO_RS03020 BBV16_RS03035 -CTO_RS03020 BKB93_RS03025 -CTO_RS03020 G9768_RS02990 -CTO_RS03020 L3404_RS02955 -CTO_RS03020 AQ193_RS01000 -CTO_RS03020 gnl|Prokka|PADJNBJD_00589 -CTO_RS03020 BKC02_RS03020 -CTO_RS03020 NILJEPDF_00589 -CTO_RS03020 LJHENM_02960 -CTO_RS03020 AOT15_RS03790 -CTO_RS03020 CTRC943_RS02960 -CTO_RS03020 BKC01_RS03020 -CTO_RS03020 QSDFRQ_00589 -CTO_RS03020 JIEJKO_02970 -CTO_RS03020 SOTONK1_RS02990 -CTO_RS03020 CTJTET1_RS03000 -CTO_RS03020 BKC03_RS03020 -CTO_RS03020 KW39_RS03000 -CTO_RS03020 C15_RS0103055 -CTO_RS03020 ECS88FINAL_RS0103050 -CTO_RS03020 IaCS19096_RS02985 -CTO_RS03020 DU10_RS03035 -CTO_RS03020 A5291_RS03020 -CTO_RS03020 O169_RS02995 -CTO_RS03020 CTL2C_RS04330 -CTO_RS03020 DU13_RS03030 -CTO_RS03020 CBP48_RS04420 -CTO_RS03020 L1224_RS02960 -CTO_RS03020 KW36_RS02985 -CTO_RS03020 BKB95_RS03030 -CTO_RS03020 AKW53_RS04215 -CTO_RS03020 BKB96_RS03025 -CTO_RS03020 BKB99_RS03020 -CTO_RS03020 7618620 -CTO_RS03020 SW2_RS02990 -CTO_RS03020 L1440_RS02960 -CTO_RS03020 ECS102511_RS02985 -CTO_RS03020 AP288_RS00095 -CTO_RS03020 CBP42_RS04425 -CTO_RS03020 L2BUCH2_RS02960 -CTO_RS03020 CTB_RS03020 -CTO_RS03020 SOTONIA3_RS03005 -CTO_RS03020 BKB92_RS03020 -CTO_RS03020 119623 -CTO_RS03020 AQ244_RS00120 -CTO_RS03020 BW688_RS04415 -CTO_RS03020 E150_RS02990 -CTO_RS03180 CTO_RS03180 -CTO_RS03180 L2BLST_RS03125 -CTO_RS03180 CBP44_RS04580 -CTO_RS03180 FCS84708_RS03150 -CTO_RS03180 AQ244_RS04765 -CTO_RS03180 BBV13_RS03185 -CTO_RS03180 AQ199_RS03850 -CTO_RS03180 BBV16_RS03195 -CTO_RS03180 BKB93_RS03185 -CTO_RS03180 G9768_RS03150 -CTO_RS03180 L3404_RS03120 -CTO_RS03180 gnl|Prokka|PADJNBJD_00620 -CTO_RS03180 AQ193_RS00835 -CTO_RS03180 NILJEPDF_00620 -CTO_RS03180 LJHENM_03115 -CTO_RS03180 BKC02_RS03180 -CTO_RS03180 AOT15_RS03950 -CTO_RS03180 AP288_RS01520 -CTO_RS03180 CTRC943_RS03125 -CTO_RS03180 BKC01_RS03180 -CTO_RS03180 QSDFRQ_00620 -CTO_RS03180 JIEJKO_03125 -CTO_RS03180 SOTONK1_RS03150 -CTO_RS03180 CTJTET1_RS03165 -CTO_RS03180 BKC03_RS03180 -CTO_RS03180 KW39_RS03165 -CTO_RS03180 C15_RS0103215 -CTO_RS03180 ECS88FINAL_RS0103215 -CTO_RS03180 IaCS19096_RS03145 -CTO_RS03180 DU10_RS03195 -CTO_RS03180 A5291_RS03185 -CTO_RS03180 O169_RS03160 -CTO_RS03180 CTL2C_RS04495 -CTO_RS03180 DU13_RS03190 -CTO_RS03180 CBP48_RS04580 -CTO_RS03180 L1224_RS03125 -CTO_RS03180 KW36_RS03150 -CTO_RS03180 BKB95_RS03190 -CTO_RS03180 AKW53_RS04375 -CTO_RS03180 BKB96_RS03185 -CTO_RS03180 BKB99_RS03180 -CTO_RS03180 7618639 -CTO_RS03180 SW2_RS03155 -CTO_RS03180 L1440_RS03125 -CTO_RS03180 ECS102511_RS03150 -CTO_RS03180 CBP42_RS04585 -CTO_RS03180 L2BUCH2_RS03125 -CTO_RS03180 CTB_RS03185 -CTO_RS03180 SOTONIA3_RS03165 -CTO_RS03180 BKB92_RS03180 -CTO_RS03180 BW688_RS04575 -CTO_RS03180 119652 -CTO_RS03180 E150_RS03155 -CTO_RS03355 CTO_RS03355 -CTO_RS03355 FCS84708_RS03320 -CTO_RS03355 AQ244_RS04590 -CTO_RS03355 BBV13_RS03360 -CTO_RS03355 L2BLST_RS03300 -CTO_RS03355 CBP44_RS04750 -CTO_RS03355 119673 -CTO_RS03355 AQ199_RS04020 -CTO_RS03355 BBV16_RS03370 -CTO_RS03355 BKB93_RS03355 -CTO_RS03355 G9768_RS03320 -CTO_RS03355 L3404_RS03295 -CTO_RS03355 gnl|Prokka|PADJNBJD_00653 -CTO_RS03355 AP288_RS01690 -CTO_RS03355 AQ193_RS00665 -CTO_RS03355 BKC02_RS03350 -CTO_RS03355 NILJEPDF_00654 -CTO_RS03355 LJHENM_03285 -CTO_RS03355 AOT15_RS04120 -CTO_RS03355 CTRC943_RS03300 -CTO_RS03355 JIEJKO_03290 -CTO_RS03355 BKC01_RS03350 -CTO_RS03355 QSDFRQ_00654 -CTO_RS03355 KW39_RS03340 -CTO_RS03355 BKC03_RS03350 -CTO_RS03355 CTJTET1_RS03340 -CTO_RS03355 ECS88FINAL_RS0103385 -CTO_RS03355 DU10_RS03365 -CTO_RS03355 SOTONK1_RS03320 -CTO_RS03355 O169_RS03335 -CTO_RS03355 IaCS19096_RS03315 -CTO_RS03355 C15_RS0103385 -CTO_RS03355 A5291_RS03365 -CTO_RS03355 AKW53_RS00070 -CTO_RS03355 DU13_RS03360 -CTO_RS03355 CTL2C_RS04670 -CTO_RS03355 CBP48_RS04750 -CTO_RS03355 SW2_RS03330 -CTO_RS03355 L1224_RS03300 -CTO_RS03355 KW36_RS03320 -CTO_RS03355 ECS102511_RS03320 -CTO_RS03355 7618653 -CTO_RS03355 L1440_RS03300 -CTO_RS03355 BKB95_RS03365 -CTO_RS03355 BKB96_RS03360 -CTO_RS03355 BKB99_RS03355 -CTO_RS03355 CBP42_RS04755 -CTO_RS03355 L2BUCH2_RS03300 -CTO_RS03355 BKB92_RS03350 -CTO_RS03355 CTB_RS03360 -CTO_RS03355 E150_RS03330 -CTO_RS03355 SOTONIA3_RS03340 -CTO_RS03355 BW688_RS04745 -CTO_RS03530 CTO_RS03530 -CTO_RS03530 AQ244_RS04415 -CTO_RS03530 BBV13_RS03535 -CTO_RS03530 FCS84708_RS03490 -CTO_RS03530 L2BLST_RS03475 -CTO_RS03530 7618215 -CTO_RS03530 BBV16_RS03545 -CTO_RS03530 BW688_RS00095 -CTO_RS03530 AQ199_RS04190 -CTO_RS03530 BKB93_RS03530 -CTO_RS03530 119700 -CTO_RS03530 G9768_RS03495 -CTO_RS03530 gnl|Prokka|PADJNBJD_00687 -CTO_RS03530 L3404_RS03470 -CTO_RS03530 AQ193_RS00495 -CTO_RS03530 BKC02_RS03525 -CTO_RS03530 NILJEPDF_00688 -CTO_RS03530 LJHENM_03455 -CTO_RS03530 AOT15_RS04295 -CTO_RS03530 AP288_RS01860 -CTO_RS03530 JIEJKO_03460 -CTO_RS03530 BKC01_RS03525 -CTO_RS03530 QSDFRQ_00688 -CTO_RS03530 CTRC943_RS03480 -CTO_RS03530 BKC03_RS03525 -CTO_RS03530 CBP48_RS00095 -CTO_RS03530 CTJTET1_RS03515 -CTO_RS03530 KW39_RS03510 -CTO_RS03530 DU10_RS03540 -CTO_RS03530 SOTONK1_RS03495 -CTO_RS03530 ECS88FINAL_RS0103575 -CTO_RS03530 IaCS19096_RS03490 -CTO_RS03530 C15_RS0103570 -CTO_RS03530 A5291_RS03540 -CTO_RS03530 O169_RS03505 -CTO_RS03530 DU13_RS03540 -CTO_RS03530 KW36_RS03495 -CTO_RS03530 AKW53_RS00240 -CTO_RS03530 BKB95_RS03545 -CTO_RS03530 CBP42_RS00095 -CTO_RS03530 SW2_RS03500 -CTO_RS03530 CTL2C_RS00095 -CTO_RS03530 L1224_RS03475 -CTO_RS03530 ECS102511_RS03490 -CTO_RS03530 L1440_RS03475 -CTO_RS03530 BKB96_RS03535 -CTO_RS03530 BKB99_RS03530 -CTO_RS03530 CBP44_RS00095 -CTO_RS03530 L2BUCH2_RS03475 -CTO_RS03530 BKB92_RS03525 -CTO_RS03530 CTB_RS03535 -CTO_RS03530 SOTONIA3_RS03515 -CTO_RS03530 E150_RS03500 -CTO_RS04240 CTO_RS04240 -CTO_RS04240 AP288_RS02515 -CTO_RS04240 BBV13_RS04255 -CTO_RS04240 119817 -CTO_RS04240 E150_RS04220 -CTO_RS04240 7618291 -CTO_RS04240 L2BLST_RS04190 -CTO_RS04240 FCS84708_RS04210 -CTO_RS04240 AQ199_RS00140 -CTO_RS04240 BBV16_RS04260 -CTO_RS04240 BW688_RS00820 -CTO_RS04240 gnl|Prokka|PADJNBJD_00827 -CTO_RS04240 NILJEPDF_00828 -CTO_RS04240 G9768_RS04215 -CTO_RS04240 L3404_RS04185 -CTO_RS04240 BKB93_RS04255 -CTO_RS04240 LJHENM_04165 -CTO_RS04240 AQ193_RS04560 -CTO_RS04240 JIEJKO_04165 -CTO_RS04240 BKC02_RS04250 -CTO_RS04240 QSDFRQ_00828 -CTO_RS04240 AQ244_RS02550 -CTO_RS04240 AKW53_RS00930 -CTO_RS04240 BKC01_RS04255 -CTO_RS04240 CTRC943_RS04195 -CTO_RS04240 AOT15_RS01795 -CTO_RS04240 CTJTET1_RS04385 -CTO_RS04240 BKC03_RS04250 -CTO_RS04240 CBP48_RS00820 -CTO_RS04240 A5291_RS04250 -CTO_RS04240 KW39_RS04230 -CTO_RS04240 SOTONK1_RS04215 -CTO_RS04240 ECS88FINAL_RS0104300 -CTO_RS04240 IaCS19096_RS04205 -CTO_RS04240 DU10_RS04265 -CTO_RS04240 C15_RS0104325 -CTO_RS04240 DU13_RS04265 -CTO_RS04240 O169_RS04225 -CTO_RS04240 KW36_RS04210 -CTO_RS04240 BKB95_RS04270 -CTO_RS04240 CBP42_RS00820 -CTO_RS04240 CTL2C_RS00810 -CTO_RS04240 L1224_RS04190 -CTO_RS04240 BKB96_RS04255 -CTO_RS04240 L1440_RS04185 -CTO_RS04240 BKB99_RS04250 -CTO_RS04240 SW2_RS04220 -CTO_RS04240 ECS102511_RS04210 -CTO_RS04240 CBP44_RS00820 -CTO_RS04240 CTB_RS04245 -CTO_RS04240 L2BUCH2_RS04190 -CTO_RS04240 SOTONIA3_RS04230 -CTO_RS04240 BKB92_RS04250 -CTO_RS04405 CTO_RS04405 -CTO_RS04405 BKB92_RS04420 -CTO_RS04405 L2BLST_RS04355 -CTO_RS04405 BBV13_RS04420 -CTO_RS04405 AP288_RS02685 -CTO_RS04405 BBV16_RS04425 -CTO_RS04405 E150_RS04390 -CTO_RS04405 gnl|Prokka|PADJNBJD_00858 -CTO_RS04405 BW688_RS00990 -CTO_RS04405 7618741 -CTO_RS04405 119965 -CTO_RS04405 FCS84708_RS04375 -CTO_RS04405 AQ199_RS00310 -CTO_RS04405 NILJEPDF_00859 -CTO_RS04405 LJHENM_04320 -CTO_RS04405 L3404_RS04350 -CTO_RS04405 G9768_RS04380 -CTO_RS04405 AQ193_RS04390 -CTO_RS04405 JIEJKO_04320 -CTO_RS04405 QSDFRQ_00859 -CTO_RS04405 BKB93_RS04425 -CTO_RS04405 BKC02_RS04420 -CTO_RS04405 AQ244_RS02370 -CTO_RS04405 CTRC943_RS04360 -CTO_RS04405 BKC01_RS04425 -CTO_RS04405 AKW53_RS01100 -CTO_RS04405 AOT15_RS01960 -CTO_RS04405 CTJTET1_RS04550 -CTO_RS04405 CBP48_RS00990 -CTO_RS04405 BKC03_RS04420 -CTO_RS04405 A5291_RS04415 -CTO_RS04405 KW39_RS04395 -CTO_RS04405 SOTONK1_RS04380 -CTO_RS04405 IaCS19096_RS04375 -CTO_RS04405 C15_RS0104490 -CTO_RS04405 ECS88FINAL_RS0104470 -CTO_RS04405 DU10_RS04435 -CTO_RS04405 KW36_RS04380 -CTO_RS04405 DU13_RS04435 -CTO_RS04405 O169_RS04395 -CTO_RS04405 CBP42_RS00990 -CTO_RS04405 CTL2C_RS00975 -CTO_RS04405 L1224_RS04355 -CTO_RS04405 BKB95_RS04440 -CTO_RS04405 L1440_RS04350 -CTO_RS04405 BKB96_RS04425 -CTO_RS04405 BKB99_RS04420 -CTO_RS04405 SW2_RS04385 -CTO_RS04405 ECS102511_RS04380 -CTO_RS04405 CBP44_RS00990 -CTO_RS04405 L2BUCH2_RS04355 -CTO_RS04405 CTB_RS04410 -CTO_RS04405 SOTONIA3_RS04395 -CTO_RS04560 CTO_RS04560 -CTO_RS04560 BBV13_RS04580 -CTO_RS04560 BKB92_RS04595 -CTO_RS04560 AP288_RS02845 -CTO_RS04560 BBV16_RS04585 -CTO_RS04560 E150_RS04550 -CTO_RS04560 gnl|Prokka|PADJNBJD_00890 -CTO_RS04560 L2BLST_RS04515 -CTO_RS04560 FCS84708_RS04535 -CTO_RS04560 AQ199_RS00470 -CTO_RS04560 NILJEPDF_00891 -CTO_RS04560 BW688_RS01165 -CTO_RS04560 119881 -CTO_RS04560 JIEJKO_04480 -CTO_RS04560 7618333 -CTO_RS04560 QSDFRQ_00891 -CTO_RS04560 G9768_RS04535 -CTO_RS04560 LJHENM_04490 -CTO_RS04560 L3404_RS04510 -CTO_RS04560 AQ193_RS04230 -CTO_RS04560 BKB93_RS04600 -CTO_RS04560 BKC02_RS04590 -CTO_RS04560 AQ244_RS02215 -CTO_RS04560 AKW53_RS01260 -CTO_RS04560 BKC01_RS04595 -CTO_RS04560 CTRC943_RS04520 -CTO_RS04560 AOT15_RS02115 -CTO_RS04560 CTJTET1_RS04705 -CTO_RS04560 KW39_RS04555 -CTO_RS04560 BKC03_RS04590 -CTO_RS04560 CBP48_RS01165 -CTO_RS04560 A5291_RS04570 -CTO_RS04560 SOTONK1_RS04535 -CTO_RS04560 ECS88FINAL_RS0104645 -CTO_RS04560 IaCS19096_RS04530 -CTO_RS04560 C15_RS0104665 -CTO_RS04560 DU10_RS04610 -CTO_RS04560 O169_RS04555 -CTO_RS04560 KW36_RS04535 -CTO_RS04560 DU13_RS04610 -CTO_RS04560 BKB95_RS04610 -CTO_RS04560 CBP42_RS01165 -CTO_RS04560 CTL2C_RS01135 -CTO_RS04560 L1224_RS04515 -CTO_RS04560 BKB96_RS04595 -CTO_RS04560 L1440_RS04510 -CTO_RS04560 BKB99_RS04590 -CTO_RS04560 SW2_RS04545 -CTO_RS04560 ECS102511_RS04540 -CTO_RS04560 CBP44_RS01165 -CTO_RS04560 CTB_RS04565 -CTO_RS04560 L2BUCH2_RS04515 -CTO_RS04560 SOTONIA3_RS04550 -LJHENM_00240 LJHENM_00240 -LJHENM_00240 BKC01_RS00245 -LJHENM_00240 7618379 -LJHENM_00240 A5291_RS00240 -LJHENM_00240 SOTONK1_RS00240 -LJHENM_00240 L3404_RS00240 -LJHENM_00240 AOT15_RS00715 -LJHENM_00240 AKW53_RS01730 -LJHENM_00240 QSDFRQ_00047 -LJHENM_00240 IaCS19096_RS00240 -LJHENM_00240 BKC03_RS00245 -LJHENM_00240 C15_RS0100240 -LJHENM_00240 DU10_RS00245 -LJHENM_00240 CTRC943_RS00240 -LJHENM_00240 CTJTET1_RS00240 -LJHENM_00240 O169_RS00240 -LJHENM_00240 CBP48_RS01635 -LJHENM_00240 ECS88FINAL_RS0100245 -LJHENM_00240 DU13_RS00245 -LJHENM_00240 KW39_RS00240 -LJHENM_00240 KW36_RS00240 -LJHENM_00240 BKB95_RS00245 -LJHENM_00240 SW2_RS00240 -LJHENM_00240 ECS102511_RS00240 -LJHENM_00240 CTL2C_RS01605 -LJHENM_00240 CBP42_RS01635 -LJHENM_00240 CTB_RS00240 -LJHENM_00240 L1224_RS00240 -LJHENM_00240 AQ193_RS03765 -LJHENM_00240 BKB96_RS00245 -LJHENM_00240 L1440_RS00240 -LJHENM_00240 AQ244_RS01750 -LJHENM_00240 BKB99_RS00245 -LJHENM_00240 BKB92_RS00245 -LJHENM_00240 CTO_RS00240 -LJHENM_00240 SOTONIA3_RS00240 -LJHENM_00240 119242 -LJHENM_00240 CBP44_RS01640 -LJHENM_00240 E150_RS00240 -LJHENM_00240 L2BUCH2_RS00240 -LJHENM_00240 BKB93_RS00245 -LJHENM_00240 FCS84708_RS00240 -LJHENM_00240 AP288_RS03310 -LJHENM_00240 BBV13_RS00245 -LJHENM_00240 AQ199_RS00935 -LJHENM_00240 BW688_RS01635 -LJHENM_00240 G9768_RS00240 -LJHENM_00240 L2BLST_RS00240 -LJHENM_00240 BKC02_RS00245 -LJHENM_00240 gnl|Prokka|PADJNBJD_00047 -LJHENM_00240 BBV16_RS00245 -LJHENM_00240 JIEJKO_00230 -LJHENM_00240 NILJEPDF_00047 -LJHENM_00895 LJHENM_00895 -LJHENM_00895 CTRC943_RS00895 -LJHENM_00895 CTJTET1_RS00925 -LJHENM_00895 C15_RS0100945 -LJHENM_00895 SOTONK1_RS00910 -LJHENM_00895 ECS88FINAL_RS0100930 -LJHENM_00895 KW39_RS00915 -LJHENM_00895 JIEJKO_00895 -LJHENM_00895 7618447 -LJHENM_00895 A5291_RS00935 -LJHENM_00895 IaCS19096_RS00910 -LJHENM_00895 QSDFRQ_00178 -LJHENM_00895 O169_RS00915 -LJHENM_00895 DU13_RS00920 -LJHENM_00895 SW2_RS00905 -LJHENM_00895 BKB95_RS00925 -LJHENM_00895 CBP48_RS02300 -LJHENM_00895 KW36_RS00910 -LJHENM_00895 ECS102511_RS00905 -LJHENM_00895 BKB96_RS00910 -LJHENM_00895 CTL2C_RS02260 -LJHENM_00895 BKB99_RS00910 -LJHENM_00895 L1224_RS00890 -LJHENM_00895 AOT15_RS01455 -LJHENM_00895 L1440_RS00890 -LJHENM_00895 AQ244_RS03090 -LJHENM_00895 BKB92_RS00910 -LJHENM_00895 CBP42_RS02300 -LJHENM_00895 SOTONIA3_RS00925 -LJHENM_00895 E150_RS00905 -LJHENM_00895 CTB_RS00935 -LJHENM_00895 L2BUCH2_RS00895 -LJHENM_00895 CTO_RS00935 -LJHENM_00895 FCS84708_RS00905 -LJHENM_00895 AP288_RS03975 -LJHENM_00895 BKB93_RS00910 -LJHENM_00895 CBP44_RS02305 -LJHENM_00895 AQ199_RS01600 -LJHENM_00895 L2BLST_RS00895 -LJHENM_00895 BW688_RS02305 -LJHENM_00895 AQ193_RS03085 -LJHENM_00895 BBV13_RS00940 -LJHENM_00895 G9768_RS00915 -LJHENM_00895 BKC02_RS00910 -LJHENM_00895 L3404_RS00890 -LJHENM_00895 AKW53_RS02400 -LJHENM_00895 119352 -LJHENM_00895 BBV16_RS00940 -LJHENM_00895 BKC01_RS00910 -LJHENM_00895 DU10_RS00920 -LJHENM_00895 gnl|Prokka|PADJNBJD_00178 -LJHENM_00895 BKC03_RS00910 -LJHENM_00895 NILJEPDF_00178 -LJHENM_01065 LJHENM_01065 -LJHENM_01065 CTRC943_RS01065 -LJHENM_01065 CTJTET1_RS01095 -LJHENM_01065 C15_RS0101115 -LJHENM_01065 SOTONK1_RS01080 -LJHENM_01065 ECS88FINAL_RS0101100 -LJHENM_01065 KW39_RS01085 -LJHENM_01065 JIEJKO_01065 -LJHENM_01065 A5291_RS01105 -LJHENM_01065 IaCS19096_RS01080 -LJHENM_01065 7618465 -LJHENM_01065 QSDFRQ_00212 -LJHENM_01065 O169_RS01085 -LJHENM_01065 DU13_RS01090 -LJHENM_01065 SW2_RS01075 -LJHENM_01065 BKB95_RS01095 -LJHENM_01065 CBP48_RS02470 -LJHENM_01065 KW36_RS01080 -LJHENM_01065 ECS102511_RS01075 -LJHENM_01065 BKB96_RS01080 -LJHENM_01065 CTL2C_RS02430 -LJHENM_01065 BKB99_RS01080 -LJHENM_01065 L1224_RS01060 -LJHENM_01065 AOT15_RS01285 -LJHENM_01065 L1440_RS01060 -LJHENM_01065 AQ244_RS03260 -LJHENM_01065 BKB92_RS01080 -LJHENM_01065 CBP42_RS02470 -LJHENM_01065 SOTONIA3_RS01095 -LJHENM_01065 E150_RS01075 -LJHENM_01065 CTB_RS01105 -LJHENM_01065 L2BUCH2_RS01065 -LJHENM_01065 CTO_RS01105 -LJHENM_01065 FCS84708_RS01075 -LJHENM_01065 AP288_RS04145 -LJHENM_01065 BKB93_RS01080 -LJHENM_01065 CBP44_RS02475 -LJHENM_01065 AQ199_RS01770 -LJHENM_01065 L2BLST_RS01065 -LJHENM_01065 BW688_RS02475 -LJHENM_01065 AQ193_RS02915 -LJHENM_01065 BBV13_RS01110 -LJHENM_01065 G9768_RS01085 -LJHENM_01065 BKC02_RS01080 -LJHENM_01065 L3404_RS01060 -LJHENM_01065 AKW53_RS02570 -LJHENM_01065 BBV16_RS01110 -LJHENM_01065 BKC01_RS01080 -LJHENM_01065 119380 -LJHENM_01065 DU10_RS01090 -LJHENM_01065 gnl|Prokka|PADJNBJD_00212 -LJHENM_01065 BKC03_RS01080 -LJHENM_01065 NILJEPDF_00212 -LJHENM_01245 LJHENM_01245 -LJHENM_01245 BKC03_RS01265 -LJHENM_01245 120475 -LJHENM_01245 CTRC943_RS01250 -LJHENM_01245 CTJTET1_RS01280 -LJHENM_01245 KW39_RS01270 -LJHENM_01245 JIEJKO_01245 -LJHENM_01245 C15_RS0101300 -LJHENM_01245 SOTONK1_RS01265 -LJHENM_01245 ECS88FINAL_RS0101285 -LJHENM_01245 QSDFRQ_00248 -LJHENM_01245 A5291_RS01290 -LJHENM_01245 IaCS19096_RS01265 -LJHENM_01245 O169_RS01270 -LJHENM_01245 DU13_RS01275 -LJHENM_01245 7618895 -LJHENM_01245 SW2_RS01260 -LJHENM_01245 BKB95_RS01280 -LJHENM_01245 CBP48_RS02655 -LJHENM_01245 KW36_RS01265 -LJHENM_01245 ECS102511_RS01260 -LJHENM_01245 BKB96_RS01265 -LJHENM_01245 CTL2C_RS02615 -LJHENM_01245 AOT15_RS01100 -LJHENM_01245 BKB99_RS01265 -LJHENM_01245 L1224_RS01245 -LJHENM_01245 L1440_RS01245 -LJHENM_01245 AQ244_RS03445 -LJHENM_01245 BKB92_RS01265 -LJHENM_01245 CBP42_RS02655 -LJHENM_01245 SOTONIA3_RS01280 -LJHENM_01245 CTB_RS01290 -LJHENM_01245 E150_RS01260 -LJHENM_01245 L2BUCH2_RS01250 -LJHENM_01245 CTO_RS01290 -LJHENM_01245 FCS84708_RS01260 -LJHENM_01245 AP288_RS04330 -LJHENM_01245 BKB93_RS01265 -LJHENM_01245 CBP44_RS02660 -LJHENM_01245 AQ193_RS02730 -LJHENM_01245 AQ199_RS01955 -LJHENM_01245 L2BLST_RS01250 -LJHENM_01245 BW688_RS02660 -LJHENM_01245 BBV13_RS01295 -LJHENM_01245 G9768_RS01270 -LJHENM_01245 BKC02_RS01265 -LJHENM_01245 L3404_RS01245 -LJHENM_01245 AKW53_RS02755 -LJHENM_01245 BBV16_RS01295 -LJHENM_01245 BKC01_RS01265 -LJHENM_01245 gnl|Prokka|PADJNBJD_00248 -LJHENM_01245 DU10_RS01275 -LJHENM_01245 NILJEPDF_00248 -LJHENM_01410 LJHENM_01410 -LJHENM_01410 BKC03_RS01430 -LJHENM_01410 CTRC943_RS01410 -LJHENM_01410 CTJTET1_RS01440 -LJHENM_01410 KW39_RS01430 -LJHENM_01410 JIEJKO_01410 -LJHENM_01410 120450 -LJHENM_01410 C15_RS0101465 -LJHENM_01410 SOTONK1_RS01430 -LJHENM_01410 ECS88FINAL_RS0101450 -LJHENM_01410 QSDFRQ_00280 -LJHENM_01410 IaCS19096_RS01425 -LJHENM_01410 A5291_RS01455 -LJHENM_01410 O169_RS01435 -LJHENM_01410 DU13_RS01440 -LJHENM_01410 7618911 -LJHENM_01410 SW2_RS01420 -LJHENM_01410 BKB95_RS01445 -LJHENM_01410 CBP48_RS02820 -LJHENM_01410 KW36_RS01425 -LJHENM_01410 ECS102511_RS01420 -LJHENM_01410 AOT15_RS02425 -LJHENM_01410 BKB96_RS01430 -LJHENM_01410 CTL2C_RS02775 -LJHENM_01410 BKB99_RS01430 -LJHENM_01410 L1224_RS01405 -LJHENM_01410 L1440_RS01405 -LJHENM_01410 AQ244_RS03610 -LJHENM_01410 CBP42_RS02820 -LJHENM_01410 SOTONIA3_RS01440 -LJHENM_01410 BKB92_RS01435 -LJHENM_01410 CTB_RS01455 -LJHENM_01410 E150_RS01425 -LJHENM_01410 L2BUCH2_RS01410 -LJHENM_01410 CTO_RS01450 -LJHENM_01410 FCS84708_RS01420 -LJHENM_01410 AP288_RS04490 -LJHENM_01410 AQ193_RS02565 -LJHENM_01410 BKB93_RS01435 -LJHENM_01410 CBP44_RS02825 -LJHENM_01410 AQ199_RS02115 -LJHENM_01410 L2BLST_RS01410 -LJHENM_01410 BBV13_RS01460 -LJHENM_01410 BW688_RS02830 -LJHENM_01410 G9768_RS01430 -LJHENM_01410 BKC02_RS01430 -LJHENM_01410 AKW53_RS02920 -LJHENM_01410 BBV16_RS01460 -LJHENM_01410 L3404_RS01405 -LJHENM_01410 BKC01_RS01435 -LJHENM_01410 gnl|Prokka|PADJNBJD_00280 -LJHENM_01410 DU10_RS01440 -LJHENM_01410 NILJEPDF_00280 -LJHENM_01745 LJHENM_01745 -LJHENM_01745 JIEJKO_01740 -LJHENM_01745 BKC03_RS01765 -LJHENM_01745 CTJTET1_RS01770 -LJHENM_01745 DU10_RS01785 -LJHENM_01745 QSDFRQ_00346 -LJHENM_01745 C15_RS0101800 -LJHENM_01745 SOTONK1_RS01760 -LJHENM_01745 A5291_RS01785 -LJHENM_01745 KW39_RS01770 -LJHENM_01745 IaCS19096_RS01755 -LJHENM_01745 119459 -LJHENM_01745 ECS88FINAL_RS0101790 -LJHENM_01745 O169_RS01770 -LJHENM_01745 AP288_RS01320 -LJHENM_01745 DU13_RS01780 -LJHENM_01745 7618516 -LJHENM_01745 CTL2C_RS03105 -LJHENM_01745 BKB95_RS01780 -LJHENM_01745 CBP48_RS03165 -LJHENM_01745 L1224_RS01735 -LJHENM_01745 KW36_RS01755 -LJHENM_01745 AOT15_RS02755 -LJHENM_01745 BKB96_RS01765 -LJHENM_01745 SW2_RS01760 -LJHENM_01745 BKB99_RS01765 -LJHENM_01745 L1440_RS01735 -LJHENM_01745 ECS102511_RS01760 -LJHENM_01745 AQ244_RS01350 -LJHENM_01745 CBP42_RS03165 -LJHENM_01745 CTB_RS01785 -LJHENM_01745 SOTONIA3_RS01770 -LJHENM_01745 L2BUCH2_RS01735 -LJHENM_01745 BKB92_RS01775 -LJHENM_01745 CTO_RS01785 -LJHENM_01745 E150_RS01765 -LJHENM_01745 AQ193_RS02225 -LJHENM_01745 L2BLST_RS01735 -LJHENM_01745 FCS84708_RS01755 -LJHENM_01745 BW688_RS03165 -LJHENM_01745 BKB93_RS01775 -LJHENM_01745 CBP44_RS03170 -LJHENM_01745 BBV13_RS01790 -LJHENM_01745 AQ199_RS02455 -LJHENM_01745 G9768_RS01760 -LJHENM_01745 L3404_RS01735 -LJHENM_01745 BBV16_RS01790 -LJHENM_01745 BKC02_RS01765 -LJHENM_01745 BKC01_RS01765 -LJHENM_01745 AKW53_RS03260 -LJHENM_01745 gnl|Prokka|PADJNBJD_00346 -LJHENM_01745 NILJEPDF_00346 -LJHENM_01745 CTRC943_RS01740 -LJHENM_01910 LJHENM_01910 -LJHENM_01910 JIEJKO_01905 -LJHENM_01910 BKC03_RS01930 -LJHENM_01910 CTJTET1_RS01935 -LJHENM_01910 QSDFRQ_00379 -LJHENM_01910 C15_RS0101970 -LJHENM_01910 SOTONK1_RS01925 -LJHENM_01910 DU10_RS01955 -LJHENM_01910 A5291_RS01950 -LJHENM_01910 KW39_RS01935 -LJHENM_01910 IaCS19096_RS01920 -LJHENM_01910 ECS88FINAL_RS0101960 -LJHENM_01910 O169_RS01935 -LJHENM_01910 AP288_RS01155 -LJHENM_01910 DU13_RS01950 -LJHENM_01910 7618968 -LJHENM_01910 120347 -LJHENM_01910 CTL2C_RS03270 -LJHENM_01910 L1224_RS01900 -LJHENM_01910 KW36_RS01920 -LJHENM_01910 AOT15_RS02920 -LJHENM_01910 BKB95_RS01950 -LJHENM_01910 BKB96_RS01930 -LJHENM_01910 CBP48_RS03335 -LJHENM_01910 SW2_RS01925 -LJHENM_01910 BKB99_RS01930 -LJHENM_01910 L1440_RS01900 -LJHENM_01910 ECS102511_RS01925 -LJHENM_01910 AQ244_RS01185 -LJHENM_01910 CTB_RS01950 -LJHENM_01910 SOTONIA3_RS01935 -LJHENM_01910 L2BUCH2_RS01900 -LJHENM_01910 BKB92_RS01940 -LJHENM_01910 CBP42_RS03345 -LJHENM_01910 CTO_RS01950 -LJHENM_01910 E150_RS01930 -LJHENM_01910 AQ193_RS02060 -LJHENM_01910 L2BLST_RS01900 -LJHENM_01910 BW688_RS03330 -LJHENM_01910 FCS84708_RS01920 -LJHENM_01910 BKB93_RS01940 -LJHENM_01910 BBV13_RS01955 -LJHENM_01910 CBP44_RS03340 -LJHENM_01910 AQ199_RS02620 -LJHENM_01910 G9768_RS01925 -LJHENM_01910 L3404_RS01900 -LJHENM_01910 BBV16_RS01955 -LJHENM_01910 BKC02_RS01930 -LJHENM_01910 BKC01_RS01930 -LJHENM_01910 AKW53_RS03425 -LJHENM_01910 gnl|Prokka|PADJNBJD_00379 -LJHENM_01910 NILJEPDF_00379 -LJHENM_01910 CTRC943_RS01905 -LJHENM_02070 LJHENM_02070 -LJHENM_02070 JIEJKO_02065 -LJHENM_02070 BKC03_RS02090 -LJHENM_02070 CTJTET1_RS02095 -LJHENM_02070 QSDFRQ_00411 -LJHENM_02070 C15_RS0102130 -LJHENM_02070 A5291_RS02110 -LJHENM_02070 SOTONK1_RS02085 -LJHENM_02070 DU10_RS02115 -LJHENM_02070 KW39_RS02095 -LJHENM_02070 IaCS19096_RS02080 -LJHENM_02070 ECS88FINAL_RS0102125 -LJHENM_02070 O169_RS02095 -LJHENM_02070 AP288_RS00995 -LJHENM_02070 DU13_RS02110 -LJHENM_02070 7618985 -LJHENM_02070 CTL2C_RS03430 -LJHENM_02070 CBP48_RS03495 -LJHENM_02070 120320 -LJHENM_02070 L1224_RS02060 -LJHENM_02070 KW36_RS02080 -LJHENM_02070 AOT15_RS03080 -LJHENM_02070 BKB95_RS02110 -LJHENM_02070 BKB96_RS02090 -LJHENM_02070 SW2_RS02085 -LJHENM_02070 BKB99_RS02090 -LJHENM_02070 L1440_RS02060 -LJHENM_02070 ECS102511_RS02085 -LJHENM_02070 AQ244_RS01025 -LJHENM_02070 CTB_RS02110 -LJHENM_02070 CBP42_RS03505 -LJHENM_02070 SOTONIA3_RS02095 -LJHENM_02070 L2BUCH2_RS02060 -LJHENM_02070 BKB92_RS02100 -LJHENM_02070 CTO_RS02110 -LJHENM_02070 E150_RS02090 -LJHENM_02070 AQ193_RS01900 -LJHENM_02070 L2BLST_RS02060 -LJHENM_02070 BW688_RS03490 -LJHENM_02070 FCS84708_RS02080 -LJHENM_02070 BBV13_RS02115 -LJHENM_02070 BKB93_RS02100 -LJHENM_02070 CBP44_RS03500 -LJHENM_02070 AQ199_RS02780 -LJHENM_02070 G9768_RS02085 -LJHENM_02070 BBV16_RS02115 -LJHENM_02070 L3404_RS02060 -LJHENM_02070 BKC02_RS02090 -LJHENM_02070 BKC01_RS02090 -LJHENM_02070 AKW53_RS03585 -LJHENM_02070 gnl|Prokka|PADJNBJD_00411 -LJHENM_02070 NILJEPDF_00411 -LJHENM_02070 CTRC943_RS02065 -LJHENM_02405 LJHENM_02405 -LJHENM_02405 CTRC943_RS02400 -LJHENM_02405 JIEJKO_02405 -LJHENM_02405 QSDFRQ_00477 -LJHENM_02405 BKC03_RS02440 -LJHENM_02405 CTJTET1_RS02430 -LJHENM_02405 AOT15_RS00045 -LJHENM_02405 AP288_RS00660 -LJHENM_02405 C15_RS0102480 -LJHENM_02405 SOTONK1_RS02420 -LJHENM_02405 DU10_RS02460 -LJHENM_02405 KW39_RS02430 -LJHENM_02405 IaCS19096_RS02415 -LJHENM_02405 A5291_RS02455 -LJHENM_02405 ECS88FINAL_RS0102475 -LJHENM_02405 7618583 -LJHENM_02405 O169_RS02430 -LJHENM_02405 DU13_RS02455 -LJHENM_02405 CBP48_RS03840 -LJHENM_02405 AQ244_RS00690 -LJHENM_02405 BKB95_RS02455 -LJHENM_02405 BKB96_RS02445 -LJHENM_02405 BKB99_RS02440 -LJHENM_02405 CTL2C_RS03770 -LJHENM_02405 KW36_RS02415 -LJHENM_02405 119565 -LJHENM_02405 L1224_RS02400 -LJHENM_02405 SW2_RS02425 -LJHENM_02405 ECS102511_RS02420 -LJHENM_02405 L1440_RS02400 -LJHENM_02405 CBP42_RS03850 -LJHENM_02405 L2BUCH2_RS02395 -LJHENM_02405 AQ193_RS01565 -LJHENM_02405 BKB92_RS02445 -LJHENM_02405 CTB_RS02455 -LJHENM_02405 SOTONIA3_RS02435 -LJHENM_02405 E150_RS02425 -LJHENM_02405 CTO_RS02455 -LJHENM_02405 BBV13_RS02460 -LJHENM_02405 BW688_RS03840 -LJHENM_02405 CBP44_RS03845 -LJHENM_02405 L2BLST_RS02400 -LJHENM_02405 FCS84708_RS02415 -LJHENM_02405 BKB93_RS02450 -LJHENM_02405 BBV16_RS02465 -LJHENM_02405 AQ199_RS03115 -LJHENM_02405 G9768_RS02420 -LJHENM_02405 L3404_RS02395 -LJHENM_02405 BKC02_RS02440 -LJHENM_02405 gnl|Prokka|PADJNBJD_00477 -LJHENM_02405 AKW53_RS03920 -LJHENM_02405 BKC01_RS02440 -LJHENM_02405 NILJEPDF_00477 -LJHENM_02580 LJHENM_02580 -LJHENM_02580 CTRC943_RS02580 -LJHENM_02580 AKW53_RS04615 -LJHENM_02580 SOTONK1_RS02600 -LJHENM_02580 CTJTET1_RS02610 -LJHENM_02580 JIEJKO_02585 -LJHENM_02580 BKC03_RS02620 -LJHENM_02580 QSDFRQ_00513 -LJHENM_02580 KW39_RS02610 -LJHENM_02580 C15_RS0102665 -LJHENM_02580 ECS88FINAL_RS0102660 -LJHENM_02580 IaCS19096_RS02595 -LJHENM_02580 DU10_RS02640 -LJHENM_02580 O169_RS02610 -LJHENM_02580 AP288_RS00480 -LJHENM_02580 A5291_RS02635 -LJHENM_02580 DU13_RS02635 -LJHENM_02580 CBP48_RS04020 -LJHENM_02580 CTL2C_RS03950 -LJHENM_02580 KW36_RS02595 -LJHENM_02580 BKB95_RS02635 -LJHENM_02580 BKB96_RS02625 -LJHENM_02580 BKB99_RS02620 -LJHENM_02580 7619027 -LJHENM_02580 SW2_RS02605 -LJHENM_02580 L1224_RS02580 -LJHENM_02580 ECS102511_RS02600 -LJHENM_02580 AQ244_RS00510 -LJHENM_02580 L1440_RS02580 -LJHENM_02580 CBP42_RS04030 -LJHENM_02580 120251 -LJHENM_02580 L2BUCH2_RS02580 -LJHENM_02580 SOTONIA3_RS02615 -LJHENM_02580 BKB92_RS02625 -LJHENM_02580 CTB_RS02635 -LJHENM_02580 E150_RS02605 -LJHENM_02580 AQ193_RS01385 -LJHENM_02580 BW688_RS04020 -LJHENM_02580 CTO_RS02635 -LJHENM_02580 FCS84708_RS02595 -LJHENM_02580 AOT15_RS03495 -LJHENM_02580 L2BLST_RS02580 -LJHENM_02580 BBV13_RS02640 -LJHENM_02580 CBP44_RS04025 -LJHENM_02580 AQ199_RS03295 -LJHENM_02580 BKB93_RS02630 -LJHENM_02580 BBV16_RS02650 -LJHENM_02580 G9768_RS02600 -LJHENM_02580 L3404_RS02575 -LJHENM_02580 BKC02_RS02620 -LJHENM_02580 BKC01_RS02620 -LJHENM_02580 gnl|Prokka|PADJNBJD_00513 -LJHENM_02580 NILJEPDF_00513 -LJHENM_02750 LJHENM_02750 -LJHENM_02750 CTRC943_RS02750 -LJHENM_02750 AOT15_RS01570 -LJHENM_02750 QSDFRQ_00546 -LJHENM_02750 JIEJKO_02755 -LJHENM_02750 SOTONK1_RS02770 -LJHENM_02750 CTJTET1_RS02780 -LJHENM_02750 BKC03_RS02795 -LJHENM_02750 KW39_RS02780 -LJHENM_02750 AP288_RS00310 -LJHENM_02750 C15_RS0102840 -LJHENM_02750 ECS88FINAL_RS0102835 -LJHENM_02750 IaCS19096_RS02765 -LJHENM_02750 DU10_RS02815 -LJHENM_02750 O169_RS02780 -LJHENM_02750 A5291_RS02805 -LJHENM_02750 DU13_RS02810 -LJHENM_02750 AQ244_RS00340 -LJHENM_02750 CBP48_RS04195 -LJHENM_02750 7619057 -LJHENM_02750 CTL2C_RS04120 -LJHENM_02750 KW36_RS02765 -LJHENM_02750 AKW53_RS03995 -LJHENM_02750 BKB95_RS02810 -LJHENM_02750 BKB96_RS02800 -LJHENM_02750 BKB99_RS02795 -LJHENM_02750 SW2_RS02775 -LJHENM_02750 L1224_RS02750 -LJHENM_02750 ECS102511_RS02770 -LJHENM_02750 L1440_RS02750 -LJHENM_02750 120205 -LJHENM_02750 CBP42_RS04205 -LJHENM_02750 L2BUCH2_RS02750 -LJHENM_02750 SOTONIA3_RS02785 -LJHENM_02750 AQ193_RS01215 -LJHENM_02750 BKB92_RS02800 -LJHENM_02750 CTB_RS02805 -LJHENM_02750 E150_RS02775 -LJHENM_02750 BW688_RS04195 -LJHENM_02750 CTO_RS02805 -LJHENM_02750 FCS84708_RS02765 -LJHENM_02750 L2BLST_RS02750 -LJHENM_02750 BBV13_RS02810 -LJHENM_02750 CBP44_RS04200 -LJHENM_02750 AQ199_RS03465 -LJHENM_02750 BKB93_RS02805 -LJHENM_02750 BBV16_RS02820 -LJHENM_02750 G9768_RS02770 -LJHENM_02750 L3404_RS02745 -LJHENM_02750 BKC02_RS02795 -LJHENM_02750 gnl|Prokka|PADJNBJD_00546 -LJHENM_02750 NILJEPDF_00546 -LJHENM_02750 BKC01_RS02795 -LJHENM_02915 LJHENM_02915 -LJHENM_02915 CTRC943_RS02915 -LJHENM_02915 QSDFRQ_00579 -LJHENM_02915 JIEJKO_02920 -LJHENM_02915 SOTONK1_RS02935 -LJHENM_02915 CTJTET1_RS02945 -LJHENM_02915 AP288_RS00145 -LJHENM_02915 BKC03_RS02965 -LJHENM_02915 C15_RS0103005 -LJHENM_02915 KW39_RS02950 -LJHENM_02915 IaCS19096_RS02930 -LJHENM_02915 ECS88FINAL_RS0103005 -LJHENM_02915 DU10_RS02985 -LJHENM_02915 A5291_RS02970 -LJHENM_02915 O169_RS02945 -LJHENM_02915 AQ244_RS00175 -LJHENM_02915 DU13_RS02980 -LJHENM_02915 CBP48_RS04365 -LJHENM_02915 CTL2C_RS04285 -LJHENM_02915 KW36_RS02930 -LJHENM_02915 BKB95_RS02980 -LJHENM_02915 BKB96_RS02970 -LJHENM_02915 BKB99_RS02965 -LJHENM_02915 L1224_RS02915 -LJHENM_02915 AKW53_RS04165 -LJHENM_02915 7618612 -LJHENM_02915 SW2_RS02940 -LJHENM_02915 ECS102511_RS02935 -LJHENM_02915 L1440_RS02915 -LJHENM_02915 CBP42_RS04375 -LJHENM_02915 L2BUCH2_RS02915 -LJHENM_02915 AQ193_RS01050 -LJHENM_02915 119610 -LJHENM_02915 SOTONIA3_RS02950 -LJHENM_02915 CTB_RS02970 -LJHENM_02915 BKB92_RS02970 -LJHENM_02915 E150_RS02940 -LJHENM_02915 BW688_RS04365 -LJHENM_02915 CTO_RS02970 -LJHENM_02915 L2BLST_RS02915 -LJHENM_02915 FCS84708_RS02935 -LJHENM_02915 BBV13_RS02975 -LJHENM_02915 CBP44_RS04370 -LJHENM_02915 AQ199_RS03635 -LJHENM_02915 BBV16_RS02985 -LJHENM_02915 BKB93_RS02975 -LJHENM_02915 G9768_RS02935 -LJHENM_02915 L3404_RS02910 -LJHENM_02915 BKC02_RS02965 -LJHENM_02915 gnl|Prokka|PADJNBJD_00579 -LJHENM_02915 AOT15_RS03735 -LJHENM_02915 NILJEPDF_00579 -LJHENM_02915 BKC01_RS02965 -LJHENM_03075 LJHENM_03075 -LJHENM_03075 BKC02_RS03140 -LJHENM_03075 AOT15_RS03910 -LJHENM_03075 AP288_RS01475 -LJHENM_03075 CTRC943_RS03080 -LJHENM_03075 BKC01_RS03140 -LJHENM_03075 QSDFRQ_00612 -LJHENM_03075 JIEJKO_03085 -LJHENM_03075 SOTONK1_RS03110 -LJHENM_03075 CTJTET1_RS03120 -LJHENM_03075 BKC03_RS03140 -LJHENM_03075 KW39_RS03120 -LJHENM_03075 C15_RS0103175 -LJHENM_03075 ECS88FINAL_RS0103175 -LJHENM_03075 IaCS19096_RS03105 -LJHENM_03075 DU10_RS03155 -LJHENM_03075 A5291_RS03140 -LJHENM_03075 O169_RS03115 -LJHENM_03075 AQ244_RS04805 -LJHENM_03075 CTL2C_RS04450 -LJHENM_03075 DU13_RS03150 -LJHENM_03075 CBP48_RS04540 -LJHENM_03075 L1224_RS03080 -LJHENM_03075 KW36_RS03105 -LJHENM_03075 BKB95_RS03150 -LJHENM_03075 AKW53_RS04335 -LJHENM_03075 BKB96_RS03145 -LJHENM_03075 BKB99_RS03140 -LJHENM_03075 7618632 -LJHENM_03075 SW2_RS03110 -LJHENM_03075 L1440_RS03080 -LJHENM_03075 ECS102511_RS03105 -LJHENM_03075 AQ193_RS00880 -LJHENM_03075 CBP42_RS04545 -LJHENM_03075 L2BUCH2_RS03080 -LJHENM_03075 CTB_RS03140 -LJHENM_03075 SOTONIA3_RS03125 -LJHENM_03075 BKB92_RS03140 -LJHENM_03075 BW688_RS04535 -LJHENM_03075 119641 -LJHENM_03075 E150_RS03110 -LJHENM_03075 CTO_RS03140 -LJHENM_03075 L2BLST_RS03080 -LJHENM_03075 CBP44_RS04540 -LJHENM_03075 FCS84708_RS03105 -LJHENM_03075 BBV13_RS03145 -LJHENM_03075 AQ199_RS03805 -LJHENM_03075 BBV16_RS03155 -LJHENM_03075 BKB93_RS03145 -LJHENM_03075 G9768_RS03110 -LJHENM_03075 L3404_RS03075 -LJHENM_03075 gnl|Prokka|PADJNBJD_00612 -LJHENM_03075 NILJEPDF_00612 -LJHENM_03240 LJHENM_03240 -LJHENM_03240 AOT15_RS04075 -LJHENM_03240 CTRC943_RS03250 -LJHENM_03240 JIEJKO_03245 -LJHENM_03240 BKC01_RS03305 -LJHENM_03240 QSDFRQ_00645 -LJHENM_03240 KW39_RS03290 -LJHENM_03240 BKC03_RS03305 -LJHENM_03240 CTJTET1_RS03290 -LJHENM_03240 ECS88FINAL_RS0103340 -LJHENM_03240 DU10_RS03320 -LJHENM_03240 SOTONK1_RS03275 -LJHENM_03240 O169_RS03285 -LJHENM_03240 IaCS19096_RS03270 -LJHENM_03240 C15_RS0103340 -LJHENM_03240 A5291_RS03315 -LJHENM_03240 AQ244_RS04640 -LJHENM_03240 AKW53_RS00025 -LJHENM_03240 DU13_RS03315 -LJHENM_03240 CTL2C_RS04620 -LJHENM_03240 CBP48_RS04705 -LJHENM_03240 7618651 -LJHENM_03240 SW2_RS03280 -LJHENM_03240 L1224_RS03250 -LJHENM_03240 KW36_RS03275 -LJHENM_03240 ECS102511_RS03275 -LJHENM_03240 L1440_RS03250 -LJHENM_03240 BKB95_RS03320 -LJHENM_03240 BKB96_RS03315 -LJHENM_03240 BKB99_RS03310 -LJHENM_03240 AQ193_RS00710 -LJHENM_03240 CBP42_RS04710 -LJHENM_03240 L2BUCH2_RS03250 -LJHENM_03240 BKB92_RS03305 -LJHENM_03240 CTB_RS03315 -LJHENM_03240 E150_RS03280 -LJHENM_03240 SOTONIA3_RS03295 -LJHENM_03240 BW688_RS04700 -LJHENM_03240 CTO_RS03310 -LJHENM_03240 FCS84708_RS03275 -LJHENM_03240 BBV13_RS03315 -LJHENM_03240 L2BLST_RS03250 -LJHENM_03240 CBP44_RS04705 -LJHENM_03240 119670 -LJHENM_03240 AQ199_RS03975 -LJHENM_03240 BBV16_RS03325 -LJHENM_03240 BKB93_RS03310 -LJHENM_03240 G9768_RS03275 -LJHENM_03240 L3404_RS03245 -LJHENM_03240 gnl|Prokka|PADJNBJD_00644 -LJHENM_03240 AP288_RS01645 -LJHENM_03240 BKC02_RS03305 -LJHENM_03240 NILJEPDF_00645 -LJHENM_03410 LJHENM_03410 -LJHENM_03410 AOT15_RS04245 -LJHENM_03410 AP288_RS01815 -LJHENM_03410 JIEJKO_03415 -LJHENM_03410 BKC01_RS03480 -LJHENM_03410 QSDFRQ_00679 -LJHENM_03410 CTRC943_RS03430 -LJHENM_03410 BKC03_RS03480 -LJHENM_03410 CBP48_RS00050 -LJHENM_03410 CTJTET1_RS03465 -LJHENM_03410 KW39_RS03465 -LJHENM_03410 DU10_RS03495 -LJHENM_03410 SOTONK1_RS03445 -LJHENM_03410 ECS88FINAL_RS0103525 -LJHENM_03410 IaCS19096_RS03440 -LJHENM_03410 C15_RS0103520 -LJHENM_03410 A5291_RS03490 -LJHENM_03410 O169_RS03460 -LJHENM_03410 DU13_RS03495 -LJHENM_03410 AQ244_RS04465 -LJHENM_03410 KW36_RS03445 -LJHENM_03410 AKW53_RS00195 -LJHENM_03410 BKB95_RS03500 -LJHENM_03410 CBP42_RS00050 -LJHENM_03410 SW2_RS03455 -LJHENM_03410 CTL2C_RS00050 -LJHENM_03410 L1224_RS03430 -LJHENM_03410 ECS102511_RS03445 -LJHENM_03410 L1440_RS03430 -LJHENM_03410 BKB96_RS03490 -LJHENM_03410 BKB99_RS03485 -LJHENM_03410 AQ193_RS00540 -LJHENM_03410 CBP44_RS00050 -LJHENM_03410 L2BUCH2_RS03430 -LJHENM_03410 BKB92_RS03480 -LJHENM_03410 CTB_RS03485 -LJHENM_03410 SOTONIA3_RS03465 -LJHENM_03410 E150_RS03455 -LJHENM_03410 CTO_RS03480 -LJHENM_03410 BBV13_RS03485 -LJHENM_03410 FCS84708_RS03445 -LJHENM_03410 L2BLST_RS03430 -LJHENM_03410 7618209 -LJHENM_03410 BBV16_RS03495 -LJHENM_03410 BW688_RS00050 -LJHENM_03410 AQ199_RS04145 -LJHENM_03410 BKB93_RS03485 -LJHENM_03410 119690 -LJHENM_03410 G9768_RS03445 -LJHENM_03410 gnl|Prokka|PADJNBJD_00678 -LJHENM_03410 L3404_RS03425 -LJHENM_03410 BKC02_RS03480 -LJHENM_03410 NILJEPDF_00679 -LJHENM_03575 LJHENM_03575 -LJHENM_03575 AOT15_RS04415 -LJHENM_03575 AP288_RS01980 -LJHENM_03575 JIEJKO_03580 -LJHENM_03575 BKC01_RS03645 -LJHENM_03575 QSDFRQ_00712 -LJHENM_03575 CTRC943_RS03600 -LJHENM_03575 BKC03_RS03645 -LJHENM_03575 CBP48_RS00215 -LJHENM_03575 CTJTET1_RS03635 -LJHENM_03575 KW39_RS03630 -LJHENM_03575 DU10_RS03660 -LJHENM_03575 SOTONK1_RS03615 -LJHENM_03575 ECS88FINAL_RS0103705 -LJHENM_03575 IaCS19096_RS03610 -LJHENM_03575 C15_RS0103695 -LJHENM_03575 A5291_RS03660 -LJHENM_03575 O169_RS03625 -LJHENM_03575 DU13_RS03660 -LJHENM_03575 AQ244_RS04295 -LJHENM_03575 KW36_RS03615 -LJHENM_03575 AKW53_RS00360 -LJHENM_03575 BKB95_RS03665 -LJHENM_03575 CBP42_RS00215 -LJHENM_03575 SW2_RS03620 -LJHENM_03575 CTL2C_RS00215 -LJHENM_03575 L1224_RS03595 -LJHENM_03575 ECS102511_RS03610 -LJHENM_03575 L1440_RS03595 -LJHENM_03575 BKB96_RS03655 -LJHENM_03575 BKB99_RS03650 -LJHENM_03575 AQ193_RS00375 -LJHENM_03575 CBP44_RS00215 -LJHENM_03575 L2BUCH2_RS03595 -LJHENM_03575 BKB92_RS03645 -LJHENM_03575 CTB_RS03655 -LJHENM_03575 SOTONIA3_RS03635 -LJHENM_03575 E150_RS03620 -LJHENM_03575 CTO_RS03650 -LJHENM_03575 BBV13_RS03655 -LJHENM_03575 FCS84708_RS03610 -LJHENM_03575 L2BLST_RS03595 -LJHENM_03575 BBV16_RS03665 -LJHENM_03575 BW688_RS00215 -LJHENM_03575 AQ199_RS04310 -LJHENM_03575 BKB93_RS03650 -LJHENM_03575 7618234 -LJHENM_03575 119729 -LJHENM_03575 G9768_RS03615 -LJHENM_03575 gnl|Prokka|PADJNBJD_00711 -LJHENM_03575 L3404_RS03590 -LJHENM_03575 BKC02_RS03645 -LJHENM_03575 NILJEPDF_00712 -LJHENM_03925 LJHENM_03925 -LJHENM_03925 AOT15_RS04760 -LJHENM_03925 AP288_RS02330 -LJHENM_03925 JIEJKO_03925 -LJHENM_03925 QSDFRQ_00780 -LJHENM_03925 BKC01_RS04000 -LJHENM_03925 CTRC943_RS03945 -LJHENM_03925 AKW53_RS00700 -LJHENM_03925 BKC03_RS03995 -LJHENM_03925 CBP48_RS00565 -LJHENM_03925 CTJTET1_RS03980 -LJHENM_03925 KW39_RS03975 -LJHENM_03925 DU10_RS04010 -LJHENM_03925 A5291_RS04005 -LJHENM_03925 SOTONK1_RS03960 -LJHENM_03925 IaCS19096_RS03955 -LJHENM_03925 DU13_RS04010 -LJHENM_03925 C15_RS0104065 -LJHENM_03925 ECS88FINAL_RS0104070 -LJHENM_03925 O169_RS03970 -LJHENM_03925 KW36_RS03960 -LJHENM_03925 AQ244_RS03950 -LJHENM_03925 BKB95_RS04015 -LJHENM_03925 CBP42_RS00565 -LJHENM_03925 CTL2C_RS00560 -LJHENM_03925 L1224_RS03940 -LJHENM_03925 SW2_RS03965 -LJHENM_03925 L1440_RS03935 -LJHENM_03925 ECS102511_RS03955 -LJHENM_03925 BKB96_RS04000 -LJHENM_03925 BKB99_RS03995 -LJHENM_03925 AQ193_RS00030 -LJHENM_03925 CBP44_RS00565 -LJHENM_03925 L2BUCH2_RS03940 -LJHENM_03925 BKB92_RS03995 -LJHENM_03925 CTB_RS04000 -LJHENM_03925 SOTONIA3_RS03980 -LJHENM_03925 E150_RS03965 -LJHENM_03925 CTO_RS03995 -LJHENM_03925 BBV13_RS04000 -LJHENM_03925 FCS84708_RS03955 -LJHENM_03925 L2BLST_RS03940 -LJHENM_03925 BBV16_RS04010 -LJHENM_03925 7618266 -LJHENM_03925 119778 -LJHENM_03925 BW688_RS00565 -LJHENM_03925 AQ199_RS04655 -LJHENM_03925 BKB93_RS04000 -LJHENM_03925 G9768_RS03960 -LJHENM_03925 gnl|Prokka|PADJNBJD_00779 -LJHENM_03925 L3404_RS03935 -LJHENM_03925 NILJEPDF_00780 -LJHENM_03925 BKC02_RS03995 -LJHENM_04125 LJHENM_04125 -LJHENM_04125 JIEJKO_04125 -LJHENM_04125 BKC02_RS04205 -LJHENM_04125 QSDFRQ_00820 -LJHENM_04125 AKW53_RS00885 -LJHENM_04125 BKC01_RS04210 -LJHENM_04125 CTRC943_RS04155 -LJHENM_04125 AOT15_RS01755 -LJHENM_04125 CTJTET1_RS04345 -LJHENM_04125 KW39_RS04185 -LJHENM_04125 BKC03_RS04205 -LJHENM_04125 CBP48_RS00775 -LJHENM_04125 A5291_RS04210 -LJHENM_04125 ECS88FINAL_RS0104255 -LJHENM_04125 DU10_RS04220 -LJHENM_04125 SOTONK1_RS04170 -LJHENM_04125 IaCS19096_RS04165 -LJHENM_04125 DU13_RS04220 -LJHENM_04125 C15_RS0104280 -LJHENM_04125 O169_RS04180 -LJHENM_04125 KW36_RS04170 -LJHENM_04125 BKB95_RS04225 -LJHENM_04125 CBP42_RS00775 -LJHENM_04125 CTL2C_RS00770 -LJHENM_04125 L1224_RS04150 -LJHENM_04125 BKB96_RS04210 -LJHENM_04125 SW2_RS04175 -LJHENM_04125 L1440_RS04145 -LJHENM_04125 ECS102511_RS04165 -LJHENM_04125 BKB99_RS04205 -LJHENM_04125 AQ193_RS04605 -LJHENM_04125 AQ244_RS02595 -LJHENM_04125 CBP44_RS00775 -LJHENM_04125 CTB_RS04205 -LJHENM_04125 L2BUCH2_RS04150 -LJHENM_04125 BKB92_RS04205 -LJHENM_04125 SOTONIA3_RS04190 -LJHENM_04125 CTO_RS04200 -LJHENM_04125 AP288_RS02470 -LJHENM_04125 E150_RS04175 -LJHENM_04125 BBV13_RS04210 -LJHENM_04125 119986 -LJHENM_04125 FCS84708_RS04165 -LJHENM_04125 AQ199_RS00095 -LJHENM_04125 7618727 -LJHENM_04125 L2BLST_RS04150 -LJHENM_04125 BBV16_RS04220 -LJHENM_04125 BW688_RS00775 -LJHENM_04125 gnl|Prokka|PADJNBJD_00819 -LJHENM_04125 BKB93_RS04210 -LJHENM_04125 NILJEPDF_00820 -LJHENM_04125 G9768_RS04170 -LJHENM_04125 L3404_RS04145 -LJHENM_04290 LJHENM_04290 -LJHENM_04290 L3404_RS04320 -LJHENM_04290 G9768_RS04350 -LJHENM_04290 JIEJKO_04290 -LJHENM_04290 QSDFRQ_00853 -LJHENM_04290 BKB93_RS04395 -LJHENM_04290 BKC02_RS04390 -LJHENM_04290 CTRC943_RS04330 -LJHENM_04290 BKC01_RS04395 -LJHENM_04290 AKW53_RS01070 -LJHENM_04290 AOT15_RS01930 -LJHENM_04290 CTJTET1_RS04520 -LJHENM_04290 CBP48_RS00960 -LJHENM_04290 BKC03_RS04390 -LJHENM_04290 A5291_RS04385 -LJHENM_04290 KW39_RS04365 -LJHENM_04290 SOTONK1_RS04350 -LJHENM_04290 IaCS19096_RS04345 -LJHENM_04290 C15_RS0104460 -LJHENM_04290 ECS88FINAL_RS0104440 -LJHENM_04290 DU10_RS04405 -LJHENM_04290 KW36_RS04350 -LJHENM_04290 AQ193_RS04420 -LJHENM_04290 DU13_RS04405 -LJHENM_04290 O169_RS04365 -LJHENM_04290 CBP42_RS00960 -LJHENM_04290 CTL2C_RS00945 -LJHENM_04290 L1224_RS04325 -LJHENM_04290 AQ244_RS02400 -LJHENM_04290 BKB95_RS04410 -LJHENM_04290 L1440_RS04320 -LJHENM_04290 BKB96_RS04395 -LJHENM_04290 BKB99_RS04390 -LJHENM_04290 SW2_RS04355 -LJHENM_04290 ECS102511_RS04350 -LJHENM_04290 CBP44_RS00960 -LJHENM_04290 L2BUCH2_RS04325 -LJHENM_04290 CTB_RS04380 -LJHENM_04290 SOTONIA3_RS04365 -LJHENM_04290 CTO_RS04375 -LJHENM_04290 BKB92_RS04390 -LJHENM_04290 L2BLST_RS04325 -LJHENM_04290 BBV13_RS04390 -LJHENM_04290 AP288_RS02655 -LJHENM_04290 BBV16_RS04395 -LJHENM_04290 E150_RS04360 -LJHENM_04290 gnl|Prokka|PADJNBJD_00852 -LJHENM_04290 BW688_RS00960 -LJHENM_04290 7618307 -LJHENM_04290 FCS84708_RS04345 -LJHENM_04290 AQ199_RS00280 -LJHENM_04290 119842 -LJHENM_04290 NILJEPDF_00853 -LJHENM_04620 LJHENM_04620 -LJHENM_04620 L3404_RS04650 -LJHENM_04620 7618345 -LJHENM_04620 G9768_RS04675 -LJHENM_04620 BKB93_RS04735 -LJHENM_04620 BKC02_RS04725 -LJHENM_04620 CTRC943_RS04660 -LJHENM_04620 AKW53_RS01400 -LJHENM_04620 BKC01_RS04730 -LJHENM_04620 AOT15_RS02255 -LJHENM_04620 CTJTET1_RS04845 -LJHENM_04620 CBP48_RS01305 -LJHENM_04620 KW39_RS04695 -LJHENM_04620 BKC03_RS04725 -LJHENM_04620 SOTONK1_RS04675 -LJHENM_04620 A5291_RS04705 -LJHENM_04620 ECS88FINAL_RS0104775 -LJHENM_04620 IaCS19096_RS04670 -LJHENM_04620 C15_RS0104795 -LJHENM_04620 DU10_RS04745 -LJHENM_04620 O169_RS04695 -LJHENM_04620 KW36_RS04675 -LJHENM_04620 DU13_RS04745 -LJHENM_04620 AQ193_RS04090 -LJHENM_04620 CTL2C_RS01275 -LJHENM_04620 CBP42_RS01305 -LJHENM_04620 L1224_RS04655 -LJHENM_04620 BKB95_RS04745 -LJHENM_04620 L1440_RS04650 -LJHENM_04620 AQ244_RS02075 -LJHENM_04620 BKB96_RS04730 -LJHENM_04620 BKB99_RS04725 -LJHENM_04620 SW2_RS04685 -LJHENM_04620 ECS102511_RS04680 -LJHENM_04620 CBP44_RS01305 -LJHENM_04620 L2BUCH2_RS04655 -LJHENM_04620 CTB_RS04700 -LJHENM_04620 SOTONIA3_RS04690 -LJHENM_04620 AP288_RS02985 -LJHENM_04620 BKB92_RS04730 -LJHENM_04620 gnl|Prokka|PADJNBJD_00916 -LJHENM_04620 CTO_RS04695 -LJHENM_04620 L2BLST_RS04655 -LJHENM_04620 BBV13_RS04715 -LJHENM_04620 E150_RS04690 -LJHENM_04620 BBV16_RS04720 -LJHENM_04620 NILJEPDF_00917 -LJHENM_04620 FCS84708_RS04675 -LJHENM_04620 AQ199_RS00610 -LJHENM_04620 BW688_RS01305 -LJHENM_04620 119901 -LJHENM_04620 JIEJKO_04610 -LJHENM_04620 QSDFRQ_00917 -A5291_RS00235 A5291_RS00235 -A5291_RS00235 SOTONK1_RS00235 -A5291_RS00235 L3404_RS00235 -A5291_RS00235 AKW53_RS01725 -A5291_RS00235 QSDFRQ_00046 -A5291_RS00235 IaCS19096_RS00235 -A5291_RS00235 AOT15_RS00720 -A5291_RS00235 BKC03_RS00240 -A5291_RS00235 C15_RS0100235 -A5291_RS00235 DU10_RS00240 -A5291_RS00235 CTRC943_RS00235 -A5291_RS00235 CTJTET1_RS00235 -A5291_RS00235 O169_RS00235 -A5291_RS00235 CBP48_RS01630 -A5291_RS00235 ECS88FINAL_RS0100240 -A5291_RS00235 DU13_RS00240 -A5291_RS00235 KW39_RS00235 -A5291_RS00235 KW36_RS00235 -A5291_RS00235 BKB95_RS00240 -A5291_RS00235 SW2_RS00235 -A5291_RS00235 ECS102511_RS00235 -A5291_RS00235 CTL2C_RS01600 -A5291_RS00235 CBP42_RS01630 -A5291_RS00235 CTB_RS00235 -A5291_RS00235 L1224_RS00235 -A5291_RS00235 BKB96_RS00240 -A5291_RS00235 L1440_RS00235 -A5291_RS00235 BKB99_RS00240 -A5291_RS00235 BKB92_RS00240 -A5291_RS00235 CTO_RS00235 -A5291_RS00235 SOTONIA3_RS00235 -A5291_RS00235 AQ193_RS03770 -A5291_RS00235 119241 -A5291_RS00235 AQ244_RS01755 -A5291_RS00235 CBP44_RS01635 -A5291_RS00235 E150_RS00235 -A5291_RS00235 L2BUCH2_RS00235 -A5291_RS00235 BKB93_RS00240 -A5291_RS00235 FCS84708_RS00235 -A5291_RS00235 AP288_RS03305 -A5291_RS00235 BBV13_RS00240 -A5291_RS00235 AQ199_RS00930 -A5291_RS00235 BW688_RS01630 -A5291_RS00235 G9768_RS00235 -A5291_RS00235 L2BLST_RS00235 -A5291_RS00235 BKC02_RS00240 -A5291_RS00235 gnl|Prokka|PADJNBJD_00046 -A5291_RS00235 BBV16_RS00240 -A5291_RS00235 JIEJKO_00225 -A5291_RS00235 NILJEPDF_00046 -A5291_RS00235 LJHENM_00235 -A5291_RS00235 BKC01_RS00240 -A5291_RS00235 7618378 -A5291_RS00405 A5291_RS00405 -A5291_RS00405 LJHENM_00405 -A5291_RS00405 BKC01_RS00415 -A5291_RS00405 SOTONK1_RS00405 -A5291_RS00405 L3404_RS00405 -A5291_RS00405 AOT15_RS00550 -A5291_RS00405 JIEJKO_00405 -A5291_RS00405 AKW53_RS01895 -A5291_RS00405 QSDFRQ_00080 -A5291_RS00405 IaCS19096_RS00405 -A5291_RS00405 BKC03_RS00415 -A5291_RS00405 C15_RS0100415 -A5291_RS00405 DU10_RS00415 -A5291_RS00405 7618813 -A5291_RS00405 CTRC943_RS00405 -A5291_RS00405 CTJTET1_RS00405 -A5291_RS00405 O169_RS00405 -A5291_RS00405 KW36_RS00405 -A5291_RS00405 DU13_RS00420 -A5291_RS00405 CBP48_RS01805 -A5291_RS00405 ECS88FINAL_RS0100420 -A5291_RS00405 KW39_RS00405 -A5291_RS00405 BKB95_RS00415 -A5291_RS00405 SW2_RS00405 -A5291_RS00405 ECS102511_RS00405 -A5291_RS00405 CTB_RS00405 -A5291_RS00405 CTL2C_RS01770 -A5291_RS00405 CBP42_RS01805 -A5291_RS00405 BKB96_RS00415 -A5291_RS00405 L1224_RS00405 -A5291_RS00405 BKB99_RS00415 -A5291_RS00405 CTO_RS00405 -A5291_RS00405 L1440_RS00405 -A5291_RS00405 AQ193_RS03590 -A5291_RS00405 AQ244_RS01585 -A5291_RS00405 BKB92_RS00415 -A5291_RS00405 SOTONIA3_RS00405 -A5291_RS00405 CBP44_RS01810 -A5291_RS00405 120611 -A5291_RS00405 E150_RS00405 -A5291_RS00405 L2BUCH2_RS00405 -A5291_RS00405 BKB93_RS00415 -A5291_RS00405 FCS84708_RS00405 -A5291_RS00405 AP288_RS03475 -A5291_RS00405 BBV13_RS00410 -A5291_RS00405 AQ199_RS01100 -A5291_RS00405 BW688_RS01805 -A5291_RS00405 G9768_RS00405 -A5291_RS00405 L2BLST_RS00405 -A5291_RS00405 BKC02_RS00415 -A5291_RS00405 BBV16_RS00410 -A5291_RS00405 gnl|Prokka|PADJNBJD_00080 -A5291_RS00405 NILJEPDF_00080 -A5291_RS00570 A5291_RS00570 -A5291_RS00570 SOTONK1_RS00565 -A5291_RS00570 L3404_RS00565 -A5291_RS00570 JIEJKO_00560 -A5291_RS00570 QSDFRQ_00111 -A5291_RS00570 IaCS19096_RS00565 -A5291_RS00570 AOT15_RS00390 -A5291_RS00570 BKC03_RS00575 -A5291_RS00570 C15_RS0100580 -A5291_RS00570 CTJTET1_RS00565 -A5291_RS00570 KW39_RS00565 -A5291_RS00570 DU10_RS00575 -A5291_RS00570 CTRC943_RS00565 -A5291_RS00570 ECS88FINAL_RS0100580 -A5291_RS00570 O169_RS00565 -A5291_RS00570 DU13_RS00580 -A5291_RS00570 7618833 -A5291_RS00570 KW36_RS00565 -A5291_RS00570 CBP48_RS01965 -A5291_RS00570 SW2_RS00565 -A5291_RS00570 BKB95_RS00575 -A5291_RS00570 ECS102511_RS00565 -A5291_RS00570 CTL2C_RS01930 -A5291_RS00570 CTB_RS00570 -A5291_RS00570 AQ244_RS02740 -A5291_RS00570 BKB96_RS00575 -A5291_RS00570 CBP42_RS01965 -A5291_RS00570 L1224_RS00565 -A5291_RS00570 BKB99_RS00575 -A5291_RS00570 BKB92_RS00575 -A5291_RS00570 SOTONIA3_RS00565 -A5291_RS00570 L1440_RS00565 -A5291_RS00570 CTO_RS00570 -A5291_RS00570 E150_RS00565 -A5291_RS00570 AQ193_RS03430 -A5291_RS00570 CBP44_RS01970 -A5291_RS00570 120580 -A5291_RS00570 L2BUCH2_RS00565 -A5291_RS00570 FCS84708_RS00565 -A5291_RS00570 AP288_RS03635 -A5291_RS00570 BKB93_RS00575 -A5291_RS00570 AQ199_RS01260 -A5291_RS00570 BBV13_RS00575 -A5291_RS00570 G9768_RS00565 -A5291_RS00570 L2BLST_RS00565 -A5291_RS00570 BW688_RS01965 -A5291_RS00570 BKC02_RS00575 -A5291_RS00570 BBV16_RS00575 -A5291_RS00570 gnl|Prokka|PADJNBJD_00111 -A5291_RS00570 LJHENM_00555 -A5291_RS00570 AKW53_RS02060 -A5291_RS00570 BKC01_RS00575 -A5291_RS00570 NILJEPDF_00111 -A5291_RS00745 A5291_RS00745 -A5291_RS00745 L3404_RS00740 -A5291_RS00745 SOTONK1_RS00740 -A5291_RS00745 AOT15_RS00215 -A5291_RS00745 JIEJKO_00735 -A5291_RS00745 QSDFRQ_00146 -A5291_RS00745 CTJTET1_RS00740 -A5291_RS00745 IaCS19096_RS00740 -A5291_RS00745 BKC03_RS00750 -A5291_RS00745 C15_RS0100765 -A5291_RS00745 CTRC943_RS00740 -A5291_RS00745 ECS88FINAL_RS0100765 -A5291_RS00745 KW39_RS00740 -A5291_RS00745 DU10_RS00750 -A5291_RS00745 O169_RS00740 -A5291_RS00745 DU13_RS00755 -A5291_RS00745 KW36_RS00740 -A5291_RS00745 CBP48_RS02140 -A5291_RS00745 SW2_RS00740 -A5291_RS00745 BKB95_RS00750 -A5291_RS00745 7618432 -A5291_RS00745 ECS102511_RS00740 -A5291_RS00745 CTL2C_RS02105 -A5291_RS00745 CTB_RS00745 -A5291_RS00745 L1224_RS00740 -A5291_RS00745 AQ244_RS02915 -A5291_RS00745 BKB96_RS00750 -A5291_RS00745 CBP42_RS02140 -A5291_RS00745 BKB99_RS00750 -A5291_RS00745 CTO_RS00745 -A5291_RS00745 L1440_RS00740 -A5291_RS00745 BKB92_RS00750 -A5291_RS00745 SOTONIA3_RS00740 -A5291_RS00745 E150_RS00740 -A5291_RS00745 AQ193_RS03255 -A5291_RS00745 L2BUCH2_RS00740 -A5291_RS00745 CBP44_RS02145 -A5291_RS00745 FCS84708_RS00740 -A5291_RS00745 AP288_RS03810 -A5291_RS00745 BKB93_RS00750 -A5291_RS00745 119324 -A5291_RS00745 AQ199_RS01435 -A5291_RS00745 BBV13_RS00750 -A5291_RS00745 G9768_RS00740 -A5291_RS00745 L2BLST_RS00740 -A5291_RS00745 BW688_RS02140 -A5291_RS00745 BBV16_RS00750 -A5291_RS00745 BKC02_RS00750 -A5291_RS00745 gnl|Prokka|PADJNBJD_00146 -A5291_RS00745 LJHENM_00730 -A5291_RS00745 AKW53_RS02235 -A5291_RS00745 BKC01_RS00750 -A5291_RS00745 NILJEPDF_00146 -A5291_RS00925 A5291_RS00925 -A5291_RS00925 IaCS19096_RS00900 -A5291_RS00925 QSDFRQ_00176 -A5291_RS00925 O169_RS00905 -A5291_RS00925 DU13_RS00910 -A5291_RS00925 BKB95_RS00915 -A5291_RS00925 KW36_RS00900 -A5291_RS00925 BKB96_RS00900 -A5291_RS00925 BKB99_RS00900 -A5291_RS00925 AQ244_RS03080 -A5291_RS00925 SOTONIA3_RS00915 -A5291_RS00925 AOT15_RS01465 -A5291_RS00925 CTB_RS00925 -A5291_RS00925 CTO_RS00925 -A5291_RS00925 BBV13_RS00930 -A5291_RS00925 G9768_RS00905 -A5291_RS00925 BKC02_RS00900 -A5291_RS00925 120539 -A5291_RS00925 BBV16_RS00930 -A5291_RS00925 BKC01_RS00900 -A5291_RS00925 gnl|Prokka|PADJNBJD_00176 -A5291_RS00925 BKC03_RS00900 -A5291_RS00925 NILJEPDF_00176 -A5291_RS00925 LJHENM_00885 -A5291_RS00925 CTJTET1_RS00915 -A5291_RS00925 C15_RS0100935 -A5291_RS00925 SOTONK1_RS00900 -A5291_RS00925 JIEJKO_00885 -A5291_RS01095 A5291_RS01095 -A5291_RS01095 IaCS19096_RS01070 -A5291_RS01095 7618463 -A5291_RS01095 QSDFRQ_00210 -A5291_RS01095 O169_RS01075 -A5291_RS01095 DU13_RS01080 -A5291_RS01095 SW2_RS01065 -A5291_RS01095 BKB95_RS01085 -A5291_RS01095 CBP48_RS02460 -A5291_RS01095 KW36_RS01070 -A5291_RS01095 ECS102511_RS01065 -A5291_RS01095 BKB96_RS01070 -A5291_RS01095 CTL2C_RS02420 -A5291_RS01095 BKB99_RS01070 -A5291_RS01095 L1224_RS01050 -A5291_RS01095 L1440_RS01050 -A5291_RS01095 AQ244_RS03250 -A5291_RS01095 BKB92_RS01070 -A5291_RS01095 CBP42_RS02460 -A5291_RS01095 SOTONIA3_RS01085 -A5291_RS01095 AOT15_RS01295 -A5291_RS01095 E150_RS01065 -A5291_RS01095 CTB_RS01095 -A5291_RS01095 L2BUCH2_RS01055 -A5291_RS01095 CTO_RS01095 -A5291_RS01095 FCS84708_RS01065 -A5291_RS01095 AP288_RS04135 -A5291_RS01095 BKB93_RS01070 -A5291_RS01095 CBP44_RS02465 -A5291_RS01095 AQ199_RS01760 -A5291_RS01095 L2BLST_RS01055 -A5291_RS01095 BW688_RS02465 -A5291_RS01095 BBV13_RS01100 -A5291_RS01095 G9768_RS01075 -A5291_RS01095 BKC02_RS01070 -A5291_RS01095 L3404_RS01050 -A5291_RS01095 AKW53_RS02560 -A5291_RS01095 AQ193_RS02925 -A5291_RS01095 BBV16_RS01100 -A5291_RS01095 BKC01_RS01070 -A5291_RS01095 119377 -A5291_RS01095 DU10_RS01080 -A5291_RS01095 gnl|Prokka|PADJNBJD_00210 -A5291_RS01095 BKC03_RS01070 -A5291_RS01095 NILJEPDF_00210 -A5291_RS01095 LJHENM_01055 -A5291_RS01095 CTRC943_RS01055 -A5291_RS01095 CTJTET1_RS01085 -A5291_RS01095 C15_RS0101105 -A5291_RS01095 SOTONK1_RS01070 -A5291_RS01095 ECS88FINAL_RS0101090 -A5291_RS01095 KW39_RS01075 -A5291_RS01095 JIEJKO_01055 -A5291_RS01275 A5291_RS01275 -A5291_RS01275 IaCS19096_RS01250 -A5291_RS01275 O169_RS01255 -A5291_RS01275 DU13_RS01260 -A5291_RS01275 7618892 -A5291_RS01275 SW2_RS01245 -A5291_RS01275 BKB95_RS01265 -A5291_RS01275 CBP48_RS02640 -A5291_RS01275 KW36_RS01250 -A5291_RS01275 ECS102511_RS01245 -A5291_RS01275 BKB96_RS01250 -A5291_RS01275 CTL2C_RS02600 -A5291_RS01275 BKB99_RS01250 -A5291_RS01275 L1224_RS01230 -A5291_RS01275 L1440_RS01230 -A5291_RS01275 AQ244_RS03430 -A5291_RS01275 BKB92_RS01250 -A5291_RS01275 CBP42_RS02640 -A5291_RS01275 SOTONIA3_RS01265 -A5291_RS01275 AOT15_RS01115 -A5291_RS01275 CTB_RS01275 -A5291_RS01275 E150_RS01245 -A5291_RS01275 L2BUCH2_RS01235 -A5291_RS01275 CTO_RS01275 -A5291_RS01275 FCS84708_RS01245 -A5291_RS01275 AP288_RS04315 -A5291_RS01275 BKB93_RS01250 -A5291_RS01275 CBP44_RS02645 -A5291_RS01275 AQ199_RS01940 -A5291_RS01275 L2BLST_RS01235 -A5291_RS01275 BW688_RS02645 -A5291_RS01275 BBV13_RS01280 -A5291_RS01275 G9768_RS01255 -A5291_RS01275 BKC02_RS01250 -A5291_RS01275 L3404_RS01230 -A5291_RS01275 AKW53_RS02740 -A5291_RS01275 AQ193_RS02745 -A5291_RS01275 BBV16_RS01280 -A5291_RS01275 BKC01_RS01250 -A5291_RS01275 gnl|Prokka|PADJNBJD_00245 -A5291_RS01275 DU10_RS01260 -A5291_RS01275 120479 -A5291_RS01275 NILJEPDF_00245 -A5291_RS01275 LJHENM_01230 -A5291_RS01275 BKC03_RS01250 -A5291_RS01275 CTRC943_RS01235 -A5291_RS01275 CTJTET1_RS01265 -A5291_RS01275 KW39_RS01255 -A5291_RS01275 JIEJKO_01230 -A5291_RS01275 C15_RS0101285 -A5291_RS01275 SOTONK1_RS01250 -A5291_RS01275 ECS88FINAL_RS0101270 -A5291_RS01275 QSDFRQ_00245 -A5291_RS01435 A5291_RS01435 -A5291_RS01435 O169_RS01415 -A5291_RS01435 DU13_RS01420 -A5291_RS01435 7618907 -A5291_RS01435 SW2_RS01400 -A5291_RS01435 BKB95_RS01425 -A5291_RS01435 CBP48_RS02800 -A5291_RS01435 KW36_RS01405 -A5291_RS01435 ECS102511_RS01400 -A5291_RS01435 AOT15_RS02405 -A5291_RS01435 BKB96_RS01410 -A5291_RS01435 CTL2C_RS02755 -A5291_RS01435 BKB99_RS01410 -A5291_RS01435 L1224_RS01385 -A5291_RS01435 L1440_RS01385 -A5291_RS01435 AQ244_RS03590 -A5291_RS01435 CBP42_RS02800 -A5291_RS01435 SOTONIA3_RS01420 -A5291_RS01435 BKB92_RS01415 -A5291_RS01435 CTB_RS01435 -A5291_RS01435 E150_RS01405 -A5291_RS01435 L2BUCH2_RS01390 -A5291_RS01435 CTO_RS01430 -A5291_RS01435 FCS84708_RS01400 -A5291_RS01435 AP288_RS04470 -A5291_RS01435 BKB93_RS01415 -A5291_RS01435 CBP44_RS02805 -A5291_RS01435 AQ199_RS02095 -A5291_RS01435 L2BLST_RS01390 -A5291_RS01435 BBV13_RS01440 -A5291_RS01435 BW688_RS02805 -A5291_RS01435 G9768_RS01410 -A5291_RS01435 BKC02_RS01410 -A5291_RS01435 BBV16_RS01440 -A5291_RS01435 L3404_RS01385 -A5291_RS01435 AKW53_RS02895 -A5291_RS01435 AQ193_RS02585 -A5291_RS01435 BKC01_RS01415 -A5291_RS01435 gnl|Prokka|PADJNBJD_00276 -A5291_RS01435 DU10_RS01420 -A5291_RS01435 NILJEPDF_00276 -A5291_RS01435 LJHENM_01390 -A5291_RS01435 BKC03_RS01410 -A5291_RS01435 CTRC943_RS01390 -A5291_RS01435 CTJTET1_RS01420 -A5291_RS01435 KW39_RS01410 -A5291_RS01435 JIEJKO_01390 -A5291_RS01435 120456 -A5291_RS01435 C15_RS0101445 -A5291_RS01435 SOTONK1_RS01410 -A5291_RS01435 ECS88FINAL_RS0101430 -A5291_RS01435 QSDFRQ_00276 -A5291_RS01435 IaCS19096_RS01405 -A5291_RS01595 A5291_RS01595 -A5291_RS01595 O169_RS01575 -A5291_RS01595 DU13_RS01580 -A5291_RS01595 SW2_RS01560 -A5291_RS01595 BKB95_RS01585 -A5291_RS01595 CBP48_RS02960 -A5291_RS01595 7618507 -A5291_RS01595 KW36_RS01565 -A5291_RS01595 ECS102511_RS01560 -A5291_RS01595 AOT15_RS02565 -A5291_RS01595 BKB96_RS01570 -A5291_RS01595 CTL2C_RS02915 -A5291_RS01595 BKB99_RS01570 -A5291_RS01595 L1224_RS01545 -A5291_RS01595 L1440_RS01545 -A5291_RS01595 AQ244_RS03750 -A5291_RS01595 CBP42_RS02960 -A5291_RS01595 SOTONIA3_RS01580 -A5291_RS01595 BKB92_RS01575 -A5291_RS01595 CTB_RS01595 -A5291_RS01595 E150_RS01565 -A5291_RS01595 L2BUCH2_RS01550 -A5291_RS01595 CTO_RS01590 -A5291_RS01595 FCS84708_RS01560 -A5291_RS01595 AP288_RS04630 -A5291_RS01595 BKB93_RS01575 -A5291_RS01595 CBP44_RS02965 -A5291_RS01595 AQ199_RS02255 -A5291_RS01595 L2BLST_RS01550 -A5291_RS01595 BBV13_RS01600 -A5291_RS01595 BW688_RS02970 -A5291_RS01595 G9768_RS01570 -A5291_RS01595 BKC02_RS01570 -A5291_RS01595 AKW53_RS03060 -A5291_RS01595 BBV16_RS01600 -A5291_RS01595 L3404_RS01545 -A5291_RS01595 AQ193_RS02425 -A5291_RS01595 BKC01_RS01575 -A5291_RS01595 gnl|Prokka|PADJNBJD_00308 -A5291_RS01595 NILJEPDF_00308 -A5291_RS01595 LJHENM_01550 -A5291_RS01595 BKC03_RS01570 -A5291_RS01595 DU10_RS01585 -A5291_RS01595 CTRC943_RS01550 -A5291_RS01595 CTJTET1_RS01580 -A5291_RS01595 KW39_RS01570 -A5291_RS01595 JIEJKO_01550 -A5291_RS01595 C15_RS0101615 -A5291_RS01595 SOTONK1_RS01570 -A5291_RS01595 ECS88FINAL_RS0101595 -A5291_RS01595 119445 -A5291_RS01595 QSDFRQ_00308 -A5291_RS01595 IaCS19096_RS01565 -A5291_RS01770 A5291_RS01770 -A5291_RS01770 KW39_RS01755 -A5291_RS01770 IaCS19096_RS01740 -A5291_RS01770 119456 -A5291_RS01770 ECS88FINAL_RS0101775 -A5291_RS01770 O169_RS01755 -A5291_RS01770 DU13_RS01765 -A5291_RS01770 7618513 -A5291_RS01770 CTL2C_RS03090 -A5291_RS01770 BKB95_RS01765 -A5291_RS01770 CBP48_RS03150 -A5291_RS01770 L1224_RS01720 -A5291_RS01770 KW36_RS01740 -A5291_RS01770 AOT15_RS02740 -A5291_RS01770 BKB96_RS01750 -A5291_RS01770 SW2_RS01745 -A5291_RS01770 BKB99_RS01750 -A5291_RS01770 L1440_RS01720 -A5291_RS01770 ECS102511_RS01745 -A5291_RS01770 AP288_RS01335 -A5291_RS01770 CBP42_RS03150 -A5291_RS01770 CTB_RS01770 -A5291_RS01770 SOTONIA3_RS01755 -A5291_RS01770 L2BUCH2_RS01720 -A5291_RS01770 BKB92_RS01760 -A5291_RS01770 AQ244_RS01365 -A5291_RS01770 CTO_RS01770 -A5291_RS01770 E150_RS01750 -A5291_RS01770 L2BLST_RS01720 -A5291_RS01770 FCS84708_RS01740 -A5291_RS01770 BW688_RS03150 -A5291_RS01770 BKB93_RS01760 -A5291_RS01770 CBP44_RS03155 -A5291_RS01770 BBV13_RS01775 -A5291_RS01770 AQ199_RS02440 -A5291_RS01770 G9768_RS01745 -A5291_RS01770 AQ193_RS02240 -A5291_RS01770 L3404_RS01720 -A5291_RS01770 BBV16_RS01775 -A5291_RS01770 BKC02_RS01750 -A5291_RS01770 BKC01_RS01750 -A5291_RS01770 AKW53_RS03245 -A5291_RS01770 gnl|Prokka|PADJNBJD_00343 -A5291_RS01770 NILJEPDF_00343 -A5291_RS01770 CTRC943_RS01725 -A5291_RS01770 LJHENM_01730 -A5291_RS01770 JIEJKO_01725 -A5291_RS01770 BKC03_RS01750 -A5291_RS01770 CTJTET1_RS01755 -A5291_RS01770 DU10_RS01770 -A5291_RS01770 QSDFRQ_00343 -A5291_RS01770 C15_RS0101785 -A5291_RS01770 SOTONK1_RS01745 -A5291_RS01935 A5291_RS01935 -A5291_RS01935 KW39_RS01920 -A5291_RS01935 IaCS19096_RS01905 -A5291_RS01935 ECS88FINAL_RS0101945 -A5291_RS01935 O169_RS01920 -A5291_RS01935 DU13_RS01935 -A5291_RS01935 CTL2C_RS03255 -A5291_RS01935 7618966 -A5291_RS01935 120350 -A5291_RS01935 L1224_RS01885 -A5291_RS01935 KW36_RS01905 -A5291_RS01935 AOT15_RS02905 -A5291_RS01935 BKB95_RS01935 -A5291_RS01935 BKB96_RS01915 -A5291_RS01935 CBP48_RS03320 -A5291_RS01935 SW2_RS01910 -A5291_RS01935 BKB99_RS01915 -A5291_RS01935 L1440_RS01885 -A5291_RS01935 ECS102511_RS01910 -A5291_RS01935 AP288_RS01170 -A5291_RS01935 CTB_RS01935 -A5291_RS01935 SOTONIA3_RS01920 -A5291_RS01935 L2BUCH2_RS01885 -A5291_RS01935 BKB92_RS01925 -A5291_RS01935 CBP42_RS03330 -A5291_RS01935 AQ244_RS01200 -A5291_RS01935 CTO_RS01935 -A5291_RS01935 E150_RS01915 -A5291_RS01935 L2BLST_RS01885 -A5291_RS01935 BW688_RS03315 -A5291_RS01935 FCS84708_RS01905 -A5291_RS01935 BKB93_RS01925 -A5291_RS01935 BBV13_RS01940 -A5291_RS01935 CBP44_RS03325 -A5291_RS01935 AQ199_RS02605 -A5291_RS01935 G9768_RS01910 -A5291_RS01935 AQ193_RS02075 -A5291_RS01935 L3404_RS01885 -A5291_RS01935 BBV16_RS01940 -A5291_RS01935 BKC02_RS01915 -A5291_RS01935 BKC01_RS01915 -A5291_RS01935 AKW53_RS03410 -A5291_RS01935 gnl|Prokka|PADJNBJD_00376 -A5291_RS01935 NILJEPDF_00376 -A5291_RS01935 CTRC943_RS01890 -A5291_RS01935 LJHENM_01895 -A5291_RS01935 JIEJKO_01890 -A5291_RS01935 BKC03_RS01915 -A5291_RS01935 CTJTET1_RS01920 -A5291_RS01935 QSDFRQ_00376 -A5291_RS01935 C15_RS0101955 -A5291_RS01935 SOTONK1_RS01910 -A5291_RS01935 DU10_RS01940 -A5291_RS02270 A5291_RS02270 -A5291_RS02270 KW39_RS02250 -A5291_RS02270 IaCS19096_RS02235 -A5291_RS02270 ECS88FINAL_RS0102285 -A5291_RS02270 O169_RS02250 -A5291_RS02270 DU13_RS02270 -A5291_RS02270 7618565 -A5291_RS02270 BKB96_RS02255 -A5291_RS02270 BKB99_RS02250 -A5291_RS02270 CBP48_RS03655 -A5291_RS02270 CTL2C_RS03590 -A5291_RS02270 KW36_RS02235 -A5291_RS02270 AOT15_RS03235 -A5291_RS02270 BKB95_RS02270 -A5291_RS02270 119538 -A5291_RS02270 L1224_RS02220 -A5291_RS02270 SW2_RS02245 -A5291_RS02270 ECS102511_RS02240 -A5291_RS02270 L1440_RS02220 -A5291_RS02270 AP288_RS00840 -A5291_RS02270 CBP42_RS03665 -A5291_RS02270 CTB_RS02270 -A5291_RS02270 L2BUCH2_RS02215 -A5291_RS02270 BKB92_RS02260 -A5291_RS02270 SOTONIA3_RS02255 -A5291_RS02270 AQ244_RS00870 -A5291_RS02270 CTO_RS02270 -A5291_RS02270 E150_RS02245 -A5291_RS02270 BW688_RS03650 -A5291_RS02270 L2BLST_RS02220 -A5291_RS02270 FCS84708_RS02235 -A5291_RS02270 BBV13_RS02275 -A5291_RS02270 CBP44_RS03660 -A5291_RS02270 BKB93_RS02265 -A5291_RS02270 AQ199_RS02935 -A5291_RS02270 G9768_RS02240 -A5291_RS02270 AQ193_RS01745 -A5291_RS02270 BBV16_RS02280 -A5291_RS02270 L3404_RS02215 -A5291_RS02270 BKC02_RS02250 -A5291_RS02270 BKC01_RS02250 -A5291_RS02270 AKW53_RS03740 -A5291_RS02270 gnl|Prokka|PADJNBJD_00442 -A5291_RS02270 NILJEPDF_00442 -A5291_RS02270 CTRC943_RS02220 -A5291_RS02270 LJHENM_02230 -A5291_RS02270 JIEJKO_02225 -A5291_RS02270 BKC03_RS02250 -A5291_RS02270 CTJTET1_RS02250 -A5291_RS02270 QSDFRQ_00442 -A5291_RS02270 C15_RS0102285 -A5291_RS02270 SOTONK1_RS02240 -A5291_RS02270 DU10_RS02275 -A5291_RS02420 A5291_RS02420 -A5291_RS02420 ECS88FINAL_RS0102445 -A5291_RS02420 O169_RS02400 -A5291_RS02420 DU13_RS02425 -A5291_RS02420 BKB96_RS02410 -A5291_RS02420 BKB99_RS02405 -A5291_RS02420 CBP48_RS03810 -A5291_RS02420 120276 -A5291_RS02420 CTL2C_RS03740 -A5291_RS02420 KW36_RS02385 -A5291_RS02420 BKB95_RS02425 -A5291_RS02420 L1224_RS02370 -A5291_RS02420 SW2_RS02395 -A5291_RS02420 ECS102511_RS02390 -A5291_RS02420 L1440_RS02370 -A5291_RS02420 AP288_RS00690 -A5291_RS02420 CBP42_RS03820 -A5291_RS02420 L2BUCH2_RS02365 -A5291_RS02420 BKB92_RS02415 -A5291_RS02420 CTB_RS02420 -A5291_RS02420 SOTONIA3_RS02405 -A5291_RS02420 E150_RS02395 -A5291_RS02420 CTO_RS02420 -A5291_RS02420 AQ244_RS00720 -A5291_RS02420 BW688_RS03805 -A5291_RS02420 L2BLST_RS02370 -A5291_RS02420 FCS84708_RS02385 -A5291_RS02420 CBP44_RS03815 -A5291_RS02420 BKB93_RS02420 -A5291_RS02420 AQ199_RS03085 -A5291_RS02420 G9768_RS02390 -A5291_RS02420 L3404_RS02365 -A5291_RS02420 BKC02_RS02405 -A5291_RS02420 AQ193_RS01595 -A5291_RS02420 AKW53_RS03890 -A5291_RS02420 BKC01_RS02405 -A5291_RS02420 gnl|Prokka|PADJNBJD_00472 -A5291_RS02420 NILJEPDF_00472 -A5291_RS02420 LJHENM_02380 -A5291_RS02420 CTRC943_RS02370 -A5291_RS02420 JIEJKO_02380 -A5291_RS02420 BKC03_RS02405 -A5291_RS02420 QSDFRQ_00472 -A5291_RS02420 CTJTET1_RS02400 -A5291_RS02420 AOT15_RS00015 -A5291_RS02420 C15_RS0102445 -A5291_RS02420 SOTONK1_RS02390 -A5291_RS02420 DU10_RS02430 -A5291_RS02420 KW39_RS02400 -A5291_RS02420 IaCS19096_RS02385 -A5291_RS02605 A5291_RS02605 -A5291_RS02605 DU13_RS02605 -A5291_RS02605 7619023 -A5291_RS02605 CBP48_RS03990 -A5291_RS02605 CTL2C_RS03920 -A5291_RS02605 KW36_RS02565 -A5291_RS02605 BKB96_RS02595 -A5291_RS02605 BKB99_RS02590 -A5291_RS02605 SW2_RS02575 -A5291_RS02605 L1224_RS02550 -A5291_RS02605 ECS102511_RS02570 -A5291_RS02605 BKB95_RS02605 -A5291_RS02605 L1440_RS02550 -A5291_RS02605 AKW53_RS04645 -A5291_RS02605 120259 -A5291_RS02605 CBP42_RS04000 -A5291_RS02605 L2BUCH2_RS02550 -A5291_RS02605 AP288_RS00510 -A5291_RS02605 BKB92_RS02595 -A5291_RS02605 CTB_RS02605 -A5291_RS02605 SOTONIA3_RS02585 -A5291_RS02605 E150_RS02575 -A5291_RS02605 BW688_RS03990 -A5291_RS02605 CTO_RS02605 -A5291_RS02605 FCS84708_RS02565 -A5291_RS02605 L2BLST_RS02550 -A5291_RS02605 AQ244_RS00540 -A5291_RS02605 BBV13_RS02610 -A5291_RS02605 CBP44_RS03995 -A5291_RS02605 AQ199_RS03265 -A5291_RS02605 BKB93_RS02600 -A5291_RS02605 BBV16_RS02620 -A5291_RS02605 G9768_RS02570 -A5291_RS02605 L3404_RS02545 -A5291_RS02605 BKC02_RS02590 -A5291_RS02605 gnl|Prokka|PADJNBJD_00506 -A5291_RS02605 BKC01_RS02590 -A5291_RS02605 NILJEPDF_00506 -A5291_RS02605 LJHENM_02545 -A5291_RS02605 AQ193_RS01415 -A5291_RS02605 CTRC943_RS02550 -A5291_RS02605 AOT15_RS03525 -A5291_RS02605 JIEJKO_02550 -A5291_RS02605 QSDFRQ_00506 -A5291_RS02605 SOTONK1_RS02570 -A5291_RS02605 BKC03_RS02590 -A5291_RS02605 CTJTET1_RS02580 -A5291_RS02605 KW39_RS02580 -A5291_RS02605 ECS88FINAL_RS0102620 -A5291_RS02605 IaCS19096_RS02565 -A5291_RS02605 DU10_RS02610 -A5291_RS02605 C15_RS0102625 -A5291_RS02605 O169_RS02580 -A5291_RS02770 A5291_RS02770 -A5291_RS02770 DU13_RS02775 -A5291_RS02770 CBP48_RS04160 -A5291_RS02770 7619050 -A5291_RS02770 CTL2C_RS04085 -A5291_RS02770 KW36_RS02730 -A5291_RS02770 BKB95_RS02775 -A5291_RS02770 BKB96_RS02765 -A5291_RS02770 BKB99_RS02760 -A5291_RS02770 SW2_RS02740 -A5291_RS02770 L1224_RS02715 -A5291_RS02770 ECS102511_RS02735 -A5291_RS02770 L1440_RS02715 -A5291_RS02770 120216 -A5291_RS02770 CBP42_RS04170 -A5291_RS02770 L2BUCH2_RS02715 -A5291_RS02770 SOTONIA3_RS02750 -A5291_RS02770 AP288_RS00345 -A5291_RS02770 BKB92_RS02765 -A5291_RS02770 CTB_RS02770 -A5291_RS02770 E150_RS02740 -A5291_RS02770 BW688_RS04160 -A5291_RS02770 CTO_RS02770 -A5291_RS02770 FCS84708_RS02730 -A5291_RS02770 L2BLST_RS02715 -A5291_RS02770 AQ244_RS00375 -A5291_RS02770 BBV13_RS02775 -A5291_RS02770 CBP44_RS04165 -A5291_RS02770 AQ199_RS03430 -A5291_RS02770 BKB93_RS02770 -A5291_RS02770 BBV16_RS02785 -A5291_RS02770 G9768_RS02735 -A5291_RS02770 L3404_RS02710 -A5291_RS02770 BKC02_RS02760 -A5291_RS02770 gnl|Prokka|PADJNBJD_00539 -A5291_RS02770 NILJEPDF_00539 -A5291_RS02770 BKC01_RS02760 -A5291_RS02770 LJHENM_02715 -A5291_RS02770 AQ193_RS01250 -A5291_RS02770 CTRC943_RS02715 -A5291_RS02770 AOT15_RS01535 -A5291_RS02770 QSDFRQ_00539 -A5291_RS02770 JIEJKO_02720 -A5291_RS02770 SOTONK1_RS02735 -A5291_RS02770 CTJTET1_RS02745 -A5291_RS02770 BKC03_RS02760 -A5291_RS02770 KW39_RS02745 -A5291_RS02770 C15_RS0102805 -A5291_RS02770 ECS88FINAL_RS0102800 -A5291_RS02770 IaCS19096_RS02730 -A5291_RS02770 DU10_RS02780 -A5291_RS02770 O169_RS02745 -A5291_RS02935 A5291_RS02935 -A5291_RS02935 DU13_RS02940 -A5291_RS02935 CBP48_RS04325 -A5291_RS02935 CTL2C_RS04250 -A5291_RS02935 KW36_RS02895 -A5291_RS02935 AKW53_RS04125 -A5291_RS02935 BKB95_RS02940 -A5291_RS02935 BKB96_RS02930 -A5291_RS02935 BKB99_RS02925 -A5291_RS02935 7619081 -A5291_RS02935 SW2_RS02905 -A5291_RS02935 L1224_RS02880 -A5291_RS02935 ECS102511_RS02900 -A5291_RS02935 L1440_RS02880 -A5291_RS02935 CBP42_RS04335 -A5291_RS02935 120167 -A5291_RS02935 L2BUCH2_RS02880 -A5291_RS02935 SOTONIA3_RS02915 -A5291_RS02935 AP288_RS00180 -A5291_RS02935 BKB92_RS02930 -A5291_RS02935 CTB_RS02935 -A5291_RS02935 E150_RS02905 -A5291_RS02935 BW688_RS04325 -A5291_RS02935 CTO_RS02935 -A5291_RS02935 FCS84708_RS02895 -A5291_RS02935 L2BLST_RS02880 -A5291_RS02935 AQ244_RS00210 -A5291_RS02935 BBV13_RS02940 -A5291_RS02935 CBP44_RS04330 -A5291_RS02935 AQ199_RS03595 -A5291_RS02935 BKB93_RS02935 -A5291_RS02935 BBV16_RS02950 -A5291_RS02935 G9768_RS02900 -A5291_RS02935 L3404_RS02875 -A5291_RS02935 BKC02_RS02925 -A5291_RS02935 gnl|Prokka|PADJNBJD_00572 -A5291_RS02935 AOT15_RS03700 -A5291_RS02935 NILJEPDF_00572 -A5291_RS02935 BKC01_RS02925 -A5291_RS02935 LJHENM_02880 -A5291_RS02935 AQ193_RS01085 -A5291_RS02935 CTRC943_RS02880 -A5291_RS02935 QSDFRQ_00572 -A5291_RS02935 JIEJKO_02885 -A5291_RS02935 SOTONK1_RS02900 -A5291_RS02935 CTJTET1_RS02910 -A5291_RS02935 BKC03_RS02925 -A5291_RS02935 KW39_RS02910 -A5291_RS02935 C15_RS0102970 -A5291_RS02935 ECS88FINAL_RS0102965 -A5291_RS02935 IaCS19096_RS02895 -A5291_RS02935 DU10_RS02945 -A5291_RS02935 O169_RS02910 -A5291_RS03095 A5291_RS03095 -A5291_RS03095 O169_RS03070 -A5291_RS03095 CTL2C_RS04405 -A5291_RS03095 DU13_RS03105 -A5291_RS03095 CBP48_RS04495 -A5291_RS03095 L1224_RS03035 -A5291_RS03095 KW36_RS03060 -A5291_RS03095 BKB95_RS03105 -A5291_RS03095 AKW53_RS04290 -A5291_RS03095 BKB96_RS03100 -A5291_RS03095 BKB99_RS03095 -A5291_RS03095 7619092 -A5291_RS03095 SW2_RS03065 -A5291_RS03095 L1440_RS03035 -A5291_RS03095 ECS102511_RS03060 -A5291_RS03095 CBP42_RS04500 -A5291_RS03095 L2BUCH2_RS03035 -A5291_RS03095 AP288_RS00020 -A5291_RS03095 CTB_RS03095 -A5291_RS03095 SOTONIA3_RS03080 -A5291_RS03095 BKB92_RS03095 -A5291_RS03095 BW688_RS04490 -A5291_RS03095 120150 -A5291_RS03095 E150_RS03065 -A5291_RS03095 CTO_RS03095 -A5291_RS03095 L2BLST_RS03035 -A5291_RS03095 AQ244_RS00045 -A5291_RS03095 CBP44_RS04495 -A5291_RS03095 FCS84708_RS03060 -A5291_RS03095 BBV13_RS03100 -A5291_RS03095 AQ199_RS03760 -A5291_RS03095 BBV16_RS03110 -A5291_RS03095 BKB93_RS03100 -A5291_RS03095 G9768_RS03065 -A5291_RS03095 L3404_RS03030 -A5291_RS03095 gnl|Prokka|PADJNBJD_00603 -A5291_RS03095 NILJEPDF_00603 -A5291_RS03095 LJHENM_03030 -A5291_RS03095 BKC02_RS03095 -A5291_RS03095 AOT15_RS03865 -A5291_RS03095 AQ193_RS00925 -A5291_RS03095 CTRC943_RS03035 -A5291_RS03095 BKC01_RS03095 -A5291_RS03095 QSDFRQ_00603 -A5291_RS03095 JIEJKO_03040 -A5291_RS03095 SOTONK1_RS03065 -A5291_RS03095 CTJTET1_RS03075 -A5291_RS03095 BKC03_RS03095 -A5291_RS03095 KW39_RS03075 -A5291_RS03095 C15_RS0103130 -A5291_RS03095 ECS88FINAL_RS0103125 -A5291_RS03095 IaCS19096_RS03060 -A5291_RS03095 DU10_RS03110 -A5291_RS03805 A5291_RS03805 -A5291_RS03805 SOTONK1_RS03760 -A5291_RS03805 IaCS19096_RS03755 -A5291_RS03805 DU13_RS03810 -A5291_RS03805 C15_RS0103865 -A5291_RS03805 ECS88FINAL_RS0103865 -A5291_RS03805 O169_RS03770 -A5291_RS03805 KW36_RS03760 -A5291_RS03805 BKB95_RS03815 -A5291_RS03805 CBP42_RS00365 -A5291_RS03805 SW2_RS03765 -A5291_RS03805 CTL2C_RS00360 -A5291_RS03805 L1224_RS03740 -A5291_RS03805 ECS102511_RS03755 -A5291_RS03805 BKB96_RS03800 -A5291_RS03805 BKB99_RS03795 -A5291_RS03805 L1440_RS03740 -A5291_RS03805 CBP44_RS00365 -A5291_RS03805 L2BUCH2_RS03740 -A5291_RS03805 BKB92_RS03795 -A5291_RS03805 CTB_RS03800 -A5291_RS03805 SOTONIA3_RS03780 -A5291_RS03805 E150_RS03765 -A5291_RS03805 CTO_RS03795 -A5291_RS03805 BBV13_RS03800 -A5291_RS03805 FCS84708_RS03755 -A5291_RS03805 AQ244_RS04150 -A5291_RS03805 BBV16_RS03810 -A5291_RS03805 L2BLST_RS03740 -A5291_RS03805 120054 -A5291_RS03805 BW688_RS00365 -A5291_RS03805 7618684 -A5291_RS03805 AQ199_RS04455 -A5291_RS03805 BKB93_RS03800 -A5291_RS03805 G9768_RS03760 -A5291_RS03805 AQ193_RS00230 -A5291_RS03805 gnl|Prokka|PADJNBJD_00740 -A5291_RS03805 L3404_RS03735 -A5291_RS03805 BKC02_RS03795 -A5291_RS03805 NILJEPDF_00741 -A5291_RS03805 LJHENM_03730 -A5291_RS03805 AOT15_RS04560 -A5291_RS03805 AP288_RS02130 -A5291_RS03805 JIEJKO_03730 -A5291_RS03805 BKC01_RS03800 -A5291_RS03805 QSDFRQ_00741 -A5291_RS03805 CTRC943_RS03745 -A5291_RS03805 AKW53_RS00500 -A5291_RS03805 BKC03_RS03795 -A5291_RS03805 CTJTET1_RS03780 -A5291_RS03805 KW39_RS03775 -A5291_RS03805 DU10_RS03810 -A5291_RS03805 CBP48_RS00365 -A5291_RS03970 A5291_RS03970 -A5291_RS03970 SOTONK1_RS03925 -A5291_RS03970 IaCS19096_RS03920 -A5291_RS03970 DU13_RS03975 -A5291_RS03970 C15_RS0104030 -A5291_RS03970 ECS88FINAL_RS0104035 -A5291_RS03970 O169_RS03935 -A5291_RS03970 KW36_RS03925 -A5291_RS03970 BKB95_RS03980 -A5291_RS03970 CBP42_RS00530 -A5291_RS03970 CTL2C_RS00525 -A5291_RS03970 L1224_RS03905 -A5291_RS03970 SW2_RS03930 -A5291_RS03970 L1440_RS03900 -A5291_RS03970 ECS102511_RS03920 -A5291_RS03970 BKB96_RS03965 -A5291_RS03970 BKB99_RS03960 -A5291_RS03970 CBP44_RS00530 -A5291_RS03970 L2BUCH2_RS03905 -A5291_RS03970 BKB92_RS03960 -A5291_RS03970 CTB_RS03965 -A5291_RS03970 SOTONIA3_RS03945 -A5291_RS03970 E150_RS03930 -A5291_RS03970 CTO_RS03960 -A5291_RS03970 BBV13_RS03965 -A5291_RS03970 FCS84708_RS03920 -A5291_RS03970 AQ244_RS03985 -A5291_RS03970 L2BLST_RS03905 -A5291_RS03970 BBV16_RS03975 -A5291_RS03970 7618704 -A5291_RS03970 120022 -A5291_RS03970 BW688_RS00530 -A5291_RS03970 AQ199_RS04620 -A5291_RS03970 BKB93_RS03965 -A5291_RS03970 G9768_RS03925 -A5291_RS03970 gnl|Prokka|PADJNBJD_00772 -A5291_RS03970 L3404_RS03900 -A5291_RS03970 AQ193_RS00065 -A5291_RS03970 NILJEPDF_00773 -A5291_RS03970 BKC02_RS03960 -A5291_RS03970 LJHENM_03890 -A5291_RS03970 AOT15_RS04725 -A5291_RS03970 AP288_RS02295 -A5291_RS03970 JIEJKO_03890 -A5291_RS03970 QSDFRQ_00773 -A5291_RS03970 BKC01_RS03965 -A5291_RS03970 CTRC943_RS03910 -A5291_RS03970 AKW53_RS00665 -A5291_RS03970 BKC03_RS03960 -A5291_RS03970 CBP48_RS00530 -A5291_RS03970 CTJTET1_RS03945 -A5291_RS03970 KW39_RS03940 -A5291_RS03970 DU10_RS03975 -A5291_RS04330 A5291_RS04330 -A5291_RS04330 KW39_RS04310 -A5291_RS04330 SOTONK1_RS04295 -A5291_RS04330 ECS88FINAL_RS0104385 -A5291_RS04330 IaCS19096_RS04285 -A5291_RS04330 DU10_RS04345 -A5291_RS04330 C15_RS0104405 -A5291_RS04330 DU13_RS04345 -A5291_RS04330 O169_RS04305 -A5291_RS04330 KW36_RS04290 -A5291_RS04330 BKB95_RS04350 -A5291_RS04330 CBP42_RS00900 -A5291_RS04330 CTL2C_RS00890 -A5291_RS04330 L1224_RS04270 -A5291_RS04330 BKB96_RS04335 -A5291_RS04330 L1440_RS04265 -A5291_RS04330 BKB99_RS04330 -A5291_RS04330 SW2_RS04300 -A5291_RS04330 ECS102511_RS04290 -A5291_RS04330 CBP44_RS00900 -A5291_RS04330 CTB_RS04325 -A5291_RS04330 L2BUCH2_RS04270 -A5291_RS04330 SOTONIA3_RS04310 -A5291_RS04330 BKB92_RS04330 -A5291_RS04330 CTO_RS04320 -A5291_RS04330 AP288_RS02595 -A5291_RS04330 BBV13_RS04335 -A5291_RS04330 E150_RS04300 -A5291_RS04330 L2BLST_RS04270 -A5291_RS04330 FCS84708_RS04290 -A5291_RS04330 AQ199_RS00220 -A5291_RS04330 BBV16_RS04340 -A5291_RS04330 119971 -A5291_RS04330 gnl|Prokka|PADJNBJD_00842 -A5291_RS04330 BW688_RS00900 -A5291_RS04330 7618737 -A5291_RS04330 NILJEPDF_00843 -A5291_RS04330 G9768_RS04295 -A5291_RS04330 LJHENM_04240 -A5291_RS04330 L3404_RS04265 -A5291_RS04330 BKB93_RS04335 -A5291_RS04330 AQ193_RS04480 -A5291_RS04330 JIEJKO_04240 -A5291_RS04330 QSDFRQ_00843 -A5291_RS04330 BKC02_RS04330 -A5291_RS04330 AQ244_RS02465 -A5291_RS04330 AKW53_RS01010 -A5291_RS04330 BKC01_RS04335 -A5291_RS04330 CTRC943_RS04275 -A5291_RS04330 AOT15_RS01875 -A5291_RS04330 CTJTET1_RS04465 -A5291_RS04330 BKC03_RS04330 -A5291_RS04330 CBP48_RS00900 -A5291_RS04490 A5291_RS04490 -A5291_RS04490 SOTONK1_RS04455 -A5291_RS04490 ECS88FINAL_RS0104555 -A5291_RS04490 IaCS19096_RS04450 -A5291_RS04490 C15_RS0104575 -A5291_RS04490 DU10_RS04520 -A5291_RS04490 O169_RS04475 -A5291_RS04490 KW36_RS04455 -A5291_RS04490 DU13_RS04520 -A5291_RS04490 BKB95_RS04520 -A5291_RS04490 CBP42_RS01075 -A5291_RS04490 CTL2C_RS01055 -A5291_RS04490 L1224_RS04435 -A5291_RS04490 BKB96_RS04505 -A5291_RS04490 L1440_RS04430 -A5291_RS04490 BKB99_RS04500 -A5291_RS04490 SW2_RS04465 -A5291_RS04490 ECS102511_RS04460 -A5291_RS04490 CBP44_RS01075 -A5291_RS04490 CTB_RS04485 -A5291_RS04490 L2BUCH2_RS04435 -A5291_RS04490 SOTONIA3_RS04470 -A5291_RS04490 CTO_RS04480 -A5291_RS04490 BBV13_RS04495 -A5291_RS04490 BKB92_RS04505 -A5291_RS04490 AP288_RS02765 -A5291_RS04490 BBV16_RS04500 -A5291_RS04490 E150_RS04470 -A5291_RS04490 L2BLST_RS04435 -A5291_RS04490 gnl|Prokka|PADJNBJD_00874 -A5291_RS04490 FCS84708_RS04455 -A5291_RS04490 AQ199_RS00390 -A5291_RS04490 BW688_RS01075 -A5291_RS04490 119864 -A5291_RS04490 NILJEPDF_00875 -A5291_RS04490 7618322 -A5291_RS04490 G9768_RS04455 -A5291_RS04490 LJHENM_04405 -A5291_RS04490 L3404_RS04430 -A5291_RS04490 JIEJKO_04400 -A5291_RS04490 QSDFRQ_00875 -A5291_RS04490 AQ193_RS04310 -A5291_RS04490 BKB93_RS04510 -A5291_RS04490 BKC02_RS04500 -A5291_RS04490 AQ244_RS02295 -A5291_RS04490 AKW53_RS01180 -A5291_RS04490 BKC01_RS04505 -A5291_RS04490 CTRC943_RS04440 -A5291_RS04490 AOT15_RS02035 -A5291_RS04490 CTJTET1_RS04625 -A5291_RS04490 KW39_RS04475 -A5291_RS04490 BKC03_RS04500 -A5291_RS04490 CBP48_RS01075 -A5291_RS04655 A5291_RS04655 -A5291_RS04655 SOTONK1_RS04620 -A5291_RS04655 ECS88FINAL_RS0104730 -A5291_RS04655 IaCS19096_RS04615 -A5291_RS04655 C15_RS0104750 -A5291_RS04655 DU10_RS04695 -A5291_RS04655 O169_RS04640 -A5291_RS04655 KW36_RS04620 -A5291_RS04655 DU13_RS04695 -A5291_RS04655 CTL2C_RS01220 -A5291_RS04655 BKB95_RS04695 -A5291_RS04655 CBP42_RS01250 -A5291_RS04655 L1224_RS04600 -A5291_RS04655 BKB96_RS04680 -A5291_RS04655 L1440_RS04595 -A5291_RS04655 BKB99_RS04675 -A5291_RS04655 SW2_RS04630 -A5291_RS04655 ECS102511_RS04625 -A5291_RS04655 CBP44_RS01250 -A5291_RS04655 CTB_RS04650 -A5291_RS04655 L2BUCH2_RS04600 -A5291_RS04655 SOTONIA3_RS04635 -A5291_RS04655 CTO_RS04645 -A5291_RS04655 AP288_RS02930 -A5291_RS04655 BBV13_RS04665 -A5291_RS04655 BKB92_RS04680 -A5291_RS04655 BBV16_RS04670 -A5291_RS04655 E150_RS04635 -A5291_RS04655 gnl|Prokka|PADJNBJD_00907 -A5291_RS04655 L2BLST_RS04600 -A5291_RS04655 FCS84708_RS04620 -A5291_RS04655 AQ199_RS00555 -A5291_RS04655 NILJEPDF_00908 -A5291_RS04655 BW688_RS01250 -A5291_RS04655 119894 -A5291_RS04655 JIEJKO_04565 -A5291_RS04655 7618342 -A5291_RS04655 QSDFRQ_00908 -A5291_RS04655 G9768_RS04620 -A5291_RS04655 LJHENM_04575 -A5291_RS04655 L3404_RS04595 -A5291_RS04655 AQ193_RS04145 -A5291_RS04655 BKB93_RS04685 -A5291_RS04655 BKC02_RS04675 -A5291_RS04655 AQ244_RS02130 -A5291_RS04655 AKW53_RS01345 -A5291_RS04655 BKC01_RS04680 -A5291_RS04655 CTRC943_RS04605 -A5291_RS04655 AOT15_RS02200 -A5291_RS04655 CTJTET1_RS04790 -A5291_RS04655 KW39_RS04640 -A5291_RS04655 BKC03_RS04675 -A5291_RS04655 CBP48_RS01250 -A5291_RS04830 A5291_RS04830 -A5291_RS04830 SOTONK1_RS04800 -A5291_RS04830 IaCS19096_RS04785 -A5291_RS04830 L1224_RS04780 -A5291_RS04830 AOT15_RS03405 -A5291_RS04830 ECS102511_RS04790 -A5291_RS04830 L2BUCH2_RS04780 -A5291_RS04830 SOTONIA3_RS04815 -A5291_RS04830 BBV13_RS04825 -A5291_RS04830 CTO_RS04815 -A5291_RS04830 L2BLST_RS04780 -A5291_RS04830 BBV16_RS04830 -A5291_RS04830 FCS84708_RS04785 -A5291_RS04830 AQ193_RS04770 -A5291_RS04830 gnl|Prokka|PADJNBJD_00940 -A5291_RS04830 NILJEPDF_00940 -A5291_RS04830 L3404_RS04775 -A5291_RS04830 QSDFRQ_00940 -A5291_RS04830 AQ199_RS04815 -A5291_RS04830 AQ244_RS04905 -A5291_RS04830 AP288_RS04860 -SOTONIA3_RS00310 SOTONIA3_RS00310 -SOTONIA3_RS00310 CBP44_RS01710 -SOTONIA3_RS00310 120624 -SOTONIA3_RS00310 E150_RS00310 -SOTONIA3_RS00310 AQ193_RS03685 -SOTONIA3_RS00310 AQ244_RS01680 -SOTONIA3_RS00310 L2BUCH2_RS00310 -SOTONIA3_RS00310 BKB93_RS00315 -SOTONIA3_RS00310 FCS84708_RS00310 -SOTONIA3_RS00310 AP288_RS03380 -SOTONIA3_RS00310 BBV13_RS00315 -SOTONIA3_RS00310 AQ199_RS01005 -SOTONIA3_RS00310 BW688_RS01705 -SOTONIA3_RS00310 G9768_RS00310 -SOTONIA3_RS00310 L2BLST_RS00310 -SOTONIA3_RS00310 BKC02_RS00315 -SOTONIA3_RS00310 BBV16_RS00315 -SOTONIA3_RS00310 gnl|Prokka|PADJNBJD_00061 -SOTONIA3_RS00310 NILJEPDF_00061 -SOTONIA3_RS00310 LJHENM_00310 -SOTONIA3_RS00310 A5291_RS00310 -SOTONIA3_RS00310 BKC01_RS00315 -SOTONIA3_RS00310 SOTONK1_RS00310 -SOTONIA3_RS00310 L3404_RS00310 -SOTONIA3_RS00310 JIEJKO_00310 -SOTONIA3_RS00310 AKW53_RS01800 -SOTONIA3_RS00310 QSDFRQ_00061 -SOTONIA3_RS00310 IaCS19096_RS00310 -SOTONIA3_RS00310 BKC03_RS00315 -SOTONIA3_RS00310 C15_RS0100315 -SOTONIA3_RS00310 DU10_RS00315 -SOTONIA3_RS00310 7618805 -SOTONIA3_RS00310 CTRC943_RS00310 -SOTONIA3_RS00310 CTJTET1_RS00310 -SOTONIA3_RS00310 AOT15_RS00645 -SOTONIA3_RS00310 O169_RS00310 -SOTONIA3_RS00310 KW36_RS00310 -SOTONIA3_RS00310 DU13_RS00320 -SOTONIA3_RS00310 CBP48_RS01705 -SOTONIA3_RS00310 ECS88FINAL_RS0100320 -SOTONIA3_RS00310 KW39_RS00310 -SOTONIA3_RS00310 BKB95_RS00315 -SOTONIA3_RS00310 SW2_RS00310 -SOTONIA3_RS00310 ECS102511_RS00310 -SOTONIA3_RS00310 CTB_RS00310 -SOTONIA3_RS00310 CTL2C_RS01675 -SOTONIA3_RS00310 CBP42_RS01705 -SOTONIA3_RS00310 BKB96_RS00315 -SOTONIA3_RS00310 L1224_RS00310 -SOTONIA3_RS00310 BKB99_RS00315 -SOTONIA3_RS00310 CTO_RS00310 -SOTONIA3_RS00310 L1440_RS00310 -SOTONIA3_RS00310 BKB92_RS00315 -SOTONIA3_RS00475 SOTONIA3_RS00475 -SOTONIA3_RS00475 E150_RS00475 -SOTONIA3_RS00475 CBP44_RS01880 -SOTONIA3_RS00475 120595 -SOTONIA3_RS00475 AQ244_RS01515 -SOTONIA3_RS00475 L2BUCH2_RS00475 -SOTONIA3_RS00475 AQ193_RS03520 -SOTONIA3_RS00475 BKB93_RS00485 -SOTONIA3_RS00475 FCS84708_RS00475 -SOTONIA3_RS00475 AP288_RS03545 -SOTONIA3_RS00475 AQ199_RS01170 -SOTONIA3_RS00475 BBV13_RS00480 -SOTONIA3_RS00475 L2BLST_RS00475 -SOTONIA3_RS00475 BW688_RS01875 -SOTONIA3_RS00475 G9768_RS00475 -SOTONIA3_RS00475 BKC02_RS00485 -SOTONIA3_RS00475 gnl|Prokka|PADJNBJD_00093 -SOTONIA3_RS00475 LJHENM_00465 -SOTONIA3_RS00475 BBV16_RS00480 -SOTONIA3_RS00475 NILJEPDF_00093 -SOTONIA3_RS00475 BKC01_RS00485 -SOTONIA3_RS00475 A5291_RS00475 -SOTONIA3_RS00475 JIEJKO_00470 -SOTONIA3_RS00475 SOTONK1_RS00475 -SOTONIA3_RS00475 L3404_RS00475 -SOTONIA3_RS00475 AKW53_RS01965 -SOTONIA3_RS00475 QSDFRQ_00093 -SOTONIA3_RS00475 IaCS19096_RS00475 -SOTONIA3_RS00475 BKC03_RS00485 -SOTONIA3_RS00475 DU10_RS00485 -SOTONIA3_RS00475 C15_RS0100480 -SOTONIA3_RS00475 7618823 -SOTONIA3_RS00475 CTRC943_RS00475 -SOTONIA3_RS00475 CTJTET1_RS00475 -SOTONIA3_RS00475 O169_RS00475 -SOTONIA3_RS00475 AOT15_RS00480 -SOTONIA3_RS00475 DU13_RS00490 -SOTONIA3_RS00475 ECS88FINAL_RS0100485 -SOTONIA3_RS00475 KW39_RS00475 -SOTONIA3_RS00475 KW36_RS00475 -SOTONIA3_RS00475 CBP48_RS01875 -SOTONIA3_RS00475 SW2_RS00475 -SOTONIA3_RS00475 BKB95_RS00485 -SOTONIA3_RS00475 ECS102511_RS00475 -SOTONIA3_RS00475 CTB_RS00475 -SOTONIA3_RS00475 CTL2C_RS01840 -SOTONIA3_RS00475 CBP42_RS01875 -SOTONIA3_RS00475 BKB96_RS00485 -SOTONIA3_RS00475 L1224_RS00475 -SOTONIA3_RS00475 BKB99_RS00485 -SOTONIA3_RS00475 BKB92_RS00485 -SOTONIA3_RS00475 CTO_RS00475 -SOTONIA3_RS00475 L1440_RS00475 -SOTONIA3_RS01025 SOTONIA3_RS01025 -SOTONIA3_RS01025 E150_RS01005 -SOTONIA3_RS01025 CTB_RS01035 -SOTONIA3_RS01025 L2BUCH2_RS00995 -SOTONIA3_RS01025 CTO_RS01035 -SOTONIA3_RS01025 FCS84708_RS01005 -SOTONIA3_RS01025 AP288_RS04075 -SOTONIA3_RS01025 AQ193_RS02985 -SOTONIA3_RS01025 BKB93_RS01010 -SOTONIA3_RS01025 CBP44_RS02405 -SOTONIA3_RS01025 AQ199_RS01700 -SOTONIA3_RS01025 L2BLST_RS00995 -SOTONIA3_RS01025 BW688_RS02405 -SOTONIA3_RS01025 BBV13_RS01040 -SOTONIA3_RS01025 G9768_RS01015 -SOTONIA3_RS01025 BKC02_RS01010 -SOTONIA3_RS01025 L3404_RS00990 -SOTONIA3_RS01025 AKW53_RS02500 -SOTONIA3_RS01025 BBV16_RS01040 -SOTONIA3_RS01025 BKC01_RS01010 -SOTONIA3_RS01025 120516 -SOTONIA3_RS01025 DU10_RS01020 -SOTONIA3_RS01025 gnl|Prokka|PADJNBJD_00198 -SOTONIA3_RS01025 BKC03_RS01010 -SOTONIA3_RS01025 NILJEPDF_00198 -SOTONIA3_RS01025 LJHENM_00995 -SOTONIA3_RS01025 CTRC943_RS00995 -SOTONIA3_RS01025 CTJTET1_RS01025 -SOTONIA3_RS01025 C15_RS0101045 -SOTONIA3_RS01025 SOTONK1_RS01010 -SOTONIA3_RS01025 ECS88FINAL_RS0101030 -SOTONIA3_RS01025 KW39_RS01015 -SOTONIA3_RS01025 JIEJKO_00995 -SOTONIA3_RS01025 A5291_RS01035 -SOTONIA3_RS01025 IaCS19096_RS01010 -SOTONIA3_RS01025 7618869 -SOTONIA3_RS01025 QSDFRQ_00198 -SOTONIA3_RS01025 O169_RS01015 -SOTONIA3_RS01025 DU13_RS01020 -SOTONIA3_RS01025 SW2_RS01005 -SOTONIA3_RS01025 AOT15_RS01355 -SOTONIA3_RS01025 BKB95_RS01025 -SOTONIA3_RS01025 CBP48_RS02400 -SOTONIA3_RS01025 KW36_RS01010 -SOTONIA3_RS01025 ECS102511_RS01005 -SOTONIA3_RS01025 BKB96_RS01010 -SOTONIA3_RS01025 CTL2C_RS02360 -SOTONIA3_RS01025 BKB99_RS01010 -SOTONIA3_RS01025 L1224_RS00990 -SOTONIA3_RS01025 L1440_RS00990 -SOTONIA3_RS01025 AQ244_RS03190 -SOTONIA3_RS01025 BKB92_RS01010 -SOTONIA3_RS01025 CBP42_RS02400 -SOTONIA3_RS01205 SOTONIA3_RS01205 -SOTONIA3_RS01205 E150_RS01185 -SOTONIA3_RS01205 CTB_RS01215 -SOTONIA3_RS01205 L2BUCH2_RS01175 -SOTONIA3_RS01205 CTO_RS01215 -SOTONIA3_RS01205 FCS84708_RS01185 -SOTONIA3_RS01205 AP288_RS04255 -SOTONIA3_RS01205 AQ193_RS02805 -SOTONIA3_RS01205 BKB93_RS01190 -SOTONIA3_RS01205 CBP44_RS02585 -SOTONIA3_RS01205 AQ199_RS01880 -SOTONIA3_RS01205 L2BLST_RS01175 -SOTONIA3_RS01205 BW688_RS02585 -SOTONIA3_RS01205 BBV13_RS01220 -SOTONIA3_RS01205 G9768_RS01195 -SOTONIA3_RS01205 BKC02_RS01190 -SOTONIA3_RS01205 L3404_RS01170 -SOTONIA3_RS01205 AKW53_RS02680 -SOTONIA3_RS01205 BBV16_RS01220 -SOTONIA3_RS01205 BKC01_RS01190 -SOTONIA3_RS01205 120489 -SOTONIA3_RS01205 gnl|Prokka|PADJNBJD_00233 -SOTONIA3_RS01205 DU10_RS01200 -SOTONIA3_RS01205 NILJEPDF_00233 -SOTONIA3_RS01205 LJHENM_01170 -SOTONIA3_RS01205 BKC03_RS01190 -SOTONIA3_RS01205 CTRC943_RS01175 -SOTONIA3_RS01205 CTJTET1_RS01205 -SOTONIA3_RS01205 JIEJKO_01170 -SOTONIA3_RS01205 C15_RS0101225 -SOTONIA3_RS01205 SOTONK1_RS01190 -SOTONIA3_RS01205 ECS88FINAL_RS0101210 -SOTONIA3_RS01205 KW39_RS01195 -SOTONIA3_RS01205 QSDFRQ_00233 -SOTONIA3_RS01205 A5291_RS01215 -SOTONIA3_RS01205 IaCS19096_RS01190 -SOTONIA3_RS01205 7618886 -SOTONIA3_RS01205 O169_RS01195 -SOTONIA3_RS01205 DU13_RS01200 -SOTONIA3_RS01205 SW2_RS01185 -SOTONIA3_RS01205 AOT15_RS01175 -SOTONIA3_RS01205 BKB95_RS01205 -SOTONIA3_RS01205 CBP48_RS02580 -SOTONIA3_RS01205 KW36_RS01190 -SOTONIA3_RS01205 ECS102511_RS01185 -SOTONIA3_RS01205 BKB96_RS01190 -SOTONIA3_RS01205 CTL2C_RS02540 -SOTONIA3_RS01205 BKB99_RS01190 -SOTONIA3_RS01205 L1224_RS01170 -SOTONIA3_RS01205 L1440_RS01170 -SOTONIA3_RS01205 AQ244_RS03370 -SOTONIA3_RS01205 BKB92_RS01190 -SOTONIA3_RS01205 CBP42_RS02580 -SOTONIA3_RS01365 SOTONIA3_RS01365 -SOTONIA3_RS01365 CTB_RS01375 -SOTONIA3_RS01365 E150_RS01345 -SOTONIA3_RS01365 L2BUCH2_RS01335 -SOTONIA3_RS01365 CTO_RS01375 -SOTONIA3_RS01365 FCS84708_RS01345 -SOTONIA3_RS01365 AP288_RS04415 -SOTONIA3_RS01365 AQ193_RS02645 -SOTONIA3_RS01365 BKB93_RS01355 -SOTONIA3_RS01365 CBP44_RS02750 -SOTONIA3_RS01365 AQ199_RS02040 -SOTONIA3_RS01365 L2BLST_RS01335 -SOTONIA3_RS01365 BBV13_RS01385 -SOTONIA3_RS01365 BW688_RS02750 -SOTONIA3_RS01365 G9768_RS01355 -SOTONIA3_RS01365 BKC02_RS01355 -SOTONIA3_RS01365 BBV16_RS01385 -SOTONIA3_RS01365 L3404_RS01330 -SOTONIA3_RS01365 AKW53_RS02840 -SOTONIA3_RS01365 BKC01_RS01355 -SOTONIA3_RS01365 gnl|Prokka|PADJNBJD_00265 -SOTONIA3_RS01365 DU10_RS01365 -SOTONIA3_RS01365 NILJEPDF_00265 -SOTONIA3_RS01365 LJHENM_01335 -SOTONIA3_RS01365 BKC03_RS01355 -SOTONIA3_RS01365 CTRC943_RS01335 -SOTONIA3_RS01365 CTJTET1_RS01365 -SOTONIA3_RS01365 KW39_RS01355 -SOTONIA3_RS01365 JIEJKO_01335 -SOTONIA3_RS01365 119417 -SOTONIA3_RS01365 C15_RS0101385 -SOTONIA3_RS01365 SOTONK1_RS01350 -SOTONIA3_RS01365 ECS88FINAL_RS0101370 -SOTONIA3_RS01365 QSDFRQ_00265 -SOTONIA3_RS01365 A5291_RS01375 -SOTONIA3_RS01365 O169_RS01355 -SOTONIA3_RS01365 IaCS19096_RS01350 -SOTONIA3_RS01365 DU13_RS01365 -SOTONIA3_RS01365 7618489 -SOTONIA3_RS01365 SW2_RS01345 -SOTONIA3_RS01365 AOT15_RS01015 -SOTONIA3_RS01365 BKB95_RS01370 -SOTONIA3_RS01365 CBP48_RS02745 -SOTONIA3_RS01365 KW36_RS01350 -SOTONIA3_RS01365 ECS102511_RS01345 -SOTONIA3_RS01365 BKB96_RS01355 -SOTONIA3_RS01365 CTL2C_RS02700 -SOTONIA3_RS01365 BKB99_RS01355 -SOTONIA3_RS01365 L1224_RS01330 -SOTONIA3_RS01365 L1440_RS01330 -SOTONIA3_RS01365 AQ244_RS03530 -SOTONIA3_RS01365 BKB92_RS01355 -SOTONIA3_RS01365 CBP42_RS02745 -SOTONIA3_RS01685 SOTONIA3_RS01685 -SOTONIA3_RS01685 BKB92_RS01680 -SOTONIA3_RS01685 CTB_RS01700 -SOTONIA3_RS01685 E150_RS01670 -SOTONIA3_RS01685 L2BUCH2_RS01655 -SOTONIA3_RS01685 CTO_RS01695 -SOTONIA3_RS01685 FCS84708_RS01665 -SOTONIA3_RS01685 AQ193_RS02320 -SOTONIA3_RS01685 CBP44_RS03070 -SOTONIA3_RS01685 BKB93_RS01680 -SOTONIA3_RS01685 L2BLST_RS01655 -SOTONIA3_RS01685 AQ199_RS02360 -SOTONIA3_RS01685 BW688_RS03075 -SOTONIA3_RS01685 BBV13_RS01705 -SOTONIA3_RS01685 G9768_RS01675 -SOTONIA3_RS01685 BKC02_RS01675 -SOTONIA3_RS01685 L3404_RS01650 -SOTONIA3_RS01685 AKW53_RS03165 -SOTONIA3_RS01685 BBV16_RS01705 -SOTONIA3_RS01685 BKC01_RS01680 -SOTONIA3_RS01685 gnl|Prokka|PADJNBJD_00329 -SOTONIA3_RS01685 NILJEPDF_00329 -SOTONIA3_RS01685 LJHENM_01655 -SOTONIA3_RS01685 CTRC943_RS01655 -SOTONIA3_RS01685 BKC03_RS01675 -SOTONIA3_RS01685 DU10_RS01690 -SOTONIA3_RS01685 CTJTET1_RS01685 -SOTONIA3_RS01685 KW39_RS01675 -SOTONIA3_RS01685 JIEJKO_01655 -SOTONIA3_RS01685 C15_RS0101715 -SOTONIA3_RS01685 SOTONK1_RS01675 -SOTONIA3_RS01685 ECS88FINAL_RS0101695 -SOTONIA3_RS01685 QSDFRQ_00329 -SOTONIA3_RS01685 IaCS19096_RS01670 -SOTONIA3_RS01685 A5291_RS01700 -SOTONIA3_RS01685 O169_RS01680 -SOTONIA3_RS01685 DU13_RS01685 -SOTONIA3_RS01685 120386 -SOTONIA3_RS01685 AP288_RS01415 -SOTONIA3_RS01685 CBP48_RS03065 -SOTONIA3_RS01685 SW2_RS01665 -SOTONIA3_RS01685 BKB95_RS01690 -SOTONIA3_RS01685 7618945 -SOTONIA3_RS01685 CTL2C_RS03020 -SOTONIA3_RS01685 KW36_RS01670 -SOTONIA3_RS01685 ECS102511_RS01665 -SOTONIA3_RS01685 AOT15_RS02670 -SOTONIA3_RS01685 AQ244_RS01445 -SOTONIA3_RS01685 BKB96_RS01675 -SOTONIA3_RS01685 L1224_RS01650 -SOTONIA3_RS01685 BKB99_RS01675 -SOTONIA3_RS01685 L1440_RS01650 -SOTONIA3_RS01685 CBP42_RS03065 -SOTONIA3_RS02020 SOTONIA3_RS02020 -SOTONIA3_RS02020 L2BUCH2_RS01985 -SOTONIA3_RS02020 BKB92_RS02025 -SOTONIA3_RS02020 CTO_RS02035 -SOTONIA3_RS02020 AQ193_RS01975 -SOTONIA3_RS02020 E150_RS02015 -SOTONIA3_RS02020 L2BLST_RS01985 -SOTONIA3_RS02020 BW688_RS03415 -SOTONIA3_RS02020 FCS84708_RS02005 -SOTONIA3_RS02020 BBV13_RS02040 -SOTONIA3_RS02020 BKB93_RS02025 -SOTONIA3_RS02020 CBP44_RS03425 -SOTONIA3_RS02020 AQ199_RS02705 -SOTONIA3_RS02020 G9768_RS02010 -SOTONIA3_RS02020 BBV16_RS02040 -SOTONIA3_RS02020 L3404_RS01985 -SOTONIA3_RS02020 BKC02_RS02015 -SOTONIA3_RS02020 BKC01_RS02015 -SOTONIA3_RS02020 AKW53_RS03510 -SOTONIA3_RS02020 gnl|Prokka|PADJNBJD_00396 -SOTONIA3_RS02020 NILJEPDF_00396 -SOTONIA3_RS02020 CTRC943_RS01990 -SOTONIA3_RS02020 LJHENM_01995 -SOTONIA3_RS02020 JIEJKO_01990 -SOTONIA3_RS02020 BKC03_RS02015 -SOTONIA3_RS02020 CTJTET1_RS02020 -SOTONIA3_RS02020 QSDFRQ_00396 -SOTONIA3_RS02020 C15_RS0102055 -SOTONIA3_RS02020 A5291_RS02035 -SOTONIA3_RS02020 SOTONK1_RS02010 -SOTONIA3_RS02020 DU10_RS02040 -SOTONIA3_RS02020 KW39_RS02020 -SOTONIA3_RS02020 IaCS19096_RS02005 -SOTONIA3_RS02020 AP288_RS01070 -SOTONIA3_RS02020 ECS88FINAL_RS0102045 -SOTONIA3_RS02020 O169_RS02020 -SOTONIA3_RS02020 DU13_RS02035 -SOTONIA3_RS02020 7618975 -SOTONIA3_RS02020 CTL2C_RS03355 -SOTONIA3_RS02020 CBP48_RS03420 -SOTONIA3_RS02020 120336 -SOTONIA3_RS02020 L1224_RS01985 -SOTONIA3_RS02020 KW36_RS02005 -SOTONIA3_RS02020 AOT15_RS03005 -SOTONIA3_RS02020 AQ244_RS01100 -SOTONIA3_RS02020 BKB95_RS02035 -SOTONIA3_RS02020 BKB96_RS02015 -SOTONIA3_RS02020 SW2_RS02010 -SOTONIA3_RS02020 BKB99_RS02015 -SOTONIA3_RS02020 L1440_RS01985 -SOTONIA3_RS02020 ECS102511_RS02010 -SOTONIA3_RS02020 CTB_RS02035 -SOTONIA3_RS02020 CBP42_RS03430 -SOTONIA3_RS02345 SOTONIA3_RS02345 -SOTONIA3_RS02345 CTO_RS02360 -SOTONIA3_RS02345 E150_RS02335 -SOTONIA3_RS02345 AQ193_RS01655 -SOTONIA3_RS02345 BW688_RS03745 -SOTONIA3_RS02345 L2BLST_RS02310 -SOTONIA3_RS02345 FCS84708_RS02325 -SOTONIA3_RS02345 BBV13_RS02365 -SOTONIA3_RS02345 CBP44_RS03755 -SOTONIA3_RS02345 BKB93_RS02360 -SOTONIA3_RS02345 AQ199_RS03025 -SOTONIA3_RS02345 G9768_RS02330 -SOTONIA3_RS02345 BBV16_RS02370 -SOTONIA3_RS02345 L3404_RS02305 -SOTONIA3_RS02345 BKC02_RS02345 -SOTONIA3_RS02345 BKC01_RS02345 -SOTONIA3_RS02345 gnl|Prokka|PADJNBJD_00460 -SOTONIA3_RS02345 AKW53_RS03830 -SOTONIA3_RS02345 NILJEPDF_00460 -SOTONIA3_RS02345 LJHENM_02320 -SOTONIA3_RS02345 CTRC943_RS02310 -SOTONIA3_RS02345 JIEJKO_02320 -SOTONIA3_RS02345 BKC03_RS02345 -SOTONIA3_RS02345 QSDFRQ_00460 -SOTONIA3_RS02345 CTJTET1_RS02340 -SOTONIA3_RS02345 C15_RS0102380 -SOTONIA3_RS02345 SOTONK1_RS02330 -SOTONIA3_RS02345 DU10_RS02370 -SOTONIA3_RS02345 A5291_RS02360 -SOTONIA3_RS02345 KW39_RS02340 -SOTONIA3_RS02345 IaCS19096_RS02325 -SOTONIA3_RS02345 ECS88FINAL_RS0102380 -SOTONIA3_RS02345 O169_RS02340 -SOTONIA3_RS02345 AP288_RS00750 -SOTONIA3_RS02345 DU13_RS02365 -SOTONIA3_RS02345 7619004 -SOTONIA3_RS02345 BKB96_RS02350 -SOTONIA3_RS02345 BKB99_RS02345 -SOTONIA3_RS02345 CBP48_RS03750 -SOTONIA3_RS02345 120291 -SOTONIA3_RS02345 CTL2C_RS03680 -SOTONIA3_RS02345 KW36_RS02325 -SOTONIA3_RS02345 AOT15_RS03325 -SOTONIA3_RS02345 BKB95_RS02365 -SOTONIA3_RS02345 L1224_RS02310 -SOTONIA3_RS02345 SW2_RS02335 -SOTONIA3_RS02345 ECS102511_RS02330 -SOTONIA3_RS02345 L1440_RS02310 -SOTONIA3_RS02345 AQ244_RS00780 -SOTONIA3_RS02345 CBP42_RS03760 -SOTONIA3_RS02345 CTB_RS02360 -SOTONIA3_RS02345 L2BUCH2_RS02305 -SOTONIA3_RS02345 BKB92_RS02355 -SOTONIA3_RS04900 SOTONIA3_RS04900 -SOTONIA3_RS04900 BKB92_RS02705 -SOTONIA3_RS04900 CTB_RS04860 -SOTONIA3_RS04900 E150_RS04835 -SOTONIA3_RS04900 BW688_RS04100 -SOTONIA3_RS04900 CTO_RS04895 -SOTONIA3_RS04900 FCS84708_RS04845 -SOTONIA3_RS04900 AQ193_RS04905 -SOTONIA3_RS04900 L2BLST_RS04865 -SOTONIA3_RS04900 BBV13_RS04880 -SOTONIA3_RS04900 CBP44_RS04105 -SOTONIA3_RS04900 AQ199_RS04945 -SOTONIA3_RS04900 BKB93_RS02710 -SOTONIA3_RS04900 BBV16_RS04885 -SOTONIA3_RS04900 G9768_RS04835 -SOTONIA3_RS04900 L3404_RS04860 -SOTONIA3_RS04900 BKC02_RS02700 -SOTONIA3_RS04900 BKC01_RS02700 -SOTONIA3_RS04900 LJHENM_02655 -SOTONIA3_RS04900 CTRC943_RS04810 -SOTONIA3_RS04900 AOT15_RS04855 -SOTONIA3_RS04900 JIEJKO_02660 -SOTONIA3_RS04900 SOTONK1_RS04870 -SOTONIA3_RS04900 CTJTET1_RS05005 -SOTONIA3_RS04900 AKW53_RS04865 -SOTONIA3_RS04900 BKC03_RS02700 -SOTONIA3_RS04900 KW39_RS04845 -SOTONIA3_RS04900 C15_RS1000000105040 -SOTONIA3_RS04900 ECS88FINAL_RS1000000105065 -SOTONIA3_RS04900 IaCS19096_RS04850 -SOTONIA3_RS04900 DU10_RS02720 -SOTONIA3_RS04900 O169_RS04830 -SOTONIA3_RS04900 A5291_RS04920 -SOTONIA3_RS04900 AP288_RS04940 -SOTONIA3_RS04900 DU13_RS02715 -SOTONIA3_RS04900 CBP48_RS04100 -SOTONIA3_RS04900 CTL2C_RS04840 -SOTONIA3_RS04900 KW36_RS04820 -SOTONIA3_RS04900 BKB95_RS02715 -SOTONIA3_RS04900 BKB96_RS02705 -SOTONIA3_RS04900 BKB99_RS02700 -SOTONIA3_RS04900 SW2_RS04830 -SOTONIA3_RS04900 L1224_RS04865 -SOTONIA3_RS04900 ECS102511_RS04845 -SOTONIA3_RS04900 L1440_RS04805 -SOTONIA3_RS04900 AQ244_RS05135 -SOTONIA3_RS04900 CBP42_RS04110 -SOTONIA3_RS04900 L2BUCH2_RS04860 -SOTONIA3_RS02855 SOTONIA3_RS02855 -SOTONIA3_RS02855 BKB92_RS02870 -SOTONIA3_RS02855 CTB_RS02875 -SOTONIA3_RS02855 E150_RS02845 -SOTONIA3_RS02855 BW688_RS04265 -SOTONIA3_RS02855 CTO_RS02875 -SOTONIA3_RS02855 FCS84708_RS02835 -SOTONIA3_RS02855 AQ193_RS01145 -SOTONIA3_RS02855 L2BLST_RS02820 -SOTONIA3_RS02855 BBV13_RS02880 -SOTONIA3_RS02855 CBP44_RS04270 -SOTONIA3_RS02855 AQ199_RS03535 -SOTONIA3_RS02855 BKB93_RS02875 -SOTONIA3_RS02855 BBV16_RS02890 -SOTONIA3_RS02855 G9768_RS02840 -SOTONIA3_RS02855 L3404_RS02815 -SOTONIA3_RS02855 BKC02_RS02865 -SOTONIA3_RS02855 gnl|Prokka|PADJNBJD_00560 -SOTONIA3_RS02855 NILJEPDF_00560 -SOTONIA3_RS02855 BKC01_RS02865 -SOTONIA3_RS02855 LJHENM_02820 -SOTONIA3_RS02855 CTRC943_RS02820 -SOTONIA3_RS02855 AOT15_RS01640 -SOTONIA3_RS02855 QSDFRQ_00560 -SOTONIA3_RS02855 JIEJKO_02825 -SOTONIA3_RS02855 SOTONK1_RS02840 -SOTONIA3_RS02855 CTJTET1_RS02850 -SOTONIA3_RS02855 BKC03_RS02865 -SOTONIA3_RS02855 KW39_RS02850 -SOTONIA3_RS02855 C15_RS0102910 -SOTONIA3_RS02855 ECS88FINAL_RS0102905 -SOTONIA3_RS02855 IaCS19096_RS02835 -SOTONIA3_RS02855 DU10_RS02885 -SOTONIA3_RS02855 O169_RS02850 -SOTONIA3_RS02855 A5291_RS02875 -SOTONIA3_RS02855 AP288_RS00240 -SOTONIA3_RS02855 DU13_RS02880 -SOTONIA3_RS02855 CBP48_RS04265 -SOTONIA3_RS02855 CTL2C_RS04190 -SOTONIA3_RS02855 KW36_RS02835 -SOTONIA3_RS02855 AKW53_RS04065 -SOTONIA3_RS02855 BKB95_RS02880 -SOTONIA3_RS02855 BKB96_RS02870 -SOTONIA3_RS02855 BKB99_RS02865 -SOTONIA3_RS02855 7619071 -SOTONIA3_RS02855 SW2_RS02845 -SOTONIA3_RS02855 L1224_RS02820 -SOTONIA3_RS02855 ECS102511_RS02840 -SOTONIA3_RS02855 L1440_RS02820 -SOTONIA3_RS02855 AQ244_RS00270 -SOTONIA3_RS02855 120183 -SOTONIA3_RS02855 CBP42_RS04275 -SOTONIA3_RS02855 L2BUCH2_RS02820 -SOTONIA3_RS04055 SOTONIA3_RS04055 -SOTONIA3_RS04055 E150_RS04040 -SOTONIA3_RS04055 CTO_RS04070 -SOTONIA3_RS04055 BBV13_RS04075 -SOTONIA3_RS04055 FCS84708_RS04030 -SOTONIA3_RS04055 120005 -SOTONIA3_RS04055 L2BLST_RS04015 -SOTONIA3_RS04055 AP288_RS04740 -SOTONIA3_RS04055 BBV16_RS04085 -SOTONIA3_RS04055 7618715 -SOTONIA3_RS04055 BW688_RS00640 -SOTONIA3_RS04055 gnl|Prokka|PADJNBJD_00793 -SOTONIA3_RS04055 AQ199_RS04730 -SOTONIA3_RS04055 BKB93_RS04075 -SOTONIA3_RS04055 G9768_RS04035 -SOTONIA3_RS04055 L3404_RS04010 -SOTONIA3_RS04055 AQ193_RS04725 -SOTONIA3_RS04055 NILJEPDF_00794 -SOTONIA3_RS04055 LJHENM_03995 -SOTONIA3_RS04055 BKC02_RS04070 -SOTONIA3_RS04055 JIEJKO_03995 -SOTONIA3_RS04055 QSDFRQ_00794 -SOTONIA3_RS04055 BKC01_RS04075 -SOTONIA3_RS04055 CTRC943_RS04020 -SOTONIA3_RS04055 CTJTET1_RS04210 -SOTONIA3_RS04055 AKW53_RS00770 -SOTONIA3_RS04055 KW39_RS04050 -SOTONIA3_RS04055 BKC03_RS04070 -SOTONIA3_RS04055 CBP48_RS00640 -SOTONIA3_RS04055 CTJTET1_RS04055 -SOTONIA3_RS04055 DU10_RS04085 -SOTONIA3_RS04055 A5291_RS04080 -SOTONIA3_RS04055 SOTONK1_RS04035 -SOTONIA3_RS04055 ECS88FINAL_RS0104135 -SOTONIA3_RS04055 IaCS19096_RS04030 -SOTONIA3_RS04055 DU13_RS04085 -SOTONIA3_RS04055 C15_RS0104140 -SOTONIA3_RS04055 O169_RS04045 -SOTONIA3_RS04055 KW36_RS04035 -SOTONIA3_RS04055 AOT15_RS02340 -SOTONIA3_RS04055 BKB95_RS04090 -SOTONIA3_RS04055 CBP42_RS00640 -SOTONIA3_RS04055 CTL2C_RS00635 -SOTONIA3_RS04055 L1224_RS04015 -SOTONIA3_RS04055 BKB96_RS04075 -SOTONIA3_RS04055 SW2_RS04040 -SOTONIA3_RS04055 L1440_RS04010 -SOTONIA3_RS04055 ECS102511_RS04030 -SOTONIA3_RS04055 BKB99_RS04070 -SOTONIA3_RS04055 AQ244_RS03850 -SOTONIA3_RS04055 CBP44_RS00640 -SOTONIA3_RS04055 L2BUCH2_RS04015 -SOTONIA3_RS04055 CTB_RS04075 -SOTONIA3_RS04055 BKB92_RS04070 -SOTONIA3_RS04235 SOTONIA3_RS04235 -SOTONIA3_RS04235 BKB92_RS04255 -SOTONIA3_RS04235 CTO_RS04245 -SOTONIA3_RS04235 AP288_RS02520 -SOTONIA3_RS04235 BBV13_RS04260 -SOTONIA3_RS04235 119819 -SOTONIA3_RS04235 E150_RS04225 -SOTONIA3_RS04235 7618292 -SOTONIA3_RS04235 L2BLST_RS04195 -SOTONIA3_RS04235 FCS84708_RS04215 -SOTONIA3_RS04235 AQ199_RS00145 -SOTONIA3_RS04235 BBV16_RS04265 -SOTONIA3_RS04235 BW688_RS00825 -SOTONIA3_RS04235 gnl|Prokka|PADJNBJD_00828 -SOTONIA3_RS04235 AQ193_RS04555 -SOTONIA3_RS04235 NILJEPDF_00829 -SOTONIA3_RS04235 G9768_RS04220 -SOTONIA3_RS04235 L3404_RS04190 -SOTONIA3_RS04235 BKB93_RS04260 -SOTONIA3_RS04235 LJHENM_04170 -SOTONIA3_RS04235 AQ244_RS02545 -SOTONIA3_RS04235 JIEJKO_04170 -SOTONIA3_RS04235 BKC02_RS04255 -SOTONIA3_RS04235 QSDFRQ_00829 -SOTONIA3_RS04235 AKW53_RS00935 -SOTONIA3_RS04235 BKC01_RS04260 -SOTONIA3_RS04235 CTRC943_RS04200 -SOTONIA3_RS04235 AOT15_RS01800 -SOTONIA3_RS04235 CTJTET1_RS04390 -SOTONIA3_RS04235 BKC03_RS04255 -SOTONIA3_RS04235 CBP48_RS00825 -SOTONIA3_RS04235 A5291_RS04255 -SOTONIA3_RS04235 KW39_RS04235 -SOTONIA3_RS04235 SOTONK1_RS04220 -SOTONIA3_RS04235 ECS88FINAL_RS0104305 -SOTONIA3_RS04235 IaCS19096_RS04210 -SOTONIA3_RS04235 DU10_RS04270 -SOTONIA3_RS04235 C15_RS0104330 -SOTONIA3_RS04235 DU13_RS04270 -SOTONIA3_RS04235 O169_RS04230 -SOTONIA3_RS04235 KW36_RS04215 -SOTONIA3_RS04235 BKB95_RS04275 -SOTONIA3_RS04235 CBP42_RS00825 -SOTONIA3_RS04235 CTL2C_RS00815 -SOTONIA3_RS04235 L1224_RS04195 -SOTONIA3_RS04235 BKB96_RS04260 -SOTONIA3_RS04235 L1440_RS04190 -SOTONIA3_RS04235 BKB99_RS04255 -SOTONIA3_RS04235 SW2_RS04225 -SOTONIA3_RS04235 ECS102511_RS04215 -SOTONIA3_RS04235 CBP44_RS00825 -SOTONIA3_RS04235 CTB_RS04250 -SOTONIA3_RS04235 L2BUCH2_RS04195 -SOTONIA3_RS04400 SOTONIA3_RS04400 -SOTONIA3_RS04400 CTO_RS04410 -SOTONIA3_RS04400 BKB92_RS04425 -SOTONIA3_RS04400 L2BLST_RS04360 -SOTONIA3_RS04400 BBV13_RS04425 -SOTONIA3_RS04400 AP288_RS02690 -SOTONIA3_RS04400 BBV16_RS04430 -SOTONIA3_RS04400 E150_RS04395 -SOTONIA3_RS04400 gnl|Prokka|PADJNBJD_00859 -SOTONIA3_RS04400 BW688_RS00995 -SOTONIA3_RS04400 7618742 -SOTONIA3_RS04400 119963 -SOTONIA3_RS04400 FCS84708_RS04380 -SOTONIA3_RS04400 AQ199_RS00315 -SOTONIA3_RS04400 NILJEPDF_00860 -SOTONIA3_RS04400 AQ193_RS04385 -SOTONIA3_RS04400 LJHENM_04325 -SOTONIA3_RS04400 L3404_RS04355 -SOTONIA3_RS04400 G9768_RS04385 -SOTONIA3_RS04400 JIEJKO_04325 -SOTONIA3_RS04400 QSDFRQ_00860 -SOTONIA3_RS04400 AQ244_RS02365 -SOTONIA3_RS04400 BKB93_RS04430 -SOTONIA3_RS04400 BKC02_RS04425 -SOTONIA3_RS04400 CTRC943_RS04365 -SOTONIA3_RS04400 BKC01_RS04430 -SOTONIA3_RS04400 AKW53_RS01105 -SOTONIA3_RS04400 AOT15_RS01965 -SOTONIA3_RS04400 CTJTET1_RS04555 -SOTONIA3_RS04400 CBP48_RS00995 -SOTONIA3_RS04400 BKC03_RS04425 -SOTONIA3_RS04400 A5291_RS04420 -SOTONIA3_RS04400 KW39_RS04400 -SOTONIA3_RS04400 SOTONK1_RS04385 -SOTONIA3_RS04400 IaCS19096_RS04380 -SOTONIA3_RS04400 C15_RS0104495 -SOTONIA3_RS04400 ECS88FINAL_RS0104475 -SOTONIA3_RS04400 DU10_RS04440 -SOTONIA3_RS04400 KW36_RS04385 -SOTONIA3_RS04400 DU13_RS04440 -SOTONIA3_RS04400 O169_RS04400 -SOTONIA3_RS04400 CBP42_RS00995 -SOTONIA3_RS04400 CTL2C_RS00980 -SOTONIA3_RS04400 L1224_RS04360 -SOTONIA3_RS04400 BKB95_RS04445 -SOTONIA3_RS04400 L1440_RS04355 -SOTONIA3_RS04400 BKB96_RS04430 -SOTONIA3_RS04400 BKB99_RS04425 -SOTONIA3_RS04400 SW2_RS04390 -SOTONIA3_RS04400 ECS102511_RS04385 -SOTONIA3_RS04400 CBP44_RS00995 -SOTONIA3_RS04400 L2BUCH2_RS04360 -SOTONIA3_RS04400 CTB_RS04415 -SOTONIA3_RS04555 SOTONIA3_RS04555 -SOTONIA3_RS04555 CTO_RS04565 -SOTONIA3_RS04555 BBV13_RS04585 -SOTONIA3_RS04555 BKB92_RS04600 -SOTONIA3_RS04555 AP288_RS02850 -SOTONIA3_RS04555 BBV16_RS04590 -SOTONIA3_RS04555 E150_RS04555 -SOTONIA3_RS04555 gnl|Prokka|PADJNBJD_00891 -SOTONIA3_RS04555 L2BLST_RS04520 -SOTONIA3_RS04555 FCS84708_RS04540 -SOTONIA3_RS04555 AQ199_RS00475 -SOTONIA3_RS04555 NILJEPDF_00892 -SOTONIA3_RS04555 BW688_RS01170 -SOTONIA3_RS04555 119882 -SOTONIA3_RS04555 AQ193_RS04225 -SOTONIA3_RS04555 JIEJKO_04485 -SOTONIA3_RS04555 7618334 -SOTONIA3_RS04555 QSDFRQ_00892 -SOTONIA3_RS04555 G9768_RS04540 -SOTONIA3_RS04555 LJHENM_04495 -SOTONIA3_RS04555 L3404_RS04515 -SOTONIA3_RS04555 BKB93_RS04605 -SOTONIA3_RS04555 AQ244_RS02210 -SOTONIA3_RS04555 BKC02_RS04595 -SOTONIA3_RS04555 AKW53_RS01265 -SOTONIA3_RS04555 BKC01_RS04600 -SOTONIA3_RS04555 CTRC943_RS04525 -SOTONIA3_RS04555 AOT15_RS02120 -SOTONIA3_RS04555 CTJTET1_RS04710 -SOTONIA3_RS04555 KW39_RS04560 -SOTONIA3_RS04555 BKC03_RS04595 -SOTONIA3_RS04555 CBP48_RS01170 -SOTONIA3_RS04555 A5291_RS04575 -SOTONIA3_RS04555 SOTONK1_RS04540 -SOTONIA3_RS04555 ECS88FINAL_RS0104650 -SOTONIA3_RS04555 IaCS19096_RS04535 -SOTONIA3_RS04555 C15_RS0104670 -SOTONIA3_RS04555 DU10_RS04615 -SOTONIA3_RS04555 O169_RS04560 -SOTONIA3_RS04555 KW36_RS04540 -SOTONIA3_RS04555 DU13_RS04615 -SOTONIA3_RS04555 BKB95_RS04615 -SOTONIA3_RS04555 CBP42_RS01170 -SOTONIA3_RS04555 CTL2C_RS01140 -SOTONIA3_RS04555 L1224_RS04520 -SOTONIA3_RS04555 BKB96_RS04600 -SOTONIA3_RS04555 L1440_RS04515 -SOTONIA3_RS04555 BKB99_RS04595 -SOTONIA3_RS04555 SW2_RS04550 -SOTONIA3_RS04555 ECS102511_RS04545 -SOTONIA3_RS04555 CBP44_RS01170 -SOTONIA3_RS04555 CTB_RS04570 -SOTONIA3_RS04555 L2BUCH2_RS04520 -SOTONIA3_RS04730 SOTONIA3_RS04730 -SOTONIA3_RS04730 AP288_RS03025 -SOTONIA3_RS04730 BKB92_RS04770 -SOTONIA3_RS04730 gnl|Prokka|PADJNBJD_00924 -SOTONIA3_RS04730 CTO_RS04735 -SOTONIA3_RS04730 L2BLST_RS04695 -SOTONIA3_RS04730 BBV13_RS04755 -SOTONIA3_RS04730 E150_RS04730 -SOTONIA3_RS04730 BBV16_RS04760 -SOTONIA3_RS04730 NILJEPDF_00925 -SOTONIA3_RS04730 FCS84708_RS04715 -SOTONIA3_RS04730 AQ199_RS00650 -SOTONIA3_RS04730 BW688_RS01345 -SOTONIA3_RS04730 119904 -SOTONIA3_RS04730 JIEJKO_04650 -SOTONIA3_RS04730 QSDFRQ_00925 -SOTONIA3_RS04730 LJHENM_04660 -SOTONIA3_RS04730 L3404_RS04690 -SOTONIA3_RS04730 AQ193_RS04050 -SOTONIA3_RS04730 G9768_RS04715 -SOTONIA3_RS04730 7618347 -SOTONIA3_RS04730 BKB93_RS04775 -SOTONIA3_RS04730 AQ244_RS02035 -SOTONIA3_RS04730 BKC02_RS04765 -SOTONIA3_RS04730 CTRC943_RS04700 -SOTONIA3_RS04730 AKW53_RS01440 -SOTONIA3_RS04730 BKC01_RS04770 -SOTONIA3_RS04730 AOT15_RS02295 -SOTONIA3_RS04730 CTJTET1_RS04885 -SOTONIA3_RS04730 CBP48_RS01345 -SOTONIA3_RS04730 KW39_RS04735 -SOTONIA3_RS04730 BKC03_RS04765 -SOTONIA3_RS04730 SOTONK1_RS04715 -SOTONIA3_RS04730 A5291_RS04745 -SOTONIA3_RS04730 ECS88FINAL_RS0104815 -SOTONIA3_RS04730 IaCS19096_RS04710 -SOTONIA3_RS04730 C15_RS0104835 -SOTONIA3_RS04730 DU10_RS04785 -SOTONIA3_RS04730 O169_RS04735 -SOTONIA3_RS04730 KW36_RS04715 -SOTONIA3_RS04730 DU13_RS04785 -SOTONIA3_RS04730 CTL2C_RS01315 -SOTONIA3_RS04730 CBP42_RS01345 -SOTONIA3_RS04730 L1224_RS04695 -SOTONIA3_RS04730 BKB95_RS04785 -SOTONIA3_RS04730 L1440_RS04690 -SOTONIA3_RS04730 BKB96_RS04770 -SOTONIA3_RS04730 BKB99_RS04765 -SOTONIA3_RS04730 SW2_RS04725 -SOTONIA3_RS04730 ECS102511_RS04720 -SOTONIA3_RS04730 CBP44_RS01345 -SOTONIA3_RS04730 L2BUCH2_RS04695 -SOTONIA3_RS04730 CTB_RS04740 -SOTONK1_RS00400 SOTONK1_RS00400 -SOTONK1_RS00400 L3404_RS00400 -SOTONK1_RS00400 JIEJKO_00400 -SOTONK1_RS00400 AKW53_RS01890 -SOTONK1_RS00400 QSDFRQ_00079 -SOTONK1_RS00400 IaCS19096_RS00400 -SOTONK1_RS00400 AOT15_RS00555 -SOTONK1_RS00400 BKC03_RS00410 -SOTONK1_RS00400 C15_RS0100410 -SOTONK1_RS00400 DU10_RS00410 -SOTONK1_RS00400 7618396 -SOTONK1_RS00400 CTRC943_RS00400 -SOTONK1_RS00400 CTJTET1_RS00400 -SOTONK1_RS00400 O169_RS00400 -SOTONK1_RS00400 KW36_RS00400 -SOTONK1_RS00400 DU13_RS00415 -SOTONK1_RS00400 CBP48_RS01800 -SOTONK1_RS00400 ECS88FINAL_RS0100415 -SOTONK1_RS00400 KW39_RS00400 -SOTONK1_RS00400 BKB95_RS00410 -SOTONK1_RS00400 SW2_RS00400 -SOTONK1_RS00400 ECS102511_RS00400 -SOTONK1_RS00400 CTB_RS00400 -SOTONK1_RS00400 CTL2C_RS01765 -SOTONK1_RS00400 CBP42_RS01800 -SOTONK1_RS00400 BKB96_RS00410 -SOTONK1_RS00400 L1224_RS00400 -SOTONK1_RS00400 BKB99_RS00410 -SOTONK1_RS00400 CTO_RS00400 -SOTONK1_RS00400 L1440_RS00400 -SOTONK1_RS00400 BKB92_RS00410 -SOTONK1_RS00400 SOTONIA3_RS00400 -SOTONK1_RS00400 AQ193_RS03595 -SOTONK1_RS00400 AQ244_RS01590 -SOTONK1_RS00400 CBP44_RS01805 -SOTONK1_RS00400 119268 -SOTONK1_RS00400 E150_RS00400 -SOTONK1_RS00400 L2BUCH2_RS00400 -SOTONK1_RS00400 BKB93_RS00410 -SOTONK1_RS00400 FCS84708_RS00400 -SOTONK1_RS00400 AP288_RS03470 -SOTONK1_RS00400 BBV13_RS00405 -SOTONK1_RS00400 AQ199_RS01095 -SOTONK1_RS00400 BW688_RS01800 -SOTONK1_RS00400 G9768_RS00400 -SOTONK1_RS00400 L2BLST_RS00400 -SOTONK1_RS00400 BKC02_RS00410 -SOTONK1_RS00400 BBV16_RS00405 -SOTONK1_RS00400 gnl|Prokka|PADJNBJD_00079 -SOTONK1_RS00400 NILJEPDF_00079 -SOTONK1_RS00400 LJHENM_00400 -SOTONK1_RS00400 A5291_RS00400 -SOTONK1_RS00400 BKC01_RS00410 -SOTONK1_RS02590 SOTONK1_RS02590 -SOTONK1_RS02590 CTJTET1_RS02600 -SOTONK1_RS02590 JIEJKO_02575 -SOTONK1_RS02590 BKC03_RS02610 -SOTONK1_RS02590 QSDFRQ_00511 -SOTONK1_RS02590 KW39_RS02600 -SOTONK1_RS02590 C15_RS0102650 -SOTONK1_RS02590 ECS88FINAL_RS0102645 -SOTONK1_RS02590 IaCS19096_RS02585 -SOTONK1_RS02590 AKW53_RS04625 -SOTONK1_RS02590 DU10_RS02630 -SOTONK1_RS02590 O169_RS02600 -SOTONK1_RS02590 A5291_RS02625 -SOTONK1_RS02590 DU13_RS02625 -SOTONK1_RS02590 CBP48_RS04010 -SOTONK1_RS02590 7619026 -SOTONK1_RS02590 CTL2C_RS03940 -SOTONK1_RS02590 KW36_RS02585 -SOTONK1_RS02590 AP288_RS00490 -SOTONK1_RS02590 BKB95_RS02625 -SOTONK1_RS02590 BKB96_RS02615 -SOTONK1_RS02590 BKB99_RS02610 -SOTONK1_RS02590 SW2_RS02595 -SOTONK1_RS02590 L1224_RS02570 -SOTONK1_RS02590 ECS102511_RS02590 -SOTONK1_RS02590 L1440_RS02570 -SOTONK1_RS02590 AQ244_RS00520 -SOTONK1_RS02590 120253 -SOTONK1_RS02590 CBP42_RS04020 -SOTONK1_RS02590 L2BUCH2_RS02570 -SOTONK1_RS02590 SOTONIA3_RS02605 -SOTONK1_RS02590 BKB92_RS02615 -SOTONK1_RS02590 CTB_RS02625 -SOTONK1_RS02590 E150_RS02595 -SOTONK1_RS02590 BW688_RS04010 -SOTONK1_RS02590 CTO_RS02625 -SOTONK1_RS02590 FCS84708_RS02585 -SOTONK1_RS02590 L2BLST_RS02570 -SOTONK1_RS02590 BBV13_RS02630 -SOTONK1_RS02590 CBP44_RS04015 -SOTONK1_RS02590 AQ193_RS01395 -SOTONK1_RS02590 AQ199_RS03285 -SOTONK1_RS02590 BKB93_RS02620 -SOTONK1_RS02590 AOT15_RS03505 -SOTONK1_RS02590 BBV16_RS02640 -SOTONK1_RS02590 G9768_RS02590 -SOTONK1_RS02590 L3404_RS02565 -SOTONK1_RS02590 BKC02_RS02610 -SOTONK1_RS02590 BKC01_RS02610 -SOTONK1_RS02590 gnl|Prokka|PADJNBJD_00511 -SOTONK1_RS02590 NILJEPDF_00511 -SOTONK1_RS02590 LJHENM_02570 -SOTONK1_RS02590 CTRC943_RS02570 -SOTONK1_RS02755 SOTONK1_RS02755 -SOTONK1_RS02755 CTJTET1_RS02765 -SOTONK1_RS02755 BKC03_RS02780 -SOTONK1_RS02755 KW39_RS02765 -SOTONK1_RS02755 C15_RS0102825 -SOTONK1_RS02755 ECS88FINAL_RS0102820 -SOTONK1_RS02755 IaCS19096_RS02750 -SOTONK1_RS02755 DU10_RS02800 -SOTONK1_RS02755 O169_RS02765 -SOTONK1_RS02755 A5291_RS02790 -SOTONK1_RS02755 DU13_RS02795 -SOTONK1_RS02755 CBP48_RS04180 -SOTONK1_RS02755 7619054 -SOTONK1_RS02755 CTL2C_RS04105 -SOTONK1_RS02755 KW36_RS02750 -SOTONK1_RS02755 AKW53_RS03980 -SOTONK1_RS02755 AP288_RS00325 -SOTONK1_RS02755 BKB95_RS02795 -SOTONK1_RS02755 BKB96_RS02785 -SOTONK1_RS02755 BKB99_RS02780 -SOTONK1_RS02755 SW2_RS02760 -SOTONK1_RS02755 L1224_RS02735 -SOTONK1_RS02755 ECS102511_RS02755 -SOTONK1_RS02755 L1440_RS02735 -SOTONK1_RS02755 AQ244_RS00355 -SOTONK1_RS02755 120209 -SOTONK1_RS02755 CBP42_RS04190 -SOTONK1_RS02755 L2BUCH2_RS02735 -SOTONK1_RS02755 SOTONIA3_RS02770 -SOTONK1_RS02755 BKB92_RS02785 -SOTONK1_RS02755 CTB_RS02790 -SOTONK1_RS02755 E150_RS02760 -SOTONK1_RS02755 BW688_RS04180 -SOTONK1_RS02755 CTO_RS02790 -SOTONK1_RS02755 FCS84708_RS02750 -SOTONK1_RS02755 L2BLST_RS02735 -SOTONK1_RS02755 BBV13_RS02795 -SOTONK1_RS02755 CBP44_RS04185 -SOTONK1_RS02755 AQ193_RS01230 -SOTONK1_RS02755 AQ199_RS03450 -SOTONK1_RS02755 BKB93_RS02790 -SOTONK1_RS02755 BBV16_RS02805 -SOTONK1_RS02755 G9768_RS02755 -SOTONK1_RS02755 L3404_RS02730 -SOTONK1_RS02755 BKC02_RS02780 -SOTONK1_RS02755 gnl|Prokka|PADJNBJD_00543 -SOTONK1_RS02755 NILJEPDF_00543 -SOTONK1_RS02755 BKC01_RS02780 -SOTONK1_RS02755 LJHENM_02735 -SOTONK1_RS02755 CTRC943_RS02735 -SOTONK1_RS02755 AOT15_RS01555 -SOTONK1_RS02755 QSDFRQ_00543 -SOTONK1_RS02755 JIEJKO_02740 -SOTONK1_RS02920 SOTONK1_RS02920 -SOTONK1_RS02920 CTJTET1_RS02930 -SOTONK1_RS02920 BKC03_RS02950 -SOTONK1_RS02920 C15_RS0102990 -SOTONK1_RS02920 KW39_RS02935 -SOTONK1_RS02920 IaCS19096_RS02915 -SOTONK1_RS02920 ECS88FINAL_RS0102990 -SOTONK1_RS02920 DU10_RS02970 -SOTONK1_RS02920 A5291_RS02955 -SOTONK1_RS02920 O169_RS02930 -SOTONK1_RS02920 AP288_RS00160 -SOTONK1_RS02920 DU13_RS02965 -SOTONK1_RS02920 CBP48_RS04350 -SOTONK1_RS02920 CTL2C_RS04270 -SOTONK1_RS02920 KW36_RS02915 -SOTONK1_RS02920 BKB95_RS02965 -SOTONK1_RS02920 BKB96_RS02955 -SOTONK1_RS02920 BKB99_RS02950 -SOTONK1_RS02920 L1224_RS02900 -SOTONK1_RS02920 AKW53_RS04150 -SOTONK1_RS02920 7618610 -SOTONK1_RS02920 SW2_RS02925 -SOTONK1_RS02920 ECS102511_RS02920 -SOTONK1_RS02920 L1440_RS02900 -SOTONK1_RS02920 AQ244_RS00190 -SOTONK1_RS02920 CBP42_RS04360 -SOTONK1_RS02920 L2BUCH2_RS02900 -SOTONK1_RS02920 119607 -SOTONK1_RS02920 SOTONIA3_RS02935 -SOTONK1_RS02920 CTB_RS02955 -SOTONK1_RS02920 BKB92_RS02955 -SOTONK1_RS02920 E150_RS02925 -SOTONK1_RS02920 BW688_RS04350 -SOTONK1_RS02920 CTO_RS02955 -SOTONK1_RS02920 L2BLST_RS02900 -SOTONK1_RS02920 FCS84708_RS02920 -SOTONK1_RS02920 AQ193_RS01065 -SOTONK1_RS02920 BBV13_RS02960 -SOTONK1_RS02920 CBP44_RS04355 -SOTONK1_RS02920 AQ199_RS03620 -SOTONK1_RS02920 BBV16_RS02970 -SOTONK1_RS02920 BKB93_RS02960 -SOTONK1_RS02920 G9768_RS02920 -SOTONK1_RS02920 L3404_RS02895 -SOTONK1_RS02920 BKC02_RS02950 -SOTONK1_RS02920 gnl|Prokka|PADJNBJD_00576 -SOTONK1_RS02920 AOT15_RS03720 -SOTONK1_RS02920 NILJEPDF_00576 -SOTONK1_RS02920 BKC01_RS02950 -SOTONK1_RS02920 LJHENM_02900 -SOTONK1_RS02920 CTRC943_RS02900 -SOTONK1_RS02920 QSDFRQ_00576 -SOTONK1_RS02920 JIEJKO_02905 -SOTONK1_RS03080 SOTONK1_RS03080 -SOTONK1_RS03080 CTJTET1_RS03090 -SOTONK1_RS03080 BKC03_RS03110 -SOTONK1_RS03080 KW39_RS03090 -SOTONK1_RS03080 C15_RS0103145 -SOTONK1_RS03080 ECS88FINAL_RS0103140 -SOTONK1_RS03080 IaCS19096_RS03075 -SOTONK1_RS03080 DU10_RS03125 -SOTONK1_RS03080 A5291_RS03110 -SOTONK1_RS03080 O169_RS03085 -SOTONK1_RS03080 CTL2C_RS04420 -SOTONK1_RS03080 DU13_RS03120 -SOTONK1_RS03080 CBP48_RS04510 -SOTONK1_RS03080 L1224_RS03050 -SOTONK1_RS03080 KW36_RS03075 -SOTONK1_RS03080 BKB95_RS03120 -SOTONK1_RS03080 AKW53_RS04305 -SOTONK1_RS03080 AP288_RS00005 -SOTONK1_RS03080 BKB96_RS03115 -SOTONK1_RS03080 BKB99_RS03110 -SOTONK1_RS03080 7619095 -SOTONK1_RS03080 SW2_RS03080 -SOTONK1_RS03080 L1440_RS03050 -SOTONK1_RS03080 ECS102511_RS03075 -SOTONK1_RS03080 CBP42_RS04515 -SOTONK1_RS03080 L2BUCH2_RS03050 -SOTONK1_RS03080 AQ244_RS00030 -SOTONK1_RS03080 CTB_RS03110 -SOTONK1_RS03080 SOTONIA3_RS03095 -SOTONK1_RS03080 BKB92_RS03110 -SOTONK1_RS03080 BW688_RS04505 -SOTONK1_RS03080 120146 -SOTONK1_RS03080 E150_RS03080 -SOTONK1_RS03080 CTO_RS03110 -SOTONK1_RS03080 L2BLST_RS03050 -SOTONK1_RS03080 CBP44_RS04510 -SOTONK1_RS03080 FCS84708_RS03075 -SOTONK1_RS03080 BBV13_RS03115 -SOTONK1_RS03080 AQ193_RS00910 -SOTONK1_RS03080 AQ199_RS03775 -SOTONK1_RS03080 BBV16_RS03125 -SOTONK1_RS03080 BKB93_RS03115 -SOTONK1_RS03080 G9768_RS03080 -SOTONK1_RS03080 L3404_RS03045 -SOTONK1_RS03080 gnl|Prokka|PADJNBJD_00606 -SOTONK1_RS03080 NILJEPDF_00606 -SOTONK1_RS03080 LJHENM_03045 -SOTONK1_RS03080 BKC02_RS03110 -SOTONK1_RS03080 AOT15_RS03880 -SOTONK1_RS03080 CTRC943_RS03050 -SOTONK1_RS03080 BKC01_RS03110 -SOTONK1_RS03080 QSDFRQ_00606 -SOTONK1_RS03080 JIEJKO_03055 -SOTONK1_RS03235 SOTONK1_RS03235 -SOTONK1_RS03235 O169_RS03245 -SOTONK1_RS03235 IaCS19096_RS03230 -SOTONK1_RS03235 C15_RS0103300 -SOTONK1_RS03235 A5291_RS03275 -SOTONK1_RS03235 DU13_RS03275 -SOTONK1_RS03235 CTL2C_RS04580 -SOTONK1_RS03235 AKW53_RS04460 -SOTONK1_RS03235 CBP48_RS04665 -SOTONK1_RS03235 7619104 -SOTONK1_RS03235 SW2_RS03240 -SOTONK1_RS03235 L1224_RS03210 -SOTONK1_RS03235 KW36_RS03235 -SOTONK1_RS03235 ECS102511_RS03235 -SOTONK1_RS03235 L1440_RS03210 -SOTONK1_RS03235 BKB95_RS03280 -SOTONK1_RS03235 BKB96_RS03275 -SOTONK1_RS03235 BKB99_RS03270 -SOTONK1_RS03235 CBP42_RS04670 -SOTONK1_RS03235 L2BUCH2_RS03210 -SOTONK1_RS03235 BKB92_RS03265 -SOTONK1_RS03235 CTB_RS03275 -SOTONK1_RS03235 E150_RS03240 -SOTONK1_RS03235 SOTONIA3_RS03255 -SOTONK1_RS03235 AQ244_RS04680 -SOTONK1_RS03235 BW688_RS04660 -SOTONK1_RS03235 CTO_RS03270 -SOTONK1_RS03235 FCS84708_RS03235 -SOTONK1_RS03235 L2BLST_RS03210 -SOTONK1_RS03235 BBV13_RS03275 -SOTONK1_RS03235 CBP44_RS04665 -SOTONK1_RS03235 120128 -SOTONK1_RS03235 AQ199_RS03935 -SOTONK1_RS03235 BKB93_RS03270 -SOTONK1_RS03235 BBV16_RS03285 -SOTONK1_RS03235 G9768_RS03235 -SOTONK1_RS03235 L3404_RS03205 -SOTONK1_RS03235 gnl|Prokka|PADJNBJD_00636 -SOTONK1_RS03235 AP288_RS01605 -SOTONK1_RS03235 AQ193_RS00750 -SOTONK1_RS03235 BKC02_RS03265 -SOTONK1_RS03235 NILJEPDF_00637 -SOTONK1_RS03235 LJHENM_03200 -SOTONK1_RS03235 AOT15_RS04035 -SOTONK1_RS03235 CTRC943_RS03210 -SOTONK1_RS03235 JIEJKO_03205 -SOTONK1_RS03235 BKC01_RS03265 -SOTONK1_RS03235 QSDFRQ_00637 -SOTONK1_RS03235 KW39_RS03250 -SOTONK1_RS03235 BKC03_RS03265 -SOTONK1_RS03235 CTJTET1_RS03250 -SOTONK1_RS03235 ECS88FINAL_RS0103300 -SOTONK1_RS03235 DU10_RS03280 -SOTONK1_RS03405 SOTONK1_RS03405 -SOTONK1_RS03405 ECS88FINAL_RS0103485 -SOTONK1_RS03405 IaCS19096_RS03400 -SOTONK1_RS03405 C15_RS0103480 -SOTONK1_RS03405 A5291_RS03450 -SOTONK1_RS03405 O169_RS03420 -SOTONK1_RS03405 DU13_RS03455 -SOTONK1_RS03405 AKW53_RS00155 -SOTONK1_RS03405 KW36_RS03405 -SOTONK1_RS03405 BKB95_RS03460 -SOTONK1_RS03405 CBP42_RS00010 -SOTONK1_RS03405 SW2_RS03415 -SOTONK1_RS03405 CTL2C_RS00010 -SOTONK1_RS03405 L1224_RS03390 -SOTONK1_RS03405 ECS102511_RS03405 -SOTONK1_RS03405 L1440_RS03390 -SOTONK1_RS03405 BKB96_RS03450 -SOTONK1_RS03405 BKB99_RS03445 -SOTONK1_RS03405 CBP44_RS00010 -SOTONK1_RS03405 L2BUCH2_RS03390 -SOTONK1_RS03405 BKB92_RS03440 -SOTONK1_RS03405 CTB_RS03445 -SOTONK1_RS03405 SOTONIA3_RS03425 -SOTONK1_RS03405 E150_RS03415 -SOTONK1_RS03405 CTO_RS03440 -SOTONK1_RS03405 AQ244_RS04505 -SOTONK1_RS03405 BBV13_RS03445 -SOTONK1_RS03405 FCS84708_RS03405 -SOTONK1_RS03405 L2BLST_RS03390 -SOTONK1_RS03405 7618659 -SOTONK1_RS03405 BBV16_RS03455 -SOTONK1_RS03405 BW688_RS00010 -SOTONK1_RS03405 120093 -SOTONK1_RS03405 AQ199_RS04105 -SOTONK1_RS03405 BKB93_RS03445 -SOTONK1_RS03405 G9768_RS03405 -SOTONK1_RS03405 gnl|Prokka|PADJNBJD_00670 -SOTONK1_RS03405 L3404_RS03385 -SOTONK1_RS03405 AQ193_RS00580 -SOTONK1_RS03405 BKC02_RS03440 -SOTONK1_RS03405 NILJEPDF_00671 -SOTONK1_RS03405 LJHENM_03370 -SOTONK1_RS03405 AOT15_RS04205 -SOTONK1_RS03405 AP288_RS01775 -SOTONK1_RS03405 JIEJKO_03375 -SOTONK1_RS03405 BKC01_RS03440 -SOTONK1_RS03405 QSDFRQ_00671 -SOTONK1_RS03405 CTRC943_RS03390 -SOTONK1_RS03405 BKC03_RS03440 -SOTONK1_RS03405 CBP48_RS00010 -SOTONK1_RS03405 CTJTET1_RS03425 -SOTONK1_RS03405 KW39_RS03425 -SOTONK1_RS03405 DU10_RS03455 -SOTONK1_RS03580 SOTONK1_RS03580 -SOTONK1_RS03580 ECS88FINAL_RS0103670 -SOTONK1_RS03580 IaCS19096_RS03575 -SOTONK1_RS03580 C15_RS0103660 -SOTONK1_RS03580 A5291_RS03625 -SOTONK1_RS03580 O169_RS03590 -SOTONK1_RS03580 DU13_RS03625 -SOTONK1_RS03580 KW36_RS03580 -SOTONK1_RS03580 AKW53_RS00325 -SOTONK1_RS03580 BKB95_RS03630 -SOTONK1_RS03580 CBP42_RS00180 -SOTONK1_RS03580 SW2_RS03585 -SOTONK1_RS03580 CTL2C_RS00180 -SOTONK1_RS03580 L1224_RS03560 -SOTONK1_RS03580 ECS102511_RS03575 -SOTONK1_RS03580 L1440_RS03560 -SOTONK1_RS03580 BKB96_RS03620 -SOTONK1_RS03580 BKB99_RS03615 -SOTONK1_RS03580 CBP44_RS00180 -SOTONK1_RS03580 L2BUCH2_RS03560 -SOTONK1_RS03580 BKB92_RS03610 -SOTONK1_RS03580 CTB_RS03620 -SOTONK1_RS03580 SOTONIA3_RS03600 -SOTONK1_RS03580 E150_RS03585 -SOTONK1_RS03580 CTO_RS03615 -SOTONK1_RS03580 AQ244_RS04330 -SOTONK1_RS03580 BBV13_RS03620 -SOTONK1_RS03580 FCS84708_RS03575 -SOTONK1_RS03580 L2BLST_RS03560 -SOTONK1_RS03580 BBV16_RS03630 -SOTONK1_RS03580 BW688_RS00180 -SOTONK1_RS03580 AQ199_RS04275 -SOTONK1_RS03580 BKB93_RS03615 -SOTONK1_RS03580 7618227 -SOTONK1_RS03580 119718 -SOTONK1_RS03580 G9768_RS03580 -SOTONK1_RS03580 gnl|Prokka|PADJNBJD_00704 -SOTONK1_RS03580 L3404_RS03555 -SOTONK1_RS03580 AQ193_RS00410 -SOTONK1_RS03580 BKC02_RS03610 -SOTONK1_RS03580 NILJEPDF_00705 -SOTONK1_RS03580 LJHENM_03540 -SOTONK1_RS03580 AOT15_RS04380 -SOTONK1_RS03580 AP288_RS01945 -SOTONK1_RS03580 JIEJKO_03545 -SOTONK1_RS03580 BKC01_RS03610 -SOTONK1_RS03580 QSDFRQ_00705 -SOTONK1_RS03580 CTRC943_RS03565 -SOTONK1_RS03580 BKC03_RS03610 -SOTONK1_RS03580 CBP48_RS00180 -SOTONK1_RS03580 CTJTET1_RS03600 -SOTONK1_RS03580 KW39_RS03595 -SOTONK1_RS03580 DU10_RS03625 -SOTONK1_RS04125 SOTONK1_RS04125 -SOTONK1_RS04125 IaCS19096_RS04120 -SOTONK1_RS04125 DU13_RS04175 -SOTONK1_RS04125 C15_RS0104235 -SOTONK1_RS04125 O169_RS04135 -SOTONK1_RS04125 KW36_RS04125 -SOTONK1_RS04125 BKB95_RS04180 -SOTONK1_RS04125 CBP42_RS00730 -SOTONK1_RS04125 CTL2C_RS00725 -SOTONK1_RS04125 L1224_RS04105 -SOTONK1_RS04125 BKB96_RS04165 -SOTONK1_RS04125 SW2_RS04130 -SOTONK1_RS04125 L1440_RS04100 -SOTONK1_RS04125 ECS102511_RS04120 -SOTONK1_RS04125 BKB99_RS04160 -SOTONK1_RS04125 CBP44_RS00730 -SOTONK1_RS04125 CTB_RS04160 -SOTONK1_RS04125 L2BUCH2_RS04105 -SOTONK1_RS04125 BKB92_RS04160 -SOTONK1_RS04125 SOTONIA3_RS04145 -SOTONK1_RS04125 CTO_RS04155 -SOTONK1_RS04125 AP288_RS02425 -SOTONK1_RS04125 E150_RS04130 -SOTONK1_RS04125 BBV13_RS04165 -SOTONK1_RS04125 119798 -SOTONK1_RS04125 FCS84708_RS04120 -SOTONK1_RS04125 AQ199_RS00050 -SOTONK1_RS04125 7618279 -SOTONK1_RS04125 L2BLST_RS04105 -SOTONK1_RS04125 BBV16_RS04175 -SOTONK1_RS04125 BW688_RS00730 -SOTONK1_RS04125 gnl|Prokka|PADJNBJD_00810 -SOTONK1_RS04125 BKB93_RS04165 -SOTONK1_RS04125 NILJEPDF_00811 -SOTONK1_RS04125 G9768_RS04125 -SOTONK1_RS04125 L3404_RS04100 -SOTONK1_RS04125 LJHENM_04080 -SOTONK1_RS04125 JIEJKO_04080 -SOTONK1_RS04125 BKC02_RS04160 -SOTONK1_RS04125 QSDFRQ_00811 -SOTONK1_RS04125 AKW53_RS00840 -SOTONK1_RS04125 AQ193_RS04650 -SOTONK1_RS04125 AQ244_RS02640 -SOTONK1_RS04125 BKC01_RS04165 -SOTONK1_RS04125 CTRC943_RS04110 -SOTONK1_RS04125 AOT15_RS01710 -SOTONK1_RS04125 CTJTET1_RS04300 -SOTONK1_RS04125 KW39_RS04140 -SOTONK1_RS04125 BKC03_RS04160 -SOTONK1_RS04125 CBP48_RS00730 -SOTONK1_RS04125 A5291_RS04165 -SOTONK1_RS04125 ECS88FINAL_RS0104210 -SOTONK1_RS04125 DU10_RS04175 -SOTONK1_RS04290 SOTONK1_RS04290 -SOTONK1_RS04290 ECS88FINAL_RS0104380 -SOTONK1_RS04290 IaCS19096_RS04280 -SOTONK1_RS04290 DU10_RS04340 -SOTONK1_RS04290 C15_RS0104400 -SOTONK1_RS04290 DU13_RS04340 -SOTONK1_RS04290 O169_RS04300 -SOTONK1_RS04290 KW36_RS04285 -SOTONK1_RS04290 BKB95_RS04345 -SOTONK1_RS04290 CBP42_RS00895 -SOTONK1_RS04290 CTL2C_RS00885 -SOTONK1_RS04290 L1224_RS04265 -SOTONK1_RS04290 BKB96_RS04330 -SOTONK1_RS04290 L1440_RS04260 -SOTONK1_RS04290 BKB99_RS04325 -SOTONK1_RS04290 SW2_RS04295 -SOTONK1_RS04290 ECS102511_RS04285 -SOTONK1_RS04290 CBP44_RS00895 -SOTONK1_RS04290 CTB_RS04320 -SOTONK1_RS04290 L2BUCH2_RS04265 -SOTONK1_RS04290 SOTONIA3_RS04305 -SOTONK1_RS04290 BKB92_RS04325 -SOTONK1_RS04290 CTO_RS04315 -SOTONK1_RS04290 AP288_RS02590 -SOTONK1_RS04290 BBV13_RS04330 -SOTONK1_RS04290 E150_RS04295 -SOTONK1_RS04290 L2BLST_RS04265 -SOTONK1_RS04290 FCS84708_RS04285 -SOTONK1_RS04290 AQ199_RS00215 -SOTONK1_RS04290 BBV16_RS04335 -SOTONK1_RS04290 119829 -SOTONK1_RS04290 gnl|Prokka|PADJNBJD_00841 -SOTONK1_RS04290 BW688_RS00895 -SOTONK1_RS04290 7618299 -SOTONK1_RS04290 NILJEPDF_00842 -SOTONK1_RS04290 G9768_RS04290 -SOTONK1_RS04290 LJHENM_04235 -SOTONK1_RS04290 L3404_RS04260 -SOTONK1_RS04290 BKB93_RS04330 -SOTONK1_RS04290 JIEJKO_04235 -SOTONK1_RS04290 QSDFRQ_00842 -SOTONK1_RS04290 BKC02_RS04325 -SOTONK1_RS04290 AQ193_RS04485 -SOTONK1_RS04290 AKW53_RS01005 -SOTONK1_RS04290 BKC01_RS04330 -SOTONK1_RS04290 CTRC943_RS04270 -SOTONK1_RS04290 AOT15_RS01870 -SOTONK1_RS04290 AQ244_RS02470 -SOTONK1_RS04290 CTJTET1_RS04460 -SOTONK1_RS04290 BKC03_RS04325 -SOTONK1_RS04290 CBP48_RS00895 -SOTONK1_RS04290 A5291_RS04325 -SOTONK1_RS04290 KW39_RS04305 -SOTONK1_RS04450 SOTONK1_RS04450 -SOTONK1_RS04450 ECS88FINAL_RS0104550 -SOTONK1_RS04450 IaCS19096_RS04445 -SOTONK1_RS04450 C15_RS0104570 -SOTONK1_RS04450 DU10_RS04515 -SOTONK1_RS04450 O169_RS04470 -SOTONK1_RS04450 KW36_RS04450 -SOTONK1_RS04450 DU13_RS04515 -SOTONK1_RS04450 BKB95_RS04515 -SOTONK1_RS04450 CBP42_RS01070 -SOTONK1_RS04450 CTL2C_RS01050 -SOTONK1_RS04450 L1224_RS04430 -SOTONK1_RS04450 BKB96_RS04500 -SOTONK1_RS04450 L1440_RS04425 -SOTONK1_RS04450 BKB99_RS04495 -SOTONK1_RS04450 SW2_RS04460 -SOTONK1_RS04450 ECS102511_RS04455 -SOTONK1_RS04450 CBP44_RS01070 -SOTONK1_RS04450 CTB_RS04480 -SOTONK1_RS04450 L2BUCH2_RS04430 -SOTONK1_RS04450 SOTONIA3_RS04465 -SOTONK1_RS04450 CTO_RS04475 -SOTONK1_RS04450 BKB92_RS04500 -SOTONK1_RS04450 AP288_RS02760 -SOTONK1_RS04450 E150_RS04465 -SOTONK1_RS04450 L2BLST_RS04430 -SOTONK1_RS04450 gnl|Prokka|PADJNBJD_00873 -SOTONK1_RS04450 FCS84708_RS04450 -SOTONK1_RS04450 AQ199_RS00385 -SOTONK1_RS04450 BW688_RS01070 -SOTONK1_RS04450 119862 -SOTONK1_RS04450 NILJEPDF_00874 -SOTONK1_RS04450 7618321 -SOTONK1_RS04450 G9768_RS04450 -SOTONK1_RS04450 LJHENM_04400 -SOTONK1_RS04450 L3404_RS04425 -SOTONK1_RS04450 JIEJKO_04395 -SOTONK1_RS04450 QSDFRQ_00874 -SOTONK1_RS04450 BKB93_RS04505 -SOTONK1_RS04450 BKC02_RS04495 -SOTONK1_RS04450 AQ193_RS04315 -SOTONK1_RS04450 AKW53_RS01175 -SOTONK1_RS04450 AQ244_RS02300 -SOTONK1_RS04450 BKC01_RS04500 -SOTONK1_RS04450 CTRC943_RS04435 -SOTONK1_RS04450 AOT15_RS02030 -SOTONK1_RS04450 CTJTET1_RS04620 -SOTONK1_RS04450 KW39_RS04470 -SOTONK1_RS04450 BKC03_RS04495 -SOTONK1_RS04450 CBP48_RS01070 -SOTONK1_RS04450 A5291_RS04485 -SOTONK1_RS04615 SOTONK1_RS04615 -SOTONK1_RS04615 ECS88FINAL_RS0104725 -SOTONK1_RS04615 IaCS19096_RS04610 -SOTONK1_RS04615 C15_RS0104745 -SOTONK1_RS04615 DU10_RS04690 -SOTONK1_RS04615 O169_RS04635 -SOTONK1_RS04615 KW36_RS04615 -SOTONK1_RS04615 DU13_RS04690 -SOTONK1_RS04615 CTL2C_RS01215 -SOTONK1_RS04615 BKB95_RS04690 -SOTONK1_RS04615 CBP42_RS01245 -SOTONK1_RS04615 L1224_RS04595 -SOTONK1_RS04615 BKB96_RS04675 -SOTONK1_RS04615 L1440_RS04590 -SOTONK1_RS04615 BKB99_RS04670 -SOTONK1_RS04615 SW2_RS04625 -SOTONK1_RS04615 ECS102511_RS04620 -SOTONK1_RS04615 CBP44_RS01245 -SOTONK1_RS04615 CTB_RS04645 -SOTONK1_RS04615 L2BUCH2_RS04595 -SOTONK1_RS04615 SOTONIA3_RS04630 -SOTONK1_RS04615 CTO_RS04640 -SOTONK1_RS04615 AP288_RS02925 -SOTONK1_RS04615 BBV13_RS04660 -SOTONK1_RS04615 BKB92_RS04675 -SOTONK1_RS04615 BBV16_RS04665 -SOTONK1_RS04615 E150_RS04630 -SOTONK1_RS04615 gnl|Prokka|PADJNBJD_00906 -SOTONK1_RS04615 L2BLST_RS04595 -SOTONK1_RS04615 FCS84708_RS04615 -SOTONK1_RS04615 AQ199_RS00550 -SOTONK1_RS04615 NILJEPDF_00907 -SOTONK1_RS04615 BW688_RS01245 -SOTONK1_RS04615 119893 -SOTONK1_RS04615 JIEJKO_04560 -SOTONK1_RS04615 7618341 -SOTONK1_RS04615 QSDFRQ_00907 -SOTONK1_RS04615 G9768_RS04615 -SOTONK1_RS04615 LJHENM_04570 -SOTONK1_RS04615 L3404_RS04590 -SOTONK1_RS04615 BKB93_RS04680 -SOTONK1_RS04615 BKC02_RS04670 -SOTONK1_RS04615 AQ193_RS04150 -SOTONK1_RS04615 AKW53_RS01340 -SOTONK1_RS04615 BKC01_RS04675 -SOTONK1_RS04615 CTRC943_RS04600 -SOTONK1_RS04615 AOT15_RS02195 -SOTONK1_RS04615 AQ244_RS02135 -SOTONK1_RS04615 CTJTET1_RS04785 -SOTONK1_RS04615 KW39_RS04635 -SOTONK1_RS04615 BKC03_RS04670 -SOTONK1_RS04615 CBP48_RS01245 -SOTONK1_RS04615 A5291_RS04650 -L1440_RS00650 L1440_RS00650 -L1440_RS00650 BKB92_RS00660 -L1440_RS00650 CTO_RS00655 -L1440_RS00650 SOTONIA3_RS00650 -L1440_RS00650 E150_RS00650 -L1440_RS00650 AQ193_RS03345 -L1440_RS00650 L2BUCH2_RS00650 -L1440_RS00650 CBP44_RS02055 -L1440_RS00650 FCS84708_RS00650 -L1440_RS00650 AP288_RS03720 -L1440_RS00650 BKB93_RS00660 -L1440_RS00650 119305 -L1440_RS00650 AQ199_RS01345 -L1440_RS00650 BBV13_RS00660 -L1440_RS00650 G9768_RS00650 -L1440_RS00650 L2BLST_RS00650 -L1440_RS00650 BW688_RS02050 -L1440_RS00650 BBV16_RS00660 -L1440_RS00650 BKC02_RS00660 -L1440_RS00650 gnl|Prokka|PADJNBJD_00128 -L1440_RS00650 LJHENM_00640 -L1440_RS00650 AKW53_RS02145 -L1440_RS00650 BKC01_RS00660 -L1440_RS00650 NILJEPDF_00128 -L1440_RS00650 A5291_RS00655 -L1440_RS00650 L3404_RS00650 -L1440_RS00650 SOTONK1_RS00650 -L1440_RS00650 AOT15_RS00305 -L1440_RS00650 JIEJKO_00645 -L1440_RS00650 QSDFRQ_00128 -L1440_RS00650 IaCS19096_RS00650 -L1440_RS00650 BKC03_RS00660 -L1440_RS00650 C15_RS0100675 -L1440_RS00650 CTRC943_RS00650 -L1440_RS00650 CTJTET1_RS00650 -L1440_RS00650 KW39_RS00650 -L1440_RS00650 DU10_RS00660 -L1440_RS00650 ECS88FINAL_RS0100675 -L1440_RS00650 O169_RS00650 -L1440_RS00650 DU13_RS00665 -L1440_RS00650 7618420 -L1440_RS00650 KW36_RS00650 -L1440_RS00650 CBP48_RS02050 -L1440_RS00650 SW2_RS00650 -L1440_RS00650 BKB95_RS00660 -L1440_RS00650 ECS102511_RS00650 -L1440_RS00650 CTL2C_RS02015 -L1440_RS00650 CTB_RS00655 -L1440_RS00650 L1224_RS00650 -L1440_RS00650 AQ244_RS02825 -L1440_RS00650 BKB96_RS00660 -L1440_RS00650 CBP42_RS02050 -L1440_RS00650 BKB99_RS00660 -L1440_RS00820 L1440_RS00820 -L1440_RS00820 L2BUCH2_RS00820 -L1440_RS00820 CBP44_RS02230 -L1440_RS00820 BBV13_RS00825 -L1440_RS00820 G9768_RS00820 -L1440_RS00820 120550 -L1440_RS00820 L2BLST_RS00820 -L1440_RS00820 BW688_RS02225 -L1440_RS00820 BBV16_RS00825 -L1440_RS00820 gnl|Prokka|PADJNBJD_00161 -L1440_RS00820 NILJEPDF_00161 -L1440_RS00820 A5291_RS00820 -L1440_RS00820 SOTONK1_RS00815 -L1440_RS00820 JIEJKO_00810 -L1440_RS00820 L3404_RS00820 -L1440_RS00820 QSDFRQ_00161 -L1440_RS00820 KW39_RS00815 -L1440_RS00820 IaCS19096_RS00815 -L1440_RS00820 AOT15_RS00140 -L1440_RS00820 DU10_RS00830 -L1440_RS00820 CTRC943_RS00820 -L1440_RS00820 KW36_RS00815 -L1440_RS00820 SW2_RS00815 -L1440_RS00820 CBP48_RS02225 -L1440_RS00820 CTB_RS00820 -L1440_RS00820 CTL2C_RS02185 -L1440_RS00820 AQ244_RS02990 -L1440_RS00820 CTO_RS00820 -L1440_RS00820 L1224_RS00820 -L1440_RS00820 CBP42_RS02225 -L1440_RS01005 L1440_RS01005 -L1440_RS01005 AQ193_RS02970 -L1440_RS01005 AQ244_RS03205 -L1440_RS01005 BKB92_RS01025 -L1440_RS01005 CBP42_RS02415 -L1440_RS01005 SOTONIA3_RS01040 -L1440_RS01005 E150_RS01020 -L1440_RS01005 CTB_RS01050 -L1440_RS01005 L2BUCH2_RS01010 -L1440_RS01005 CTO_RS01050 -L1440_RS01005 FCS84708_RS01020 -L1440_RS01005 AP288_RS04090 -L1440_RS01005 BKB93_RS01025 -L1440_RS01005 CBP44_RS02420 -L1440_RS01005 AQ199_RS01715 -L1440_RS01005 L2BLST_RS01010 -L1440_RS01005 BW688_RS02420 -L1440_RS01005 BBV13_RS01055 -L1440_RS01005 G9768_RS01030 -L1440_RS01005 BKC02_RS01025 -L1440_RS01005 L3404_RS01005 -L1440_RS01005 AKW53_RS02515 -L1440_RS01005 BBV16_RS01055 -L1440_RS01005 BKC01_RS01025 -L1440_RS01005 119363 -L1440_RS01005 DU10_RS01035 -L1440_RS01005 gnl|Prokka|PADJNBJD_00201 -L1440_RS01005 BKC03_RS01025 -L1440_RS01005 NILJEPDF_00201 -L1440_RS01005 LJHENM_01010 -L1440_RS01005 CTRC943_RS01010 -L1440_RS01005 CTJTET1_RS01040 -L1440_RS01005 AOT15_RS01340 -L1440_RS01005 C15_RS0101060 -L1440_RS01005 SOTONK1_RS01025 -L1440_RS01005 ECS88FINAL_RS0101045 -L1440_RS01005 KW39_RS01030 -L1440_RS01005 JIEJKO_01010 -L1440_RS01005 A5291_RS01050 -L1440_RS01005 IaCS19096_RS01025 -L1440_RS01005 7618454 -L1440_RS01005 QSDFRQ_00201 -L1440_RS01005 O169_RS01030 -L1440_RS01005 DU13_RS01035 -L1440_RS01005 SW2_RS01020 -L1440_RS01005 BKB95_RS01040 -L1440_RS01005 CBP48_RS02415 -L1440_RS01005 KW36_RS01025 -L1440_RS01005 ECS102511_RS01020 -L1440_RS01005 BKB96_RS01025 -L1440_RS01005 CTL2C_RS02375 -L1440_RS01005 BKB99_RS01025 -L1440_RS01005 L1224_RS01005 -L1440_RS01185 L1440_RS01185 -L1440_RS01185 AQ193_RS02790 -L1440_RS01185 AQ244_RS03385 -L1440_RS01185 BKB92_RS01205 -L1440_RS01185 CBP42_RS02595 -L1440_RS01185 SOTONIA3_RS01220 -L1440_RS01185 E150_RS01200 -L1440_RS01185 CTB_RS01230 -L1440_RS01185 L2BUCH2_RS01190 -L1440_RS01185 CTO_RS01230 -L1440_RS01185 FCS84708_RS01200 -L1440_RS01185 AP288_RS04270 -L1440_RS01185 BKB93_RS01205 -L1440_RS01185 CBP44_RS02600 -L1440_RS01185 AQ199_RS01895 -L1440_RS01185 L2BLST_RS01190 -L1440_RS01185 BW688_RS02600 -L1440_RS01185 G9768_RS01210 -L1440_RS01185 BKC02_RS01205 -L1440_RS01185 L3404_RS01185 -L1440_RS01185 AKW53_RS02695 -L1440_RS01185 BKC01_RS01205 -L1440_RS01185 120484 -L1440_RS01185 gnl|Prokka|PADJNBJD_00236 -L1440_RS01185 DU10_RS01215 -L1440_RS01185 NILJEPDF_00236 -L1440_RS01185 LJHENM_01185 -L1440_RS01185 BKC03_RS01205 -L1440_RS01185 CTRC943_RS01190 -L1440_RS01185 CTJTET1_RS01220 -L1440_RS01185 KW39_RS01210 -L1440_RS01185 AOT15_RS01160 -L1440_RS01185 JIEJKO_01185 -L1440_RS01185 C15_RS0101240 -L1440_RS01185 SOTONK1_RS01205 -L1440_RS01185 ECS88FINAL_RS0101225 -L1440_RS01185 QSDFRQ_00236 -L1440_RS01185 A5291_RS01230 -L1440_RS01185 IaCS19096_RS01205 -L1440_RS01185 7618889 -L1440_RS01185 O169_RS01210 -L1440_RS01185 DU13_RS01215 -L1440_RS01185 SW2_RS01200 -L1440_RS01185 BKB95_RS01220 -L1440_RS01185 CBP48_RS02595 -L1440_RS01185 KW36_RS01205 -L1440_RS01185 ECS102511_RS01200 -L1440_RS01185 BKB96_RS01205 -L1440_RS01185 CTL2C_RS02555 -L1440_RS01185 BKB99_RS01205 -L1440_RS01185 L1224_RS01185 -L1440_RS01345 L1440_RS01345 -L1440_RS01345 AQ193_RS02630 -L1440_RS01345 AQ244_RS03545 -L1440_RS01345 BKB92_RS01370 -L1440_RS01345 CBP42_RS02760 -L1440_RS01345 SOTONIA3_RS01380 -L1440_RS01345 CTB_RS01390 -L1440_RS01345 E150_RS01360 -L1440_RS01345 L2BUCH2_RS01350 -L1440_RS01345 CTO_RS01390 -L1440_RS01345 FCS84708_RS01360 -L1440_RS01345 AP288_RS04430 -L1440_RS01345 BKB93_RS01370 -L1440_RS01345 CBP44_RS02765 -L1440_RS01345 AQ199_RS02055 -L1440_RS01345 L2BLST_RS01350 -L1440_RS01345 BBV13_RS01400 -L1440_RS01345 BW688_RS02765 -L1440_RS01345 G9768_RS01370 -L1440_RS01345 BKC02_RS01370 -L1440_RS01345 BBV16_RS01400 -L1440_RS01345 L3404_RS01345 -L1440_RS01345 AKW53_RS02855 -L1440_RS01345 BKC01_RS01370 -L1440_RS01345 gnl|Prokka|PADJNBJD_00268 -L1440_RS01345 DU10_RS01380 -L1440_RS01345 NILJEPDF_00268 -L1440_RS01345 LJHENM_01350 -L1440_RS01345 BKC03_RS01370 -L1440_RS01345 CTRC943_RS01350 -L1440_RS01345 CTJTET1_RS01380 -L1440_RS01345 KW39_RS01370 -L1440_RS01345 AOT15_RS01000 -L1440_RS01345 JIEJKO_01350 -L1440_RS01345 120462 -L1440_RS01345 C15_RS0101400 -L1440_RS01345 SOTONK1_RS01365 -L1440_RS01345 ECS88FINAL_RS0101385 -L1440_RS01345 QSDFRQ_00268 -L1440_RS01345 A5291_RS01390 -L1440_RS01345 O169_RS01370 -L1440_RS01345 IaCS19096_RS01365 -L1440_RS01345 DU13_RS01380 -L1440_RS01345 7618903 -L1440_RS01345 SW2_RS01360 -L1440_RS01345 BKB95_RS01385 -L1440_RS01345 CBP48_RS02760 -L1440_RS01345 KW36_RS01365 -L1440_RS01345 ECS102511_RS01360 -L1440_RS01345 BKB96_RS01370 -L1440_RS01345 CTL2C_RS02715 -L1440_RS01345 BKB99_RS01370 -L1440_RS01345 L1224_RS01345 -L1440_RS01505 L1440_RS01505 -L1440_RS01505 AQ193_RS02465 -L1440_RS01505 AQ244_RS03710 -L1440_RS01505 CBP42_RS02920 -L1440_RS01505 SOTONIA3_RS01540 -L1440_RS01505 BKB92_RS01535 -L1440_RS01505 CTB_RS01555 -L1440_RS01505 E150_RS01525 -L1440_RS01505 L2BUCH2_RS01510 -L1440_RS01505 CTO_RS01550 -L1440_RS01505 FCS84708_RS01520 -L1440_RS01505 AP288_RS04590 -L1440_RS01505 BKB93_RS01535 -L1440_RS01505 CBP44_RS02925 -L1440_RS01505 AQ199_RS02215 -L1440_RS01505 L2BLST_RS01510 -L1440_RS01505 BBV13_RS01560 -L1440_RS01505 BW688_RS02930 -L1440_RS01505 G9768_RS01530 -L1440_RS01505 BKC02_RS01530 -L1440_RS01505 AKW53_RS03020 -L1440_RS01505 BBV16_RS01560 -L1440_RS01505 L3404_RS01505 -L1440_RS01505 BKC01_RS01535 -L1440_RS01505 gnl|Prokka|PADJNBJD_00300 -L1440_RS01505 NILJEPDF_00300 -L1440_RS01505 LJHENM_01510 -L1440_RS01505 BKC03_RS01530 -L1440_RS01505 DU10_RS01545 -L1440_RS01505 CTRC943_RS01510 -L1440_RS01505 CTJTET1_RS01540 -L1440_RS01505 KW39_RS01530 -L1440_RS01505 JIEJKO_01510 -L1440_RS01505 C15_RS0101575 -L1440_RS01505 SOTONK1_RS01530 -L1440_RS01505 ECS88FINAL_RS0101555 -L1440_RS01505 120434 -L1440_RS01505 QSDFRQ_00300 -L1440_RS01505 IaCS19096_RS01525 -L1440_RS01505 A5291_RS01555 -L1440_RS01505 O169_RS01535 -L1440_RS01505 DU13_RS01540 -L1440_RS01505 SW2_RS01520 -L1440_RS01505 BKB95_RS01545 -L1440_RS01505 CBP48_RS02920 -L1440_RS01505 7618921 -L1440_RS01505 KW36_RS01525 -L1440_RS01505 ECS102511_RS01520 -L1440_RS01505 AOT15_RS02525 -L1440_RS01505 BKB96_RS01530 -L1440_RS01505 CTL2C_RS02875 -L1440_RS01505 BKB99_RS01530 -L1440_RS01505 L1224_RS01505 -L1440_RS01680 L1440_RS01680 -L1440_RS01680 CBP42_RS03095 -L1440_RS01680 SOTONIA3_RS01715 -L1440_RS01680 CTB_RS01730 -L1440_RS01680 BKB92_RS01715 -L1440_RS01680 L2BUCH2_RS01685 -L1440_RS01680 E150_RS01705 -L1440_RS01680 CTO_RS01730 -L1440_RS01680 FCS84708_RS01695 -L1440_RS01680 CBP44_RS03100 -L1440_RS01680 L2BLST_RS01685 -L1440_RS01680 BW688_RS03105 -L1440_RS01680 BKB93_RS01715 -L1440_RS01680 AQ199_RS02395 -L1440_RS01680 BBV13_RS01735 -L1440_RS01680 G9768_RS01705 -L1440_RS01680 BKC02_RS01705 -L1440_RS01680 L3404_RS01680 -L1440_RS01680 BBV16_RS01735 -L1440_RS01680 AKW53_RS03200 -L1440_RS01680 AP288_RS01380 -L1440_RS01680 BKC01_RS01710 -L1440_RS01680 gnl|Prokka|PADJNBJD_00335 -L1440_RS01680 NILJEPDF_00335 -L1440_RS01680 LJHENM_01685 -L1440_RS01680 CTRC943_RS01685 -L1440_RS01680 AQ244_RS01410 -L1440_RS01680 BKC03_RS01705 -L1440_RS01680 CTJTET1_RS01715 -L1440_RS01680 JIEJKO_01685 -L1440_RS01680 DU10_RS01725 -L1440_RS01680 C15_RS0101745 -L1440_RS01680 SOTONK1_RS01705 -L1440_RS01680 KW39_RS01710 -L1440_RS01680 QSDFRQ_00335 -L1440_RS01680 ECS88FINAL_RS0101730 -L1440_RS01680 IaCS19096_RS01700 -L1440_RS01680 A5291_RS01730 -L1440_RS01680 119450 -L1440_RS01680 O169_RS01710 -L1440_RS01680 DU13_RS01720 -L1440_RS01680 CBP48_RS03095 -L1440_RS01680 BKB95_RS01720 -L1440_RS01680 7618509 -L1440_RS01680 SW2_RS01700 -L1440_RS01680 CTL2C_RS03050 -L1440_RS01680 KW36_RS01700 -L1440_RS01680 AOT15_RS02700 -L1440_RS01680 BKB96_RS01705 -L1440_RS01680 L1224_RS01680 -L1440_RS01680 ECS102511_RS01700 -L1440_RS01680 BKB99_RS01705 -L1440_RS01680 AQ193_RS02285 -L1440_RS01845 L1440_RS01845 -L1440_RS01845 ECS102511_RS01870 -L1440_RS01845 CBP42_RS03285 -L1440_RS01845 CTB_RS01895 -L1440_RS01845 SOTONIA3_RS01880 -L1440_RS01845 L2BUCH2_RS01845 -L1440_RS01845 BKB92_RS01885 -L1440_RS01845 CTO_RS01895 -L1440_RS01845 E150_RS01875 -L1440_RS01845 L2BLST_RS01845 -L1440_RS01845 FCS84708_RS01865 -L1440_RS01845 BW688_RS03275 -L1440_RS01845 BKB93_RS01885 -L1440_RS01845 CBP44_RS03280 -L1440_RS01845 BBV13_RS01900 -L1440_RS01845 AQ199_RS02565 -L1440_RS01845 G9768_RS01870 -L1440_RS01845 AP288_RS01210 -L1440_RS01845 L3404_RS01845 -L1440_RS01845 BBV16_RS01900 -L1440_RS01845 BKC02_RS01875 -L1440_RS01845 BKC01_RS01875 -L1440_RS01845 AKW53_RS03370 -L1440_RS01845 gnl|Prokka|PADJNBJD_00368 -L1440_RS01845 AQ244_RS01240 -L1440_RS01845 NILJEPDF_00368 -L1440_RS01845 CTRC943_RS01850 -L1440_RS01845 LJHENM_01855 -L1440_RS01845 JIEJKO_01850 -L1440_RS01845 BKC03_RS01875 -L1440_RS01845 CTJTET1_RS01880 -L1440_RS01845 DU10_RS01895 -L1440_RS01845 QSDFRQ_00368 -L1440_RS01845 C15_RS0101910 -L1440_RS01845 SOTONK1_RS01870 -L1440_RS01845 A5291_RS01895 -L1440_RS01845 KW39_RS01880 -L1440_RS01845 IaCS19096_RS01865 -L1440_RS01845 ECS88FINAL_RS0101900 -L1440_RS01845 DU13_RS01890 -L1440_RS01845 120359 -L1440_RS01845 O169_RS01880 -L1440_RS01845 7618961 -L1440_RS01845 CTL2C_RS03215 -L1440_RS01845 AQ193_RS02115 -L1440_RS01845 BKB95_RS01890 -L1440_RS01845 CBP48_RS03275 -L1440_RS01845 L1224_RS01845 -L1440_RS01845 KW36_RS01865 -L1440_RS01845 AOT15_RS02865 -L1440_RS01845 BKB96_RS01875 -L1440_RS01845 SW2_RS01870 -L1440_RS01845 BKB99_RS01875 -L1440_RS02010 L1440_RS02010 -L1440_RS02010 ECS102511_RS02035 -L1440_RS02010 CTB_RS02060 -L1440_RS02010 CBP42_RS03455 -L1440_RS02010 SOTONIA3_RS02045 -L1440_RS02010 L2BUCH2_RS02010 -L1440_RS02010 BKB92_RS02050 -L1440_RS02010 CTO_RS02060 -L1440_RS02010 E150_RS02040 -L1440_RS02010 L2BLST_RS02010 -L1440_RS02010 BW688_RS03440 -L1440_RS02010 FCS84708_RS02030 -L1440_RS02010 BBV13_RS02065 -L1440_RS02010 BKB93_RS02050 -L1440_RS02010 CBP44_RS03450 -L1440_RS02010 AQ199_RS02730 -L1440_RS02010 G9768_RS02035 -L1440_RS02010 AP288_RS01045 -L1440_RS02010 BBV16_RS02065 -L1440_RS02010 L3404_RS02010 -L1440_RS02010 BKC02_RS02040 -L1440_RS02010 BKC01_RS02040 -L1440_RS02010 AKW53_RS03535 -L1440_RS02010 gnl|Prokka|PADJNBJD_00401 -L1440_RS02010 AQ244_RS01075 -L1440_RS02010 NILJEPDF_00401 -L1440_RS02010 CTRC943_RS02015 -L1440_RS02010 LJHENM_02020 -L1440_RS02010 JIEJKO_02015 -L1440_RS02010 BKC03_RS02040 -L1440_RS02010 CTJTET1_RS02045 -L1440_RS02010 QSDFRQ_00401 -L1440_RS02010 C15_RS0102080 -L1440_RS02010 A5291_RS02060 -L1440_RS02010 SOTONK1_RS02035 -L1440_RS02010 DU10_RS02065 -L1440_RS02010 KW39_RS02045 -L1440_RS02010 IaCS19096_RS02030 -L1440_RS02010 ECS88FINAL_RS0102075 -L1440_RS02010 O169_RS02045 -L1440_RS02010 DU13_RS02060 -L1440_RS02010 7618980 -L1440_RS02010 CTL2C_RS03380 -L1440_RS02010 AQ193_RS01950 -L1440_RS02010 CBP48_RS03445 -L1440_RS02010 120328 -L1440_RS02010 L1224_RS02010 -L1440_RS02010 KW36_RS02030 -L1440_RS02010 AOT15_RS03030 -L1440_RS02010 BKB95_RS02060 -L1440_RS02010 BKB96_RS02040 -L1440_RS02010 SW2_RS02035 -L1440_RS02010 BKB99_RS02040 -L1440_RS02170 L1440_RS02170 -L1440_RS02170 CBP42_RS03620 -L1440_RS02170 L2BUCH2_RS02170 -L1440_RS02170 L2BLST_RS02170 -L1440_RS02170 BW688_RS03605 -L1440_RS02170 CBP44_RS03615 -L1440_RS02170 L3404_RS02170 -L1440_RS02170 7618561 -L1440_RS02170 CTL2C_RS03540 -L1440_RS02170 CBP48_RS03610 -L1440_RS02170 L1224_RS02170 -L1440_RS02170 ECS102511_RS02195 -L1440_RS02170 CTB_RS02220 -L1440_RS02170 SOTONIA3_RS02205 -L1440_RS02170 BKB92_RS02215 -L1440_RS02170 CTO_RS02220 -L1440_RS02170 E150_RS02200 -L1440_RS02170 BBV13_RS02230 -L1440_RS02170 FCS84708_RS02190 -L1440_RS02170 BKB93_RS02215 -L1440_RS02170 AQ199_RS02890 -L1440_RS02170 BBV16_RS02230 -L1440_RS02170 G9768_RS02195 -L1440_RS02170 AP288_RS00885 -L1440_RS02170 BKC02_RS02205 -L1440_RS02170 BKC01_RS02205 -L1440_RS02170 AKW53_RS03695 -L1440_RS02170 gnl|Prokka|PADJNBJD_00433 -L1440_RS02170 NILJEPDF_00433 -L1440_RS02170 CTRC943_RS02175 -L1440_RS02170 AQ244_RS00915 -L1440_RS02170 LJHENM_02185 -L1440_RS02170 JIEJKO_02180 -L1440_RS02170 BKC03_RS02205 -L1440_RS02170 CTJTET1_RS02205 -L1440_RS02170 QSDFRQ_00433 -L1440_RS02170 C15_RS0102240 -L1440_RS02170 A5291_RS02220 -L1440_RS02170 SOTONK1_RS02195 -L1440_RS02170 DU10_RS02230 -L1440_RS02170 KW39_RS02205 -L1440_RS02170 IaCS19096_RS02190 -L1440_RS02170 ECS88FINAL_RS0102235 -L1440_RS02170 O169_RS02205 -L1440_RS02170 DU13_RS02225 -L1440_RS02170 BKB96_RS02205 -L1440_RS02170 AQ193_RS01790 -L1440_RS02170 BKB99_RS02205 -L1440_RS02170 KW36_RS02190 -L1440_RS02170 AOT15_RS03190 -L1440_RS02170 BKB95_RS02225 -L1440_RS02170 119531 -L1440_RS02170 SW2_RS02195 -L1440_RS02335 L1440_RS02335 -L1440_RS02335 CBP42_RS03785 -L1440_RS02335 L2BUCH2_RS02330 -L1440_RS02335 BW688_RS03770 -L1440_RS02335 L2BLST_RS02335 -L1440_RS02335 CBP44_RS03780 -L1440_RS02335 L3404_RS02330 -L1440_RS02335 7619007 -L1440_RS02335 CBP48_RS03775 -L1440_RS02335 CTL2C_RS03705 -L1440_RS02335 L1224_RS02335 -L1440_RS02335 CTB_RS02385 -L1440_RS02335 SOTONIA3_RS02370 -L1440_RS02335 CTO_RS02385 -L1440_RS02335 BBV13_RS02390 -L1440_RS02335 G9768_RS02355 -L1440_RS02335 BBV16_RS02395 -L1440_RS02335 BKC02_RS02370 -L1440_RS02335 BKC01_RS02370 -L1440_RS02335 gnl|Prokka|PADJNBJD_00465 -L1440_RS02335 NILJEPDF_00465 -L1440_RS02335 CTRC943_RS02335 -L1440_RS02335 JIEJKO_02345 -L1440_RS02335 BKC03_RS02370 -L1440_RS02335 QSDFRQ_00465 -L1440_RS02335 CTJTET1_RS02365 -L1440_RS02335 AQ244_RS00755 -L1440_RS02335 C15_RS0102405 -L1440_RS02335 SOTONK1_RS02355 -L1440_RS02335 A5291_RS02385 -L1440_RS02335 KW39_RS02365 -L1440_RS02335 IaCS19096_RS02350 -L1440_RS02335 BKB96_RS02375 -L1440_RS02335 BKB99_RS02370 -L1440_RS02335 120286 -L1440_RS02335 KW36_RS02350 -L1440_RS02335 AOT15_RS03350 -L1440_RS02335 BKB95_RS02390 -L1440_RS02335 BKB92_RS02380 -L1440_RS02335 E150_RS02360 -L1440_RS02335 FCS84708_RS02350 -L1440_RS02335 BKB93_RS02385 -L1440_RS02335 AQ199_RS03050 -L1440_RS02335 AP288_RS00725 -L1440_RS02335 AKW53_RS03855 -L1440_RS02335 LJHENM_02345 -L1440_RS02335 DU10_RS02395 -L1440_RS02335 ECS88FINAL_RS0102405 -L1440_RS02335 O169_RS02365 -L1440_RS02335 DU13_RS02390 -L1440_RS02335 AQ193_RS01630 -L1440_RS02335 SW2_RS02360 -L1440_RS02335 ECS102511_RS02355 -L1440_RS02520 L1440_RS02520 -L1440_RS02520 AOT15_RS03555 -L1440_RS02520 119590 -L1440_RS02520 CBP42_RS03970 -L1440_RS02520 L2BUCH2_RS02520 -L1440_RS02520 CTB_RS02575 -L1440_RS02520 SOTONIA3_RS02555 -L1440_RS02520 BW688_RS03960 -L1440_RS02520 CTO_RS02575 -L1440_RS02520 L2BLST_RS02520 -L1440_RS02520 BBV13_RS02580 -L1440_RS02520 CBP44_RS03965 -L1440_RS02520 BBV16_RS02590 -L1440_RS02520 G9768_RS02540 -L1440_RS02520 L3404_RS02515 -L1440_RS02520 BKC02_RS02560 -L1440_RS02520 gnl|Prokka|PADJNBJD_00500 -L1440_RS02520 NILJEPDF_00500 -L1440_RS02520 BKC01_RS02560 -L1440_RS02520 CTRC943_RS02520 -L1440_RS02520 JIEJKO_02520 -L1440_RS02520 QSDFRQ_00500 -L1440_RS02520 SOTONK1_RS02540 -L1440_RS02520 AQ244_RS00570 -L1440_RS02520 BKC03_RS02560 -L1440_RS02520 CTJTET1_RS02550 -L1440_RS02520 IaCS19096_RS02535 -L1440_RS02520 C15_RS01000000104940 -L1440_RS02520 A5291_RS02575 -L1440_RS02520 7618599 -L1440_RS02520 CBP48_RS03960 -L1440_RS02520 CTL2C_RS03890 -L1440_RS02520 KW36_RS02535 -L1440_RS02520 BKB96_RS02565 -L1440_RS02520 BKB99_RS02560 -L1440_RS02520 L1224_RS02520 -L1440_RS02520 BKB95_RS02575 -L1440_RS02680 L1440_RS02680 -L1440_RS02680 120226 -L1440_RS02680 CBP42_RS04135 -L1440_RS02680 L2BUCH2_RS02680 -L1440_RS02680 SOTONIA3_RS02715 -L1440_RS02680 BKB92_RS02730 -L1440_RS02680 CTB_RS02735 -L1440_RS02680 E150_RS02705 -L1440_RS02680 BW688_RS04125 -L1440_RS02680 CTO_RS02735 -L1440_RS02680 FCS84708_RS02695 -L1440_RS02680 L2BLST_RS02680 -L1440_RS02680 BBV13_RS02740 -L1440_RS02680 CBP44_RS04130 -L1440_RS02680 AKW53_RS04515 -L1440_RS02680 AQ199_RS03395 -L1440_RS02680 BKB93_RS02735 -L1440_RS02680 BBV16_RS02750 -L1440_RS02680 G9768_RS02700 -L1440_RS02680 L3404_RS02675 -L1440_RS02680 BKC02_RS02725 -L1440_RS02680 gnl|Prokka|PADJNBJD_00532 -L1440_RS02680 AP288_RS00380 -L1440_RS02680 NILJEPDF_00532 -L1440_RS02680 BKC01_RS02725 -L1440_RS02680 LJHENM_02680 -L1440_RS02680 CTRC943_RS02680 -L1440_RS02680 AOT15_RS01500 -L1440_RS02680 QSDFRQ_00532 -L1440_RS02680 JIEJKO_02685 -L1440_RS02680 SOTONK1_RS02700 -L1440_RS02680 CTJTET1_RS02710 -L1440_RS02680 AQ244_RS00410 -L1440_RS02680 BKC03_RS02725 -L1440_RS02680 KW39_RS02710 -L1440_RS02680 C15_RS0102770 -L1440_RS02680 ECS88FINAL_RS0102765 -L1440_RS02680 IaCS19096_RS02695 -L1440_RS02680 DU10_RS02745 -L1440_RS02680 O169_RS02710 -L1440_RS02680 A5291_RS02735 -L1440_RS02680 DU13_RS02740 -L1440_RS02680 CBP48_RS04125 -L1440_RS02680 7619043 -L1440_RS02680 CTL2C_RS04050 -L1440_RS02680 KW36_RS02695 -L1440_RS02680 BKB95_RS02740 -L1440_RS02680 BKB96_RS02730 -L1440_RS02680 BKB99_RS02725 -L1440_RS02680 SW2_RS02705 -L1440_RS02680 L1224_RS02680 -L1440_RS02680 ECS102511_RS02700 -L1440_RS02680 AQ193_RS01285 -L1440_RS02845 L1440_RS02845 -L1440_RS02845 CBP42_RS04300 -L1440_RS02845 120175 -L1440_RS02845 L2BUCH2_RS02845 -L1440_RS02845 SOTONIA3_RS02880 -L1440_RS02845 BKB92_RS02895 -L1440_RS02845 CTB_RS02900 -L1440_RS02845 E150_RS02870 -L1440_RS02845 BW688_RS04290 -L1440_RS02845 CTO_RS02900 -L1440_RS02845 FCS84708_RS02860 -L1440_RS02845 L2BLST_RS02845 -L1440_RS02845 BBV13_RS02905 -L1440_RS02845 CBP44_RS04295 -L1440_RS02845 AQ199_RS03560 -L1440_RS02845 BKB93_RS02900 -L1440_RS02845 BBV16_RS02915 -L1440_RS02845 G9768_RS02865 -L1440_RS02845 L3404_RS02840 -L1440_RS02845 BKC02_RS02890 -L1440_RS02845 gnl|Prokka|PADJNBJD_00565 -L1440_RS02845 AOT15_RS03665 -L1440_RS02845 AP288_RS00215 -L1440_RS02845 NILJEPDF_00565 -L1440_RS02845 BKC01_RS02890 -L1440_RS02845 LJHENM_02845 -L1440_RS02845 CTRC943_RS02845 -L1440_RS02845 QSDFRQ_00565 -L1440_RS02845 JIEJKO_02850 -L1440_RS02845 SOTONK1_RS02865 -L1440_RS02845 CTJTET1_RS02875 -L1440_RS02845 AQ244_RS00245 -L1440_RS02845 BKC03_RS02890 -L1440_RS02845 KW39_RS02875 -L1440_RS02845 C15_RS0102935 -L1440_RS02845 ECS88FINAL_RS0102930 -L1440_RS02845 IaCS19096_RS02860 -L1440_RS02845 DU10_RS02910 -L1440_RS02845 O169_RS02875 -L1440_RS02845 A5291_RS02900 -L1440_RS02845 DU13_RS02905 -L1440_RS02845 CBP48_RS04290 -L1440_RS02845 CTL2C_RS04215 -L1440_RS02845 KW36_RS02860 -L1440_RS02845 AKW53_RS04090 -L1440_RS02845 BKB95_RS02905 -L1440_RS02845 BKB96_RS02895 -L1440_RS02845 BKB99_RS02890 -L1440_RS02845 7619076 -L1440_RS02845 SW2_RS02870 -L1440_RS02845 L1224_RS02845 -L1440_RS02845 ECS102511_RS02865 -L1440_RS02845 AQ193_RS01120 -L1440_RS03180 L1440_RS03180 -L1440_RS03180 BKB95_RS03250 -L1440_RS03180 BKB96_RS03245 -L1440_RS03180 BKB99_RS03240 -L1440_RS03180 CBP42_RS04640 -L1440_RS03180 L2BUCH2_RS03180 -L1440_RS03180 BKB92_RS03235 -L1440_RS03180 CTB_RS03245 -L1440_RS03180 E150_RS03210 -L1440_RS03180 SOTONIA3_RS03225 -L1440_RS03180 BW688_RS04630 -L1440_RS03180 CTO_RS03240 -L1440_RS03180 FCS84708_RS03205 -L1440_RS03180 L2BLST_RS03180 -L1440_RS03180 BBV13_RS03245 -L1440_RS03180 CBP44_RS04635 -L1440_RS03180 119658 -L1440_RS03180 AQ199_RS03905 -L1440_RS03180 BKB93_RS03240 -L1440_RS03180 BBV16_RS03255 -L1440_RS03180 G9768_RS03205 -L1440_RS03180 L3404_RS03175 -L1440_RS03180 gnl|Prokka|PADJNBJD_00630 -L1440_RS03180 AP288_RS01575 -L1440_RS03180 BKC02_RS03235 -L1440_RS03180 NILJEPDF_00631 -L1440_RS03180 LJHENM_03170 -L1440_RS03180 AOT15_RS04005 -L1440_RS03180 CTRC943_RS03180 -L1440_RS03180 AQ244_RS04710 -L1440_RS03180 JIEJKO_03175 -L1440_RS03180 BKC01_RS03235 -L1440_RS03180 QSDFRQ_00631 -L1440_RS03180 KW39_RS03220 -L1440_RS03180 BKC03_RS03235 -L1440_RS03180 CTJTET1_RS03220 -L1440_RS03180 ECS88FINAL_RS0103270 -L1440_RS03180 DU10_RS03250 -L1440_RS03180 SOTONK1_RS03205 -L1440_RS03180 O169_RS03215 -L1440_RS03180 IaCS19096_RS03200 -L1440_RS03180 C15_RS0103270 -L1440_RS03180 A5291_RS03245 -L1440_RS03180 DU13_RS03245 -L1440_RS03180 CTL2C_RS04550 -L1440_RS03180 AKW53_RS04430 -L1440_RS03180 AQ193_RS00780 -L1440_RS03180 CBP48_RS04635 -L1440_RS03180 7618643 -L1440_RS03180 SW2_RS03210 -L1440_RS03180 L1224_RS03180 -L1440_RS03180 KW36_RS03205 -L1440_RS03180 ECS102511_RS03205 -L1440_RS03350 L1440_RS03350 -L1440_RS03350 BKB96_RS03410 -L1440_RS03350 BKB99_RS03405 -L1440_RS03350 CBP42_RS04805 -L1440_RS03350 L2BUCH2_RS03350 -L1440_RS03350 CTB_RS03405 -L1440_RS03350 BKB92_RS03400 -L1440_RS03350 SOTONIA3_RS03385 -L1440_RS03350 E150_RS03375 -L1440_RS03350 CTO_RS03400 -L1440_RS03350 BBV13_RS03405 -L1440_RS03350 BW688_RS04795 -L1440_RS03350 FCS84708_RS03365 -L1440_RS03350 L2BLST_RS03350 -L1440_RS03350 CBP44_RS04800 -L1440_RS03350 119678 -L1440_RS03350 BBV16_RS03415 -L1440_RS03350 AQ199_RS04065 -L1440_RS03350 BKB93_RS03405 -L1440_RS03350 G9768_RS03365 -L1440_RS03350 gnl|Prokka|PADJNBJD_00662 -L1440_RS03350 L3404_RS03345 -L1440_RS03350 BKC02_RS03400 -L1440_RS03350 NILJEPDF_00663 -L1440_RS03350 LJHENM_03330 -L1440_RS03350 AOT15_RS04165 -L1440_RS03350 AP288_RS01735 -L1440_RS03350 JIEJKO_03335 -L1440_RS03350 BKC01_RS03400 -L1440_RS03350 QSDFRQ_00663 -L1440_RS03350 CTRC943_RS03350 -L1440_RS03350 AQ244_RS04545 -L1440_RS03350 BKC03_RS03400 -L1440_RS03350 CTJTET1_RS03385 -L1440_RS03350 KW39_RS03385 -L1440_RS03350 DU10_RS03415 -L1440_RS03350 SOTONK1_RS03365 -L1440_RS03350 ECS88FINAL_RS0103440 -L1440_RS03350 IaCS19096_RS03360 -L1440_RS03350 C15_RS0103435 -L1440_RS03350 A5291_RS03410 -L1440_RS03350 O169_RS03380 -L1440_RS03350 DU13_RS03415 -L1440_RS03350 AKW53_RS00115 -L1440_RS03350 KW36_RS03365 -L1440_RS03350 CTL2C_RS04720 -L1440_RS03350 AQ193_RS00620 -L1440_RS03350 BKB95_RS03420 -L1440_RS03350 CBP48_RS04800 -L1440_RS03350 7618656 -L1440_RS03350 SW2_RS03375 -L1440_RS03350 L1224_RS03350 -L1440_RS03350 ECS102511_RS03365 -L1440_RS03525 L1440_RS03525 -L1440_RS03525 BKB96_RS03585 -L1440_RS03525 BKB99_RS03580 -L1440_RS03525 CBP44_RS00145 -L1440_RS03525 L2BUCH2_RS03525 -L1440_RS03525 BKB92_RS03575 -L1440_RS03525 CTB_RS03585 -L1440_RS03525 SOTONIA3_RS03565 -L1440_RS03525 E150_RS03550 -L1440_RS03525 CTO_RS03580 -L1440_RS03525 BBV13_RS03585 -L1440_RS03525 FCS84708_RS03540 -L1440_RS03525 L2BLST_RS03525 -L1440_RS03525 BBV16_RS03595 -L1440_RS03525 BW688_RS00145 -L1440_RS03525 AQ199_RS04240 -L1440_RS03525 BKB93_RS03580 -L1440_RS03525 7618222 -L1440_RS03525 119711 -L1440_RS03525 G9768_RS03545 -L1440_RS03525 gnl|Prokka|PADJNBJD_00697 -L1440_RS03525 L3404_RS03520 -L1440_RS03525 BKC02_RS03575 -L1440_RS03525 NILJEPDF_00698 -L1440_RS03525 LJHENM_03505 -L1440_RS03525 AOT15_RS04345 -L1440_RS03525 AP288_RS01910 -L1440_RS03525 JIEJKO_03510 -L1440_RS03525 BKC01_RS03575 -L1440_RS03525 QSDFRQ_00698 -L1440_RS03525 CTRC943_RS03530 -L1440_RS03525 AQ244_RS04365 -L1440_RS03525 BKC03_RS03575 -L1440_RS03525 CBP48_RS00145 -L1440_RS03525 CTJTET1_RS03565 -L1440_RS03525 KW39_RS03560 -L1440_RS03525 DU10_RS03590 -L1440_RS03525 SOTONK1_RS03545 -L1440_RS03525 ECS88FINAL_RS0103630 -L1440_RS03525 IaCS19096_RS03540 -L1440_RS03525 C15_RS0103620 -L1440_RS03525 A5291_RS03590 -L1440_RS03525 O169_RS03555 -L1440_RS03525 DU13_RS03590 -L1440_RS03525 KW36_RS03545 -L1440_RS03525 AKW53_RS00290 -L1440_RS03525 AQ193_RS00445 -L1440_RS03525 BKB95_RS03595 -L1440_RS03525 CBP42_RS00145 -L1440_RS03525 SW2_RS03550 -L1440_RS03525 CTL2C_RS00145 -L1440_RS03525 L1224_RS03525 -L1440_RS03525 ECS102511_RS03540 -L1440_RS04225 L1440_RS04225 -L1440_RS04225 AQ193_RS04520 -L1440_RS04225 SW2_RS04260 -L1440_RS04225 ECS102511_RS04250 -L1440_RS04225 AQ244_RS02505 -L1440_RS04225 CBP44_RS00860 -L1440_RS04225 CTB_RS04285 -L1440_RS04225 L2BUCH2_RS04230 -L1440_RS04225 BKB92_RS04290 -L1440_RS04225 CTO_RS04280 -L1440_RS04225 AP288_RS02555 -L1440_RS04225 BBV13_RS04295 -L1440_RS04225 E150_RS04260 -L1440_RS04225 L2BLST_RS04230 -L1440_RS04225 119825 -L1440_RS04225 FCS84708_RS04250 -L1440_RS04225 AQ199_RS00180 -L1440_RS04225 BBV16_RS04300 -L1440_RS04225 7618296 -L1440_RS04225 BW688_RS00860 -L1440_RS04225 gnl|Prokka|PADJNBJD_00835 -L1440_RS04225 NILJEPDF_00836 -L1440_RS04225 L3404_RS04225 -L1440_RS04225 BKB93_RS04295 -L1440_RS04225 LJHENM_04205 -L1440_RS04225 JIEJKO_04205 -L1440_RS04225 BKC02_RS04290 -L1440_RS04225 QSDFRQ_00836 -L1440_RS04225 AKW53_RS00970 -L1440_RS04225 BKC01_RS04295 -L1440_RS04225 CTRC943_RS04235 -L1440_RS04225 AOT15_RS01835 -L1440_RS04225 CTJTET1_RS04425 -L1440_RS04225 BKC03_RS04290 -L1440_RS04225 CBP48_RS00860 -L1440_RS04225 A5291_RS04290 -L1440_RS04225 KW39_RS04270 -L1440_RS04225 SOTONK1_RS04255 -L1440_RS04225 ECS88FINAL_RS0104350 -L1440_RS04225 IaCS19096_RS04245 -L1440_RS04225 DU10_RS04305 -L1440_RS04225 C15_RS0104370 -L1440_RS04225 DU13_RS04305 -L1440_RS04225 O169_RS04265 -L1440_RS04225 KW36_RS04250 -L1440_RS04225 CBP42_RS00860 -L1440_RS04225 CTL2C_RS00850 -L1440_RS04225 L1224_RS04230 -L1440_RS04225 BKB99_RS04290 -L1440_RS04225 SOTONIA3_RS04270 -L1440_RS04225 G9768_RS04255 -L1440_RS04225 BKB95_RS04310 -L1440_RS04225 BKB96_RS04295 -L1440_RS04390 L1440_RS04390 -L1440_RS04390 AQ193_RS04350 -L1440_RS04390 SW2_RS04425 -L1440_RS04390 ECS102511_RS04420 -L1440_RS04390 CBP44_RS01035 -L1440_RS04390 L2BUCH2_RS04395 -L1440_RS04390 BKB92_RS04465 -L1440_RS04390 AP288_RS02725 -L1440_RS04390 E150_RS04430 -L1440_RS04390 L2BLST_RS04395 -L1440_RS04390 FCS84708_RS04415 -L1440_RS04390 AQ199_RS00350 -L1440_RS04390 7618316 -L1440_RS04390 BW688_RS01035 -L1440_RS04390 LJHENM_04360 -L1440_RS04390 L3404_RS04390 -L1440_RS04390 BKB93_RS04470 -L1440_RS04390 AKW53_RS01140 -L1440_RS04390 CTRC943_RS04400 -L1440_RS04390 KW39_RS04435 -L1440_RS04390 CBP48_RS01035 -L1440_RS04390 ECS88FINAL_RS0104505 -L1440_RS04390 DU10_RS04480 -L1440_RS04390 O169_RS04435 -L1440_RS04390 DU13_RS04480 -L1440_RS04390 CBP42_RS01035 -L1440_RS04390 CTL2C_RS01015 -L1440_RS04390 L1224_RS04395 -L1440_RS04390 BKB99_RS04460 -L1440_RS04390 AQ244_RS02335 -L1440_RS04390 CTB_RS04445 -L1440_RS04390 SOTONIA3_RS04430 -L1440_RS04390 CTO_RS04440 -L1440_RS04390 BBV13_RS04455 -L1440_RS04390 gnl|Prokka|PADJNBJD_00865 -L1440_RS04390 BBV16_RS04460 -L1440_RS04390 119854 -L1440_RS04390 NILJEPDF_00866 -L1440_RS04390 JIEJKO_04355 -L1440_RS04390 QSDFRQ_00866 -L1440_RS04390 G9768_RS04415 -L1440_RS04390 BKC02_RS04460 -L1440_RS04390 BKC01_RS04465 -L1440_RS04390 AOT15_RS01995 -L1440_RS04390 CTJTET1_RS04585 -L1440_RS04390 BKC03_RS04460 -L1440_RS04390 A5291_RS04450 -L1440_RS04390 SOTONK1_RS04415 -L1440_RS04390 IaCS19096_RS04410 -L1440_RS04390 C15_RS0104525 -L1440_RS04390 KW36_RS04415 -L1440_RS04390 BKB95_RS04480 -L1440_RS04390 BKB96_RS04465 -L1440_RS04555 L1440_RS04555 -L1440_RS04555 AQ193_RS04185 -L1440_RS04555 BKB99_RS04635 -L1440_RS04555 SW2_RS04590 -L1440_RS04555 ECS102511_RS04585 -L1440_RS04555 AQ244_RS02170 -L1440_RS04555 CBP44_RS01210 -L1440_RS04555 CTB_RS04610 -L1440_RS04555 L2BUCH2_RS04560 -L1440_RS04555 SOTONIA3_RS04595 -L1440_RS04555 CTO_RS04605 -L1440_RS04555 AP288_RS02890 -L1440_RS04555 BBV13_RS04625 -L1440_RS04555 BKB92_RS04640 -L1440_RS04555 BBV16_RS04630 -L1440_RS04555 E150_RS04595 -L1440_RS04555 gnl|Prokka|PADJNBJD_00899 -L1440_RS04555 L2BLST_RS04560 -L1440_RS04555 FCS84708_RS04580 -L1440_RS04555 AQ199_RS00515 -L1440_RS04555 NILJEPDF_00900 -L1440_RS04555 BW688_RS01210 -L1440_RS04555 119941 -L1440_RS04555 JIEJKO_04525 -L1440_RS04555 7618756 -L1440_RS04555 QSDFRQ_00900 -L1440_RS04555 G9768_RS04580 -L1440_RS04555 LJHENM_04535 -L1440_RS04555 L3404_RS04555 -L1440_RS04555 BKB93_RS04645 -L1440_RS04555 BKC02_RS04635 -L1440_RS04555 AKW53_RS01305 -L1440_RS04555 BKC01_RS04640 -L1440_RS04555 CTRC943_RS04565 -L1440_RS04555 AOT15_RS02160 -L1440_RS04555 CTJTET1_RS04750 -L1440_RS04555 KW39_RS04600 -L1440_RS04555 BKC03_RS04635 -L1440_RS04555 CBP48_RS01210 -L1440_RS04555 A5291_RS04615 -L1440_RS04555 SOTONK1_RS04580 -L1440_RS04555 ECS88FINAL_RS0104690 -L1440_RS04555 IaCS19096_RS04575 -L1440_RS04555 C15_RS0104710 -L1440_RS04555 DU10_RS04655 -L1440_RS04555 O169_RS04600 -L1440_RS04555 KW36_RS04580 -L1440_RS04555 DU13_RS04655 -L1440_RS04555 CTL2C_RS01180 -L1440_RS04555 BKB95_RS04655 -L1440_RS04555 CBP42_RS01210 -L1440_RS04555 L1224_RS04560 -L1440_RS04555 BKB96_RS04640 -L1440_RS04730 L1440_RS04730 -L1440_RS04730 CBP44_RS01385 -L1440_RS04730 L2BUCH2_RS04735 -L1440_RS04730 L2BLST_RS04735 -L1440_RS04730 BW688_RS01385 -L1440_RS04730 L3404_RS04730 -L1440_RS04730 7618351 -L1440_RS04730 CTRC943_RS04740 -L1440_RS04730 KW39_RS04775 -L1440_RS04730 CBP48_RS01385 -L1440_RS04730 CTL2C_RS01355 -L1440_RS04730 CBP42_RS01385 -L1440_RS04730 L1224_RS04735 -L1440_RS04730 119192 F -L1440_RS04730 LJHENM_04705 F -L1224_RS00155 L1224_RS00155 -L1224_RS00155 BKB96_RS00160 -L1224_RS00155 AQ244_RS01835 -L1224_RS00155 BKB99_RS00160 -L1224_RS00155 CTO_RS00155 -L1224_RS00155 SOTONIA3_RS00155 -L1224_RS00155 L1440_RS00155 -L1224_RS00155 BKB92_RS00160 -L1224_RS00155 119230 -L1224_RS00155 CBP44_RS01555 -L1224_RS00155 E150_RS00155 -L1224_RS00155 L2BUCH2_RS00155 -L1224_RS00155 BKB93_RS00160 -L1224_RS00155 FCS84708_RS00155 -L1224_RS00155 AP288_RS03225 -L1224_RS00155 BBV13_RS00160 -L1224_RS00155 G9768_RS00155 -L1224_RS00155 AQ199_RS00850 -L1224_RS00155 BW688_RS01550 -L1224_RS00155 L2BLST_RS00155 -L1224_RS00155 BKC02_RS00160 -L1224_RS00155 BBV16_RS00160 -L1224_RS00155 AOT15_RS00800 -L1224_RS00155 BKC01_RS00160 -L1224_RS00155 gnl|Prokka|PADJNBJD_00032 -L1224_RS00155 LJHENM_00160 -L1224_RS00155 A5291_RS00155 -L1224_RS00155 SOTONK1_RS00155 -L1224_RS00155 JIEJKO_00155 -L1224_RS00155 7618371 -L1224_RS00155 NILJEPDF_00032 -L1224_RS00155 L3404_RS00155 -L1224_RS00155 IaCS19096_RS00155 -L1224_RS00155 AKW53_RS01645 -L1224_RS00155 BKC03_RS00160 -L1224_RS00155 C15_RS0100155 -L1224_RS00155 QSDFRQ_00032 -L1224_RS00155 CTJTET1_RS00155 -L1224_RS00155 DU10_RS00160 -L1224_RS00155 CTRC943_RS00155 -L1224_RS00155 O169_RS00155 -L1224_RS00155 CBP48_RS01550 -L1224_RS00155 ECS88FINAL_RS0100160 -L1224_RS00155 DU13_RS00160 -L1224_RS00155 KW39_RS00155 -L1224_RS00155 KW36_RS00155 -L1224_RS00155 BKB95_RS00160 -L1224_RS00155 SW2_RS00155 -L1224_RS00155 ECS102511_RS00155 -L1224_RS00155 CTB_RS00155 -L1224_RS00155 CTL2C_RS01520 -L1224_RS00155 CBP42_RS01550 -L1224_RS00155 AQ193_RS03850 -L1224_RS00330 L1224_RS00330 -L1224_RS00330 AQ193_RS03665 -L1224_RS00330 AQ244_RS01660 -L1224_RS00330 BKB99_RS00335 -L1224_RS00330 CTO_RS00330 -L1224_RS00330 L1440_RS00330 -L1224_RS00330 BKB92_RS00335 -L1224_RS00330 SOTONIA3_RS00330 -L1224_RS00330 CBP44_RS01730 -L1224_RS00330 119256 -L1224_RS00330 E150_RS00330 -L1224_RS00330 L2BUCH2_RS00330 -L1224_RS00330 BKB93_RS00335 -L1224_RS00330 FCS84708_RS00330 -L1224_RS00330 AP288_RS03400 -L1224_RS00330 BBV13_RS00335 -L1224_RS00330 AQ199_RS01025 -L1224_RS00330 BW688_RS01725 -L1224_RS00330 G9768_RS00330 -L1224_RS00330 L2BLST_RS00330 -L1224_RS00330 BKC02_RS00335 -L1224_RS00330 BBV16_RS00335 -L1224_RS00330 gnl|Prokka|PADJNBJD_00065 -L1224_RS00330 AOT15_RS00625 -L1224_RS00330 NILJEPDF_00065 -L1224_RS00330 LJHENM_00330 -L1224_RS00330 A5291_RS00330 -L1224_RS00330 BKC01_RS00335 -L1224_RS00330 SOTONK1_RS00330 -L1224_RS00330 L3404_RS00330 -L1224_RS00330 JIEJKO_00330 -L1224_RS00330 AKW53_RS01820 -L1224_RS00330 QSDFRQ_00065 -L1224_RS00330 IaCS19096_RS00330 -L1224_RS00330 BKC03_RS00335 -L1224_RS00330 C15_RS0100335 -L1224_RS00330 DU10_RS00335 -L1224_RS00330 7618388 -L1224_RS00330 CTRC943_RS00330 -L1224_RS00330 CTJTET1_RS00330 -L1224_RS00330 O169_RS00330 -L1224_RS00330 KW36_RS00330 -L1224_RS00330 DU13_RS00340 -L1224_RS00330 CBP48_RS01725 -L1224_RS00330 ECS88FINAL_RS0100345 -L1224_RS00330 KW39_RS00330 -L1224_RS00330 BKB95_RS00335 -L1224_RS00330 SW2_RS00330 -L1224_RS00330 ECS102511_RS00330 -L1224_RS00330 CTB_RS00330 -L1224_RS00330 CTL2C_RS01695 -L1224_RS00330 CBP42_RS01725 -L1224_RS00330 BKB96_RS00335 -L1224_RS00490 L1224_RS00490 -L1224_RS00490 AQ244_RS01500 -L1224_RS00490 BKB99_RS00500 -L1224_RS00490 AQ193_RS03505 -L1224_RS00490 BKB92_RS00500 -L1224_RS00490 CTO_RS00490 -L1224_RS00490 L1440_RS00490 -L1224_RS00490 SOTONIA3_RS00490 -L1224_RS00490 E150_RS00490 -L1224_RS00490 CBP44_RS01895 -L1224_RS00490 120592 -L1224_RS00490 L2BUCH2_RS00490 -L1224_RS00490 BKB93_RS00500 -L1224_RS00490 FCS84708_RS00490 -L1224_RS00490 AP288_RS03560 -L1224_RS00490 AQ199_RS01185 -L1224_RS00490 L2BLST_RS00490 -L1224_RS00490 BW688_RS01890 -L1224_RS00490 G9768_RS00490 -L1224_RS00490 BKC02_RS00500 -L1224_RS00490 gnl|Prokka|PADJNBJD_00096 -L1224_RS00490 LJHENM_00480 -L1224_RS00490 NILJEPDF_00096 -L1224_RS00490 AOT15_RS00465 -L1224_RS00490 BKC01_RS00500 -L1224_RS00490 A5291_RS00490 -L1224_RS00490 JIEJKO_00485 -L1224_RS00490 SOTONK1_RS00490 -L1224_RS00490 L3404_RS00490 -L1224_RS00490 AKW53_RS01980 -L1224_RS00490 QSDFRQ_00096 -L1224_RS00490 IaCS19096_RS00490 -L1224_RS00490 BKC03_RS00500 -L1224_RS00490 DU10_RS00500 -L1224_RS00490 C15_RS0100500 -L1224_RS00490 7618825 -L1224_RS00490 CTRC943_RS00490 -L1224_RS00490 CTJTET1_RS00490 -L1224_RS00490 O169_RS00490 -L1224_RS00490 DU13_RS00505 -L1224_RS00490 ECS88FINAL_RS0100505 -L1224_RS00490 KW39_RS00490 -L1224_RS00490 KW36_RS00490 -L1224_RS00490 CBP48_RS01890 -L1224_RS00490 SW2_RS00490 -L1224_RS00490 BKB95_RS00500 -L1224_RS00490 ECS102511_RS00490 -L1224_RS00490 CTB_RS00490 -L1224_RS00490 CTL2C_RS01855 -L1224_RS00490 CBP42_RS01890 -L1224_RS00490 BKB96_RS00500 -L1224_RS00660 L1224_RS00660 -L1224_RS00660 AQ244_RS02835 -L1224_RS00660 BKB96_RS00670 -L1224_RS00660 CBP42_RS02060 -L1224_RS00660 AQ193_RS03335 -L1224_RS00660 BKB99_RS00670 -L1224_RS00660 L1440_RS00660 -L1224_RS00660 BKB92_RS00670 -L1224_RS00660 CTO_RS00665 -L1224_RS00660 SOTONIA3_RS00660 -L1224_RS00660 E150_RS00660 -L1224_RS00660 L2BUCH2_RS00660 -L1224_RS00660 CBP44_RS02065 -L1224_RS00660 FCS84708_RS00660 -L1224_RS00660 AP288_RS03730 -L1224_RS00660 BKB93_RS00670 -L1224_RS00660 120569 -L1224_RS00660 AQ199_RS01355 -L1224_RS00660 BBV13_RS00670 -L1224_RS00660 G9768_RS00660 -L1224_RS00660 L2BLST_RS00660 -L1224_RS00660 BW688_RS02060 -L1224_RS00660 AOT15_RS00295 -L1224_RS00660 BBV16_RS00670 -L1224_RS00660 BKC02_RS00670 -L1224_RS00660 gnl|Prokka|PADJNBJD_00130 -L1224_RS00660 LJHENM_00650 -L1224_RS00660 AKW53_RS02155 -L1224_RS00660 BKC01_RS00670 -L1224_RS00660 NILJEPDF_00130 -L1224_RS00660 A5291_RS00665 -L1224_RS00660 L3404_RS00660 -L1224_RS00660 SOTONK1_RS00660 -L1224_RS00660 JIEJKO_00655 -L1224_RS00660 QSDFRQ_00130 -L1224_RS00660 IaCS19096_RS00660 -L1224_RS00660 BKC03_RS00670 -L1224_RS00660 C15_RS0100685 -L1224_RS00660 CTRC943_RS00660 -L1224_RS00660 CTJTET1_RS00660 -L1224_RS00660 KW39_RS00660 -L1224_RS00660 DU10_RS00670 -L1224_RS00660 ECS88FINAL_RS0100685 -L1224_RS00660 O169_RS00660 -L1224_RS00660 DU13_RS00675 -L1224_RS00660 7618840 -L1224_RS00660 KW36_RS00660 -L1224_RS00660 CBP48_RS02060 -L1224_RS00660 SW2_RS00660 -L1224_RS00660 BKB95_RS00670 -L1224_RS00660 ECS102511_RS00660 -L1224_RS00660 CTL2C_RS02025 -L1224_RS00660 CTB_RS00665 -L1224_RS01015 L1224_RS01015 -L1224_RS01015 AQ193_RS02960 -L1224_RS01015 L1440_RS01015 -L1224_RS01015 AQ244_RS03215 -L1224_RS01015 BKB92_RS01035 -L1224_RS01015 CBP42_RS02425 -L1224_RS01015 SOTONIA3_RS01050 -L1224_RS01015 E150_RS01030 -L1224_RS01015 CTB_RS01060 -L1224_RS01015 L2BUCH2_RS01020 -L1224_RS01015 CTO_RS01060 -L1224_RS01015 FCS84708_RS01030 -L1224_RS01015 AP288_RS04100 -L1224_RS01015 BKB93_RS01035 -L1224_RS01015 CBP44_RS02430 -L1224_RS01015 AQ199_RS01725 -L1224_RS01015 L2BLST_RS01020 -L1224_RS01015 BW688_RS02430 -L1224_RS01015 BBV13_RS01065 -L1224_RS01015 G9768_RS01040 -L1224_RS01015 BKC02_RS01035 -L1224_RS01015 L3404_RS01015 -L1224_RS01015 AKW53_RS02525 -L1224_RS01015 AOT15_RS01330 -L1224_RS01015 BBV16_RS01065 -L1224_RS01015 BKC01_RS01035 -L1224_RS01015 119366 -L1224_RS01015 DU10_RS01045 -L1224_RS01015 gnl|Prokka|PADJNBJD_00203 -L1224_RS01015 BKC03_RS01035 -L1224_RS01015 NILJEPDF_00203 -L1224_RS01015 LJHENM_01020 -L1224_RS01015 CTRC943_RS01020 -L1224_RS01015 CTJTET1_RS01050 -L1224_RS01015 C15_RS0101070 -L1224_RS01015 SOTONK1_RS01035 -L1224_RS01015 ECS88FINAL_RS0101055 -L1224_RS01015 KW39_RS01040 -L1224_RS01015 JIEJKO_01020 -L1224_RS01015 A5291_RS01060 -L1224_RS01015 IaCS19096_RS01035 -L1224_RS01015 7618456 -L1224_RS01015 QSDFRQ_00203 -L1224_RS01015 O169_RS01040 -L1224_RS01015 DU13_RS01045 -L1224_RS01015 SW2_RS01030 -L1224_RS01015 BKB95_RS01050 -L1224_RS01015 CBP48_RS02425 -L1224_RS01015 KW36_RS01035 -L1224_RS01015 ECS102511_RS01030 -L1224_RS01015 BKB96_RS01035 -L1224_RS01015 CTL2C_RS02385 -L1224_RS01015 BKB99_RS01035 -L1224_RS01195 L1224_RS01195 -L1224_RS01195 AQ193_RS02780 -L1224_RS01195 L1440_RS01195 -L1224_RS01195 AQ244_RS03395 -L1224_RS01195 BKB92_RS01215 -L1224_RS01195 CBP42_RS02605 -L1224_RS01195 SOTONIA3_RS01230 -L1224_RS01195 CTB_RS01240 -L1224_RS01195 E150_RS01210 -L1224_RS01195 L2BUCH2_RS01200 -L1224_RS01195 CTO_RS01240 -L1224_RS01195 FCS84708_RS01210 -L1224_RS01195 AP288_RS04280 -L1224_RS01195 BKB93_RS01215 -L1224_RS01195 CBP44_RS02610 -L1224_RS01195 AQ199_RS01905 -L1224_RS01195 L2BLST_RS01200 -L1224_RS01195 BW688_RS02610 -L1224_RS01195 BBV13_RS01245 -L1224_RS01195 G9768_RS01220 -L1224_RS01195 BKC02_RS01215 -L1224_RS01195 L3404_RS01195 -L1224_RS01195 AKW53_RS02705 -L1224_RS01195 BBV16_RS01245 -L1224_RS01195 AOT15_RS01150 -L1224_RS01195 BKC01_RS01215 -L1224_RS01195 120481 -L1224_RS01195 gnl|Prokka|PADJNBJD_00238 -L1224_RS01195 DU10_RS01225 -L1224_RS01195 NILJEPDF_00238 -L1224_RS01195 LJHENM_01195 -L1224_RS01195 BKC03_RS01215 -L1224_RS01195 CTRC943_RS01200 -L1224_RS01195 CTJTET1_RS01230 -L1224_RS01195 KW39_RS01220 -L1224_RS01195 JIEJKO_01195 -L1224_RS01195 C15_RS0101250 -L1224_RS01195 SOTONK1_RS01215 -L1224_RS01195 ECS88FINAL_RS0101235 -L1224_RS01195 QSDFRQ_00238 -L1224_RS01195 A5291_RS01240 -L1224_RS01195 IaCS19096_RS01215 -L1224_RS01195 O169_RS01220 -L1224_RS01195 DU13_RS01225 -L1224_RS01195 7618891 -L1224_RS01195 SW2_RS01210 -L1224_RS01195 BKB95_RS01230 -L1224_RS01195 CBP48_RS02605 -L1224_RS01195 KW36_RS01215 -L1224_RS01195 ECS102511_RS01210 -L1224_RS01195 BKB96_RS01215 -L1224_RS01195 CTL2C_RS02565 -L1224_RS01195 BKB99_RS01215 -L1224_RS01355 L1224_RS01355 -L1224_RS01355 L1440_RS01355 -L1224_RS01355 AQ244_RS03560 -L1224_RS01355 CBP42_RS02770 -L1224_RS01355 SOTONIA3_RS01390 -L1224_RS01355 BKB92_RS01385 -L1224_RS01355 CTB_RS01405 -L1224_RS01355 E150_RS01375 -L1224_RS01355 L2BUCH2_RS01360 -L1224_RS01355 CTO_RS01400 -L1224_RS01355 FCS84708_RS01370 -L1224_RS01355 AP288_RS04440 -L1224_RS01355 BKB93_RS01385 -L1224_RS01355 CBP44_RS02775 -L1224_RS01355 AQ199_RS02065 -L1224_RS01355 L2BLST_RS01360 -L1224_RS01355 BBV13_RS01410 -L1224_RS01355 BW688_RS02775 -L1224_RS01355 G9768_RS01380 -L1224_RS01355 BKC02_RS01380 -L1224_RS01355 BBV16_RS01410 -L1224_RS01355 L3404_RS01355 -L1224_RS01355 AKW53_RS02865 -L1224_RS01355 BKC01_RS01385 -L1224_RS01355 gnl|Prokka|PADJNBJD_00270 -L1224_RS01355 DU10_RS01390 -L1224_RS01355 NILJEPDF_00270 -L1224_RS01355 LJHENM_01360 -L1224_RS01355 BKC03_RS01380 -L1224_RS01355 CTRC943_RS01360 -L1224_RS01355 CTJTET1_RS01390 -L1224_RS01355 KW39_RS01380 -L1224_RS01355 JIEJKO_01360 -L1224_RS01355 119422 -L1224_RS01355 C15_RS0101415 -L1224_RS01355 SOTONK1_RS01380 -L1224_RS01355 ECS88FINAL_RS0101400 -L1224_RS01355 QSDFRQ_00270 -L1224_RS01355 IaCS19096_RS01375 -L1224_RS01355 A5291_RS01405 -L1224_RS01355 O169_RS01385 -L1224_RS01355 DU13_RS01390 -L1224_RS01355 7618492 -L1224_RS01355 SW2_RS01370 -L1224_RS01355 BKB95_RS01395 -L1224_RS01355 CBP48_RS02770 -L1224_RS01355 KW36_RS01375 -L1224_RS01355 ECS102511_RS01370 -L1224_RS01355 AOT15_RS02375 -L1224_RS01355 BKB96_RS01380 -L1224_RS01355 CTL2C_RS02725 -L1224_RS01355 AQ193_RS02615 -L1224_RS01355 BKB99_RS01380 -L1224_RS01515 L1224_RS01515 -L1224_RS01515 L1440_RS01515 -L1224_RS01515 AQ244_RS03720 -L1224_RS01515 CBP42_RS02930 -L1224_RS01515 SOTONIA3_RS01550 -L1224_RS01515 BKB92_RS01545 -L1224_RS01515 CTB_RS01565 -L1224_RS01515 E150_RS01535 -L1224_RS01515 L2BUCH2_RS01520 -L1224_RS01515 CTO_RS01560 -L1224_RS01515 FCS84708_RS01530 -L1224_RS01515 AP288_RS04600 -L1224_RS01515 BKB93_RS01545 -L1224_RS01515 CBP44_RS02935 -L1224_RS01515 AQ199_RS02225 -L1224_RS01515 L2BLST_RS01520 -L1224_RS01515 BBV13_RS01570 -L1224_RS01515 BW688_RS02940 -L1224_RS01515 G9768_RS01540 -L1224_RS01515 BKC02_RS01540 -L1224_RS01515 AKW53_RS03030 -L1224_RS01515 BBV16_RS01570 -L1224_RS01515 L3404_RS01515 -L1224_RS01515 BKC01_RS01545 -L1224_RS01515 gnl|Prokka|PADJNBJD_00302 -L1224_RS01515 NILJEPDF_00302 -L1224_RS01515 LJHENM_01520 -L1224_RS01515 BKC03_RS01540 -L1224_RS01515 DU10_RS01555 -L1224_RS01515 CTRC943_RS01520 -L1224_RS01515 CTJTET1_RS01550 -L1224_RS01515 KW39_RS01540 -L1224_RS01515 JIEJKO_01520 -L1224_RS01515 C15_RS0101585 -L1224_RS01515 SOTONK1_RS01540 -L1224_RS01515 ECS88FINAL_RS0101565 -L1224_RS01515 120431 -L1224_RS01515 QSDFRQ_00302 -L1224_RS01515 IaCS19096_RS01535 -L1224_RS01515 A5291_RS01565 -L1224_RS01515 O169_RS01545 -L1224_RS01515 DU13_RS01550 -L1224_RS01515 SW2_RS01530 -L1224_RS01515 BKB95_RS01555 -L1224_RS01515 CBP48_RS02930 -L1224_RS01515 7618923 -L1224_RS01515 KW36_RS01535 -L1224_RS01515 ECS102511_RS01530 -L1224_RS01515 AOT15_RS02535 -L1224_RS01515 BKB96_RS01540 -L1224_RS01515 CTL2C_RS02885 -L1224_RS01515 AQ193_RS02455 -L1224_RS01515 BKB99_RS01540 -L1224_RS01855 L1224_RS01855 -L1224_RS01855 KW36_RS01875 -L1224_RS01855 AOT15_RS02875 -L1224_RS01855 BKB96_RS01885 -L1224_RS01855 SW2_RS01880 -L1224_RS01855 BKB99_RS01885 -L1224_RS01855 L1440_RS01855 -L1224_RS01855 ECS102511_RS01880 -L1224_RS01855 CBP42_RS03295 -L1224_RS01855 CTB_RS01905 -L1224_RS01855 SOTONIA3_RS01890 -L1224_RS01855 L2BUCH2_RS01855 -L1224_RS01855 BKB92_RS01895 -L1224_RS01855 CTO_RS01905 -L1224_RS01855 E150_RS01885 -L1224_RS01855 L2BLST_RS01855 -L1224_RS01855 FCS84708_RS01875 -L1224_RS01855 AP288_RS01200 -L1224_RS01855 BW688_RS03285 -L1224_RS01855 BKB93_RS01895 -L1224_RS01855 CBP44_RS03290 -L1224_RS01855 BBV13_RS01910 -L1224_RS01855 AQ199_RS02575 -L1224_RS01855 G9768_RS01880 -L1224_RS01855 L3404_RS01855 -L1224_RS01855 AQ244_RS01230 -L1224_RS01855 BBV16_RS01910 -L1224_RS01855 BKC02_RS01885 -L1224_RS01855 BKC01_RS01885 -L1224_RS01855 AKW53_RS03380 -L1224_RS01855 gnl|Prokka|PADJNBJD_00370 -L1224_RS01855 NILJEPDF_00370 -L1224_RS01855 CTRC943_RS01860 -L1224_RS01855 LJHENM_01865 -L1224_RS01855 JIEJKO_01860 -L1224_RS01855 BKC03_RS01885 -L1224_RS01855 CTJTET1_RS01890 -L1224_RS01855 DU10_RS01905 -L1224_RS01855 QSDFRQ_00370 -L1224_RS01855 C15_RS0101925 -L1224_RS01855 SOTONK1_RS01880 -L1224_RS01855 A5291_RS01905 -L1224_RS01855 KW39_RS01890 -L1224_RS01855 IaCS19096_RS01875 -L1224_RS01855 AQ193_RS02105 -L1224_RS01855 ECS88FINAL_RS0101915 -L1224_RS01855 DU13_RS01900 -L1224_RS01855 O169_RS01890 -L1224_RS01855 120356 -L1224_RS01855 7618963 -L1224_RS01855 CTL2C_RS03225 -L1224_RS01855 BKB95_RS01900 -L1224_RS01855 CBP48_RS03285 -L1224_RS02020 L1224_RS02020 -L1224_RS02020 KW36_RS02040 -L1224_RS02020 AOT15_RS03040 -L1224_RS02020 BKB95_RS02070 -L1224_RS02020 BKB96_RS02050 -L1224_RS02020 SW2_RS02045 -L1224_RS02020 BKB99_RS02050 -L1224_RS02020 L1440_RS02020 -L1224_RS02020 ECS102511_RS02045 -L1224_RS02020 CTB_RS02070 -L1224_RS02020 CBP42_RS03465 -L1224_RS02020 SOTONIA3_RS02055 -L1224_RS02020 L2BUCH2_RS02020 -L1224_RS02020 BKB92_RS02060 -L1224_RS02020 CTO_RS02070 -L1224_RS02020 E150_RS02050 -L1224_RS02020 L2BLST_RS02020 -L1224_RS02020 BW688_RS03450 -L1224_RS02020 FCS84708_RS02040 -L1224_RS02020 AP288_RS01035 -L1224_RS02020 BBV13_RS02075 -L1224_RS02020 BKB93_RS02060 -L1224_RS02020 CBP44_RS03460 -L1224_RS02020 AQ199_RS02740 -L1224_RS02020 G9768_RS02045 -L1224_RS02020 BBV16_RS02075 -L1224_RS02020 L3404_RS02020 -L1224_RS02020 AQ244_RS01065 -L1224_RS02020 BKC02_RS02050 -L1224_RS02020 BKC01_RS02050 -L1224_RS02020 AKW53_RS03545 -L1224_RS02020 gnl|Prokka|PADJNBJD_00403 -L1224_RS02020 NILJEPDF_00403 -L1224_RS02020 CTRC943_RS02025 -L1224_RS02020 LJHENM_02030 -L1224_RS02020 JIEJKO_02025 -L1224_RS02020 BKC03_RS02050 -L1224_RS02020 CTJTET1_RS02055 -L1224_RS02020 QSDFRQ_00403 -L1224_RS02020 C15_RS0102090 -L1224_RS02020 A5291_RS02070 -L1224_RS02020 SOTONK1_RS02045 -L1224_RS02020 DU10_RS02075 -L1224_RS02020 KW39_RS02055 -L1224_RS02020 IaCS19096_RS02040 -L1224_RS02020 AQ193_RS01940 -L1224_RS02020 ECS88FINAL_RS0102085 -L1224_RS02020 O169_RS02055 -L1224_RS02020 DU13_RS02070 -L1224_RS02020 7618981 -L1224_RS02020 CTL2C_RS03390 -L1224_RS02020 CBP48_RS03455 -L1224_RS02020 120327 -L1224_RS02185 L1224_RS02185 -L1224_RS02185 SW2_RS02210 -L1224_RS02185 ECS102511_RS02205 -L1224_RS02185 L1440_RS02185 -L1224_RS02185 CBP42_RS03630 -L1224_RS02185 CTB_RS02235 -L1224_RS02185 L2BUCH2_RS02180 -L1224_RS02185 BKB92_RS02225 -L1224_RS02185 SOTONIA3_RS02220 -L1224_RS02185 CTO_RS02235 -L1224_RS02185 E150_RS02210 -L1224_RS02185 BW688_RS03615 -L1224_RS02185 L2BLST_RS02185 -L1224_RS02185 FCS84708_RS02200 -L1224_RS02185 BBV13_RS02240 -L1224_RS02185 CBP44_RS03625 -L1224_RS02185 BKB93_RS02230 -L1224_RS02185 AP288_RS00875 -L1224_RS02185 AQ199_RS02900 -L1224_RS02185 G9768_RS02205 -L1224_RS02185 BBV16_RS02245 -L1224_RS02185 L3404_RS02180 -L1224_RS02185 BKC02_RS02215 -L1224_RS02185 BKC01_RS02215 -L1224_RS02185 AKW53_RS03705 -L1224_RS02185 AQ244_RS00905 -L1224_RS02185 gnl|Prokka|PADJNBJD_00435 -L1224_RS02185 NILJEPDF_00435 -L1224_RS02185 CTRC943_RS02185 -L1224_RS02185 LJHENM_02195 -L1224_RS02185 JIEJKO_02190 -L1224_RS02185 BKC03_RS02215 -L1224_RS02185 CTJTET1_RS02215 -L1224_RS02185 QSDFRQ_00435 -L1224_RS02185 C15_RS0102250 -L1224_RS02185 SOTONK1_RS02205 -L1224_RS02185 DU10_RS02240 -L1224_RS02185 A5291_RS02235 -L1224_RS02185 KW39_RS02215 -L1224_RS02185 IaCS19096_RS02200 -L1224_RS02185 ECS88FINAL_RS0102250 -L1224_RS02185 O169_RS02215 -L1224_RS02185 AQ193_RS01780 -L1224_RS02185 DU13_RS02235 -L1224_RS02185 7618562 -L1224_RS02185 BKB96_RS02220 -L1224_RS02185 BKB99_RS02215 -L1224_RS02185 CBP48_RS03620 -L1224_RS02185 CTL2C_RS03555 -L1224_RS02185 KW36_RS02200 -L1224_RS02185 AOT15_RS03200 -L1224_RS02185 BKB95_RS02235 -L1224_RS02185 119533 -L1224_RS02345 L1224_RS02345 -L1224_RS02345 SW2_RS02370 -L1224_RS02345 ECS102511_RS02365 -L1224_RS02345 L1440_RS02345 -L1224_RS02345 CBP42_RS03795 -L1224_RS02345 CTB_RS02395 -L1224_RS02345 L2BUCH2_RS02340 -L1224_RS02345 BKB92_RS02390 -L1224_RS02345 SOTONIA3_RS02380 -L1224_RS02345 CTO_RS02395 -L1224_RS02345 E150_RS02370 -L1224_RS02345 BW688_RS03780 -L1224_RS02345 L2BLST_RS02345 -L1224_RS02345 FCS84708_RS02360 -L1224_RS02345 BBV13_RS02400 -L1224_RS02345 CBP44_RS03790 -L1224_RS02345 BKB93_RS02395 -L1224_RS02345 AP288_RS00715 -L1224_RS02345 AQ199_RS03060 -L1224_RS02345 G9768_RS02365 -L1224_RS02345 BBV16_RS02405 -L1224_RS02345 L3404_RS02340 -L1224_RS02345 BKC02_RS02380 -L1224_RS02345 AKW53_RS03865 -L1224_RS02345 BKC01_RS02380 -L1224_RS02345 gnl|Prokka|PADJNBJD_00467 -L1224_RS02345 AQ244_RS00745 -L1224_RS02345 NILJEPDF_00467 -L1224_RS02345 LJHENM_02355 -L1224_RS02345 CTRC943_RS02345 -L1224_RS02345 JIEJKO_02355 -L1224_RS02345 BKC03_RS02380 -L1224_RS02345 QSDFRQ_00467 -L1224_RS02345 CTJTET1_RS02375 -L1224_RS02345 C15_RS0102415 -L1224_RS02345 SOTONK1_RS02365 -L1224_RS02345 DU10_RS02405 -L1224_RS02345 A5291_RS02395 -L1224_RS02345 KW39_RS02375 -L1224_RS02345 IaCS19096_RS02360 -L1224_RS02345 ECS88FINAL_RS0102415 -L1224_RS02345 O169_RS02375 -L1224_RS02345 AQ193_RS01620 -L1224_RS02345 DU13_RS02400 -L1224_RS02345 7619009 -L1224_RS02345 BKB96_RS02385 -L1224_RS02345 BKB99_RS02380 -L1224_RS02345 CBP48_RS03785 -L1224_RS02345 120283 -L1224_RS02345 CTL2C_RS03715 -L1224_RS02345 KW36_RS02360 -L1224_RS02345 AOT15_RS03360 -L1224_RS02345 BKB95_RS02400 -L1224_RS03020 L1224_RS03020 -L1224_RS03020 KW36_RS03045 -L1224_RS03020 BKB95_RS03090 -L1224_RS03020 AKW53_RS04275 -L1224_RS03020 BKB96_RS03085 -L1224_RS03020 BKB99_RS03080 -L1224_RS03020 7619089 -L1224_RS03020 SW2_RS03050 -L1224_RS03020 L1440_RS03020 -L1224_RS03020 ECS102511_RS03045 -L1224_RS03020 CBP42_RS04485 -L1224_RS03020 L2BUCH2_RS03020 -L1224_RS03020 CTB_RS03080 -L1224_RS03020 SOTONIA3_RS03065 -L1224_RS03020 BKB92_RS03080 -L1224_RS03020 BW688_RS04475 -L1224_RS03020 120155 -L1224_RS03020 E150_RS03050 -L1224_RS03020 CTO_RS03080 -L1224_RS03020 L2BLST_RS03020 -L1224_RS03020 CBP44_RS04480 -L1224_RS03020 FCS84708_RS03045 -L1224_RS03020 AP288_RS00035 -L1224_RS03020 BBV13_RS03085 -L1224_RS03020 AQ199_RS03745 -L1224_RS03020 BBV16_RS03095 -L1224_RS03020 BKB93_RS03085 -L1224_RS03020 G9768_RS03050 -L1224_RS03020 L3404_RS03015 -L1224_RS03020 AQ244_RS00060 -L1224_RS03020 gnl|Prokka|PADJNBJD_00600 -L1224_RS03020 NILJEPDF_00600 -L1224_RS03020 LJHENM_03015 -L1224_RS03020 BKC02_RS03080 -L1224_RS03020 AOT15_RS03850 -L1224_RS03020 CTRC943_RS03020 -L1224_RS03020 BKC01_RS03080 -L1224_RS03020 QSDFRQ_00600 -L1224_RS03020 JIEJKO_03025 -L1224_RS03020 SOTONK1_RS03050 -L1224_RS03020 CTJTET1_RS03060 -L1224_RS03020 BKC03_RS03080 -L1224_RS03020 KW39_RS03060 -L1224_RS03020 AQ193_RS00940 -L1224_RS03020 C15_RS0103115 -L1224_RS03020 ECS88FINAL_RS0103110 -L1224_RS03020 IaCS19096_RS03045 -L1224_RS03020 DU10_RS03095 -L1224_RS03020 A5291_RS03080 -L1224_RS03020 O169_RS03055 -L1224_RS03020 CTL2C_RS04390 -L1224_RS03020 DU13_RS03090 -L1224_RS03020 CBP48_RS04480 -L1224_RS03185 L1224_RS03185 -L1224_RS03185 SW2_RS03215 -L1224_RS03185 KW36_RS03210 -L1224_RS03185 ECS102511_RS03210 -L1224_RS03185 L1440_RS03185 -L1224_RS03185 BKB95_RS03255 -L1224_RS03185 BKB96_RS03250 -L1224_RS03185 BKB99_RS03245 -L1224_RS03185 CBP42_RS04645 -L1224_RS03185 L2BUCH2_RS03185 -L1224_RS03185 BKB92_RS03240 -L1224_RS03185 CTB_RS03250 -L1224_RS03185 E150_RS03215 -L1224_RS03185 SOTONIA3_RS03230 -L1224_RS03185 BW688_RS04635 -L1224_RS03185 CTO_RS03245 -L1224_RS03185 FCS84708_RS03210 -L1224_RS03185 L2BLST_RS03185 -L1224_RS03185 BBV13_RS03250 -L1224_RS03185 CBP44_RS04640 -L1224_RS03185 119660 -L1224_RS03185 AQ199_RS03910 -L1224_RS03185 BKB93_RS03245 -L1224_RS03185 BBV16_RS03260 -L1224_RS03185 G9768_RS03210 -L1224_RS03185 L3404_RS03180 -L1224_RS03185 gnl|Prokka|PADJNBJD_00631 -L1224_RS03185 AP288_RS01580 -L1224_RS03185 BKC02_RS03240 -L1224_RS03185 NILJEPDF_00632 -L1224_RS03185 LJHENM_03175 -L1224_RS03185 AOT15_RS04010 -L1224_RS03185 AQ244_RS04705 -L1224_RS03185 CTRC943_RS03185 -L1224_RS03185 JIEJKO_03180 -L1224_RS03185 BKC01_RS03240 -L1224_RS03185 QSDFRQ_00632 -L1224_RS03185 KW39_RS03225 -L1224_RS03185 BKC03_RS03240 -L1224_RS03185 CTJTET1_RS03225 -L1224_RS03185 ECS88FINAL_RS0103275 -L1224_RS03185 DU10_RS03255 -L1224_RS03185 SOTONK1_RS03210 -L1224_RS03185 O169_RS03220 -L1224_RS03185 IaCS19096_RS03205 -L1224_RS03185 C15_RS0103275 -L1224_RS03185 A5291_RS03250 -L1224_RS03185 AQ193_RS00775 -L1224_RS03185 DU13_RS03250 -L1224_RS03185 CTL2C_RS04555 -L1224_RS03185 AKW53_RS04435 -L1224_RS03185 CBP48_RS04640 -L1224_RS03185 7618644 -L1224_RS04565 L1224_RS04565 -L1224_RS04565 BKB96_RS04645 -L1224_RS04565 L1440_RS04560 -L1224_RS04565 BKB99_RS04640 -L1224_RS04565 SW2_RS04595 -L1224_RS04565 ECS102511_RS04590 -L1224_RS04565 AQ244_RS02165 -L1224_RS04565 CBP44_RS01215 -L1224_RS04565 CTB_RS04615 -L1224_RS04565 L2BUCH2_RS04565 -L1224_RS04565 SOTONIA3_RS04600 -L1224_RS04565 CTO_RS04610 -L1224_RS04565 AP288_RS02895 -L1224_RS04565 BBV13_RS04630 -L1224_RS04565 BKB92_RS04645 -L1224_RS04565 BBV16_RS04635 -L1224_RS04565 E150_RS04600 -L1224_RS04565 gnl|Prokka|PADJNBJD_00900 -L1224_RS04565 L2BLST_RS04565 -L1224_RS04565 FCS84708_RS04585 -L1224_RS04565 AQ199_RS00520 -L1224_RS04565 NILJEPDF_00901 -L1224_RS04565 BW688_RS01215 -L1224_RS04565 119890 -L1224_RS04565 JIEJKO_04530 -L1224_RS04565 7618339 -L1224_RS04565 QSDFRQ_00901 -L1224_RS04565 G9768_RS04585 -L1224_RS04565 LJHENM_04540 -L1224_RS04565 L3404_RS04560 -L1224_RS04565 BKB93_RS04650 -L1224_RS04565 BKC02_RS04640 -L1224_RS04565 AKW53_RS01310 -L1224_RS04565 BKC01_RS04645 -L1224_RS04565 CTRC943_RS04570 -L1224_RS04565 AOT15_RS02165 -L1224_RS04565 CTJTET1_RS04755 -L1224_RS04565 KW39_RS04605 -L1224_RS04565 BKC03_RS04640 -L1224_RS04565 CBP48_RS01215 -L1224_RS04565 A5291_RS04620 -L1224_RS04565 SOTONK1_RS04585 -L1224_RS04565 ECS88FINAL_RS0104695 -L1224_RS04565 IaCS19096_RS04580 -L1224_RS04565 C15_RS0104715 -L1224_RS04565 DU10_RS04660 -L1224_RS04565 O169_RS04605 -L1224_RS04565 KW36_RS04585 -L1224_RS04565 DU13_RS04660 -L1224_RS04565 CTL2C_RS01185 -L1224_RS04565 AQ193_RS04180 -L1224_RS04565 BKB95_RS04660 -L1224_RS04565 CBP42_RS01215 -L1224_RS04740 L1224_RS04740 -L1224_RS04740 AQ244_RS01990 -L1224_RS04740 L1440_RS04735 -L1224_RS04740 BKB95_RS04835 -L1224_RS04740 ECS102511_RS04760 -L1224_RS04740 BKB96_RS04820 -L1224_RS04740 BKB99_RS04815 -L1224_RS04740 SW2_RS04770 -L1224_RS04740 CBP44_RS01390 -L1224_RS04740 L2BUCH2_RS04740 -L1224_RS04740 CTB_RS04785 -L1224_RS04740 BKB92_RS04815 -L1224_RS04740 SOTONIA3_RS04775 -L1224_RS04740 BBV13_RS04800 -L1224_RS04740 CTO_RS04780 -L1224_RS04740 L2BLST_RS04740 -L1224_RS04740 AP288_RS03070 -L1224_RS04740 BBV16_RS04805 -L1224_RS04740 gnl|Prokka|PADJNBJD_00934 -L1224_RS04740 FCS84708_RS04755 -L1224_RS04740 E150_RS04775 -L1224_RS04740 BW688_RS01390 -L1224_RS04740 NILJEPDF_00935 -L1224_RS04740 AQ199_RS00695 -L1224_RS04740 AOT15_RS00955 -L1224_RS04740 L3404_RS04735 -L1224_RS04740 JIEJKO_04700 -L1224_RS04740 119912 -L1224_RS04740 QSDFRQ_00935 -L1224_RS04740 BKB93_RS04820 -L1224_RS04740 7618777 -L1224_RS04740 G9768_RS04760 -L1224_RS04740 LJHENM_04715 -L1224_RS04740 BKC02_RS04815 -L1224_RS04740 CTRC943_RS04745 -L1224_RS04740 AKW53_RS01485 -L1224_RS04740 BKC01_RS04820 -L1224_RS04740 KW39_RS04780 -L1224_RS04740 CBP48_RS01390 -L1224_RS04740 CTJTET1_RS04930 -L1224_RS04740 ECS88FINAL_RS0104865 -L1224_RS04740 BKC03_RS04815 -L1224_RS04740 DU10_RS04830 -L1224_RS04740 A5291_RS04790 -L1224_RS04740 SOTONK1_RS04760 -L1224_RS04740 O169_RS04775 -L1224_RS04740 IaCS19096_RS04755 -L1224_RS04740 DU13_RS04830 -L1224_RS04740 C15_RS0104885 -L1224_RS04740 AQ193_RS04005 -L1224_RS04740 KW36_RS04760 -L1224_RS04740 CTL2C_RS01360 -L1224_RS04740 CBP42_RS01390 -L2BUCH2_RS00120 L2BUCH2_RS00120 -L2BUCH2_RS00120 BKB93_RS00125 -L2BUCH2_RS00120 FCS84708_RS00120 -L2BUCH2_RS00120 AP288_RS03190 -L2BUCH2_RS00120 BBV13_RS00125 -L2BUCH2_RS00120 G9768_RS00120 -L2BUCH2_RS00120 AQ199_RS00815 -L2BUCH2_RS00120 BW688_RS01515 -L2BUCH2_RS00120 L2BLST_RS00120 -L2BUCH2_RS00120 AQ193_RS03885 -L2BUCH2_RS00120 BKC02_RS00125 -L2BUCH2_RS00120 AQ244_RS01870 -L2BUCH2_RS00120 BBV16_RS00125 -L2BUCH2_RS00120 BKC01_RS00125 -L2BUCH2_RS00120 gnl|Prokka|PADJNBJD_00025 -L2BUCH2_RS00120 LJHENM_00125 -L2BUCH2_RS00120 A5291_RS00120 -L2BUCH2_RS00120 SOTONK1_RS00120 -L2BUCH2_RS00120 JIEJKO_00120 -L2BUCH2_RS00120 7618364 -L2BUCH2_RS00120 NILJEPDF_00025 -L2BUCH2_RS00120 L3404_RS00120 -L2BUCH2_RS00120 IaCS19096_RS00120 -L2BUCH2_RS00120 BKC03_RS00125 -L2BUCH2_RS00120 C15_RS0100120 -L2BUCH2_RS00120 AKW53_RS01605 -L2BUCH2_RS00120 QSDFRQ_00025 -L2BUCH2_RS00120 CTJTET1_RS00120 -L2BUCH2_RS00120 DU10_RS00125 -L2BUCH2_RS00120 CTRC943_RS00120 -L2BUCH2_RS00120 O169_RS00120 -L2BUCH2_RS00120 CBP48_RS01515 -L2BUCH2_RS00120 ECS88FINAL_RS0100125 -L2BUCH2_RS00120 DU13_RS00125 -L2BUCH2_RS00120 KW39_RS00120 -L2BUCH2_RS00120 KW36_RS00120 -L2BUCH2_RS00120 BKB95_RS00125 -L2BUCH2_RS00120 SW2_RS00120 -L2BUCH2_RS00120 ECS102511_RS00120 -L2BUCH2_RS00120 CTB_RS00120 -L2BUCH2_RS00120 CTL2C_RS01485 -L2BUCH2_RS00120 AOT15_RS00835 -L2BUCH2_RS00120 CBP42_RS01515 -L2BUCH2_RS00120 L1224_RS00120 -L2BUCH2_RS00120 BKB96_RS00125 -L2BUCH2_RS00120 BKB99_RS00125 -L2BUCH2_RS00120 CTO_RS00120 -L2BUCH2_RS00120 SOTONIA3_RS00120 -L2BUCH2_RS00120 L1440_RS00120 -L2BUCH2_RS00120 BKB92_RS00125 -L2BUCH2_RS00120 119219 -L2BUCH2_RS00120 CBP44_RS01520 -L2BUCH2_RS00120 E150_RS00120 -L2BUCH2_RS00290 L2BUCH2_RS00290 -L2BUCH2_RS00290 BKB93_RS00295 -L2BUCH2_RS00290 FCS84708_RS00290 -L2BUCH2_RS00290 AP288_RS03360 -L2BUCH2_RS00290 BBV13_RS00295 -L2BUCH2_RS00290 AQ199_RS00985 -L2BUCH2_RS00290 BW688_RS01685 -L2BUCH2_RS00290 G9768_RS00290 -L2BUCH2_RS00290 L2BLST_RS00290 -L2BUCH2_RS00290 AQ193_RS03705 -L2BUCH2_RS00290 AQ244_RS01700 -L2BUCH2_RS00290 BKC02_RS00295 -L2BUCH2_RS00290 BBV16_RS00295 -L2BUCH2_RS00290 gnl|Prokka|PADJNBJD_00057 -L2BUCH2_RS00290 NILJEPDF_00057 -L2BUCH2_RS00290 LJHENM_00290 -L2BUCH2_RS00290 BKC01_RS00295 -L2BUCH2_RS00290 A5291_RS00290 -L2BUCH2_RS00290 SOTONK1_RS00290 -L2BUCH2_RS00290 L3404_RS00290 -L2BUCH2_RS00290 JIEJKO_00290 -L2BUCH2_RS00290 AKW53_RS01780 -L2BUCH2_RS00290 QSDFRQ_00057 -L2BUCH2_RS00290 IaCS19096_RS00290 -L2BUCH2_RS00290 BKC03_RS00295 -L2BUCH2_RS00290 C15_RS0100295 -L2BUCH2_RS00290 DU10_RS00295 -L2BUCH2_RS00290 7618385 -L2BUCH2_RS00290 CTRC943_RS00290 -L2BUCH2_RS00290 CTJTET1_RS00290 -L2BUCH2_RS00290 O169_RS00290 -L2BUCH2_RS00290 KW36_RS00290 -L2BUCH2_RS00290 DU13_RS00300 -L2BUCH2_RS00290 CBP48_RS01685 -L2BUCH2_RS00290 ECS88FINAL_RS0100300 -L2BUCH2_RS00290 KW39_RS00290 -L2BUCH2_RS00290 BKB95_RS00295 -L2BUCH2_RS00290 SW2_RS00290 -L2BUCH2_RS00290 ECS102511_RS00290 -L2BUCH2_RS00290 CTL2C_RS01655 -L2BUCH2_RS00290 AOT15_RS00665 -L2BUCH2_RS00290 CBP42_RS01685 -L2BUCH2_RS00290 CTB_RS00290 -L2BUCH2_RS00290 BKB96_RS00295 -L2BUCH2_RS00290 L1224_RS00290 -L2BUCH2_RS00290 BKB99_RS00295 -L2BUCH2_RS00290 L1440_RS00290 -L2BUCH2_RS00290 BKB92_RS00295 -L2BUCH2_RS00290 CTO_RS00290 -L2BUCH2_RS00290 SOTONIA3_RS00290 -L2BUCH2_RS00290 CBP44_RS01690 -L2BUCH2_RS00290 119252 -L2BUCH2_RS00290 E150_RS00290 -L2BUCH2_RS00455 L2BUCH2_RS00455 -L2BUCH2_RS00455 BKB93_RS00465 -L2BUCH2_RS00455 FCS84708_RS00455 -L2BUCH2_RS00455 AP288_RS03525 -L2BUCH2_RS00455 AQ199_RS01150 -L2BUCH2_RS00455 BBV13_RS00460 -L2BUCH2_RS00455 L2BLST_RS00455 -L2BUCH2_RS00455 BW688_RS01855 -L2BUCH2_RS00455 G9768_RS00455 -L2BUCH2_RS00455 AQ244_RS01535 -L2BUCH2_RS00455 BKC02_RS00465 -L2BUCH2_RS00455 gnl|Prokka|PADJNBJD_00089 -L2BUCH2_RS00455 LJHENM_00445 -L2BUCH2_RS00455 AQ193_RS03540 -L2BUCH2_RS00455 BBV16_RS00460 -L2BUCH2_RS00455 NILJEPDF_00089 -L2BUCH2_RS00455 A5291_RS00455 -L2BUCH2_RS00455 JIEJKO_00450 -L2BUCH2_RS00455 SOTONK1_RS00455 -L2BUCH2_RS00455 L3404_RS00455 -L2BUCH2_RS00455 AKW53_RS01945 -L2BUCH2_RS00455 QSDFRQ_00089 -L2BUCH2_RS00455 IaCS19096_RS00455 -L2BUCH2_RS00455 BKC03_RS00465 -L2BUCH2_RS00455 DU10_RS00465 -L2BUCH2_RS00455 C15_RS0100460 -L2BUCH2_RS00455 7618819 -L2BUCH2_RS00455 CTRC943_RS00455 -L2BUCH2_RS00455 CTJTET1_RS00455 -L2BUCH2_RS00455 O169_RS00455 -L2BUCH2_RS00455 DU13_RS00470 -L2BUCH2_RS00455 ECS88FINAL_RS0100465 -L2BUCH2_RS00455 KW36_RS00455 -L2BUCH2_RS00455 CBP48_RS01855 -L2BUCH2_RS00455 SW2_RS00455 -L2BUCH2_RS00455 BKB95_RS00465 -L2BUCH2_RS00455 ECS102511_RS00455 -L2BUCH2_RS00455 CTB_RS00455 -L2BUCH2_RS00455 CTL2C_RS01820 -L2BUCH2_RS00455 AOT15_RS00500 -L2BUCH2_RS00455 CBP42_RS01855 -L2BUCH2_RS00455 BKB96_RS00465 -L2BUCH2_RS00455 L1224_RS00455 -L2BUCH2_RS00455 BKB99_RS00465 -L2BUCH2_RS00455 BKB92_RS00465 -L2BUCH2_RS00455 CTO_RS00455 -L2BUCH2_RS00455 L1440_RS00455 -L2BUCH2_RS00455 SOTONIA3_RS00455 -L2BUCH2_RS00455 E150_RS00455 -L2BUCH2_RS00455 CBP44_RS01860 -L2BUCH2_RS00455 120602 -L2BUCH2_RS00795 L2BUCH2_RS00795 -L2BUCH2_RS00795 CBP44_RS02200 -L2BUCH2_RS00795 FCS84708_RS00795 -L2BUCH2_RS00795 AP288_RS03865 -L2BUCH2_RS00795 BKB93_RS00805 -L2BUCH2_RS00795 120558 -L2BUCH2_RS00795 AQ199_RS01490 -L2BUCH2_RS00795 BBV13_RS00805 -L2BUCH2_RS00795 G9768_RS00795 -L2BUCH2_RS00795 L2BLST_RS00795 -L2BUCH2_RS00795 BW688_RS02195 -L2BUCH2_RS00795 AQ193_RS03200 -L2BUCH2_RS00795 BBV16_RS00805 -L2BUCH2_RS00795 BKC02_RS00805 -L2BUCH2_RS00795 gnl|Prokka|PADJNBJD_00157 -L2BUCH2_RS00795 LJHENM_00785 -L2BUCH2_RS00795 AKW53_RS02290 -L2BUCH2_RS00795 BKC01_RS00805 -L2BUCH2_RS00795 NILJEPDF_00157 -L2BUCH2_RS00795 A5291_RS00800 -L2BUCH2_RS00795 L3404_RS00795 -L2BUCH2_RS00795 SOTONK1_RS00795 -L2BUCH2_RS00795 JIEJKO_00790 -L2BUCH2_RS00795 QSDFRQ_00157 -L2BUCH2_RS00795 CTJTET1_RS00795 -L2BUCH2_RS00795 IaCS19096_RS00795 -L2BUCH2_RS00795 BKC03_RS00805 -L2BUCH2_RS00795 C15_RS0100820 -L2BUCH2_RS00795 CTRC943_RS00795 -L2BUCH2_RS00795 ECS88FINAL_RS0100820 -L2BUCH2_RS00795 KW39_RS00795 -L2BUCH2_RS00795 DU10_RS00805 -L2BUCH2_RS00795 O169_RS00795 -L2BUCH2_RS00795 DU13_RS00810 -L2BUCH2_RS00795 KW36_RS00795 -L2BUCH2_RS00795 CBP48_RS02195 -L2BUCH2_RS00795 SW2_RS00795 -L2BUCH2_RS00795 BKB95_RS00805 -L2BUCH2_RS00795 7618847 -L2BUCH2_RS00795 ECS102511_RS00795 -L2BUCH2_RS00795 AOT15_RS00160 -L2BUCH2_RS00795 CTL2C_RS02160 -L2BUCH2_RS00795 CTB_RS00800 -L2BUCH2_RS00795 L1224_RS00795 -L2BUCH2_RS00795 AQ244_RS02970 -L2BUCH2_RS00795 BKB96_RS00805 -L2BUCH2_RS00795 CBP42_RS02195 -L2BUCH2_RS00795 L1440_RS00795 -L2BUCH2_RS00795 BKB99_RS00805 -L2BUCH2_RS00795 CTO_RS00800 -L2BUCH2_RS00795 BKB92_RS00805 -L2BUCH2_RS00795 SOTONIA3_RS00795 -L2BUCH2_RS00795 E150_RS00795 -L2BUCH2_RS00980 L2BUCH2_RS00980 -L2BUCH2_RS00980 CTO_RS01020 -L2BUCH2_RS00980 FCS84708_RS00990 -L2BUCH2_RS00980 AP288_RS04060 -L2BUCH2_RS00980 BKB93_RS00995 -L2BUCH2_RS00980 CBP44_RS02390 -L2BUCH2_RS00980 AQ199_RS01685 -L2BUCH2_RS00980 L2BLST_RS00980 -L2BUCH2_RS00980 BW688_RS02390 -L2BUCH2_RS00980 BBV13_RS01025 -L2BUCH2_RS00980 G9768_RS01000 -L2BUCH2_RS00980 AQ193_RS03000 -L2BUCH2_RS00980 BKC02_RS00995 -L2BUCH2_RS00980 L3404_RS00975 -L2BUCH2_RS00980 AKW53_RS02485 -L2BUCH2_RS00980 120520 -L2BUCH2_RS00980 BBV16_RS01025 -L2BUCH2_RS00980 BKC01_RS00995 -L2BUCH2_RS00980 DU10_RS01005 -L2BUCH2_RS00980 gnl|Prokka|PADJNBJD_00195 -L2BUCH2_RS00980 BKC03_RS00995 -L2BUCH2_RS00980 NILJEPDF_00195 -L2BUCH2_RS00980 LJHENM_00980 -L2BUCH2_RS00980 CTRC943_RS00980 -L2BUCH2_RS00980 CTJTET1_RS01010 -L2BUCH2_RS00980 C15_RS0101030 -L2BUCH2_RS00980 SOTONK1_RS00995 -L2BUCH2_RS00980 ECS88FINAL_RS0101015 -L2BUCH2_RS00980 KW39_RS01000 -L2BUCH2_RS00980 JIEJKO_00980 -L2BUCH2_RS00980 7618866 -L2BUCH2_RS00980 A5291_RS01020 -L2BUCH2_RS00980 IaCS19096_RS00995 -L2BUCH2_RS00980 QSDFRQ_00195 -L2BUCH2_RS00980 O169_RS01000 -L2BUCH2_RS00980 DU13_RS01005 -L2BUCH2_RS00980 SW2_RS00990 -L2BUCH2_RS00980 BKB95_RS01010 -L2BUCH2_RS00980 CBP48_RS02385 -L2BUCH2_RS00980 KW36_RS00995 -L2BUCH2_RS00980 ECS102511_RS00990 -L2BUCH2_RS00980 BKB96_RS00995 -L2BUCH2_RS00980 CTL2C_RS02345 -L2BUCH2_RS00980 BKB99_RS00995 -L2BUCH2_RS00980 L1224_RS00975 -L2BUCH2_RS00980 L1440_RS00975 -L2BUCH2_RS00980 AOT15_RS01370 -L2BUCH2_RS00980 AQ244_RS03175 -L2BUCH2_RS00980 BKB92_RS00995 -L2BUCH2_RS00980 CBP42_RS02385 -L2BUCH2_RS00980 SOTONIA3_RS01010 -L2BUCH2_RS00980 E150_RS00990 -L2BUCH2_RS00980 CTB_RS01020 -L2BUCH2_RS01160 L2BUCH2_RS01160 -L2BUCH2_RS01160 CTO_RS01200 -L2BUCH2_RS01160 FCS84708_RS01170 -L2BUCH2_RS01160 AP288_RS04240 -L2BUCH2_RS01160 BKB93_RS01175 -L2BUCH2_RS01160 CBP44_RS02570 -L2BUCH2_RS01160 AQ199_RS01865 -L2BUCH2_RS01160 L2BLST_RS01160 -L2BUCH2_RS01160 BW688_RS02570 -L2BUCH2_RS01160 BBV13_RS01205 -L2BUCH2_RS01160 G9768_RS01180 -L2BUCH2_RS01160 AQ193_RS02820 -L2BUCH2_RS01160 BKC02_RS01175 -L2BUCH2_RS01160 L3404_RS01155 -L2BUCH2_RS01160 AKW53_RS02665 -L2BUCH2_RS01160 BBV16_RS01205 -L2BUCH2_RS01160 BKC01_RS01175 -L2BUCH2_RS01160 120493 -L2BUCH2_RS01160 DU10_RS01185 -L2BUCH2_RS01160 BKC03_RS01175 -L2BUCH2_RS01160 CTRC943_RS01160 -L2BUCH2_RS01160 CTJTET1_RS01190 -L2BUCH2_RS01160 C15_RS0101210 -L2BUCH2_RS01160 SOTONK1_RS01175 -L2BUCH2_RS01160 ECS88FINAL_RS0101195 -L2BUCH2_RS01160 KW39_RS01180 -L2BUCH2_RS01160 A5291_RS01200 -L2BUCH2_RS01160 IaCS19096_RS01175 -L2BUCH2_RS01160 7618883 -L2BUCH2_RS01160 O169_RS01180 -L2BUCH2_RS01160 DU13_RS01185 -L2BUCH2_RS01160 SW2_RS01170 -L2BUCH2_RS01160 BKB95_RS01190 -L2BUCH2_RS01160 CBP48_RS02565 -L2BUCH2_RS01160 KW36_RS01175 -L2BUCH2_RS01160 ECS102511_RS01170 -L2BUCH2_RS01160 BKB96_RS01175 -L2BUCH2_RS01160 CTL2C_RS02525 -L2BUCH2_RS01160 BKB99_RS01175 -L2BUCH2_RS01160 L1224_RS01155 -L2BUCH2_RS01160 L1440_RS01155 -L2BUCH2_RS01160 AOT15_RS01190 -L2BUCH2_RS01160 AQ244_RS03355 -L2BUCH2_RS01160 BKB92_RS01175 -L2BUCH2_RS01160 CBP42_RS02565 -L2BUCH2_RS01160 SOTONIA3_RS01190 -L2BUCH2_RS01160 E150_RS01170 -L2BUCH2_RS01160 CTB_RS01200 -L2BUCH2_RS01320 L2BUCH2_RS01320 -L2BUCH2_RS01320 CTO_RS01360 -L2BUCH2_RS01320 FCS84708_RS01330 -L2BUCH2_RS01320 AP288_RS04400 -L2BUCH2_RS01320 BKB93_RS01335 -L2BUCH2_RS01320 CBP44_RS02730 -L2BUCH2_RS01320 AQ199_RS02025 -L2BUCH2_RS01320 L2BLST_RS01320 -L2BUCH2_RS01320 BBV13_RS01365 -L2BUCH2_RS01320 BW688_RS02730 -L2BUCH2_RS01320 G9768_RS01340 -L2BUCH2_RS01320 AQ193_RS02660 -L2BUCH2_RS01320 BKC02_RS01335 -L2BUCH2_RS01320 BBV16_RS01365 -L2BUCH2_RS01320 L3404_RS01315 -L2BUCH2_RS01320 AKW53_RS02825 -L2BUCH2_RS01320 BKC01_RS01335 -L2BUCH2_RS01320 gnl|Prokka|PADJNBJD_00262 -L2BUCH2_RS01320 DU10_RS01345 -L2BUCH2_RS01320 NILJEPDF_00262 -L2BUCH2_RS01320 LJHENM_01315 -L2BUCH2_RS01320 BKC03_RS01335 -L2BUCH2_RS01320 CTRC943_RS01320 -L2BUCH2_RS01320 CTJTET1_RS01350 -L2BUCH2_RS01320 KW39_RS01340 -L2BUCH2_RS01320 JIEJKO_01315 -L2BUCH2_RS01320 119414 -L2BUCH2_RS01320 C15_RS0101370 -L2BUCH2_RS01320 SOTONK1_RS01335 -L2BUCH2_RS01320 ECS88FINAL_RS0101355 -L2BUCH2_RS01320 QSDFRQ_00262 -L2BUCH2_RS01320 A5291_RS01360 -L2BUCH2_RS01320 O169_RS01340 -L2BUCH2_RS01320 IaCS19096_RS01335 -L2BUCH2_RS01320 DU13_RS01345 -L2BUCH2_RS01320 7618487 -L2BUCH2_RS01320 SW2_RS01330 -L2BUCH2_RS01320 BKB95_RS01350 -L2BUCH2_RS01320 CBP48_RS02725 -L2BUCH2_RS01320 KW36_RS01335 -L2BUCH2_RS01320 ECS102511_RS01330 -L2BUCH2_RS01320 BKB96_RS01335 -L2BUCH2_RS01320 CTL2C_RS02685 -L2BUCH2_RS01320 BKB99_RS01335 -L2BUCH2_RS01320 L1224_RS01315 -L2BUCH2_RS01320 L1440_RS01315 -L2BUCH2_RS01320 AOT15_RS01030 -L2BUCH2_RS01320 AQ244_RS03515 -L2BUCH2_RS01320 BKB92_RS01335 -L2BUCH2_RS01320 CBP42_RS02725 -L2BUCH2_RS01320 SOTONIA3_RS01350 -L2BUCH2_RS01320 CTB_RS01360 -L2BUCH2_RS01320 E150_RS01330 -L2BUCH2_RS01480 L2BUCH2_RS01480 -L2BUCH2_RS01480 CTO_RS01520 -L2BUCH2_RS01480 FCS84708_RS01490 -L2BUCH2_RS01480 AP288_RS04560 -L2BUCH2_RS01480 BKB93_RS01505 -L2BUCH2_RS01480 CBP44_RS02895 -L2BUCH2_RS01480 AQ199_RS02185 -L2BUCH2_RS01480 L2BLST_RS01480 -L2BUCH2_RS01480 BBV13_RS01530 -L2BUCH2_RS01480 BW688_RS02900 -L2BUCH2_RS01480 AQ193_RS02495 -L2BUCH2_RS01480 G9768_RS01500 -L2BUCH2_RS01480 BKC02_RS01500 -L2BUCH2_RS01480 AKW53_RS02990 -L2BUCH2_RS01480 BBV16_RS01530 -L2BUCH2_RS01480 L3404_RS01475 -L2BUCH2_RS01480 BKC01_RS01505 -L2BUCH2_RS01480 gnl|Prokka|PADJNBJD_00294 -L2BUCH2_RS01480 DU10_RS01510 -L2BUCH2_RS01480 NILJEPDF_00294 -L2BUCH2_RS01480 LJHENM_01480 -L2BUCH2_RS01480 BKC03_RS01500 -L2BUCH2_RS01480 CTRC943_RS01480 -L2BUCH2_RS01480 CTJTET1_RS01510 -L2BUCH2_RS01480 KW39_RS01500 -L2BUCH2_RS01480 JIEJKO_01480 -L2BUCH2_RS01480 C15_RS0101535 -L2BUCH2_RS01480 SOTONK1_RS01500 -L2BUCH2_RS01480 ECS88FINAL_RS0101520 -L2BUCH2_RS01480 120440 -L2BUCH2_RS01480 QSDFRQ_00294 -L2BUCH2_RS01480 IaCS19096_RS01495 -L2BUCH2_RS01480 A5291_RS01525 -L2BUCH2_RS01480 O169_RS01505 -L2BUCH2_RS01480 DU13_RS01510 -L2BUCH2_RS01480 SW2_RS01490 -L2BUCH2_RS01480 BKB95_RS01515 -L2BUCH2_RS01480 CBP48_RS02890 -L2BUCH2_RS01480 7618917 -L2BUCH2_RS01480 KW36_RS01495 -L2BUCH2_RS01480 ECS102511_RS01490 -L2BUCH2_RS01480 AOT15_RS02495 -L2BUCH2_RS01480 BKB96_RS01500 -L2BUCH2_RS01480 CTL2C_RS02845 -L2BUCH2_RS01480 BKB99_RS01500 -L2BUCH2_RS01480 L1224_RS01475 -L2BUCH2_RS01480 L1440_RS01475 -L2BUCH2_RS01480 AQ244_RS03680 -L2BUCH2_RS01480 CBP42_RS02890 -L2BUCH2_RS01480 SOTONIA3_RS01510 -L2BUCH2_RS01480 BKB92_RS01505 -L2BUCH2_RS01480 CTB_RS01525 -L2BUCH2_RS01480 E150_RS01495 -L2BUCH2_RS02490 L2BUCH2_RS02490 -L2BUCH2_RS02490 CTB_RS02545 -L2BUCH2_RS02490 SOTONIA3_RS02525 -L2BUCH2_RS02490 BKB92_RS02535 -L2BUCH2_RS02490 AQ193_RS01475 -L2BUCH2_RS02490 E150_RS02515 -L2BUCH2_RS02490 CTO_RS02545 -L2BUCH2_RS02490 BW688_RS03930 -L2BUCH2_RS02490 AOT15_RS03585 -L2BUCH2_RS02490 BBV13_RS02550 -L2BUCH2_RS02490 L2BLST_RS02490 -L2BUCH2_RS02490 FCS84708_RS02505 -L2BUCH2_RS02490 CBP44_RS03935 -L2BUCH2_RS02490 BBV16_RS02560 -L2BUCH2_RS02490 BKB93_RS02540 -L2BUCH2_RS02490 AQ199_RS03205 -L2BUCH2_RS02490 G9768_RS02510 -L2BUCH2_RS02490 L3404_RS02485 -L2BUCH2_RS02490 BKC02_RS02530 -L2BUCH2_RS02490 gnl|Prokka|PADJNBJD_00495 -L2BUCH2_RS02490 BKC01_RS02530 -L2BUCH2_RS02490 NILJEPDF_00495 -L2BUCH2_RS02490 AKW53_RS04705 -L2BUCH2_RS02490 LJHENM_02495 -L2BUCH2_RS02490 CTRC943_RS02490 -L2BUCH2_RS02490 JIEJKO_02495 -L2BUCH2_RS02490 QSDFRQ_00495 -L2BUCH2_RS02490 SOTONK1_RS02510 -L2BUCH2_RS02490 CTJTET1_RS02520 -L2BUCH2_RS02490 BKC03_RS02530 -L2BUCH2_RS02490 C15_RS0102570 -L2BUCH2_RS02490 KW39_RS02520 -L2BUCH2_RS02490 IaCS19096_RS02505 -L2BUCH2_RS02490 AP288_RS00570 -L2BUCH2_RS02490 DU10_RS02550 -L2BUCH2_RS02490 A5291_RS02545 -L2BUCH2_RS02490 ECS88FINAL_RS0102565 -L2BUCH2_RS02490 O169_RS02520 -L2BUCH2_RS02490 DU13_RS02545 -L2BUCH2_RS02490 7618596 -L2BUCH2_RS02490 BKB96_RS02535 -L2BUCH2_RS02490 BKB99_RS02530 -L2BUCH2_RS02490 CBP48_RS03930 -L2BUCH2_RS02490 CTL2C_RS03860 -L2BUCH2_RS02490 KW36_RS02505 -L2BUCH2_RS02490 BKB95_RS02545 -L2BUCH2_RS02490 L1224_RS02490 -L2BUCH2_RS02490 AQ244_RS00600 -L2BUCH2_RS02490 SW2_RS02515 -L2BUCH2_RS02490 ECS102511_RS02510 -L2BUCH2_RS02490 L1440_RS02490 -L2BUCH2_RS02490 119585 -L2BUCH2_RS02490 CBP42_RS03940 -L2BUCH2_RS02660 L2BUCH2_RS02660 -L2BUCH2_RS02660 SOTONIA3_RS02695 -L2BUCH2_RS02660 BKB92_RS02710 -L2BUCH2_RS02660 CTB_RS02715 -L2BUCH2_RS02660 E150_RS02685 -L2BUCH2_RS02660 AQ193_RS01305 -L2BUCH2_RS02660 BW688_RS04105 -L2BUCH2_RS02660 CTO_RS02715 -L2BUCH2_RS02660 FCS84708_RS02675 -L2BUCH2_RS02660 L2BLST_RS02660 -L2BUCH2_RS02660 BBV13_RS02720 -L2BUCH2_RS02660 CBP44_RS04110 -L2BUCH2_RS02660 AQ199_RS03375 -L2BUCH2_RS02660 BKB93_RS02715 -L2BUCH2_RS02660 BBV16_RS02730 -L2BUCH2_RS02660 G9768_RS02680 -L2BUCH2_RS02660 L3404_RS02655 -L2BUCH2_RS02660 BKC02_RS02705 -L2BUCH2_RS02660 gnl|Prokka|PADJNBJD_00528 -L2BUCH2_RS02660 NILJEPDF_00528 -L2BUCH2_RS02660 BKC01_RS02705 -L2BUCH2_RS02660 LJHENM_02660 -L2BUCH2_RS02660 CTRC943_RS02660 -L2BUCH2_RS02660 AKW53_RS04535 -L2BUCH2_RS02660 AOT15_RS01480 -L2BUCH2_RS02660 QSDFRQ_00528 -L2BUCH2_RS02660 JIEJKO_02665 -L2BUCH2_RS02660 SOTONK1_RS02680 -L2BUCH2_RS02660 CTJTET1_RS02690 -L2BUCH2_RS02660 BKC03_RS02705 -L2BUCH2_RS02660 KW39_RS02690 -L2BUCH2_RS02660 C15_RS0102750 -L2BUCH2_RS02660 ECS88FINAL_RS0102745 -L2BUCH2_RS02660 IaCS19096_RS02675 -L2BUCH2_RS02660 DU10_RS02725 -L2BUCH2_RS02660 O169_RS02690 -L2BUCH2_RS02660 AP288_RS00400 -L2BUCH2_RS02660 A5291_RS02715 -L2BUCH2_RS02660 DU13_RS02720 -L2BUCH2_RS02660 CBP48_RS04105 -L2BUCH2_RS02660 7618606 -L2BUCH2_RS02660 CTL2C_RS04030 -L2BUCH2_RS02660 KW36_RS02675 -L2BUCH2_RS02660 BKB95_RS02720 -L2BUCH2_RS02660 BKB96_RS02710 -L2BUCH2_RS02660 BKB99_RS02705 -L2BUCH2_RS02660 SW2_RS02685 -L2BUCH2_RS02660 L1224_RS02660 -L2BUCH2_RS02660 ECS102511_RS02680 -L2BUCH2_RS02660 AQ244_RS00430 -L2BUCH2_RS02660 L1440_RS02660 -L2BUCH2_RS02660 119601 -L2BUCH2_RS02660 CBP42_RS04115 -L2BUCH2_RS02825 L2BUCH2_RS02825 -L2BUCH2_RS02825 SOTONIA3_RS02860 -L2BUCH2_RS02825 BKB92_RS02875 -L2BUCH2_RS02825 CTB_RS02880 -L2BUCH2_RS02825 E150_RS02850 -L2BUCH2_RS02825 AQ193_RS01140 -L2BUCH2_RS02825 BW688_RS04270 -L2BUCH2_RS02825 CTO_RS02880 -L2BUCH2_RS02825 FCS84708_RS02840 -L2BUCH2_RS02825 L2BLST_RS02825 -L2BUCH2_RS02825 BBV13_RS02885 -L2BUCH2_RS02825 CBP44_RS04275 -L2BUCH2_RS02825 AQ199_RS03540 -L2BUCH2_RS02825 BKB93_RS02880 -L2BUCH2_RS02825 BBV16_RS02895 -L2BUCH2_RS02825 G9768_RS02845 -L2BUCH2_RS02825 L3404_RS02820 -L2BUCH2_RS02825 BKC02_RS02870 -L2BUCH2_RS02825 gnl|Prokka|PADJNBJD_00561 -L2BUCH2_RS02825 NILJEPDF_00561 -L2BUCH2_RS02825 BKC01_RS02870 -L2BUCH2_RS02825 LJHENM_02825 -L2BUCH2_RS02825 CTRC943_RS02825 -L2BUCH2_RS02825 AOT15_RS01645 -L2BUCH2_RS02825 QSDFRQ_00561 -L2BUCH2_RS02825 JIEJKO_02830 -L2BUCH2_RS02825 SOTONK1_RS02845 -L2BUCH2_RS02825 CTJTET1_RS02855 -L2BUCH2_RS02825 BKC03_RS02870 -L2BUCH2_RS02825 KW39_RS02855 -L2BUCH2_RS02825 C15_RS0102915 -L2BUCH2_RS02825 ECS88FINAL_RS0102910 -L2BUCH2_RS02825 IaCS19096_RS02840 -L2BUCH2_RS02825 DU10_RS02890 -L2BUCH2_RS02825 O169_RS02855 -L2BUCH2_RS02825 AP288_RS00235 -L2BUCH2_RS02825 A5291_RS02880 -L2BUCH2_RS02825 DU13_RS02885 -L2BUCH2_RS02825 CBP48_RS04270 -L2BUCH2_RS02825 CTL2C_RS04195 -L2BUCH2_RS02825 KW36_RS02840 -L2BUCH2_RS02825 AKW53_RS04070 -L2BUCH2_RS02825 BKB95_RS02885 -L2BUCH2_RS02825 BKB96_RS02875 -L2BUCH2_RS02825 BKB99_RS02870 -L2BUCH2_RS02825 7619072 -L2BUCH2_RS02825 SW2_RS02850 -L2BUCH2_RS02825 L1224_RS02825 -L2BUCH2_RS02825 ECS102511_RS02845 -L2BUCH2_RS02825 AQ244_RS00265 -L2BUCH2_RS02825 L1440_RS02825 -L2BUCH2_RS02825 CBP42_RS04280 -L2BUCH2_RS02825 120181 -L2BUCH2_RS02990 L2BUCH2_RS02990 -L2BUCH2_RS02990 AQ193_RS00970 -L2BUCH2_RS02990 CTB_RS03050 -L2BUCH2_RS02990 SOTONIA3_RS03035 -L2BUCH2_RS02990 BKB92_RS03050 -L2BUCH2_RS02990 BW688_RS04445 -L2BUCH2_RS02990 119630 -L2BUCH2_RS02990 E150_RS03020 -L2BUCH2_RS02990 CTO_RS03050 -L2BUCH2_RS02990 L2BLST_RS02990 -L2BUCH2_RS02990 CBP44_RS04450 -L2BUCH2_RS02990 FCS84708_RS03015 -L2BUCH2_RS02990 BBV13_RS03055 -L2BUCH2_RS02990 AQ199_RS03715 -L2BUCH2_RS02990 BBV16_RS03065 -L2BUCH2_RS02990 BKB93_RS03055 -L2BUCH2_RS02990 G9768_RS03020 -L2BUCH2_RS02990 L3404_RS02985 -L2BUCH2_RS02990 gnl|Prokka|PADJNBJD_00594 -L2BUCH2_RS02990 NILJEPDF_00594 -L2BUCH2_RS02990 LJHENM_02985 -L2BUCH2_RS02990 BKC02_RS03050 -L2BUCH2_RS02990 AOT15_RS03820 -L2BUCH2_RS02990 CTRC943_RS02990 -L2BUCH2_RS02990 BKC01_RS03050 -L2BUCH2_RS02990 QSDFRQ_00594 -L2BUCH2_RS02990 JIEJKO_02995 -L2BUCH2_RS02990 AP288_RS00065 -L2BUCH2_RS02990 SOTONK1_RS03020 -L2BUCH2_RS02990 CTJTET1_RS03030 -L2BUCH2_RS02990 BKC03_RS03050 -L2BUCH2_RS02990 KW39_RS03030 -L2BUCH2_RS02990 C15_RS0103085 -L2BUCH2_RS02990 ECS88FINAL_RS0103080 -L2BUCH2_RS02990 IaCS19096_RS03015 -L2BUCH2_RS02990 DU10_RS03065 -L2BUCH2_RS02990 A5291_RS03050 -L2BUCH2_RS02990 O169_RS03025 -L2BUCH2_RS02990 AQ244_RS00090 -L2BUCH2_RS02990 CTL2C_RS04360 -L2BUCH2_RS02990 DU13_RS03060 -L2BUCH2_RS02990 CBP48_RS04450 -L2BUCH2_RS02990 L1224_RS02990 -L2BUCH2_RS02990 KW36_RS03015 -L2BUCH2_RS02990 BKB95_RS03060 -L2BUCH2_RS02990 AKW53_RS04245 -L2BUCH2_RS02990 BKB96_RS03055 -L2BUCH2_RS02990 BKB99_RS03050 -L2BUCH2_RS02990 7618625 -L2BUCH2_RS02990 SW2_RS03020 -L2BUCH2_RS02990 L1440_RS02990 -L2BUCH2_RS02990 ECS102511_RS03015 -L2BUCH2_RS02990 CBP42_RS04455 -L2BUCH2_RS03495 L2BUCH2_RS03495 -L2BUCH2_RS03495 BKB92_RS03545 -L2BUCH2_RS03495 CTB_RS03555 -L2BUCH2_RS03495 SOTONIA3_RS03535 -L2BUCH2_RS03495 E150_RS03520 -L2BUCH2_RS03495 AQ193_RS00475 -L2BUCH2_RS03495 CTO_RS03550 -L2BUCH2_RS03495 BBV13_RS03555 -L2BUCH2_RS03495 FCS84708_RS03510 -L2BUCH2_RS03495 L2BLST_RS03495 -L2BUCH2_RS03495 BBV16_RS03565 -L2BUCH2_RS03495 BW688_RS00115 -L2BUCH2_RS03495 7618667 -L2BUCH2_RS03495 AQ199_RS04210 -L2BUCH2_RS03495 BKB93_RS03550 -L2BUCH2_RS03495 120080 -L2BUCH2_RS03495 G9768_RS03515 -L2BUCH2_RS03495 gnl|Prokka|PADJNBJD_00691 -L2BUCH2_RS03495 L3404_RS03490 -L2BUCH2_RS03495 BKC02_RS03545 -L2BUCH2_RS03495 NILJEPDF_00692 -L2BUCH2_RS03495 LJHENM_03475 -L2BUCH2_RS03495 AOT15_RS04315 -L2BUCH2_RS03495 AP288_RS01880 -L2BUCH2_RS03495 JIEJKO_03480 -L2BUCH2_RS03495 BKC01_RS03545 -L2BUCH2_RS03495 QSDFRQ_00692 -L2BUCH2_RS03495 CTRC943_RS03500 -L2BUCH2_RS03495 BKC03_RS03545 -L2BUCH2_RS03495 CBP48_RS00115 -L2BUCH2_RS03495 CTJTET1_RS03535 -L2BUCH2_RS03495 KW39_RS03530 -L2BUCH2_RS03495 DU10_RS03560 -L2BUCH2_RS03495 SOTONK1_RS03515 -L2BUCH2_RS03495 ECS88FINAL_RS0103600 -L2BUCH2_RS03495 IaCS19096_RS03510 -L2BUCH2_RS03495 C15_RS0103590 -L2BUCH2_RS03495 A5291_RS03560 -L2BUCH2_RS03495 O169_RS03525 -L2BUCH2_RS03495 DU13_RS03560 -L2BUCH2_RS03495 KW36_RS03515 -L2BUCH2_RS03495 AKW53_RS00260 -L2BUCH2_RS03495 BKB95_RS03565 -L2BUCH2_RS03495 CBP42_RS00115 -L2BUCH2_RS03495 SW2_RS03520 -L2BUCH2_RS03495 CTL2C_RS00115 -L2BUCH2_RS03495 L1224_RS03495 -L2BUCH2_RS03495 ECS102511_RS03510 -L2BUCH2_RS03495 L1440_RS03495 -L2BUCH2_RS03495 BKB96_RS03555 -L2BUCH2_RS03495 BKB99_RS03550 -L2BUCH2_RS03495 AQ244_RS04395 -L2BUCH2_RS03495 CBP44_RS00115 -L2BUCH2_RS03675 L2BUCH2_RS03675 -L2BUCH2_RS03675 BKB92_RS03730 -L2BUCH2_RS03675 CTB_RS03735 -L2BUCH2_RS03675 SOTONIA3_RS03715 -L2BUCH2_RS03675 E150_RS03700 -L2BUCH2_RS03675 CTO_RS03730 -L2BUCH2_RS03675 AQ193_RS00295 -L2BUCH2_RS03675 BBV13_RS03735 -L2BUCH2_RS03675 FCS84708_RS03690 -L2BUCH2_RS03675 BBV16_RS03745 -L2BUCH2_RS03675 L2BLST_RS03675 -L2BUCH2_RS03675 119738 -L2BUCH2_RS03675 BW688_RS00300 -L2BUCH2_RS03675 7618240 -L2BUCH2_RS03675 AQ199_RS04390 -L2BUCH2_RS03675 BKB93_RS03735 -L2BUCH2_RS03675 G9768_RS03695 -L2BUCH2_RS03675 gnl|Prokka|PADJNBJD_00727 -L2BUCH2_RS03675 L3404_RS03670 -L2BUCH2_RS03675 BKC02_RS03730 -L2BUCH2_RS03675 NILJEPDF_00728 -L2BUCH2_RS03675 LJHENM_03665 -L2BUCH2_RS03675 AOT15_RS04495 -L2BUCH2_RS03675 AP288_RS02065 -L2BUCH2_RS03675 JIEJKO_03665 -L2BUCH2_RS03675 BKC01_RS03735 -L2BUCH2_RS03675 QSDFRQ_00728 -L2BUCH2_RS03675 CTRC943_RS03680 -L2BUCH2_RS03675 AKW53_RS00435 -L2BUCH2_RS03675 BKC03_RS03730 -L2BUCH2_RS03675 CTJTET1_RS03715 -L2BUCH2_RS03675 KW39_RS03710 -L2BUCH2_RS03675 DU10_RS03745 -L2BUCH2_RS03675 CBP48_RS00300 -L2BUCH2_RS03675 A5291_RS03740 -L2BUCH2_RS03675 SOTONK1_RS03695 -L2BUCH2_RS03675 IaCS19096_RS03690 -L2BUCH2_RS03675 DU13_RS03745 -L2BUCH2_RS03675 C15_RS0103800 -L2BUCH2_RS03675 ECS88FINAL_RS0103800 -L2BUCH2_RS03675 O169_RS03705 -L2BUCH2_RS03675 KW36_RS03695 -L2BUCH2_RS03675 BKB95_RS03750 -L2BUCH2_RS03675 CBP42_RS00300 -L2BUCH2_RS03675 SW2_RS03700 -L2BUCH2_RS03675 CTL2C_RS00295 -L2BUCH2_RS03675 L1224_RS03675 -L2BUCH2_RS03675 ECS102511_RS03690 -L2BUCH2_RS03675 BKB96_RS03735 -L2BUCH2_RS03675 BKB99_RS03730 -L2BUCH2_RS03675 L1440_RS03675 -L2BUCH2_RS03675 AQ244_RS04215 -L2BUCH2_RS03675 CBP44_RS00300 -L2BUCH2_RS03845 L2BUCH2_RS03845 -L2BUCH2_RS03845 BKB92_RS03900 -L2BUCH2_RS03845 CTB_RS03905 -L2BUCH2_RS03845 SOTONIA3_RS03885 -L2BUCH2_RS03845 AQ193_RS00125 -L2BUCH2_RS03845 E150_RS03870 -L2BUCH2_RS03845 CTO_RS03900 -L2BUCH2_RS03845 BBV13_RS03905 -L2BUCH2_RS03845 FCS84708_RS03860 -L2BUCH2_RS03845 7618695 -L2BUCH2_RS03845 L2BLST_RS03845 -L2BUCH2_RS03845 BBV16_RS03915 -L2BUCH2_RS03845 120036 -L2BUCH2_RS03845 BW688_RS00470 -L2BUCH2_RS03845 AQ199_RS04560 -L2BUCH2_RS03845 BKB93_RS03905 -L2BUCH2_RS03845 G9768_RS03865 -L2BUCH2_RS03845 gnl|Prokka|PADJNBJD_00760 -L2BUCH2_RS03845 L3404_RS03840 -L2BUCH2_RS03845 NILJEPDF_00761 -L2BUCH2_RS03845 BKC02_RS03900 -L2BUCH2_RS03845 LJHENM_03830 -L2BUCH2_RS03845 AOT15_RS04665 -L2BUCH2_RS03845 AP288_RS02235 -L2BUCH2_RS03845 JIEJKO_03830 -L2BUCH2_RS03845 QSDFRQ_00761 -L2BUCH2_RS03845 BKC01_RS03905 -L2BUCH2_RS03845 CTRC943_RS03850 -L2BUCH2_RS03845 AKW53_RS00605 -L2BUCH2_RS03845 BKC03_RS03900 -L2BUCH2_RS03845 CBP48_RS00470 -L2BUCH2_RS03845 CTJTET1_RS03885 -L2BUCH2_RS03845 KW39_RS03880 -L2BUCH2_RS03845 DU10_RS03915 -L2BUCH2_RS03845 A5291_RS03910 -L2BUCH2_RS03845 SOTONK1_RS03865 -L2BUCH2_RS03845 IaCS19096_RS03860 -L2BUCH2_RS03845 DU13_RS03915 -L2BUCH2_RS03845 C15_RS0103970 -L2BUCH2_RS03845 ECS88FINAL_RS0103970 -L2BUCH2_RS03845 O169_RS03875 -L2BUCH2_RS03845 KW36_RS03865 -L2BUCH2_RS03845 BKB95_RS03920 -L2BUCH2_RS03845 CBP42_RS00470 -L2BUCH2_RS03845 CTL2C_RS00465 -L2BUCH2_RS03845 L1224_RS03845 -L2BUCH2_RS03845 SW2_RS03870 -L2BUCH2_RS03845 L1440_RS03840 -L2BUCH2_RS03845 ECS102511_RS03860 -L2BUCH2_RS03845 BKB96_RS03905 -L2BUCH2_RS03845 BKB99_RS03900 -L2BUCH2_RS03845 AQ244_RS04045 -L2BUCH2_RS03845 CBP44_RS00470 -L2BUCH2_RS04025 L2BUCH2_RS04025 -L2BUCH2_RS04025 CTB_RS04085 -L2BUCH2_RS04025 BKB92_RS04080 -L2BUCH2_RS04025 SOTONIA3_RS04065 -L2BUCH2_RS04025 E150_RS04050 -L2BUCH2_RS04025 CTO_RS04080 -L2BUCH2_RS04025 BBV13_RS04085 -L2BUCH2_RS04025 FCS84708_RS04040 -L2BUCH2_RS04025 120002 -L2BUCH2_RS04025 L2BLST_RS04025 -L2BUCH2_RS04025 AP288_RS04750 -L2BUCH2_RS04025 BBV16_RS04095 -L2BUCH2_RS04025 7618717 -L2BUCH2_RS04025 BW688_RS00650 -L2BUCH2_RS04025 gnl|Prokka|PADJNBJD_00795 -L2BUCH2_RS04025 AQ199_RS04740 -L2BUCH2_RS04025 BKB93_RS04085 -L2BUCH2_RS04025 G9768_RS04045 -L2BUCH2_RS04025 L3404_RS04020 -L2BUCH2_RS04025 AQ193_RS04735 -L2BUCH2_RS04025 NILJEPDF_00796 -L2BUCH2_RS04025 LJHENM_04005 -L2BUCH2_RS04025 BKC02_RS04080 -L2BUCH2_RS04025 JIEJKO_04005 -L2BUCH2_RS04025 QSDFRQ_00796 -L2BUCH2_RS04025 BKC01_RS04085 -L2BUCH2_RS04025 CTRC943_RS04030 -L2BUCH2_RS04025 CTJTET1_RS04220 -L2BUCH2_RS04025 AKW53_RS00780 -L2BUCH2_RS04025 KW39_RS04060 -L2BUCH2_RS04025 BKC03_RS04080 -L2BUCH2_RS04025 CBP48_RS00650 -L2BUCH2_RS04025 CTJTET1_RS04065 -L2BUCH2_RS04025 DU10_RS04095 -L2BUCH2_RS04025 A5291_RS04090 -L2BUCH2_RS04025 SOTONK1_RS04045 -L2BUCH2_RS04025 ECS88FINAL_RS0104145 -L2BUCH2_RS04025 IaCS19096_RS04040 -L2BUCH2_RS04025 DU13_RS04095 -L2BUCH2_RS04025 C15_RS0104150 -L2BUCH2_RS04025 O169_RS04055 -L2BUCH2_RS04025 KW36_RS04045 -L2BUCH2_RS04025 AOT15_RS02350 -L2BUCH2_RS04025 BKB95_RS04100 -L2BUCH2_RS04025 CBP42_RS00650 -L2BUCH2_RS04025 CTL2C_RS00645 -L2BUCH2_RS04025 L1224_RS04025 -L2BUCH2_RS04025 AQ244_RS03840 -L2BUCH2_RS04025 BKB96_RS04085 -L2BUCH2_RS04025 SW2_RS04050 -L2BUCH2_RS04025 L1440_RS04020 -L2BUCH2_RS04025 ECS102511_RS04040 -L2BUCH2_RS04025 BKB99_RS04080 -L2BUCH2_RS04025 CBP44_RS00650 -L2BUCH2_RS04890 L2BUCH2_RS04890 -L2BUCH2_RS04890 CTB_RS04895 -L2BUCH2_RS04890 SOTONIA3_RS04925 -L2BUCH2_RS04890 CTO_RS04935 -L2BUCH2_RS04890 L2BLST_RS04895 -L2BUCH2_RS04890 BBV13_RS04905 -L2BUCH2_RS04890 AQ244_RS05190 -L2BUCH2_RS04890 BBV16_RS04910 -L2BUCH2_RS04890 BW688_RS01010 -L2BUCH2_RS04890 L3404_RS04895 -L2BUCH2_RS04890 G9768_RS04855 -L2BUCH2_RS04890 BKC02_RS04440 -L2BUCH2_RS04890 CTRC943_RS04840 -L2BUCH2_RS04890 BKC01_RS04445 -L2BUCH2_RS04890 AOT15_RS04870 -L2BUCH2_RS04890 CTJTET1_RS05050 -L2BUCH2_RS04890 CBP48_RS01010 -L2BUCH2_RS04890 BKC03_RS04440 -L2BUCH2_RS04890 A5291_RS04960 -L2BUCH2_RS04890 SOTONK1_RS04905 -L2BUCH2_RS04890 IaCS19096_RS04875 -L2BUCH2_RS04890 C15_RS1000000105070 -L2BUCH2_RS04890 KW36_RS04850 -L2BUCH2_RS04890 CBP42_RS01010 -L2BUCH2_RS04890 CTL2C_RS04780 -L2BUCH2_RS04890 L1224_RS04895 -L2BUCH2_RS04890 BKB95_RS04460 -L2BUCH2_RS04890 L1440_RS04845 -L2BUCH2_RS04890 BKB96_RS04445 -L2BUCH2_RS04890 BKB99_RS04440 -L2BUCH2_RS04890 CBP44_RS01010 -L2BLST_RS00430 L2BLST_RS00430 -L2BLST_RS00430 BW688_RS01830 -L2BLST_RS00430 G9768_RS00430 -L2BLST_RS00430 BKC02_RS00440 -L2BLST_RS00430 gnl|Prokka|PADJNBJD_00084 -L2BLST_RS00430 LJHENM_00420 -L2BLST_RS00430 BBV16_RS00435 -L2BLST_RS00430 NILJEPDF_00084 -L2BLST_RS00430 A5291_RS00430 -L2BLST_RS00430 JIEJKO_00425 -L2BLST_RS00430 BKC01_RS00440 -L2BLST_RS00430 SOTONK1_RS00430 -L2BLST_RS00430 L3404_RS00430 -L2BLST_RS00430 AKW53_RS01920 -L2BLST_RS00430 QSDFRQ_00084 -L2BLST_RS00430 IaCS19096_RS00430 -L2BLST_RS00430 BKC03_RS00440 -L2BLST_RS00430 DU10_RS00440 -L2BLST_RS00430 C15_RS0100435 -L2BLST_RS00430 7618399 -L2BLST_RS00430 CTRC943_RS00430 -L2BLST_RS00430 CTJTET1_RS00430 -L2BLST_RS00430 O169_RS00430 -L2BLST_RS00430 DU13_RS00445 -L2BLST_RS00430 ECS88FINAL_RS0100440 -L2BLST_RS00430 KW36_RS00430 -L2BLST_RS00430 CBP48_RS01830 -L2BLST_RS00430 KW39_RS00430 -L2BLST_RS00430 AQ244_RS01560 -L2BLST_RS00430 AQ193_RS03565 -L2BLST_RS00430 SW2_RS00430 -L2BLST_RS00430 BKB95_RS00440 -L2BLST_RS00430 ECS102511_RS00430 -L2BLST_RS00430 CTB_RS00430 -L2BLST_RS00430 CTL2C_RS01795 -L2BLST_RS00430 CBP42_RS01830 -L2BLST_RS00430 BKB96_RS00440 -L2BLST_RS00430 L1224_RS00430 -L2BLST_RS00430 BKB99_RS00440 -L2BLST_RS00430 BKB92_RS00440 -L2BLST_RS00430 CTO_RS00430 -L2BLST_RS00430 L1440_RS00430 -L2BLST_RS00430 SOTONIA3_RS00430 -L2BLST_RS00430 E150_RS00430 -L2BLST_RS00430 CBP44_RS01835 -L2BLST_RS00430 119273 -L2BLST_RS00430 L2BUCH2_RS00430 -L2BLST_RS00430 BKB93_RS00440 -L2BLST_RS00430 FCS84708_RS00430 -L2BLST_RS00430 AOT15_RS00525 -L2BLST_RS00430 AP288_RS03500 -L2BLST_RS00430 AQ199_RS01125 -L2BLST_RS00430 BBV13_RS00435 -L2BLST_RS00600 L2BLST_RS00600 -L2BLST_RS00600 BBV13_RS00610 -L2BLST_RS00600 BW688_RS02000 -L2BLST_RS00600 G9768_RS00600 -L2BLST_RS00600 BKC02_RS00610 -L2BLST_RS00600 BBV16_RS00610 -L2BLST_RS00600 gnl|Prokka|PADJNBJD_00118 -L2BLST_RS00600 LJHENM_00590 -L2BLST_RS00600 AKW53_RS02095 -L2BLST_RS00600 BKC01_RS00610 -L2BLST_RS00600 NILJEPDF_00118 -L2BLST_RS00600 L3404_RS00600 -L2BLST_RS00600 A5291_RS00605 -L2BLST_RS00600 SOTONK1_RS00600 -L2BLST_RS00600 JIEJKO_00595 -L2BLST_RS00600 QSDFRQ_00118 -L2BLST_RS00600 IaCS19096_RS00600 -L2BLST_RS00600 BKC03_RS00610 -L2BLST_RS00600 C15_RS0100620 -L2BLST_RS00600 CTRC943_RS00600 -L2BLST_RS00600 CTJTET1_RS00600 -L2BLST_RS00600 KW39_RS00600 -L2BLST_RS00600 DU10_RS00610 -L2BLST_RS00600 ECS88FINAL_RS0100620 -L2BLST_RS00600 O169_RS00600 -L2BLST_RS00600 DU13_RS00615 -L2BLST_RS00600 7618412 -L2BLST_RS00600 KW36_RS00600 -L2BLST_RS00600 AQ193_RS03395 -L2BLST_RS00600 CBP48_RS02000 -L2BLST_RS00600 SW2_RS00600 -L2BLST_RS00600 BKB95_RS00610 -L2BLST_RS00600 ECS102511_RS00600 -L2BLST_RS00600 CTL2C_RS01965 -L2BLST_RS00600 CTB_RS00605 -L2BLST_RS00600 L1224_RS00600 -L2BLST_RS00600 AQ244_RS02775 -L2BLST_RS00600 BKB96_RS00610 -L2BLST_RS00600 CBP42_RS02000 -L2BLST_RS00600 BKB99_RS00610 -L2BLST_RS00600 L1440_RS00600 -L2BLST_RS00600 BKB92_RS00610 -L2BLST_RS00600 SOTONIA3_RS00600 -L2BLST_RS00600 CTO_RS00605 -L2BLST_RS00600 E150_RS00600 -L2BLST_RS00600 L2BUCH2_RS00600 -L2BLST_RS00600 AOT15_RS00355 -L2BLST_RS00600 CBP44_RS02005 -L2BLST_RS00600 FCS84708_RS00600 -L2BLST_RS00600 AP288_RS03670 -L2BLST_RS00600 BKB93_RS00610 -L2BLST_RS00600 119293 -L2BLST_RS00600 AQ199_RS01295 -L2BLST_RS00955 L2BLST_RS00955 -L2BLST_RS00955 AOT15_RS01395 -L2BLST_RS00955 BW688_RS02365 -L2BLST_RS00955 BBV13_RS01000 -L2BLST_RS00955 G9768_RS00975 -L2BLST_RS00955 BKC02_RS00970 -L2BLST_RS00955 L3404_RS00950 -L2BLST_RS00955 AKW53_RS02460 -L2BLST_RS00955 119360 -L2BLST_RS00955 BBV16_RS01000 -L2BLST_RS00955 BKC01_RS00970 -L2BLST_RS00955 DU10_RS00980 -L2BLST_RS00955 gnl|Prokka|PADJNBJD_00190 -L2BLST_RS00955 BKC03_RS00970 -L2BLST_RS00955 NILJEPDF_00190 -L2BLST_RS00955 LJHENM_00955 -L2BLST_RS00955 CTRC943_RS00955 -L2BLST_RS00955 CTJTET1_RS00985 -L2BLST_RS00955 C15_RS0101005 -L2BLST_RS00955 SOTONK1_RS00970 -L2BLST_RS00955 ECS88FINAL_RS0100990 -L2BLST_RS00955 KW39_RS00975 -L2BLST_RS00955 JIEJKO_00955 -L2BLST_RS00955 7618452 -L2BLST_RS00955 A5291_RS00995 -L2BLST_RS00955 IaCS19096_RS00970 -L2BLST_RS00955 QSDFRQ_00190 -L2BLST_RS00955 O169_RS00975 -L2BLST_RS00955 AQ193_RS03025 -L2BLST_RS00955 DU13_RS00980 -L2BLST_RS00955 SW2_RS00965 -L2BLST_RS00955 BKB95_RS00985 -L2BLST_RS00955 CBP48_RS02360 -L2BLST_RS00955 KW36_RS00970 -L2BLST_RS00955 ECS102511_RS00965 -L2BLST_RS00955 BKB96_RS00970 -L2BLST_RS00955 CTL2C_RS02320 -L2BLST_RS00955 BKB99_RS00970 -L2BLST_RS00955 L1224_RS00950 -L2BLST_RS00955 L1440_RS00950 -L2BLST_RS00955 AQ244_RS03150 -L2BLST_RS00955 BKB92_RS00970 -L2BLST_RS00955 CBP42_RS02360 -L2BLST_RS00955 SOTONIA3_RS00985 -L2BLST_RS00955 E150_RS00965 -L2BLST_RS00955 CTB_RS00995 -L2BLST_RS00955 L2BUCH2_RS00955 -L2BLST_RS00955 CTO_RS00995 -L2BLST_RS00955 FCS84708_RS00965 -L2BLST_RS00955 AP288_RS04035 -L2BLST_RS00955 BKB93_RS00970 -L2BLST_RS00955 CBP44_RS02365 -L2BLST_RS00955 AQ199_RS01660 -L2BLST_RS01125 L2BLST_RS01125 -L2BLST_RS01125 AOT15_RS01225 -L2BLST_RS01125 BW688_RS02535 -L2BLST_RS01125 BBV13_RS01170 -L2BLST_RS01125 G9768_RS01145 -L2BLST_RS01125 BKC02_RS01140 -L2BLST_RS01125 L3404_RS01120 -L2BLST_RS01125 AKW53_RS02630 -L2BLST_RS01125 BBV16_RS01170 -L2BLST_RS01125 BKC01_RS01140 -L2BLST_RS01125 119386 -L2BLST_RS01125 DU10_RS01150 -L2BLST_RS01125 gnl|Prokka|PADJNBJD_00224 -L2BLST_RS01125 BKC03_RS01140 -L2BLST_RS01125 NILJEPDF_00224 -L2BLST_RS01125 LJHENM_01125 -L2BLST_RS01125 CTRC943_RS01125 -L2BLST_RS01125 CTJTET1_RS01155 -L2BLST_RS01125 C15_RS0101175 -L2BLST_RS01125 SOTONK1_RS01140 -L2BLST_RS01125 ECS88FINAL_RS0101160 -L2BLST_RS01125 KW39_RS01145 -L2BLST_RS01125 JIEJKO_01125 -L2BLST_RS01125 A5291_RS01165 -L2BLST_RS01125 IaCS19096_RS01140 -L2BLST_RS01125 7618469 -L2BLST_RS01125 QSDFRQ_00224 -L2BLST_RS01125 O169_RS01145 -L2BLST_RS01125 AQ193_RS02855 -L2BLST_RS01125 DU13_RS01150 -L2BLST_RS01125 SW2_RS01135 -L2BLST_RS01125 BKB95_RS01155 -L2BLST_RS01125 CBP48_RS02530 -L2BLST_RS01125 KW36_RS01140 -L2BLST_RS01125 ECS102511_RS01135 -L2BLST_RS01125 BKB96_RS01140 -L2BLST_RS01125 CTL2C_RS02490 -L2BLST_RS01125 BKB99_RS01140 -L2BLST_RS01125 L1224_RS01120 -L2BLST_RS01125 L1440_RS01120 -L2BLST_RS01125 AQ244_RS03320 -L2BLST_RS01125 BKB92_RS01140 -L2BLST_RS01125 CBP42_RS02530 -L2BLST_RS01125 SOTONIA3_RS01155 -L2BLST_RS01125 E150_RS01135 -L2BLST_RS01125 CTB_RS01165 -L2BLST_RS01125 L2BUCH2_RS01125 -L2BLST_RS01125 CTO_RS01165 -L2BLST_RS01125 FCS84708_RS01135 -L2BLST_RS01125 AP288_RS04205 -L2BLST_RS01125 BKB93_RS01140 -L2BLST_RS01125 CBP44_RS02535 -L2BLST_RS01125 AQ199_RS01830 -L2BLST_RS01295 L2BLST_RS01295 -L2BLST_RS01295 AOT15_RS01055 -L2BLST_RS01295 BBV13_RS01340 -L2BLST_RS01295 BW688_RS02705 -L2BLST_RS01295 G9768_RS01315 -L2BLST_RS01295 BKC02_RS01310 -L2BLST_RS01295 BBV16_RS01340 -L2BLST_RS01295 L3404_RS01290 -L2BLST_RS01295 AKW53_RS02800 -L2BLST_RS01295 BKC01_RS01310 -L2BLST_RS01295 gnl|Prokka|PADJNBJD_00257 -L2BLST_RS01295 DU10_RS01320 -L2BLST_RS01295 NILJEPDF_00257 -L2BLST_RS01295 LJHENM_01290 -L2BLST_RS01295 BKC03_RS01310 -L2BLST_RS01295 CTRC943_RS01295 -L2BLST_RS01295 CTJTET1_RS01325 -L2BLST_RS01295 KW39_RS01315 -L2BLST_RS01295 JIEJKO_01290 -L2BLST_RS01295 120471 -L2BLST_RS01295 C15_RS0101345 -L2BLST_RS01295 SOTONK1_RS01310 -L2BLST_RS01295 ECS88FINAL_RS0101330 -L2BLST_RS01295 QSDFRQ_00257 -L2BLST_RS01295 A5291_RS01335 -L2BLST_RS01295 O169_RS01315 -L2BLST_RS01295 IaCS19096_RS01310 -L2BLST_RS01295 AQ193_RS02685 -L2BLST_RS01295 DU13_RS01320 -L2BLST_RS01295 7618897 -L2BLST_RS01295 SW2_RS01305 -L2BLST_RS01295 BKB95_RS01325 -L2BLST_RS01295 CBP48_RS02700 -L2BLST_RS01295 KW36_RS01310 -L2BLST_RS01295 ECS102511_RS01305 -L2BLST_RS01295 BKB96_RS01310 -L2BLST_RS01295 CTL2C_RS02660 -L2BLST_RS01295 BKB99_RS01310 -L2BLST_RS01295 L1224_RS01290 -L2BLST_RS01295 L1440_RS01290 -L2BLST_RS01295 AQ244_RS03490 -L2BLST_RS01295 BKB92_RS01310 -L2BLST_RS01295 CBP42_RS02700 -L2BLST_RS01295 SOTONIA3_RS01325 -L2BLST_RS01295 CTB_RS01335 -L2BLST_RS01295 E150_RS01305 -L2BLST_RS01295 L2BUCH2_RS01295 -L2BLST_RS01295 CTO_RS01335 -L2BLST_RS01295 FCS84708_RS01305 -L2BLST_RS01295 AP288_RS04375 -L2BLST_RS01295 BKB93_RS01310 -L2BLST_RS01295 CBP44_RS02705 -L2BLST_RS01295 AQ199_RS02000 -L2BLST_RS01455 L2BLST_RS01455 -L2BLST_RS01455 BBV13_RS01505 -L2BLST_RS01455 BW688_RS02875 -L2BLST_RS01455 G9768_RS01475 -L2BLST_RS01455 BKC02_RS01475 -L2BLST_RS01455 AKW53_RS02965 -L2BLST_RS01455 BBV16_RS01505 -L2BLST_RS01455 L3404_RS01450 -L2BLST_RS01455 BKC01_RS01480 -L2BLST_RS01455 gnl|Prokka|PADJNBJD_00289 -L2BLST_RS01455 DU10_RS01485 -L2BLST_RS01455 NILJEPDF_00289 -L2BLST_RS01455 LJHENM_01455 -L2BLST_RS01455 BKC03_RS01475 -L2BLST_RS01455 CTRC943_RS01455 -L2BLST_RS01455 CTJTET1_RS01485 -L2BLST_RS01455 KW39_RS01475 -L2BLST_RS01455 JIEJKO_01455 -L2BLST_RS01455 C15_RS0101510 -L2BLST_RS01455 SOTONK1_RS01475 -L2BLST_RS01455 ECS88FINAL_RS0101495 -L2BLST_RS01455 119436 -L2BLST_RS01455 QSDFRQ_00289 -L2BLST_RS01455 IaCS19096_RS01470 -L2BLST_RS01455 AQ193_RS02520 -L2BLST_RS01455 A5291_RS01500 -L2BLST_RS01455 O169_RS01480 -L2BLST_RS01455 DU13_RS01485 -L2BLST_RS01455 SW2_RS01465 -L2BLST_RS01455 BKB95_RS01490 -L2BLST_RS01455 CBP48_RS02865 -L2BLST_RS01455 7618501 -L2BLST_RS01455 KW36_RS01470 -L2BLST_RS01455 ECS102511_RS01465 -L2BLST_RS01455 AOT15_RS02470 -L2BLST_RS01455 BKB96_RS01475 -L2BLST_RS01455 CTL2C_RS02820 -L2BLST_RS01455 BKB99_RS01475 -L2BLST_RS01455 L1224_RS01450 -L2BLST_RS01455 L1440_RS01450 -L2BLST_RS01455 AQ244_RS03655 -L2BLST_RS01455 CBP42_RS02865 -L2BLST_RS01455 SOTONIA3_RS01485 -L2BLST_RS01455 BKB92_RS01480 -L2BLST_RS01455 CTB_RS01500 -L2BLST_RS01455 E150_RS01470 -L2BLST_RS01455 L2BUCH2_RS01455 -L2BLST_RS01455 CTO_RS01495 -L2BLST_RS01455 FCS84708_RS01465 -L2BLST_RS01455 AP288_RS04535 -L2BLST_RS01455 BKB93_RS01480 -L2BLST_RS01455 CBP44_RS02870 -L2BLST_RS01455 AQ199_RS02160 -L2BLST_RS01620 L2BLST_RS01620 -L2BLST_RS01620 AQ199_RS02325 -L2BLST_RS01620 BW688_RS03040 -L2BLST_RS01620 BBV13_RS01670 -L2BLST_RS01620 G9768_RS01640 -L2BLST_RS01620 BKC02_RS01640 -L2BLST_RS01620 L3404_RS01615 -L2BLST_RS01620 AKW53_RS03130 -L2BLST_RS01620 BBV16_RS01670 -L2BLST_RS01620 BKC01_RS01645 -L2BLST_RS01620 gnl|Prokka|PADJNBJD_00322 -L2BLST_RS01620 NILJEPDF_00322 -L2BLST_RS01620 LJHENM_01620 -L2BLST_RS01620 CTRC943_RS01620 -L2BLST_RS01620 BKC03_RS01640 -L2BLST_RS01620 DU10_RS01655 -L2BLST_RS01620 CTJTET1_RS01650 -L2BLST_RS01620 KW39_RS01640 -L2BLST_RS01620 AQ193_RS02355 -L2BLST_RS01620 JIEJKO_01620 -L2BLST_RS01620 C15_RS0101680 -L2BLST_RS01620 SOTONK1_RS01640 -L2BLST_RS01620 ECS88FINAL_RS0101660 -L2BLST_RS01620 QSDFRQ_00322 -L2BLST_RS01620 IaCS19096_RS01635 -L2BLST_RS01620 120397 -L2BLST_RS01620 A5291_RS01665 -L2BLST_RS01620 O169_RS01645 -L2BLST_RS01620 DU13_RS01650 -L2BLST_RS01620 CBP48_RS03030 -L2BLST_RS01620 7618938 -L2BLST_RS01620 SW2_RS01630 -L2BLST_RS01620 BKB95_RS01655 -L2BLST_RS01620 CTL2C_RS02985 -L2BLST_RS01620 KW36_RS01635 -L2BLST_RS01620 ECS102511_RS01630 -L2BLST_RS01620 AOT15_RS02635 -L2BLST_RS01620 BKB96_RS01640 -L2BLST_RS01620 L1224_RS01615 -L2BLST_RS01620 BKB99_RS01640 -L2BLST_RS01620 L1440_RS01615 -L2BLST_RS01620 CBP42_RS03030 -L2BLST_RS01620 AQ244_RS03820 -L2BLST_RS01620 SOTONIA3_RS01650 -L2BLST_RS01620 BKB92_RS01645 -L2BLST_RS01620 CTB_RS01665 -L2BLST_RS01620 E150_RS01635 -L2BLST_RS01620 L2BUCH2_RS01620 -L2BLST_RS01620 CTO_RS01660 -L2BLST_RS01620 FCS84708_RS01630 -L2BLST_RS01620 AP288_RS04700 -L2BLST_RS01620 CBP44_RS03035 -L2BLST_RS01620 BKB93_RS01645 -L2BLST_RS01795 L2BLST_RS01795 -L2BLST_RS01795 FCS84708_RS01815 -L2BLST_RS01795 BW688_RS03225 -L2BLST_RS01795 BKB93_RS01835 -L2BLST_RS01795 CBP44_RS03230 -L2BLST_RS01795 BBV13_RS01850 -L2BLST_RS01795 AQ199_RS02515 -L2BLST_RS01795 G9768_RS01820 -L2BLST_RS01795 L3404_RS01795 -L2BLST_RS01795 BBV16_RS01850 -L2BLST_RS01795 BKC02_RS01825 -L2BLST_RS01795 AQ193_RS02165 -L2BLST_RS01795 BKC01_RS01825 -L2BLST_RS01795 AKW53_RS03320 -L2BLST_RS01795 gnl|Prokka|PADJNBJD_00358 -L2BLST_RS01795 NILJEPDF_00358 -L2BLST_RS01795 CTRC943_RS01800 -L2BLST_RS01795 LJHENM_01805 -L2BLST_RS01795 JIEJKO_01800 -L2BLST_RS01795 BKC03_RS01825 -L2BLST_RS01795 CTJTET1_RS01830 -L2BLST_RS01795 DU10_RS01845 -L2BLST_RS01795 QSDFRQ_00358 -L2BLST_RS01795 C15_RS0101860 -L2BLST_RS01795 SOTONK1_RS01820 -L2BLST_RS01795 A5291_RS01845 -L2BLST_RS01795 KW39_RS01830 -L2BLST_RS01795 IaCS19096_RS01815 -L2BLST_RS01795 120363 -L2BLST_RS01795 ECS88FINAL_RS0101850 -L2BLST_RS01795 DU13_RS01840 -L2BLST_RS01795 O169_RS01830 -L2BLST_RS01795 7618959 -L2BLST_RS01795 CTL2C_RS03165 -L2BLST_RS01795 BKB95_RS01840 -L2BLST_RS01795 CBP48_RS03225 -L2BLST_RS01795 L1224_RS01795 -L2BLST_RS01795 KW36_RS01815 -L2BLST_RS01795 AOT15_RS02815 -L2BLST_RS01795 BKB96_RS01825 -L2BLST_RS01795 SW2_RS01820 -L2BLST_RS01795 BKB99_RS01825 -L2BLST_RS01795 L1440_RS01795 -L2BLST_RS01795 ECS102511_RS01820 -L2BLST_RS01795 AP288_RS01260 -L2BLST_RS01795 CBP42_RS03235 -L2BLST_RS01795 CTB_RS01845 -L2BLST_RS01795 SOTONIA3_RS01830 -L2BLST_RS01795 L2BUCH2_RS01795 -L2BLST_RS01795 BKB92_RS01835 -L2BLST_RS01795 CTO_RS01845 -L2BLST_RS01795 AQ244_RS01290 -L2BLST_RS01795 E150_RS01825 -L2BLST_RS02120 L2BLST_RS02120 -L2BLST_RS02120 BBV13_RS02180 -L2BLST_RS02120 BW688_RS03555 -L2BLST_RS02120 FCS84708_RS02140 -L2BLST_RS02120 BKB93_RS02165 -L2BLST_RS02120 CBP44_RS03565 -L2BLST_RS02120 AQ199_RS02840 -L2BLST_RS02120 BBV16_RS02180 -L2BLST_RS02120 G9768_RS02145 -L2BLST_RS02120 L3404_RS02120 -L2BLST_RS02120 BKC02_RS02155 -L2BLST_RS02120 AQ193_RS01840 -L2BLST_RS02120 BKC01_RS02155 -L2BLST_RS02120 AKW53_RS03645 -L2BLST_RS02120 gnl|Prokka|PADJNBJD_00423 -L2BLST_RS02120 NILJEPDF_00423 -L2BLST_RS02120 CTRC943_RS02125 -L2BLST_RS02120 LJHENM_02135 -L2BLST_RS02120 JIEJKO_02130 -L2BLST_RS02120 BKC03_RS02155 -L2BLST_RS02120 CTJTET1_RS02155 -L2BLST_RS02120 QSDFRQ_00423 -L2BLST_RS02120 C15_RS0102190 -L2BLST_RS02120 A5291_RS02170 -L2BLST_RS02120 SOTONK1_RS02145 -L2BLST_RS02120 DU10_RS02180 -L2BLST_RS02120 KW39_RS02155 -L2BLST_RS02120 IaCS19096_RS02140 -L2BLST_RS02120 ECS88FINAL_RS0102185 -L2BLST_RS02120 O169_RS02155 -L2BLST_RS02120 DU13_RS02175 -L2BLST_RS02120 7618991 -L2BLST_RS02120 CTL2C_RS03490 -L2BLST_RS02120 CBP48_RS03560 -L2BLST_RS02120 120311 -L2BLST_RS02120 L1224_RS02120 -L2BLST_RS02120 KW36_RS02140 -L2BLST_RS02120 AOT15_RS03140 -L2BLST_RS02120 BKB95_RS02175 -L2BLST_RS02120 BKB96_RS02155 -L2BLST_RS02120 SW2_RS02145 -L2BLST_RS02120 BKB99_RS02155 -L2BLST_RS02120 L1440_RS02120 -L2BLST_RS02120 ECS102511_RS02145 -L2BLST_RS02120 AP288_RS00935 -L2BLST_RS02120 CTB_RS02170 -L2BLST_RS02120 CBP42_RS03570 -L2BLST_RS02120 SOTONIA3_RS02155 -L2BLST_RS02120 L2BUCH2_RS02120 -L2BLST_RS02120 BKB92_RS02165 -L2BLST_RS02120 CTO_RS02170 -L2BLST_RS02120 E150_RS02150 -L2BLST_RS02285 L2BLST_RS02285 -L2BLST_RS02285 FCS84708_RS02300 -L2BLST_RS02285 AQ244_RS00805 -L2BLST_RS02285 BBV13_RS02340 -L2BLST_RS02285 CBP44_RS03730 -L2BLST_RS02285 BKB93_RS02335 -L2BLST_RS02285 AQ199_RS03000 -L2BLST_RS02285 G9768_RS02305 -L2BLST_RS02285 BBV16_RS02345 -L2BLST_RS02285 L3404_RS02280 -L2BLST_RS02285 BKC02_RS02320 -L2BLST_RS02285 BKC01_RS02320 -L2BLST_RS02285 gnl|Prokka|PADJNBJD_00455 -L2BLST_RS02285 AKW53_RS03805 -L2BLST_RS02285 AQ193_RS01680 -L2BLST_RS02285 NILJEPDF_00455 -L2BLST_RS02285 LJHENM_02295 -L2BLST_RS02285 CTRC943_RS02285 -L2BLST_RS02285 JIEJKO_02295 -L2BLST_RS02285 BKC03_RS02320 -L2BLST_RS02285 QSDFRQ_00455 -L2BLST_RS02285 CTJTET1_RS02315 -L2BLST_RS02285 C15_RS0102350 -L2BLST_RS02285 SOTONK1_RS02305 -L2BLST_RS02285 DU10_RS02345 -L2BLST_RS02285 A5291_RS02335 -L2BLST_RS02285 KW39_RS02315 -L2BLST_RS02285 IaCS19096_RS02300 -L2BLST_RS02285 ECS88FINAL_RS0102350 -L2BLST_RS02285 O169_RS02315 -L2BLST_RS02285 DU13_RS02340 -L2BLST_RS02285 7619001 -L2BLST_RS02285 BKB96_RS02325 -L2BLST_RS02285 BKB99_RS02320 -L2BLST_RS02285 CBP48_RS03725 -L2BLST_RS02285 120295 -L2BLST_RS02285 CTL2C_RS03655 -L2BLST_RS02285 KW36_RS02300 -L2BLST_RS02285 AOT15_RS03300 -L2BLST_RS02285 BKB95_RS02340 -L2BLST_RS02285 L1224_RS02285 -L2BLST_RS02285 SW2_RS02310 -L2BLST_RS02285 ECS102511_RS02305 -L2BLST_RS02285 L1440_RS02285 -L2BLST_RS02285 CBP42_RS03735 -L2BLST_RS02285 CTB_RS02335 -L2BLST_RS02285 L2BUCH2_RS02280 -L2BLST_RS02285 AP288_RS00775 -L2BLST_RS02285 BKB92_RS02330 -L2BLST_RS02285 SOTONIA3_RS02320 -L2BLST_RS02285 CTO_RS02335 -L2BLST_RS02285 E150_RS02310 -L2BLST_RS02285 BW688_RS03720 -L2BLST_RS02450 L2BLST_RS02450 -L2BLST_RS02450 FCS84708_RS02465 -L2BLST_RS02450 AQ244_RS00640 -L2BLST_RS02450 CBP44_RS03895 -L2BLST_RS02450 BBV16_RS02520 -L2BLST_RS02450 BKB93_RS02500 -L2BLST_RS02450 AQ199_RS03165 -L2BLST_RS02450 G9768_RS02470 -L2BLST_RS02450 L3404_RS02445 -L2BLST_RS02450 BKC02_RS02490 -L2BLST_RS02450 gnl|Prokka|PADJNBJD_00487 -L2BLST_RS02450 AQ193_RS01515 -L2BLST_RS02450 BKC01_RS02490 -L2BLST_RS02450 NILJEPDF_00487 -L2BLST_RS02450 LJHENM_02455 -L2BLST_RS02450 CTRC943_RS02450 -L2BLST_RS02450 AOT15_RS03625 -L2BLST_RS02450 JIEJKO_02455 -L2BLST_RS02450 QSDFRQ_00487 -L2BLST_RS02450 SOTONK1_RS02470 -L2BLST_RS02450 CTJTET1_RS02480 -L2BLST_RS02450 BKC03_RS02490 -L2BLST_RS02450 C15_RS0102530 -L2BLST_RS02450 KW39_RS02480 -L2BLST_RS02450 IaCS19096_RS02465 -L2BLST_RS02450 DU10_RS02510 -L2BLST_RS02450 A5291_RS02505 -L2BLST_RS02450 ECS88FINAL_RS0102525 -L2BLST_RS02450 O169_RS02480 -L2BLST_RS02450 7618589 -L2BLST_RS02450 DU13_RS02505 -L2BLST_RS02450 BKB96_RS02495 -L2BLST_RS02450 BKB99_RS02490 -L2BLST_RS02450 CBP48_RS03890 -L2BLST_RS02450 CTL2C_RS03820 -L2BLST_RS02450 KW36_RS02465 -L2BLST_RS02450 BKB95_RS02505 -L2BLST_RS02450 L1224_RS02450 -L2BLST_RS02450 SW2_RS02475 -L2BLST_RS02450 ECS102511_RS02470 -L2BLST_RS02450 AKW53_RS04745 -L2BLST_RS02450 119575 -L2BLST_RS02450 L1440_RS02450 -L2BLST_RS02450 CBP42_RS03900 -L2BLST_RS02450 L2BUCH2_RS02450 -L2BLST_RS02450 AP288_RS00610 -L2BLST_RS02450 CTB_RS02505 -L2BLST_RS02450 SOTONIA3_RS02485 -L2BLST_RS02450 BKB92_RS02495 -L2BLST_RS02450 E150_RS02475 -L2BLST_RS02450 CTO_RS02505 -L2BLST_RS02450 BW688_RS03890 -L2BLST_RS02450 BBV13_RS02510 -L2BLST_RS02630 L2BLST_RS02630 -L2BLST_RS02630 AQ244_RS00460 -L2BLST_RS02630 BBV13_RS02690 -L2BLST_RS02630 CBP44_RS04075 -L2BLST_RS02630 AQ199_RS03345 -L2BLST_RS02630 BKB93_RS02680 -L2BLST_RS02630 BBV16_RS02700 -L2BLST_RS02630 G9768_RS02650 -L2BLST_RS02630 L3404_RS02625 -L2BLST_RS02630 BKC02_RS02670 -L2BLST_RS02630 BKC01_RS02670 -L2BLST_RS02630 gnl|Prokka|PADJNBJD_00523 -L2BLST_RS02630 AQ193_RS01335 -L2BLST_RS02630 NILJEPDF_00523 -L2BLST_RS02630 LJHENM_02630 -L2BLST_RS02630 CTRC943_RS02630 -L2BLST_RS02630 AOT15_RS03445 -L2BLST_RS02630 SOTONK1_RS02650 -L2BLST_RS02630 CTJTET1_RS02660 -L2BLST_RS02630 JIEJKO_02635 -L2BLST_RS02630 BKC03_RS02670 -L2BLST_RS02630 QSDFRQ_00523 -L2BLST_RS02630 KW39_RS02660 -L2BLST_RS02630 C15_RS0102715 -L2BLST_RS02630 ECS88FINAL_RS0102710 -L2BLST_RS02630 IaCS19096_RS02645 -L2BLST_RS02630 DU10_RS02690 -L2BLST_RS02630 O169_RS02660 -L2BLST_RS02630 A5291_RS02685 -L2BLST_RS02630 DU13_RS02685 -L2BLST_RS02630 CBP48_RS04070 -L2BLST_RS02630 CTL2C_RS04000 -L2BLST_RS02630 KW36_RS02645 -L2BLST_RS02630 BKB95_RS02685 -L2BLST_RS02630 BKB96_RS02675 -L2BLST_RS02630 BKB99_RS02670 -L2BLST_RS02630 7619036 -L2BLST_RS02630 SW2_RS02655 -L2BLST_RS02630 L1224_RS02630 -L2BLST_RS02630 ECS102511_RS02650 -L2BLST_RS02630 L1440_RS02630 -L2BLST_RS02630 AKW53_RS04565 -L2BLST_RS02630 CBP42_RS04080 -L2BLST_RS02630 120237 -L2BLST_RS02630 L2BUCH2_RS02630 -L2BLST_RS02630 SOTONIA3_RS02665 -L2BLST_RS02630 AP288_RS00430 -L2BLST_RS02630 BKB92_RS02675 -L2BLST_RS02630 CTB_RS02685 -L2BLST_RS02630 E150_RS02655 -L2BLST_RS02630 BW688_RS04070 -L2BLST_RS02630 CTO_RS02685 -L2BLST_RS02630 FCS84708_RS02645 -L2BLST_RS02795 L2BLST_RS02795 -L2BLST_RS02795 AQ244_RS00295 -L2BLST_RS02795 BBV13_RS02855 -L2BLST_RS02795 CBP44_RS04245 -L2BLST_RS02795 AQ199_RS03510 -L2BLST_RS02795 BKB93_RS02850 -L2BLST_RS02795 BBV16_RS02865 -L2BLST_RS02795 G9768_RS02815 -L2BLST_RS02795 L3404_RS02790 -L2BLST_RS02795 BKC02_RS02840 -L2BLST_RS02795 gnl|Prokka|PADJNBJD_00555 -L2BLST_RS02795 NILJEPDF_00555 -L2BLST_RS02795 BKC01_RS02840 -L2BLST_RS02795 LJHENM_02795 -L2BLST_RS02795 AQ193_RS01170 -L2BLST_RS02795 CTRC943_RS02795 -L2BLST_RS02795 AOT15_RS01615 -L2BLST_RS02795 QSDFRQ_00555 -L2BLST_RS02795 JIEJKO_02800 -L2BLST_RS02795 SOTONK1_RS02815 -L2BLST_RS02795 CTJTET1_RS02825 -L2BLST_RS02795 BKC03_RS02840 -L2BLST_RS02795 KW39_RS02825 -L2BLST_RS02795 C15_RS0102885 -L2BLST_RS02795 ECS88FINAL_RS0102880 -L2BLST_RS02795 IaCS19096_RS02810 -L2BLST_RS02795 DU10_RS02860 -L2BLST_RS02795 O169_RS02825 -L2BLST_RS02795 A5291_RS02850 -L2BLST_RS02795 DU13_RS02855 -L2BLST_RS02795 CBP48_RS04240 -L2BLST_RS02795 7619066 -L2BLST_RS02795 CTL2C_RS04165 -L2BLST_RS02795 KW36_RS02810 -L2BLST_RS02795 AKW53_RS04040 -L2BLST_RS02795 BKB95_RS02855 -L2BLST_RS02795 BKB96_RS02845 -L2BLST_RS02795 BKB99_RS02840 -L2BLST_RS02795 SW2_RS02820 -L2BLST_RS02795 L1224_RS02795 -L2BLST_RS02795 ECS102511_RS02815 -L2BLST_RS02795 L1440_RS02795 -L2BLST_RS02795 120191 -L2BLST_RS02795 CBP42_RS04250 -L2BLST_RS02795 L2BUCH2_RS02795 -L2BLST_RS02795 SOTONIA3_RS02830 -L2BLST_RS02795 AP288_RS00265 -L2BLST_RS02795 BKB92_RS02845 -L2BLST_RS02795 CTB_RS02850 -L2BLST_RS02795 E150_RS02820 -L2BLST_RS02795 BW688_RS04240 -L2BLST_RS02795 CTO_RS02850 -L2BLST_RS02795 FCS84708_RS02810 -L2BLST_RS03295 L2BLST_RS03295 -L2BLST_RS03295 CBP44_RS04745 -L2BLST_RS03295 119672 -L2BLST_RS03295 AQ244_RS04595 -L2BLST_RS03295 AQ199_RS04015 -L2BLST_RS03295 BBV16_RS03365 -L2BLST_RS03295 BKB93_RS03350 -L2BLST_RS03295 G9768_RS03315 -L2BLST_RS03295 L3404_RS03290 -L2BLST_RS03295 gnl|Prokka|PADJNBJD_00652 -L2BLST_RS03295 AP288_RS01685 -L2BLST_RS03295 BKC02_RS03345 -L2BLST_RS03295 NILJEPDF_00653 -L2BLST_RS03295 LJHENM_03280 -L2BLST_RS03295 AOT15_RS04115 -L2BLST_RS03295 AQ193_RS00670 -L2BLST_RS03295 CTRC943_RS03295 -L2BLST_RS03295 JIEJKO_03285 -L2BLST_RS03295 BKC01_RS03345 -L2BLST_RS03295 QSDFRQ_00653 -L2BLST_RS03295 KW39_RS03335 -L2BLST_RS03295 BKC03_RS03345 -L2BLST_RS03295 CTJTET1_RS03335 -L2BLST_RS03295 ECS88FINAL_RS0103380 -L2BLST_RS03295 DU10_RS03360 -L2BLST_RS03295 SOTONK1_RS03315 -L2BLST_RS03295 O169_RS03330 -L2BLST_RS03295 IaCS19096_RS03310 -L2BLST_RS03295 C15_RS0103380 -L2BLST_RS03295 A5291_RS03360 -L2BLST_RS03295 AKW53_RS00065 -L2BLST_RS03295 DU13_RS03355 -L2BLST_RS03295 CTL2C_RS04665 -L2BLST_RS03295 CBP48_RS04745 -L2BLST_RS03295 SW2_RS03325 -L2BLST_RS03295 L1224_RS03295 -L2BLST_RS03295 KW36_RS03315 -L2BLST_RS03295 ECS102511_RS03315 -L2BLST_RS03295 7618652 -L2BLST_RS03295 L1440_RS03295 -L2BLST_RS03295 BKB95_RS03360 -L2BLST_RS03295 BKB96_RS03355 -L2BLST_RS03295 BKB99_RS03350 -L2BLST_RS03295 CBP42_RS04750 -L2BLST_RS03295 L2BUCH2_RS03295 -L2BLST_RS03295 BKB92_RS03345 -L2BLST_RS03295 CTB_RS03355 -L2BLST_RS03295 E150_RS03325 -L2BLST_RS03295 SOTONIA3_RS03335 -L2BLST_RS03295 BW688_RS04740 -L2BLST_RS03295 CTO_RS03350 -L2BLST_RS03295 FCS84708_RS03315 -L2BLST_RS03295 BBV13_RS03355 -L2BLST_RS03465 L2BLST_RS03465 -L2BLST_RS03465 7618213 -L2BLST_RS03465 BBV16_RS03530 -L2BLST_RS03465 BW688_RS00085 -L2BLST_RS03465 AQ199_RS04180 -L2BLST_RS03465 AQ244_RS04430 -L2BLST_RS03465 BKB93_RS03520 -L2BLST_RS03465 119697 -L2BLST_RS03465 G9768_RS03480 -L2BLST_RS03465 gnl|Prokka|PADJNBJD_00685 -L2BLST_RS03465 L3404_RS03460 -L2BLST_RS03465 BKC02_RS03515 -L2BLST_RS03465 NILJEPDF_00686 -L2BLST_RS03465 LJHENM_03445 -L2BLST_RS03465 AOT15_RS04280 -L2BLST_RS03465 AP288_RS01850 -L2BLST_RS03465 AQ193_RS00505 -L2BLST_RS03465 JIEJKO_03450 -L2BLST_RS03465 BKC01_RS03515 -L2BLST_RS03465 QSDFRQ_00686 -L2BLST_RS03465 CTRC943_RS03465 -L2BLST_RS03465 BKC03_RS03515 -L2BLST_RS03465 CBP48_RS00085 -L2BLST_RS03465 CTJTET1_RS03500 -L2BLST_RS03465 KW39_RS03500 -L2BLST_RS03465 DU10_RS03530 -L2BLST_RS03465 SOTONK1_RS03480 -L2BLST_RS03465 ECS88FINAL_RS0103560 -L2BLST_RS03465 IaCS19096_RS03475 -L2BLST_RS03465 C15_RS0103555 -L2BLST_RS03465 A5291_RS03525 -L2BLST_RS03465 O169_RS03495 -L2BLST_RS03465 DU13_RS03530 -L2BLST_RS03465 KW36_RS03480 -L2BLST_RS03465 AKW53_RS00230 -L2BLST_RS03465 BKB95_RS03535 -L2BLST_RS03465 CBP42_RS00085 -L2BLST_RS03465 SW2_RS03490 -L2BLST_RS03465 CTL2C_RS00085 -L2BLST_RS03465 L1224_RS03465 -L2BLST_RS03465 ECS102511_RS03480 -L2BLST_RS03465 L1440_RS03465 -L2BLST_RS03465 BKB96_RS03525 -L2BLST_RS03465 BKB99_RS03520 -L2BLST_RS03465 CBP44_RS00085 -L2BLST_RS03465 L2BUCH2_RS03465 -L2BLST_RS03465 BKB92_RS03515 -L2BLST_RS03465 CTB_RS03520 -L2BLST_RS03465 SOTONIA3_RS03500 -L2BLST_RS03465 E150_RS03490 -L2BLST_RS03465 CTO_RS03515 -L2BLST_RS03465 BBV13_RS03520 -L2BLST_RS03465 FCS84708_RS03480 -L2BLST_RS03645 L2BLST_RS03645 -L2BLST_RS03645 BBV16_RS03715 -L2BLST_RS03645 BW688_RS00265 -L2BLST_RS03645 120063 -L2BLST_RS03645 AQ199_RS04360 -L2BLST_RS03645 BKB93_RS03700 -L2BLST_RS03645 7618678 -L2BLST_RS03645 AQ244_RS04245 -L2BLST_RS03645 G9768_RS03665 -L2BLST_RS03645 gnl|Prokka|PADJNBJD_00721 -L2BLST_RS03645 L3404_RS03640 -L2BLST_RS03645 BKC02_RS03695 -L2BLST_RS03645 NILJEPDF_00722 -L2BLST_RS03645 LJHENM_03630 -L2BLST_RS03645 AOT15_RS04465 -L2BLST_RS03645 AP288_RS02030 -L2BLST_RS03645 AQ193_RS00325 -L2BLST_RS03645 JIEJKO_03635 -L2BLST_RS03645 BKC01_RS03695 -L2BLST_RS03645 QSDFRQ_00722 -L2BLST_RS03645 CTRC943_RS03650 -L2BLST_RS03645 BKC03_RS03695 -L2BLST_RS03645 CBP48_RS00265 -L2BLST_RS03645 CTJTET1_RS03685 -L2BLST_RS03645 KW39_RS03680 -L2BLST_RS03645 DU10_RS03710 -L2BLST_RS03645 SOTONK1_RS03665 -L2BLST_RS03645 ECS88FINAL_RS0103760 -L2BLST_RS03645 IaCS19096_RS03660 -L2BLST_RS03645 C15_RS0103755 -L2BLST_RS03645 A5291_RS03710 -L2BLST_RS03645 O169_RS03675 -L2BLST_RS03645 DU13_RS03710 -L2BLST_RS03645 KW36_RS03665 -L2BLST_RS03645 BKB95_RS03715 -L2BLST_RS03645 CBP42_RS00265 -L2BLST_RS03645 SW2_RS03670 -L2BLST_RS03645 CTL2C_RS00265 -L2BLST_RS03645 L1224_RS03645 -L2BLST_RS03645 ECS102511_RS03660 -L2BLST_RS03645 L1440_RS03645 -L2BLST_RS03645 BKB96_RS03705 -L2BLST_RS03645 BKB99_RS03700 -L2BLST_RS03645 CBP44_RS00265 -L2BLST_RS03645 L2BUCH2_RS03645 -L2BLST_RS03645 BKB92_RS03695 -L2BLST_RS03645 CTB_RS03705 -L2BLST_RS03645 SOTONIA3_RS03685 -L2BLST_RS03645 E150_RS03670 -L2BLST_RS03645 CTO_RS03700 -L2BLST_RS03645 BBV13_RS03705 -L2BLST_RS03645 FCS84708_RS03660 -L2BLST_RS03815 L2BLST_RS03815 -L2BLST_RS03815 BBV16_RS03885 -L2BLST_RS03815 7618256 -L2BLST_RS03815 119763 -L2BLST_RS03815 BW688_RS00440 -L2BLST_RS03815 AQ199_RS04530 -L2BLST_RS03815 AQ244_RS04075 -L2BLST_RS03815 BKB93_RS03875 -L2BLST_RS03815 G9768_RS03835 -L2BLST_RS03815 gnl|Prokka|PADJNBJD_00754 -L2BLST_RS03815 L3404_RS03810 -L2BLST_RS03815 NILJEPDF_00755 -L2BLST_RS03815 BKC02_RS03870 -L2BLST_RS03815 LJHENM_03800 -L2BLST_RS03815 AOT15_RS04635 -L2BLST_RS03815 AP288_RS02205 -L2BLST_RS03815 AQ193_RS00155 -L2BLST_RS03815 JIEJKO_03800 -L2BLST_RS03815 QSDFRQ_00755 -L2BLST_RS03815 BKC01_RS03875 -L2BLST_RS03815 CTRC943_RS03820 -L2BLST_RS03815 AKW53_RS00575 -L2BLST_RS03815 BKC03_RS03870 -L2BLST_RS03815 CBP48_RS00440 -L2BLST_RS03815 CTJTET1_RS03855 -L2BLST_RS03815 KW39_RS03850 -L2BLST_RS03815 DU10_RS03885 -L2BLST_RS03815 A5291_RS03880 -L2BLST_RS03815 SOTONK1_RS03835 -L2BLST_RS03815 IaCS19096_RS03830 -L2BLST_RS03815 DU13_RS03885 -L2BLST_RS03815 C15_RS0103940 -L2BLST_RS03815 ECS88FINAL_RS0103940 -L2BLST_RS03815 O169_RS03845 -L2BLST_RS03815 KW36_RS03835 -L2BLST_RS03815 BKB95_RS03890 -L2BLST_RS03815 CBP42_RS00440 -L2BLST_RS03815 CTL2C_RS00435 -L2BLST_RS03815 L1224_RS03815 -L2BLST_RS03815 SW2_RS03840 -L2BLST_RS03815 L1440_RS03810 -L2BLST_RS03815 ECS102511_RS03830 -L2BLST_RS03815 BKB96_RS03875 -L2BLST_RS03815 BKB99_RS03870 -L2BLST_RS03815 CBP44_RS00440 -L2BLST_RS03815 L2BUCH2_RS03815 -L2BLST_RS03815 BKB92_RS03870 -L2BLST_RS03815 CTB_RS03875 -L2BLST_RS03815 SOTONIA3_RS03855 -L2BLST_RS03815 E150_RS03840 -L2BLST_RS03815 CTO_RS03870 -L2BLST_RS03815 BBV13_RS03875 -L2BLST_RS03815 FCS84708_RS03830 -L2BLST_RS03995 L2BLST_RS03995 -L2BLST_RS03995 AP288_RS04720 -L2BLST_RS03995 AQ244_RS03870 -L2BLST_RS03995 BBV16_RS04065 -L2BLST_RS03995 7618712 -L2BLST_RS03995 BW688_RS00620 -L2BLST_RS03995 gnl|Prokka|PADJNBJD_00789 -L2BLST_RS03995 AQ199_RS04710 -L2BLST_RS03995 BKB93_RS04055 -L2BLST_RS03995 G9768_RS04015 -L2BLST_RS03995 L3404_RS03990 -L2BLST_RS03995 AQ193_RS04705 -L2BLST_RS03995 NILJEPDF_00790 -L2BLST_RS03995 LJHENM_03975 -L2BLST_RS03995 BKC02_RS04050 -L2BLST_RS03995 JIEJKO_03975 -L2BLST_RS03995 QSDFRQ_00790 -L2BLST_RS03995 BKC01_RS04055 -L2BLST_RS03995 CTRC943_RS04000 -L2BLST_RS03995 CTJTET1_RS04190 -L2BLST_RS03995 AKW53_RS00750 -L2BLST_RS03995 BKC03_RS04050 -L2BLST_RS03995 CBP48_RS00620 -L2BLST_RS03995 CTJTET1_RS04035 -L2BLST_RS03995 KW39_RS04030 -L2BLST_RS03995 DU10_RS04065 -L2BLST_RS03995 A5291_RS04060 -L2BLST_RS03995 SOTONK1_RS04015 -L2BLST_RS03995 ECS88FINAL_RS0104115 -L2BLST_RS03995 IaCS19096_RS04010 -L2BLST_RS03995 DU13_RS04065 -L2BLST_RS03995 C15_RS0104120 -L2BLST_RS03995 O169_RS04025 -L2BLST_RS03995 KW36_RS04015 -L2BLST_RS03995 AOT15_RS02320 -L2BLST_RS03995 BKB95_RS04070 -L2BLST_RS03995 CBP42_RS00620 -L2BLST_RS03995 CTL2C_RS00615 -L2BLST_RS03995 L1224_RS03995 -L2BLST_RS03995 SW2_RS04020 -L2BLST_RS03995 L1440_RS03990 -L2BLST_RS03995 ECS102511_RS04010 -L2BLST_RS03995 BKB96_RS04055 -L2BLST_RS03995 BKB99_RS04050 -L2BLST_RS03995 CBP44_RS00620 -L2BLST_RS03995 L2BUCH2_RS03995 -L2BLST_RS03995 CTB_RS04055 -L2BLST_RS03995 BKB92_RS04050 -L2BLST_RS03995 SOTONIA3_RS04035 -L2BLST_RS03995 E150_RS04020 -L2BLST_RS03995 CTO_RS04050 -L2BLST_RS03995 BBV13_RS04055 -L2BLST_RS03995 FCS84708_RS04010 -L2BLST_RS03995 120009 -L2BLST_RS04175 L2BLST_RS04175 -L2BLST_RS04175 BBV16_RS04245 -L2BLST_RS04175 BW688_RS00800 -L2BLST_RS04175 gnl|Prokka|PADJNBJD_00824 -L2BLST_RS04175 BKB93_RS04235 -L2BLST_RS04175 NILJEPDF_00825 -L2BLST_RS04175 G9768_RS04195 -L2BLST_RS04175 L3404_RS04170 -L2BLST_RS04175 LJHENM_04150 -L2BLST_RS04175 JIEJKO_04150 -L2BLST_RS04175 BKC02_RS04230 -L2BLST_RS04175 QSDFRQ_00825 -L2BLST_RS04175 AKW53_RS00910 -L2BLST_RS04175 BKC01_RS04235 -L2BLST_RS04175 CTRC943_RS04180 -L2BLST_RS04175 AOT15_RS01780 -L2BLST_RS04175 CTJTET1_RS04370 -L2BLST_RS04175 KW39_RS04210 -L2BLST_RS04175 AQ193_RS04580 -L2BLST_RS04175 BKC03_RS04230 -L2BLST_RS04175 CBP48_RS00800 -L2BLST_RS04175 A5291_RS04235 -L2BLST_RS04175 ECS88FINAL_RS0104280 -L2BLST_RS04175 AQ244_RS02570 -L2BLST_RS04175 DU10_RS04245 -L2BLST_RS04175 SOTONK1_RS04195 -L2BLST_RS04175 IaCS19096_RS04190 -L2BLST_RS04175 DU13_RS04245 -L2BLST_RS04175 C15_RS0104305 -L2BLST_RS04175 O169_RS04205 -L2BLST_RS04175 KW36_RS04195 -L2BLST_RS04175 BKB95_RS04250 -L2BLST_RS04175 CBP42_RS00800 -L2BLST_RS04175 CTL2C_RS00795 -L2BLST_RS04175 L1224_RS04175 -L2BLST_RS04175 BKB96_RS04235 -L2BLST_RS04175 SW2_RS04200 -L2BLST_RS04175 L1440_RS04170 -L2BLST_RS04175 ECS102511_RS04190 -L2BLST_RS04175 BKB99_RS04230 -L2BLST_RS04175 CBP44_RS00800 -L2BLST_RS04175 CTB_RS04230 -L2BLST_RS04175 L2BUCH2_RS04175 -L2BLST_RS04175 BKB92_RS04230 -L2BLST_RS04175 SOTONIA3_RS04215 -L2BLST_RS04175 CTO_RS04225 -L2BLST_RS04175 AP288_RS02495 -L2BLST_RS04175 E150_RS04200 -L2BLST_RS04175 BBV13_RS04235 -L2BLST_RS04175 119985 -L2BLST_RS04175 FCS84708_RS04190 -L2BLST_RS04175 AQ199_RS00120 -L2BLST_RS04175 7618728 -L2BLST_RS04350 L2BLST_RS04350 -L2BLST_RS04350 BBV13_RS04415 -L2BLST_RS04350 AP288_RS02680 -L2BLST_RS04350 BBV16_RS04420 -L2BLST_RS04350 E150_RS04385 -L2BLST_RS04350 gnl|Prokka|PADJNBJD_00857 -L2BLST_RS04350 BW688_RS00985 -L2BLST_RS04350 7618165 -L2BLST_RS04350 FCS84708_RS04370 -L2BLST_RS04350 AQ199_RS00305 -L2BLST_RS04350 NILJEPDF_00858 -L2BLST_RS04350 LJHENM_04315 -L2BLST_RS04350 L3404_RS04345 -L2BLST_RS04350 G9768_RS04375 -L2BLST_RS04350 JIEJKO_04315 -L2BLST_RS04350 QSDFRQ_00858 -L2BLST_RS04350 BKB93_RS04420 -L2BLST_RS04350 AQ193_RS04395 -L2BLST_RS04350 BKC02_RS04415 -L2BLST_RS04350 CTRC943_RS04355 -L2BLST_RS04350 AQ244_RS02375 -L2BLST_RS04350 BKC01_RS04420 -L2BLST_RS04350 AKW53_RS01095 -L2BLST_RS04350 AOT15_RS01955 -L2BLST_RS04350 CTJTET1_RS04545 -L2BLST_RS04350 CBP48_RS00985 -L2BLST_RS04350 BKC03_RS04415 -L2BLST_RS04350 A5291_RS04410 -L2BLST_RS04350 KW39_RS04390 -L2BLST_RS04350 SOTONK1_RS04375 -L2BLST_RS04350 IaCS19096_RS04370 -L2BLST_RS04350 C15_RS0104485 -L2BLST_RS04350 ECS88FINAL_RS0104465 -L2BLST_RS04350 DU10_RS04430 -L2BLST_RS04350 KW36_RS04375 -L2BLST_RS04350 DU13_RS04430 -L2BLST_RS04350 O169_RS04390 -L2BLST_RS04350 CBP42_RS00985 -L2BLST_RS04350 CTL2C_RS00970 -L2BLST_RS04350 L1224_RS04350 -L2BLST_RS04350 BKB95_RS04435 -L2BLST_RS04350 L1440_RS04345 -L2BLST_RS04350 BKB96_RS04420 -L2BLST_RS04350 BKB99_RS04415 -L2BLST_RS04350 SW2_RS04380 -L2BLST_RS04350 ECS102511_RS04375 -L2BLST_RS04350 CBP44_RS00985 -L2BLST_RS04350 L2BUCH2_RS04350 -L2BLST_RS04350 CTB_RS04405 -L2BLST_RS04350 SOTONIA3_RS04390 -L2BLST_RS04350 CTO_RS04400 -L2BLST_RS04350 BKB92_RS04415 -L2BLST_RS04505 L2BLST_RS04505 -L2BLST_RS04505 E150_RS04540 -L2BLST_RS04505 gnl|Prokka|PADJNBJD_00888 -L2BLST_RS04505 FCS84708_RS04525 -L2BLST_RS04505 AQ199_RS00460 -L2BLST_RS04505 NILJEPDF_00889 -L2BLST_RS04505 BW688_RS01155 -L2BLST_RS04505 119877 -L2BLST_RS04505 JIEJKO_04470 -L2BLST_RS04505 7618331 -L2BLST_RS04505 QSDFRQ_00889 -L2BLST_RS04505 G9768_RS04525 -L2BLST_RS04505 LJHENM_04480 -L2BLST_RS04505 L3404_RS04500 -L2BLST_RS04505 BKB93_RS04590 -L2BLST_RS04505 BKC02_RS04580 -L2BLST_RS04505 AKW53_RS01250 -L2BLST_RS04505 AQ193_RS04240 -L2BLST_RS04505 BKC01_RS04585 -L2BLST_RS04505 CTRC943_RS04510 -L2BLST_RS04505 AOT15_RS02105 -L2BLST_RS04505 CTJTET1_RS04695 -L2BLST_RS04505 KW39_RS04545 -L2BLST_RS04505 AQ244_RS02225 -L2BLST_RS04505 BKC03_RS04580 -L2BLST_RS04505 CBP48_RS01155 -L2BLST_RS04505 A5291_RS04560 -L2BLST_RS04505 SOTONK1_RS04525 -L2BLST_RS04505 ECS88FINAL_RS0104635 -L2BLST_RS04505 IaCS19096_RS04520 -L2BLST_RS04505 C15_RS0104655 -L2BLST_RS04505 DU10_RS04600 -L2BLST_RS04505 O169_RS04545 -L2BLST_RS04505 KW36_RS04525 -L2BLST_RS04505 DU13_RS04600 -L2BLST_RS04505 BKB95_RS04600 -L2BLST_RS04505 CBP42_RS01155 -L2BLST_RS04505 CTL2C_RS01125 -L2BLST_RS04505 L1224_RS04505 -L2BLST_RS04505 BKB96_RS04585 -L2BLST_RS04505 L1440_RS04500 -L2BLST_RS04505 BKB99_RS04580 -L2BLST_RS04505 SW2_RS04535 -L2BLST_RS04505 ECS102511_RS04530 -L2BLST_RS04505 CBP44_RS01155 -L2BLST_RS04505 CTB_RS04555 -L2BLST_RS04505 L2BUCH2_RS04505 -L2BLST_RS04505 SOTONIA3_RS04540 -L2BLST_RS04505 CTO_RS04550 -L2BLST_RS04505 BBV13_RS04570 -L2BLST_RS04505 BKB92_RS04585 -L2BLST_RS04505 AP288_RS02835 -L2BLST_RS04505 BBV16_RS04575 -L3404_RS00065 L3404_RS00065 -L3404_RS00065 IaCS19096_RS00065 -L3404_RS00065 BKC03_RS00065 -L3404_RS00065 C15_RS0100065 -L3404_RS00065 AKW53_RS01550 -L3404_RS00065 AOT15_RS00890 -L3404_RS00065 QSDFRQ_00013 -L3404_RS00065 CTJTET1_RS00065 -L3404_RS00065 DU10_RS00065 -L3404_RS00065 CTRC943_RS00065 -L3404_RS00065 O169_RS00065 -L3404_RS00065 CBP48_RS01455 -L3404_RS00065 ECS88FINAL_RS0100070 -L3404_RS00065 DU13_RS00065 -L3404_RS00065 KW39_RS00065 -L3404_RS00065 BKB95_RS00065 -L3404_RS00065 KW36_RS00065 -L3404_RS00065 SW2_RS00065 -L3404_RS00065 ECS102511_RS00065 -L3404_RS00065 CTB_RS00065 -L3404_RS00065 CTL2C_RS01430 -L3404_RS00065 CBP42_RS01455 -L3404_RS00065 L1224_RS00065 -L3404_RS00065 BKB96_RS00065 -L3404_RS00065 BKB99_RS00065 -L3404_RS00065 CTO_RS00065 -L3404_RS00065 SOTONIA3_RS00065 -L3404_RS00065 L1440_RS00065 -L3404_RS00065 BKB92_RS00065 -L3404_RS00065 120657 -L3404_RS00065 AQ193_RS03940 -L3404_RS00065 CBP44_RS01455 -L3404_RS00065 AQ244_RS01925 -L3404_RS00065 E150_RS00065 -L3404_RS00065 L2BUCH2_RS00065 -L3404_RS00065 BKB93_RS00065 -L3404_RS00065 FCS84708_RS00065 -L3404_RS00065 AP288_RS03135 -L3404_RS00065 G9768_RS00065 -L3404_RS00065 AQ199_RS00760 -L3404_RS00065 BW688_RS01455 -L3404_RS00065 L2BLST_RS00065 -L3404_RS00065 BKC02_RS00065 -L3404_RS00065 BKC01_RS00065 -L3404_RS00065 7618784 -L3404_RS00065 gnl|Prokka|PADJNBJD_00013 -L3404_RS00065 LJHENM_00065 -L3404_RS00065 A5291_RS00065 -L3404_RS00065 SOTONK1_RS00065 -L3404_RS00065 JIEJKO_00060 -L3404_RS00065 NILJEPDF_00013 -L3404_RS00915 L3404_RS00915 -L3404_RS00915 AKW53_RS02425 -L3404_RS00915 120531 -L3404_RS00915 BBV16_RS00965 -L3404_RS00915 BKC01_RS00935 -L3404_RS00915 DU10_RS00945 -L3404_RS00915 gnl|Prokka|PADJNBJD_00183 -L3404_RS00915 BKC03_RS00935 -L3404_RS00915 NILJEPDF_00183 -L3404_RS00915 LJHENM_00920 -L3404_RS00915 CTRC943_RS00920 -L3404_RS00915 CTJTET1_RS00950 -L3404_RS00915 AOT15_RS01430 -L3404_RS00915 C15_RS0100970 -L3404_RS00915 SOTONK1_RS00935 -L3404_RS00915 ECS88FINAL_RS0100955 -L3404_RS00915 KW39_RS00940 -L3404_RS00915 JIEJKO_00920 -L3404_RS00915 7618859 -L3404_RS00915 A5291_RS00960 -L3404_RS00915 IaCS19096_RS00935 -L3404_RS00915 QSDFRQ_00183 -L3404_RS00915 O169_RS00940 -L3404_RS00915 DU13_RS00945 -L3404_RS00915 SW2_RS00930 -L3404_RS00915 BKB95_RS00950 -L3404_RS00915 CBP48_RS02325 -L3404_RS00915 KW36_RS00935 -L3404_RS00915 ECS102511_RS00930 -L3404_RS00915 BKB96_RS00935 -L3404_RS00915 CTL2C_RS02285 -L3404_RS00915 BKB99_RS00935 -L3404_RS00915 L1224_RS00915 -L3404_RS00915 L1440_RS00915 -L3404_RS00915 AQ193_RS03060 -L3404_RS00915 AQ244_RS03115 -L3404_RS00915 BKB92_RS00935 -L3404_RS00915 CBP42_RS02325 -L3404_RS00915 SOTONIA3_RS00950 -L3404_RS00915 E150_RS00930 -L3404_RS00915 CTB_RS00960 -L3404_RS00915 L2BUCH2_RS00920 -L3404_RS00915 CTO_RS00960 -L3404_RS00915 FCS84708_RS00930 -L3404_RS00915 AP288_RS04000 -L3404_RS00915 BKB93_RS00935 -L3404_RS00915 CBP44_RS02330 -L3404_RS00915 AQ199_RS01625 -L3404_RS00915 L2BLST_RS00920 -L3404_RS00915 BW688_RS02330 -L3404_RS00915 BBV13_RS00965 -L3404_RS00915 G9768_RS00940 -L3404_RS00915 BKC02_RS00935 -L3404_RS01095 L3404_RS01095 -L3404_RS01095 AKW53_RS02605 -L3404_RS01095 BBV16_RS01145 -L3404_RS01095 BKC01_RS01115 -L3404_RS01095 120503 -L3404_RS01095 DU10_RS01125 -L3404_RS01095 gnl|Prokka|PADJNBJD_00219 -L3404_RS01095 BKC03_RS01115 -L3404_RS01095 NILJEPDF_00219 -L3404_RS01095 LJHENM_01100 -L3404_RS01095 CTRC943_RS01100 -L3404_RS01095 CTJTET1_RS01130 -L3404_RS01095 AOT15_RS01250 -L3404_RS01095 C15_RS0101150 -L3404_RS01095 SOTONK1_RS01115 -L3404_RS01095 ECS88FINAL_RS0101135 -L3404_RS01095 KW39_RS01120 -L3404_RS01095 JIEJKO_01100 -L3404_RS01095 A5291_RS01140 -L3404_RS01095 IaCS19096_RS01115 -L3404_RS01095 7618877 -L3404_RS01095 QSDFRQ_00219 -L3404_RS01095 O169_RS01120 -L3404_RS01095 DU13_RS01125 -L3404_RS01095 SW2_RS01110 -L3404_RS01095 BKB95_RS01130 -L3404_RS01095 CBP48_RS02505 -L3404_RS01095 KW36_RS01115 -L3404_RS01095 ECS102511_RS01110 -L3404_RS01095 BKB96_RS01115 -L3404_RS01095 CTL2C_RS02465 -L3404_RS01095 BKB99_RS01115 -L3404_RS01095 L1224_RS01095 -L3404_RS01095 L1440_RS01095 -L3404_RS01095 AQ193_RS02880 -L3404_RS01095 AQ244_RS03295 -L3404_RS01095 BKB92_RS01115 -L3404_RS01095 CBP42_RS02505 -L3404_RS01095 SOTONIA3_RS01130 -L3404_RS01095 E150_RS01110 -L3404_RS01095 CTB_RS01140 -L3404_RS01095 L2BUCH2_RS01100 -L3404_RS01095 CTO_RS01140 -L3404_RS01095 FCS84708_RS01110 -L3404_RS01095 AP288_RS04180 -L3404_RS01095 BKB93_RS01115 -L3404_RS01095 CBP44_RS02510 -L3404_RS01095 AQ199_RS01805 -L3404_RS01095 L2BLST_RS01100 -L3404_RS01095 BW688_RS02510 -L3404_RS01095 BBV13_RS01145 -L3404_RS01095 G9768_RS01120 -L3404_RS01095 BKC02_RS01115 -L3404_RS01265 L3404_RS01265 -L3404_RS01265 AKW53_RS02775 -L3404_RS01265 BBV16_RS01315 -L3404_RS01265 BKC01_RS01285 -L3404_RS01265 gnl|Prokka|PADJNBJD_00252 -L3404_RS01265 DU10_RS01295 -L3404_RS01265 NILJEPDF_00252 -L3404_RS01265 LJHENM_01265 -L3404_RS01265 BKC03_RS01285 -L3404_RS01265 CTRC943_RS01270 -L3404_RS01265 CTJTET1_RS01300 -L3404_RS01265 KW39_RS01290 -L3404_RS01265 AOT15_RS01080 -L3404_RS01265 JIEJKO_01265 -L3404_RS01265 119406 -L3404_RS01265 C15_RS0101320 -L3404_RS01265 SOTONK1_RS01285 -L3404_RS01265 ECS88FINAL_RS0101305 -L3404_RS01265 QSDFRQ_00252 -L3404_RS01265 A5291_RS01310 -L3404_RS01265 IaCS19096_RS01285 -L3404_RS01265 O169_RS01290 -L3404_RS01265 DU13_RS01295 -L3404_RS01265 7618482 -L3404_RS01265 SW2_RS01280 -L3404_RS01265 BKB95_RS01300 -L3404_RS01265 CBP48_RS02675 -L3404_RS01265 KW36_RS01285 -L3404_RS01265 ECS102511_RS01280 -L3404_RS01265 BKB96_RS01285 -L3404_RS01265 CTL2C_RS02635 -L3404_RS01265 BKB99_RS01285 -L3404_RS01265 L1224_RS01265 -L3404_RS01265 L1440_RS01265 -L3404_RS01265 AQ193_RS02710 -L3404_RS01265 AQ244_RS03465 -L3404_RS01265 BKB92_RS01285 -L3404_RS01265 CBP42_RS02675 -L3404_RS01265 SOTONIA3_RS01300 -L3404_RS01265 CTB_RS01310 -L3404_RS01265 E150_RS01280 -L3404_RS01265 L2BUCH2_RS01270 -L3404_RS01265 CTO_RS01310 -L3404_RS01265 FCS84708_RS01280 -L3404_RS01265 AP288_RS04350 -L3404_RS01265 BKB93_RS01285 -L3404_RS01265 CBP44_RS02680 -L3404_RS01265 AQ199_RS01975 -L3404_RS01265 L2BLST_RS01270 -L3404_RS01265 BW688_RS02680 -L3404_RS01265 BBV13_RS01315 -L3404_RS01265 G9768_RS01290 -L3404_RS01265 BKC02_RS01285 -L3404_RS01590 L3404_RS01590 -L3404_RS01590 AKW53_RS03105 -L3404_RS01590 BBV16_RS01645 -L3404_RS01590 BKC01_RS01620 -L3404_RS01590 gnl|Prokka|PADJNBJD_00317 -L3404_RS01590 NILJEPDF_00317 -L3404_RS01590 LJHENM_01595 -L3404_RS01590 CTRC943_RS01595 -L3404_RS01590 BKC03_RS01615 -L3404_RS01590 DU10_RS01630 -L3404_RS01590 CTJTET1_RS01625 -L3404_RS01590 KW39_RS01615 -L3404_RS01590 JIEJKO_01595 -L3404_RS01590 C15_RS0101655 -L3404_RS01590 SOTONK1_RS01615 -L3404_RS01590 ECS88FINAL_RS0101635 -L3404_RS01590 120413 -L3404_RS01590 QSDFRQ_00317 -L3404_RS01590 IaCS19096_RS01610 -L3404_RS01590 A5291_RS01640 -L3404_RS01590 O169_RS01620 -L3404_RS01590 DU13_RS01625 -L3404_RS01590 CBP48_RS03005 -L3404_RS01590 7618934 -L3404_RS01590 SW2_RS01605 -L3404_RS01590 BKB95_RS01630 -L3404_RS01590 CTL2C_RS02960 -L3404_RS01590 KW36_RS01610 -L3404_RS01590 ECS102511_RS01605 -L3404_RS01590 AOT15_RS02610 -L3404_RS01590 BKB96_RS01615 -L3404_RS01590 L1224_RS01590 -L3404_RS01590 BKB99_RS01615 -L3404_RS01590 L1440_RS01590 -L3404_RS01590 AQ193_RS02380 -L3404_RS01590 CBP42_RS03005 -L3404_RS01590 AQ244_RS03795 -L3404_RS01590 SOTONIA3_RS01625 -L3404_RS01590 BKB92_RS01620 -L3404_RS01590 CTB_RS01640 -L3404_RS01590 E150_RS01610 -L3404_RS01590 L2BUCH2_RS01595 -L3404_RS01590 CTO_RS01635 -L3404_RS01590 FCS84708_RS01605 -L3404_RS01590 AP288_RS04675 -L3404_RS01590 CBP44_RS03010 -L3404_RS01590 BKB93_RS01620 -L3404_RS01590 L2BLST_RS01595 -L3404_RS01590 AQ199_RS02300 -L3404_RS01590 BW688_RS03015 -L3404_RS01590 BBV13_RS01645 -L3404_RS01590 G9768_RS01615 -L3404_RS01590 BKC02_RS01615 -L3404_RS01765 L3404_RS01765 -L3404_RS01765 BBV16_RS01820 -L3404_RS01765 BKC02_RS01795 -L3404_RS01765 BKC01_RS01795 -L3404_RS01765 AKW53_RS03290 -L3404_RS01765 gnl|Prokka|PADJNBJD_00352 -L3404_RS01765 AQ244_RS01320 -L3404_RS01765 NILJEPDF_00352 -L3404_RS01765 CTRC943_RS01770 -L3404_RS01765 LJHENM_01775 -L3404_RS01765 JIEJKO_01770 -L3404_RS01765 BKC03_RS01795 -L3404_RS01765 CTJTET1_RS01800 -L3404_RS01765 DU10_RS01815 -L3404_RS01765 QSDFRQ_00352 -L3404_RS01765 C15_RS0101830 -L3404_RS01765 SOTONK1_RS01790 -L3404_RS01765 A5291_RS01815 -L3404_RS01765 KW39_RS01800 -L3404_RS01765 IaCS19096_RS01785 -L3404_RS01765 120369 -L3404_RS01765 ECS88FINAL_RS0101820 -L3404_RS01765 O169_RS01800 -L3404_RS01765 DU13_RS01810 -L3404_RS01765 7618954 -L3404_RS01765 CTL2C_RS03135 -L3404_RS01765 AQ193_RS02195 -L3404_RS01765 BKB95_RS01810 -L3404_RS01765 CBP48_RS03195 -L3404_RS01765 L1224_RS01765 -L3404_RS01765 KW36_RS01785 -L3404_RS01765 AOT15_RS02785 -L3404_RS01765 BKB96_RS01795 -L3404_RS01765 SW2_RS01790 -L3404_RS01765 BKB99_RS01795 -L3404_RS01765 L1440_RS01765 -L3404_RS01765 ECS102511_RS01790 -L3404_RS01765 CBP42_RS03205 -L3404_RS01765 CTB_RS01815 -L3404_RS01765 SOTONIA3_RS01800 -L3404_RS01765 L2BUCH2_RS01765 -L3404_RS01765 BKB92_RS01805 -L3404_RS01765 CTO_RS01815 -L3404_RS01765 E150_RS01795 -L3404_RS01765 L2BLST_RS01765 -L3404_RS01765 FCS84708_RS01785 -L3404_RS01765 BW688_RS03195 -L3404_RS01765 BKB93_RS01805 -L3404_RS01765 CBP44_RS03200 -L3404_RS01765 BBV13_RS01820 -L3404_RS01765 AQ199_RS02485 -L3404_RS01765 G9768_RS01790 -L3404_RS01765 AP288_RS01290 -L3404_RS02090 L3404_RS02090 -L3404_RS02090 BKC02_RS02120 -L3404_RS02090 BKC01_RS02120 -L3404_RS02090 AKW53_RS03615 -L3404_RS02090 gnl|Prokka|PADJNBJD_00417 -L3404_RS02090 AQ244_RS00995 -L3404_RS02090 NILJEPDF_00417 -L3404_RS02090 CTRC943_RS02095 -L3404_RS02090 LJHENM_02100 -L3404_RS02090 JIEJKO_02095 -L3404_RS02090 BKC03_RS02120 -L3404_RS02090 CTJTET1_RS02125 -L3404_RS02090 QSDFRQ_00417 -L3404_RS02090 C15_RS0102160 -L3404_RS02090 A5291_RS02140 -L3404_RS02090 SOTONK1_RS02115 -L3404_RS02090 DU10_RS02145 -L3404_RS02090 KW39_RS02125 -L3404_RS02090 IaCS19096_RS02110 -L3404_RS02090 ECS88FINAL_RS0102155 -L3404_RS02090 O169_RS02125 -L3404_RS02090 DU13_RS02140 -L3404_RS02090 7618552 -L3404_RS02090 CTL2C_RS03460 -L3404_RS02090 AQ193_RS01870 -L3404_RS02090 CBP48_RS03525 -L3404_RS02090 119518 -L3404_RS02090 L1224_RS02090 -L3404_RS02090 KW36_RS02110 -L3404_RS02090 AOT15_RS03110 -L3404_RS02090 BKB95_RS02140 -L3404_RS02090 BKB96_RS02120 -L3404_RS02090 SW2_RS02115 -L3404_RS02090 BKB99_RS02120 -L3404_RS02090 L1440_RS02090 -L3404_RS02090 ECS102511_RS02115 -L3404_RS02090 CTB_RS02140 -L3404_RS02090 CBP42_RS03535 -L3404_RS02090 SOTONIA3_RS02125 -L3404_RS02090 L2BUCH2_RS02090 -L3404_RS02090 BKB92_RS02130 -L3404_RS02090 CTO_RS02140 -L3404_RS02090 E150_RS02120 -L3404_RS02090 L2BLST_RS02090 -L3404_RS02090 BW688_RS03520 -L3404_RS02090 FCS84708_RS02110 -L3404_RS02090 BBV13_RS02145 -L3404_RS02090 BKB93_RS02130 -L3404_RS02090 CBP44_RS03530 -L3404_RS02090 AQ199_RS02810 -L3404_RS02090 G9768_RS02115 -L3404_RS02090 AP288_RS00965 -L3404_RS02090 BBV16_RS02145 -L3404_RS02255 L3404_RS02255 -L3404_RS02255 BKC02_RS02295 -L3404_RS02255 BKC01_RS02295 -L3404_RS02255 gnl|Prokka|PADJNBJD_00450 -L3404_RS02255 AKW53_RS03780 -L3404_RS02255 NILJEPDF_00450 -L3404_RS02255 LJHENM_02270 -L3404_RS02255 CTRC943_RS02260 -L3404_RS02255 AQ244_RS00830 -L3404_RS02255 JIEJKO_02270 -L3404_RS02255 BKC03_RS02295 -L3404_RS02255 QSDFRQ_00450 -L3404_RS02255 CTJTET1_RS02290 -L3404_RS02255 C15_RS0102325 -L3404_RS02255 SOTONK1_RS02280 -L3404_RS02255 DU10_RS02320 -L3404_RS02255 A5291_RS02310 -L3404_RS02255 KW39_RS02290 -L3404_RS02255 IaCS19096_RS02275 -L3404_RS02255 ECS88FINAL_RS0102325 -L3404_RS02255 O169_RS02290 -L3404_RS02255 DU13_RS02315 -L3404_RS02255 7618573 -L3404_RS02255 AQ193_RS01705 -L3404_RS02255 BKB96_RS02300 -L3404_RS02255 BKB99_RS02295 -L3404_RS02255 CBP48_RS03700 -L3404_RS02255 119550 -L3404_RS02255 CTL2C_RS03630 -L3404_RS02255 KW36_RS02275 -L3404_RS02255 AOT15_RS03275 -L3404_RS02255 BKB95_RS02315 -L3404_RS02255 L1224_RS02260 -L3404_RS02255 SW2_RS02285 -L3404_RS02255 ECS102511_RS02280 -L3404_RS02255 L1440_RS02260 -L3404_RS02255 CBP42_RS03710 -L3404_RS02255 CTB_RS02310 -L3404_RS02255 L2BUCH2_RS02255 -L3404_RS02255 BKB92_RS02305 -L3404_RS02255 SOTONIA3_RS02295 -L3404_RS02255 CTO_RS02310 -L3404_RS02255 E150_RS02285 -L3404_RS02255 BW688_RS03695 -L3404_RS02255 L2BLST_RS02260 -L3404_RS02255 FCS84708_RS02275 -L3404_RS02255 BBV13_RS02315 -L3404_RS02255 CBP44_RS03705 -L3404_RS02255 BKB93_RS02310 -L3404_RS02255 AQ199_RS02975 -L3404_RS02255 G9768_RS02280 -L3404_RS02255 AP288_RS00800 -L3404_RS02255 BBV16_RS02320 -L3404_RS02415 L3404_RS02415 -L3404_RS02415 BKC02_RS02460 -L3404_RS02415 gnl|Prokka|PADJNBJD_00481 -L3404_RS02415 AKW53_RS03940 -L3404_RS02415 BKC01_RS02460 -L3404_RS02415 NILJEPDF_00481 -L3404_RS02415 LJHENM_02425 -L3404_RS02415 CTRC943_RS02420 -L3404_RS02415 AQ244_RS00670 -L3404_RS02415 JIEJKO_02425 -L3404_RS02415 QSDFRQ_00481 -L3404_RS02415 BKC03_RS02460 -L3404_RS02415 SOTONK1_RS02440 -L3404_RS02415 CTJTET1_RS02450 -L3404_RS02415 C15_RS0102500 -L3404_RS02415 DU10_RS02480 -L3404_RS02415 KW39_RS02450 -L3404_RS02415 IaCS19096_RS02435 -L3404_RS02415 A5291_RS02475 -L3404_RS02415 ECS88FINAL_RS0102495 -L3404_RS02415 7619015 -L3404_RS02415 O169_RS02450 -L3404_RS02415 DU13_RS02475 -L3404_RS02415 BKB96_RS02465 -L3404_RS02415 BKB99_RS02460 -L3404_RS02415 CBP48_RS03860 -L3404_RS02415 AQ193_RS01545 -L3404_RS02415 BKB95_RS02475 -L3404_RS02415 CTL2C_RS03790 -L3404_RS02415 KW36_RS02435 -L3404_RS02415 120272 -L3404_RS02415 L1224_RS02420 -L3404_RS02415 SW2_RS02445 -L3404_RS02415 ECS102511_RS02440 -L3404_RS02415 AOT15_RS03655 -L3404_RS02415 L1440_RS02420 -L3404_RS02415 CBP42_RS03870 -L3404_RS02415 L2BUCH2_RS02415 -L3404_RS02415 BKB92_RS02465 -L3404_RS02415 CTB_RS02475 -L3404_RS02415 SOTONIA3_RS02455 -L3404_RS02415 E150_RS02445 -L3404_RS02415 CTO_RS02475 -L3404_RS02415 BW688_RS03860 -L3404_RS02415 BBV13_RS02480 -L3404_RS02415 CBP44_RS03865 -L3404_RS02415 L2BLST_RS02420 -L3404_RS02415 FCS84708_RS02435 -L3404_RS02415 BKB93_RS02470 -L3404_RS02415 BBV16_RS02485 -L3404_RS02415 AQ199_RS03135 -L3404_RS02415 G9768_RS02440 -L3404_RS02415 AP288_RS00640 -L3404_RS02595 L3404_RS02595 -L3404_RS02595 BKC02_RS02640 -L3404_RS02595 AP288_RS00460 -L3404_RS02595 BKC01_RS02640 -L3404_RS02595 gnl|Prokka|PADJNBJD_00517 -L3404_RS02595 NILJEPDF_00517 -L3404_RS02595 LJHENM_02600 -L3404_RS02595 CTRC943_RS02600 -L3404_RS02595 SOTONK1_RS02620 -L3404_RS02595 CTJTET1_RS02630 -L3404_RS02595 AQ244_RS00490 -L3404_RS02595 JIEJKO_02605 -L3404_RS02595 BKC03_RS02640 -L3404_RS02595 QSDFRQ_00517 -L3404_RS02595 KW39_RS02630 -L3404_RS02595 C15_RS0102685 -L3404_RS02595 ECS88FINAL_RS0102680 -L3404_RS02595 IaCS19096_RS02615 -L3404_RS02595 DU10_RS02660 -L3404_RS02595 O169_RS02630 -L3404_RS02595 A5291_RS02655 -L3404_RS02595 DU13_RS02655 -L3404_RS02595 CBP48_RS04040 -L3404_RS02595 CTL2C_RS03970 -L3404_RS02595 KW36_RS02615 -L3404_RS02595 BKB95_RS02655 -L3404_RS02595 BKB96_RS02645 -L3404_RS02595 BKB99_RS02640 -L3404_RS02595 7619031 -L3404_RS02595 SW2_RS02625 -L3404_RS02595 L1224_RS02600 -L3404_RS02595 ECS102511_RS02620 -L3404_RS02595 AQ193_RS01365 -L3404_RS02595 L1440_RS02600 -L3404_RS02595 AOT15_RS03475 -L3404_RS02595 CBP42_RS04050 -L3404_RS02595 120245 -L3404_RS02595 L2BUCH2_RS02600 -L3404_RS02595 SOTONIA3_RS02635 -L3404_RS02595 BKB92_RS02645 -L3404_RS02595 CTB_RS02655 -L3404_RS02595 E150_RS02625 -L3404_RS02595 BW688_RS04040 -L3404_RS02595 CTO_RS02655 -L3404_RS02595 FCS84708_RS02615 -L3404_RS02595 L2BLST_RS02600 -L3404_RS02595 BBV13_RS02660 -L3404_RS02595 CBP44_RS04045 -L3404_RS02595 AKW53_RS04595 -L3404_RS02595 AQ199_RS03315 -L3404_RS02595 BKB93_RS02650 -L3404_RS02595 BBV16_RS02670 -L3404_RS02595 G9768_RS02620 -L3404_RS02760 L3404_RS02760 -L3404_RS02760 BKC02_RS02810 -L3404_RS02760 gnl|Prokka|PADJNBJD_00549 -L3404_RS02760 AP288_RS00295 -L3404_RS02760 NILJEPDF_00549 -L3404_RS02760 BKC01_RS02810 -L3404_RS02760 LJHENM_02765 -L3404_RS02760 CTRC943_RS02765 -L3404_RS02760 AOT15_RS01585 -L3404_RS02760 QSDFRQ_00549 -L3404_RS02760 JIEJKO_02770 -L3404_RS02760 SOTONK1_RS02785 -L3404_RS02760 CTJTET1_RS02795 -L3404_RS02760 AQ244_RS00325 -L3404_RS02760 BKC03_RS02810 -L3404_RS02760 KW39_RS02795 -L3404_RS02760 C15_RS0102855 -L3404_RS02760 ECS88FINAL_RS0102850 -L3404_RS02760 IaCS19096_RS02780 -L3404_RS02760 DU10_RS02830 -L3404_RS02760 O169_RS02795 -L3404_RS02760 A5291_RS02820 -L3404_RS02760 DU13_RS02825 -L3404_RS02760 CBP48_RS04210 -L3404_RS02760 7619060 -L3404_RS02760 CTL2C_RS04135 -L3404_RS02760 KW36_RS02780 -L3404_RS02760 AKW53_RS04010 -L3404_RS02760 BKB95_RS02825 -L3404_RS02760 BKB96_RS02815 -L3404_RS02760 BKB99_RS02810 -L3404_RS02760 SW2_RS02790 -L3404_RS02760 L1224_RS02765 -L3404_RS02760 ECS102511_RS02785 -L3404_RS02760 AQ193_RS01200 -L3404_RS02760 L1440_RS02765 -L3404_RS02760 120200 -L3404_RS02760 CBP42_RS04220 -L3404_RS02760 L2BUCH2_RS02765 -L3404_RS02760 SOTONIA3_RS02800 -L3404_RS02760 BKB92_RS02815 -L3404_RS02760 CTB_RS02820 -L3404_RS02760 E150_RS02790 -L3404_RS02760 BW688_RS04210 -L3404_RS02760 CTO_RS02820 -L3404_RS02760 FCS84708_RS02780 -L3404_RS02760 L2BLST_RS02765 -L3404_RS02760 BBV13_RS02825 -L3404_RS02760 CBP44_RS04215 -L3404_RS02760 AQ199_RS03480 -L3404_RS02760 BKB93_RS02820 -L3404_RS02760 BBV16_RS02835 -L3404_RS02760 G9768_RS02785 -L3404_RS02925 L3404_RS02925 -L3404_RS02925 AP288_RS00130 -L3404_RS02925 BKC02_RS02980 -L3404_RS02925 gnl|Prokka|PADJNBJD_00582 -L3404_RS02925 AOT15_RS03750 -L3404_RS02925 NILJEPDF_00582 -L3404_RS02925 BKC01_RS02980 -L3404_RS02925 LJHENM_02930 -L3404_RS02925 CTRC943_RS02930 -L3404_RS02925 QSDFRQ_00582 -L3404_RS02925 JIEJKO_02935 -L3404_RS02925 SOTONK1_RS02950 -L3404_RS02925 CTJTET1_RS02960 -L3404_RS02925 AQ244_RS00160 -L3404_RS02925 BKC03_RS02980 -L3404_RS02925 C15_RS0103020 -L3404_RS02925 KW39_RS02965 -L3404_RS02925 IaCS19096_RS02945 -L3404_RS02925 ECS88FINAL_RS0103020 -L3404_RS02925 DU10_RS03000 -L3404_RS02925 A5291_RS02985 -L3404_RS02925 O169_RS02960 -L3404_RS02925 DU13_RS02995 -L3404_RS02925 CBP48_RS04380 -L3404_RS02925 CTL2C_RS04300 -L3404_RS02925 KW36_RS02945 -L3404_RS02925 BKB95_RS02995 -L3404_RS02925 BKB96_RS02985 -L3404_RS02925 BKB99_RS02980 -L3404_RS02925 L1224_RS02930 -L3404_RS02925 AKW53_RS04180 -L3404_RS02925 AQ193_RS01035 -L3404_RS02925 7619086 -L3404_RS02925 SW2_RS02955 -L3404_RS02925 ECS102511_RS02950 -L3404_RS02925 L1440_RS02930 -L3404_RS02925 CBP42_RS04390 -L3404_RS02925 L2BUCH2_RS02930 -L3404_RS02925 120159 -L3404_RS02925 SOTONIA3_RS02965 -L3404_RS02925 CTB_RS02985 -L3404_RS02925 BKB92_RS02985 -L3404_RS02925 E150_RS02955 -L3404_RS02925 BW688_RS04380 -L3404_RS02925 CTO_RS02985 -L3404_RS02925 L2BLST_RS02930 -L3404_RS02925 FCS84708_RS02950 -L3404_RS02925 BBV13_RS02990 -L3404_RS02925 CBP44_RS04385 -L3404_RS02925 AQ199_RS03650 -L3404_RS02925 BBV16_RS03000 -L3404_RS02925 BKB93_RS02990 -L3404_RS02925 G9768_RS02950 -CTRC943_RS00045 CTRC943_RS00045 -CTRC943_RS00045 O169_RS00045 -CTRC943_RS00045 CBP48_RS01435 -CTRC943_RS00045 ECS88FINAL_RS0100050 -CTRC943_RS00045 DU13_RS00045 -CTRC943_RS00045 KW39_RS00045 -CTRC943_RS00045 BKB95_RS00045 -CTRC943_RS00045 KW36_RS00045 -CTRC943_RS00045 SW2_RS00045 -CTRC943_RS00045 AOT15_RS00910 -CTRC943_RS00045 ECS102511_RS00045 -CTRC943_RS00045 CTB_RS00045 -CTRC943_RS00045 CTL2C_RS01410 -CTRC943_RS00045 CBP42_RS01435 -CTRC943_RS00045 L1224_RS00045 -CTRC943_RS00045 BKB96_RS00045 -CTRC943_RS00045 BKB99_RS00045 -CTRC943_RS00045 CTO_RS00045 -CTRC943_RS00045 SOTONIA3_RS00045 -CTRC943_RS00045 L1440_RS00045 -CTRC943_RS00045 BKB92_RS00045 -CTRC943_RS00045 120661 -CTRC943_RS00045 CBP44_RS01435 -CTRC943_RS00045 E150_RS00045 -CTRC943_RS00045 L2BUCH2_RS00045 -CTRC943_RS00045 BKB93_RS00045 -CTRC943_RS00045 FCS84708_RS00045 -CTRC943_RS00045 AP288_RS03115 -CTRC943_RS00045 AQ193_RS03960 -CTRC943_RS00045 BBV13_RS00045 -CTRC943_RS00045 G9768_RS00045 -CTRC943_RS00045 BW688_RS01435 -CTRC943_RS00045 L2BLST_RS00045 -CTRC943_RS00045 AQ199_RS00740 -CTRC943_RS00045 AQ244_RS01945 -CTRC943_RS00045 BKC02_RS00045 -CTRC943_RS00045 BBV16_RS00045 -CTRC943_RS00045 BKC01_RS00045 -CTRC943_RS00045 7618781 -CTRC943_RS00045 gnl|Prokka|PADJNBJD_00009 -CTRC943_RS00045 LJHENM_00045 -CTRC943_RS00045 A5291_RS00045 -CTRC943_RS00045 SOTONK1_RS00045 -CTRC943_RS00045 JIEJKO_00040 -CTRC943_RS00045 NILJEPDF_00009 -CTRC943_RS00045 L3404_RS00045 -CTRC943_RS00045 IaCS19096_RS00045 -CTRC943_RS00045 BKC03_RS00045 -CTRC943_RS00045 C15_RS0100045 -CTRC943_RS00045 QSDFRQ_00009 -CTRC943_RS00045 CTJTET1_RS00045 -CTRC943_RS00045 AKW53_RS01530 -CTRC943_RS00045 DU10_RS00045 -CTRC943_RS00215 CTRC943_RS00215 -CTRC943_RS00215 CTJTET1_RS00215 -CTRC943_RS00215 O169_RS00215 -CTRC943_RS00215 CBP48_RS01610 -CTRC943_RS00215 ECS88FINAL_RS0100220 -CTRC943_RS00215 DU13_RS00220 -CTRC943_RS00215 KW39_RS00215 -CTRC943_RS00215 KW36_RS00215 -CTRC943_RS00215 BKB95_RS00220 -CTRC943_RS00215 SW2_RS00215 -CTRC943_RS00215 AOT15_RS00740 -CTRC943_RS00215 ECS102511_RS00215 -CTRC943_RS00215 CTL2C_RS01580 -CTRC943_RS00215 CBP42_RS01610 -CTRC943_RS00215 CTB_RS00215 -CTRC943_RS00215 L1224_RS00215 -CTRC943_RS00215 BKB96_RS00220 -CTRC943_RS00215 L1440_RS00215 -CTRC943_RS00215 BKB99_RS00220 -CTRC943_RS00215 BKB92_RS00220 -CTRC943_RS00215 CTO_RS00215 -CTRC943_RS00215 SOTONIA3_RS00215 -CTRC943_RS00215 119238 -CTRC943_RS00215 CBP44_RS01615 -CTRC943_RS00215 E150_RS00215 -CTRC943_RS00215 L2BUCH2_RS00215 -CTRC943_RS00215 BKB93_RS00220 -CTRC943_RS00215 FCS84708_RS00215 -CTRC943_RS00215 AP288_RS03285 -CTRC943_RS00215 AQ193_RS03790 -CTRC943_RS00215 BBV13_RS00220 -CTRC943_RS00215 AQ199_RS00910 -CTRC943_RS00215 AQ244_RS01775 -CTRC943_RS00215 BW688_RS01610 -CTRC943_RS00215 G9768_RS00215 -CTRC943_RS00215 L2BLST_RS00215 -CTRC943_RS00215 BKC02_RS00220 -CTRC943_RS00215 gnl|Prokka|PADJNBJD_00042 -CTRC943_RS00215 BBV16_RS00220 -CTRC943_RS00215 JIEJKO_00205 -CTRC943_RS00215 NILJEPDF_00042 -CTRC943_RS00215 LJHENM_00215 -CTRC943_RS00215 BKC01_RS00220 -CTRC943_RS00215 7618376 -CTRC943_RS00215 A5291_RS00215 -CTRC943_RS00215 SOTONK1_RS00215 -CTRC943_RS00215 L3404_RS00215 -CTRC943_RS00215 AKW53_RS01705 -CTRC943_RS00215 QSDFRQ_00042 -CTRC943_RS00215 IaCS19096_RS00215 -CTRC943_RS00215 BKC03_RS00220 -CTRC943_RS00215 C15_RS0100215 -CTRC943_RS00215 DU10_RS00220 -CTRC943_RS00380 CTRC943_RS00380 -CTRC943_RS00380 CTJTET1_RS00380 -CTRC943_RS00380 O169_RS00380 -CTRC943_RS00380 KW36_RS00380 -CTRC943_RS00380 DU13_RS00395 -CTRC943_RS00380 CBP48_RS01780 -CTRC943_RS00380 ECS88FINAL_RS0100395 -CTRC943_RS00380 KW39_RS00380 -CTRC943_RS00380 BKB95_RS00390 -CTRC943_RS00380 SW2_RS00380 -CTRC943_RS00380 AOT15_RS00575 -CTRC943_RS00380 ECS102511_RS00380 -CTRC943_RS00380 CTB_RS00380 -CTRC943_RS00380 CTL2C_RS01745 -CTRC943_RS00380 CBP42_RS01780 -CTRC943_RS00380 BKB96_RS00390 -CTRC943_RS00380 L1224_RS00380 -CTRC943_RS00380 BKB99_RS00390 -CTRC943_RS00380 CTO_RS00380 -CTRC943_RS00380 L1440_RS00380 -CTRC943_RS00380 BKB92_RS00390 -CTRC943_RS00380 SOTONIA3_RS00380 -CTRC943_RS00380 CBP44_RS01785 -CTRC943_RS00380 119267 -CTRC943_RS00380 E150_RS00380 -CTRC943_RS00380 L2BUCH2_RS00380 -CTRC943_RS00380 BKB93_RS00390 -CTRC943_RS00380 FCS84708_RS00380 -CTRC943_RS00380 AP288_RS03450 -CTRC943_RS00380 BBV13_RS00385 -CTRC943_RS00380 AQ193_RS03615 -CTRC943_RS00380 AQ199_RS01075 -CTRC943_RS00380 AQ244_RS01610 -CTRC943_RS00380 BW688_RS01780 -CTRC943_RS00380 G9768_RS00380 -CTRC943_RS00380 L2BLST_RS00380 -CTRC943_RS00380 BKC02_RS00390 -CTRC943_RS00380 BBV16_RS00385 -CTRC943_RS00380 gnl|Prokka|PADJNBJD_00075 -CTRC943_RS00380 NILJEPDF_00075 -CTRC943_RS00380 LJHENM_00380 -CTRC943_RS00380 A5291_RS00380 -CTRC943_RS00380 BKC01_RS00390 -CTRC943_RS00380 SOTONK1_RS00380 -CTRC943_RS00380 L3404_RS00380 -CTRC943_RS00380 JIEJKO_00380 -CTRC943_RS00380 AKW53_RS01870 -CTRC943_RS00380 QSDFRQ_00075 -CTRC943_RS00380 IaCS19096_RS00380 -CTRC943_RS00380 BKC03_RS00390 -CTRC943_RS00380 C15_RS0100390 -CTRC943_RS00380 DU10_RS00390 -CTRC943_RS00380 7618395 -CTRC943_RS00540 CTRC943_RS00540 -CTRC943_RS00540 KW39_RS00540 -CTRC943_RS00540 ECS88FINAL_RS0100555 -CTRC943_RS00540 KW36_RS00540 -CTRC943_RS00540 CBP48_RS01940 -CTRC943_RS00540 SW2_RS00540 -CTRC943_RS00540 BKB95_RS00550 -CTRC943_RS00540 ECS102511_RS00540 -CTRC943_RS00540 AOT15_RS00415 -CTRC943_RS00540 CTB_RS00540 -CTRC943_RS00540 CTL2C_RS01905 -CTRC943_RS00540 AQ244_RS02715 -CTRC943_RS00540 BKB96_RS00550 -CTRC943_RS00540 CBP42_RS01940 -CTRC943_RS00540 BKB99_RS00550 -CTRC943_RS00540 L1224_RS00540 -CTRC943_RS00540 BKB92_RS00550 -CTRC943_RS00540 CTO_RS00540 -CTRC943_RS00540 SOTONIA3_RS00540 -CTRC943_RS00540 L1440_RS00540 -CTRC943_RS00540 E150_RS00540 -CTRC943_RS00540 CBP44_RS01945 -CTRC943_RS00540 120583 -CTRC943_RS00540 BKB93_RS00550 -CTRC943_RS00540 L2BUCH2_RS00540 -CTRC943_RS00540 AP288_RS03610 -CTRC943_RS00540 FCS84708_RS00540 -CTRC943_RS00540 AQ199_RS01235 -CTRC943_RS00540 BBV13_RS00545 -CTRC943_RS00540 G9768_RS00540 -CTRC943_RS00540 L2BLST_RS00540 -CTRC943_RS00540 BW688_RS01940 -CTRC943_RS00540 BKC02_RS00550 -CTRC943_RS00540 AQ193_RS03455 -CTRC943_RS00540 BBV16_RS00545 -CTRC943_RS00540 gnl|Prokka|PADJNBJD_00106 -CTRC943_RS00540 LJHENM_00530 -CTRC943_RS00540 BKC01_RS00550 -CTRC943_RS00540 NILJEPDF_00106 -CTRC943_RS00540 AKW53_RS02035 -CTRC943_RS00540 A5291_RS00540 -CTRC943_RS00540 SOTONK1_RS00540 -CTRC943_RS00540 JIEJKO_00535 -CTRC943_RS00540 L3404_RS00540 -CTRC943_RS00540 QSDFRQ_00106 -CTRC943_RS00540 IaCS19096_RS00540 -CTRC943_RS00540 BKC03_RS00550 -CTRC943_RS00540 C15_RS0100555 -CTRC943_RS00540 DU10_RS00550 -CTRC943_RS00540 CTJTET1_RS00540 -CTRC943_RS00540 O169_RS00540 -CTRC943_RS00540 DU13_RS00555 -CTRC943_RS00540 7618831 -CTRC943_RS01245 CTRC943_RS01245 -CTRC943_RS01245 CTJTET1_RS01275 -CTRC943_RS01245 KW39_RS01265 -CTRC943_RS01245 JIEJKO_01240 -CTRC943_RS01245 C15_RS0101295 -CTRC943_RS01245 SOTONK1_RS01260 -CTRC943_RS01245 ECS88FINAL_RS0101280 -CTRC943_RS01245 QSDFRQ_00247 -CTRC943_RS01245 A5291_RS01285 -CTRC943_RS01245 IaCS19096_RS01260 -CTRC943_RS01245 O169_RS01265 -CTRC943_RS01245 DU13_RS01270 -CTRC943_RS01245 7618894 -CTRC943_RS01245 SW2_RS01255 -CTRC943_RS01245 BKB95_RS01275 -CTRC943_RS01245 CBP48_RS02650 -CTRC943_RS01245 KW36_RS01260 -CTRC943_RS01245 ECS102511_RS01255 -CTRC943_RS01245 BKB96_RS01260 -CTRC943_RS01245 CTL2C_RS02610 -CTRC943_RS01245 BKB99_RS01260 -CTRC943_RS01245 L1224_RS01240 -CTRC943_RS01245 AOT15_RS01105 -CTRC943_RS01245 L1440_RS01240 -CTRC943_RS01245 AQ244_RS03440 -CTRC943_RS01245 BKB92_RS01260 -CTRC943_RS01245 CBP42_RS02650 -CTRC943_RS01245 SOTONIA3_RS01275 -CTRC943_RS01245 CTB_RS01285 -CTRC943_RS01245 E150_RS01255 -CTRC943_RS01245 L2BUCH2_RS01245 -CTRC943_RS01245 CTO_RS01285 -CTRC943_RS01245 FCS84708_RS01255 -CTRC943_RS01245 AP288_RS04325 -CTRC943_RS01245 BKB93_RS01260 -CTRC943_RS01245 CBP44_RS02655 -CTRC943_RS01245 AQ199_RS01950 -CTRC943_RS01245 L2BLST_RS01245 -CTRC943_RS01245 BW688_RS02655 -CTRC943_RS01245 AQ193_RS02735 -CTRC943_RS01245 BBV13_RS01290 -CTRC943_RS01245 G9768_RS01265 -CTRC943_RS01245 BKC02_RS01260 -CTRC943_RS01245 L3404_RS01240 -CTRC943_RS01245 AKW53_RS02750 -CTRC943_RS01245 BBV16_RS01290 -CTRC943_RS01245 BKC01_RS01260 -CTRC943_RS01245 gnl|Prokka|PADJNBJD_00247 -CTRC943_RS01245 DU10_RS01270 -CTRC943_RS01245 NILJEPDF_00247 -CTRC943_RS01245 LJHENM_01240 -CTRC943_RS01245 BKC03_RS01260 -CTRC943_RS01245 120476 -CTRC943_RS01405 CTRC943_RS01405 -CTRC943_RS01405 CTJTET1_RS01435 -CTRC943_RS01405 KW39_RS01425 -CTRC943_RS01405 JIEJKO_01405 -CTRC943_RS01405 120451 -CTRC943_RS01405 C15_RS0101460 -CTRC943_RS01405 SOTONK1_RS01425 -CTRC943_RS01405 ECS88FINAL_RS0101445 -CTRC943_RS01405 QSDFRQ_00279 -CTRC943_RS01405 IaCS19096_RS01420 -CTRC943_RS01405 A5291_RS01450 -CTRC943_RS01405 O169_RS01430 -CTRC943_RS01405 DU13_RS01435 -CTRC943_RS01405 7618910 -CTRC943_RS01405 SW2_RS01415 -CTRC943_RS01405 BKB95_RS01440 -CTRC943_RS01405 CBP48_RS02815 -CTRC943_RS01405 KW36_RS01420 -CTRC943_RS01405 ECS102511_RS01415 -CTRC943_RS01405 AOT15_RS02420 -CTRC943_RS01405 BKB96_RS01425 -CTRC943_RS01405 CTL2C_RS02770 -CTRC943_RS01405 BKB99_RS01425 -CTRC943_RS01405 L1224_RS01400 -CTRC943_RS01405 L1440_RS01400 -CTRC943_RS01405 AQ244_RS03605 -CTRC943_RS01405 CBP42_RS02815 -CTRC943_RS01405 SOTONIA3_RS01435 -CTRC943_RS01405 BKB92_RS01430 -CTRC943_RS01405 CTB_RS01450 -CTRC943_RS01405 E150_RS01420 -CTRC943_RS01405 L2BUCH2_RS01405 -CTRC943_RS01405 CTO_RS01445 -CTRC943_RS01405 FCS84708_RS01415 -CTRC943_RS01405 AP288_RS04485 -CTRC943_RS01405 BKB93_RS01430 -CTRC943_RS01405 CBP44_RS02820 -CTRC943_RS01405 AQ199_RS02110 -CTRC943_RS01405 L2BLST_RS01405 -CTRC943_RS01405 AQ193_RS02570 -CTRC943_RS01405 BBV13_RS01455 -CTRC943_RS01405 BW688_RS02825 -CTRC943_RS01405 G9768_RS01425 -CTRC943_RS01405 BKC02_RS01425 -CTRC943_RS01405 AKW53_RS02915 -CTRC943_RS01405 BBV16_RS01455 -CTRC943_RS01405 L3404_RS01400 -CTRC943_RS01405 BKC01_RS01430 -CTRC943_RS01405 gnl|Prokka|PADJNBJD_00279 -CTRC943_RS01405 DU10_RS01435 -CTRC943_RS01405 NILJEPDF_00279 -CTRC943_RS01405 LJHENM_01405 -CTRC943_RS01405 BKC03_RS01425 -CTRC943_RS01570 CTRC943_RS01570 -CTRC943_RS01570 LJHENM_01570 -CTRC943_RS01570 BKC03_RS01590 -CTRC943_RS01570 DU10_RS01605 -CTRC943_RS01570 CTJTET1_RS01600 -CTRC943_RS01570 KW39_RS01590 -CTRC943_RS01570 JIEJKO_01570 -CTRC943_RS01570 C15_RS0101630 -CTRC943_RS01570 SOTONK1_RS01590 -CTRC943_RS01570 ECS88FINAL_RS0101610 -CTRC943_RS01570 120421 -CTRC943_RS01570 QSDFRQ_00312 -CTRC943_RS01570 IaCS19096_RS01585 -CTRC943_RS01570 A5291_RS01615 -CTRC943_RS01570 O169_RS01595 -CTRC943_RS01570 DU13_RS01600 -CTRC943_RS01570 CBP48_RS02980 -CTRC943_RS01570 7618929 -CTRC943_RS01570 SW2_RS01580 -CTRC943_RS01570 BKB95_RS01605 -CTRC943_RS01570 CTL2C_RS02935 -CTRC943_RS01570 KW36_RS01585 -CTRC943_RS01570 ECS102511_RS01580 -CTRC943_RS01570 AOT15_RS02585 -CTRC943_RS01570 BKB96_RS01590 -CTRC943_RS01570 L1224_RS01565 -CTRC943_RS01570 BKB99_RS01590 -CTRC943_RS01570 L1440_RS01565 -CTRC943_RS01570 CBP42_RS02980 -CTRC943_RS01570 AQ244_RS03770 -CTRC943_RS01570 SOTONIA3_RS01600 -CTRC943_RS01570 BKB92_RS01595 -CTRC943_RS01570 CTB_RS01615 -CTRC943_RS01570 E150_RS01585 -CTRC943_RS01570 L2BUCH2_RS01570 -CTRC943_RS01570 CTO_RS01610 -CTRC943_RS01570 FCS84708_RS01580 -CTRC943_RS01570 AP288_RS04650 -CTRC943_RS01570 CBP44_RS02985 -CTRC943_RS01570 AQ193_RS02405 -CTRC943_RS01570 BKB93_RS01595 -CTRC943_RS01570 L2BLST_RS01570 -CTRC943_RS01570 AQ199_RS02275 -CTRC943_RS01570 BW688_RS02990 -CTRC943_RS01570 BBV13_RS01620 -CTRC943_RS01570 G9768_RS01590 -CTRC943_RS01570 BKC02_RS01590 -CTRC943_RS01570 L3404_RS01565 -CTRC943_RS01570 AKW53_RS03080 -CTRC943_RS01570 BBV16_RS01620 -CTRC943_RS01570 BKC01_RS01595 -CTRC943_RS01570 gnl|Prokka|PADJNBJD_00312 -CTRC943_RS01570 NILJEPDF_00312 -CTRC943_RS01745 CTRC943_RS01745 -CTRC943_RS01745 LJHENM_01750 -CTRC943_RS01745 JIEJKO_01745 -CTRC943_RS01745 BKC03_RS01770 -CTRC943_RS01745 CTJTET1_RS01775 -CTRC943_RS01745 DU10_RS01790 -CTRC943_RS01745 QSDFRQ_00347 -CTRC943_RS01745 C15_RS0101805 -CTRC943_RS01745 SOTONK1_RS01765 -CTRC943_RS01745 A5291_RS01790 -CTRC943_RS01745 KW39_RS01775 -CTRC943_RS01745 IaCS19096_RS01760 -CTRC943_RS01745 AP288_RS01315 -CTRC943_RS01745 119460 -CTRC943_RS01745 ECS88FINAL_RS0101795 -CTRC943_RS01745 O169_RS01775 -CTRC943_RS01745 DU13_RS01785 -CTRC943_RS01745 7618517 -CTRC943_RS01745 CTL2C_RS03110 -CTRC943_RS01745 BKB95_RS01785 -CTRC943_RS01745 CBP48_RS03170 -CTRC943_RS01745 L1224_RS01740 -CTRC943_RS01745 KW36_RS01760 -CTRC943_RS01745 AOT15_RS02760 -CTRC943_RS01745 AQ244_RS01345 -CTRC943_RS01745 BKB96_RS01770 -CTRC943_RS01745 SW2_RS01765 -CTRC943_RS01745 BKB99_RS01770 -CTRC943_RS01745 L1440_RS01740 -CTRC943_RS01745 ECS102511_RS01765 -CTRC943_RS01745 CBP42_RS03170 -CTRC943_RS01745 CTB_RS01790 -CTRC943_RS01745 SOTONIA3_RS01775 -CTRC943_RS01745 L2BUCH2_RS01740 -CTRC943_RS01745 BKB92_RS01780 -CTRC943_RS01745 AQ193_RS02220 -CTRC943_RS01745 CTO_RS01790 -CTRC943_RS01745 E150_RS01770 -CTRC943_RS01745 L2BLST_RS01740 -CTRC943_RS01745 FCS84708_RS01760 -CTRC943_RS01745 BW688_RS03170 -CTRC943_RS01745 BKB93_RS01780 -CTRC943_RS01745 CBP44_RS03175 -CTRC943_RS01745 BBV13_RS01795 -CTRC943_RS01745 AQ199_RS02460 -CTRC943_RS01745 G9768_RS01765 -CTRC943_RS01745 L3404_RS01740 -CTRC943_RS01745 BBV16_RS01795 -CTRC943_RS01745 BKC02_RS01770 -CTRC943_RS01745 BKC01_RS01770 -CTRC943_RS01745 AKW53_RS03265 -CTRC943_RS01745 gnl|Prokka|PADJNBJD_00347 -CTRC943_RS01745 NILJEPDF_00347 -CTRC943_RS01910 CTRC943_RS01910 -CTRC943_RS01910 LJHENM_01915 -CTRC943_RS01910 JIEJKO_01910 -CTRC943_RS01910 BKC03_RS01935 -CTRC943_RS01910 CTJTET1_RS01940 -CTRC943_RS01910 QSDFRQ_00380 -CTRC943_RS01910 C15_RS0101975 -CTRC943_RS01910 SOTONK1_RS01930 -CTRC943_RS01910 DU10_RS01960 -CTRC943_RS01910 A5291_RS01955 -CTRC943_RS01910 KW39_RS01940 -CTRC943_RS01910 IaCS19096_RS01925 -CTRC943_RS01910 AP288_RS01150 -CTRC943_RS01910 ECS88FINAL_RS0101965 -CTRC943_RS01910 O169_RS01940 -CTRC943_RS01910 DU13_RS01955 -CTRC943_RS01910 7618969 -CTRC943_RS01910 120345 -CTRC943_RS01910 CTL2C_RS03275 -CTRC943_RS01910 L1224_RS01905 -CTRC943_RS01910 KW36_RS01925 -CTRC943_RS01910 AOT15_RS02925 -CTRC943_RS01910 AQ244_RS01180 -CTRC943_RS01910 BKB95_RS01955 -CTRC943_RS01910 BKB96_RS01935 -CTRC943_RS01910 CBP48_RS03340 -CTRC943_RS01910 SW2_RS01930 -CTRC943_RS01910 BKB99_RS01935 -CTRC943_RS01910 L1440_RS01905 -CTRC943_RS01910 ECS102511_RS01930 -CTRC943_RS01910 CTB_RS01955 -CTRC943_RS01910 SOTONIA3_RS01940 -CTRC943_RS01910 L2BUCH2_RS01905 -CTRC943_RS01910 BKB92_RS01945 -CTRC943_RS01910 CBP42_RS03350 -CTRC943_RS01910 AQ193_RS02055 -CTRC943_RS01910 CTO_RS01955 -CTRC943_RS01910 E150_RS01935 -CTRC943_RS01910 L2BLST_RS01905 -CTRC943_RS01910 BW688_RS03335 -CTRC943_RS01910 FCS84708_RS01925 -CTRC943_RS01910 BKB93_RS01945 -CTRC943_RS01910 BBV13_RS01960 -CTRC943_RS01910 CBP44_RS03345 -CTRC943_RS01910 AQ199_RS02625 -CTRC943_RS01910 G9768_RS01930 -CTRC943_RS01910 L3404_RS01905 -CTRC943_RS01910 BBV16_RS01960 -CTRC943_RS01910 BKC02_RS01935 -CTRC943_RS01910 BKC01_RS01935 -CTRC943_RS01910 AKW53_RS03430 -CTRC943_RS01910 gnl|Prokka|PADJNBJD_00380 -CTRC943_RS01910 NILJEPDF_00380 -CTRC943_RS02070 CTRC943_RS02070 -CTRC943_RS02070 LJHENM_02075 -CTRC943_RS02070 JIEJKO_02070 -CTRC943_RS02070 BKC03_RS02095 -CTRC943_RS02070 CTJTET1_RS02100 -CTRC943_RS02070 QSDFRQ_00412 -CTRC943_RS02070 C15_RS0102135 -CTRC943_RS02070 A5291_RS02115 -CTRC943_RS02070 SOTONK1_RS02090 -CTRC943_RS02070 DU10_RS02120 -CTRC943_RS02070 KW39_RS02100 -CTRC943_RS02070 IaCS19096_RS02085 -CTRC943_RS02070 AP288_RS00990 -CTRC943_RS02070 ECS88FINAL_RS0102130 -CTRC943_RS02070 O169_RS02100 -CTRC943_RS02070 DU13_RS02115 -CTRC943_RS02070 7618547 -CTRC943_RS02070 CTL2C_RS03435 -CTRC943_RS02070 CBP48_RS03500 -CTRC943_RS02070 119510 -CTRC943_RS02070 L1224_RS02065 -CTRC943_RS02070 KW36_RS02085 -CTRC943_RS02070 AOT15_RS03085 -CTRC943_RS02070 AQ244_RS01020 -CTRC943_RS02070 BKB95_RS02115 -CTRC943_RS02070 BKB96_RS02095 -CTRC943_RS02070 SW2_RS02090 -CTRC943_RS02070 BKB99_RS02095 -CTRC943_RS02070 L1440_RS02065 -CTRC943_RS02070 ECS102511_RS02090 -CTRC943_RS02070 CTB_RS02115 -CTRC943_RS02070 CBP42_RS03510 -CTRC943_RS02070 SOTONIA3_RS02100 -CTRC943_RS02070 L2BUCH2_RS02065 -CTRC943_RS02070 BKB92_RS02105 -CTRC943_RS02070 CTO_RS02115 -CTRC943_RS02070 AQ193_RS01895 -CTRC943_RS02070 E150_RS02095 -CTRC943_RS02070 L2BLST_RS02065 -CTRC943_RS02070 BW688_RS03495 -CTRC943_RS02070 FCS84708_RS02085 -CTRC943_RS02070 BBV13_RS02120 -CTRC943_RS02070 BKB93_RS02105 -CTRC943_RS02070 CBP44_RS03505 -CTRC943_RS02070 AQ199_RS02785 -CTRC943_RS02070 G9768_RS02090 -CTRC943_RS02070 BBV16_RS02120 -CTRC943_RS02070 L3404_RS02065 -CTRC943_RS02070 BKC02_RS02095 -CTRC943_RS02070 BKC01_RS02095 -CTRC943_RS02070 AKW53_RS03590 -CTRC943_RS02070 gnl|Prokka|PADJNBJD_00412 -CTRC943_RS02070 NILJEPDF_00412 -CTRC943_RS02240 CTRC943_RS02240 -CTRC943_RS02240 LJHENM_02250 -CTRC943_RS02240 JIEJKO_02245 -CTRC943_RS02240 BKC03_RS02270 -CTRC943_RS02240 CTJTET1_RS02270 -CTRC943_RS02240 QSDFRQ_00446 -CTRC943_RS02240 C15_RS0102305 -CTRC943_RS02240 SOTONK1_RS02260 -CTRC943_RS02240 DU10_RS02295 -CTRC943_RS02240 A5291_RS02290 -CTRC943_RS02240 KW39_RS02270 -CTRC943_RS02240 IaCS19096_RS02255 -CTRC943_RS02240 AP288_RS00820 -CTRC943_RS02240 ECS88FINAL_RS0102305 -CTRC943_RS02240 O169_RS02270 -CTRC943_RS02240 DU13_RS02290 -CTRC943_RS02240 7618569 -CTRC943_RS02240 BKB96_RS02275 -CTRC943_RS02240 BKB99_RS02270 -CTRC943_RS02240 CBP48_RS03675 -CTRC943_RS02240 CTL2C_RS03610 -CTRC943_RS02240 KW36_RS02255 -CTRC943_RS02240 AOT15_RS03255 -CTRC943_RS02240 BKB95_RS02290 -CTRC943_RS02240 119544 -CTRC943_RS02240 L1224_RS02240 -CTRC943_RS02240 AQ244_RS00850 -CTRC943_RS02240 SW2_RS02265 -CTRC943_RS02240 ECS102511_RS02260 -CTRC943_RS02240 L1440_RS02240 -CTRC943_RS02240 CBP42_RS03685 -CTRC943_RS02240 CTB_RS02290 -CTRC943_RS02240 L2BUCH2_RS02235 -CTRC943_RS02240 BKB92_RS02280 -CTRC943_RS02240 SOTONIA3_RS02275 -CTRC943_RS02240 AQ193_RS01725 -CTRC943_RS02240 CTO_RS02290 -CTRC943_RS02240 E150_RS02265 -CTRC943_RS02240 BW688_RS03670 -CTRC943_RS02240 L2BLST_RS02240 -CTRC943_RS02240 FCS84708_RS02255 -CTRC943_RS02240 BBV13_RS02295 -CTRC943_RS02240 CBP44_RS03680 -CTRC943_RS02240 BKB93_RS02285 -CTRC943_RS02240 AQ199_RS02955 -CTRC943_RS02240 G9768_RS02260 -CTRC943_RS02240 BBV16_RS02300 -CTRC943_RS02240 L3404_RS02235 -CTRC943_RS02240 BKC02_RS02270 -CTRC943_RS02240 BKC01_RS02270 -CTRC943_RS02240 AKW53_RS03760 -CTRC943_RS02240 gnl|Prokka|PADJNBJD_00446 -CTRC943_RS02240 NILJEPDF_00446 -CTRC943_RS02395 CTRC943_RS02395 -CTRC943_RS02395 JIEJKO_02400 -CTRC943_RS02395 QSDFRQ_00476 -CTRC943_RS02395 BKC03_RS02435 -CTRC943_RS02395 CTJTET1_RS02425 -CTRC943_RS02395 AOT15_RS00040 -CTRC943_RS02395 C15_RS0102475 -CTRC943_RS02395 SOTONK1_RS02415 -CTRC943_RS02395 DU10_RS02455 -CTRC943_RS02395 KW39_RS02425 -CTRC943_RS02395 IaCS19096_RS02410 -CTRC943_RS02395 AP288_RS00665 -CTRC943_RS02395 A5291_RS02450 -CTRC943_RS02395 ECS88FINAL_RS0102470 -CTRC943_RS02395 7618582 -CTRC943_RS02395 O169_RS02425 -CTRC943_RS02395 DU13_RS02450 -CTRC943_RS02395 CBP48_RS03835 -CTRC943_RS02395 BKB95_RS02450 -CTRC943_RS02395 BKB96_RS02440 -CTRC943_RS02395 BKB99_RS02435 -CTRC943_RS02395 CTL2C_RS03765 -CTRC943_RS02395 KW36_RS02410 -CTRC943_RS02395 119564 -CTRC943_RS02395 L1224_RS02395 -CTRC943_RS02395 AQ244_RS00695 -CTRC943_RS02395 SW2_RS02420 -CTRC943_RS02395 ECS102511_RS02415 -CTRC943_RS02395 L1440_RS02395 -CTRC943_RS02395 CBP42_RS03845 -CTRC943_RS02395 L2BUCH2_RS02390 -CTRC943_RS02395 BKB92_RS02440 -CTRC943_RS02395 CTB_RS02450 -CTRC943_RS02395 SOTONIA3_RS02430 -CTRC943_RS02395 AQ193_RS01570 -CTRC943_RS02395 E150_RS02420 -CTRC943_RS02395 CTO_RS02450 -CTRC943_RS02395 BBV13_RS02455 -CTRC943_RS02395 BW688_RS03835 -CTRC943_RS02395 CBP44_RS03840 -CTRC943_RS02395 L2BLST_RS02395 -CTRC943_RS02395 FCS84708_RS02410 -CTRC943_RS02395 BKB93_RS02445 -CTRC943_RS02395 BBV16_RS02460 -CTRC943_RS02395 AQ199_RS03110 -CTRC943_RS02395 G9768_RS02415 -CTRC943_RS02395 L3404_RS02390 -CTRC943_RS02395 BKC02_RS02435 -CTRC943_RS02395 gnl|Prokka|PADJNBJD_00476 -CTRC943_RS02395 AKW53_RS03915 -CTRC943_RS02395 BKC01_RS02435 -CTRC943_RS02395 NILJEPDF_00476 -CTRC943_RS02395 LJHENM_02400 -CTRC943_RS02745 CTRC943_RS02745 -CTRC943_RS02745 AOT15_RS01565 -CTRC943_RS02745 QSDFRQ_00545 -CTRC943_RS02745 JIEJKO_02750 -CTRC943_RS02745 SOTONK1_RS02765 -CTRC943_RS02745 CTJTET1_RS02775 -CTRC943_RS02745 BKC03_RS02790 -CTRC943_RS02745 KW39_RS02775 -CTRC943_RS02745 C15_RS0102835 -CTRC943_RS02745 ECS88FINAL_RS0102830 -CTRC943_RS02745 IaCS19096_RS02760 -CTRC943_RS02745 DU10_RS02810 -CTRC943_RS02745 O169_RS02775 -CTRC943_RS02745 AP288_RS00315 -CTRC943_RS02745 A5291_RS02800 -CTRC943_RS02745 DU13_RS02805 -CTRC943_RS02745 CBP48_RS04190 -CTRC943_RS02745 7619056 -CTRC943_RS02745 CTL2C_RS04115 -CTRC943_RS02745 KW36_RS02760 -CTRC943_RS02745 AKW53_RS03990 -CTRC943_RS02745 BKB95_RS02805 -CTRC943_RS02745 BKB96_RS02795 -CTRC943_RS02745 BKB99_RS02790 -CTRC943_RS02745 SW2_RS02770 -CTRC943_RS02745 L1224_RS02745 -CTRC943_RS02745 ECS102511_RS02765 -CTRC943_RS02745 AQ244_RS00345 -CTRC943_RS02745 L1440_RS02745 -CTRC943_RS02745 120206 -CTRC943_RS02745 CBP42_RS04200 -CTRC943_RS02745 L2BUCH2_RS02745 -CTRC943_RS02745 SOTONIA3_RS02780 -CTRC943_RS02745 BKB92_RS02795 -CTRC943_RS02745 CTB_RS02800 -CTRC943_RS02745 E150_RS02770 -CTRC943_RS02745 AQ193_RS01220 -CTRC943_RS02745 BW688_RS04190 -CTRC943_RS02745 CTO_RS02800 -CTRC943_RS02745 FCS84708_RS02760 -CTRC943_RS02745 L2BLST_RS02745 -CTRC943_RS02745 BBV13_RS02805 -CTRC943_RS02745 CBP44_RS04195 -CTRC943_RS02745 AQ199_RS03460 -CTRC943_RS02745 BKB93_RS02800 -CTRC943_RS02745 BBV16_RS02815 -CTRC943_RS02745 G9768_RS02765 -CTRC943_RS02745 L3404_RS02740 -CTRC943_RS02745 BKC02_RS02790 -CTRC943_RS02745 gnl|Prokka|PADJNBJD_00545 -CTRC943_RS02745 NILJEPDF_00545 -CTRC943_RS02745 BKC01_RS02790 -CTRC943_RS02745 LJHENM_02745 -CTRC943_RS02910 CTRC943_RS02910 -CTRC943_RS02910 QSDFRQ_00578 -CTRC943_RS02910 JIEJKO_02915 -CTRC943_RS02910 SOTONK1_RS02930 -CTRC943_RS02910 CTJTET1_RS02940 -CTRC943_RS02910 BKC03_RS02960 -CTRC943_RS02910 C15_RS0103000 -CTRC943_RS02910 KW39_RS02945 -CTRC943_RS02910 IaCS19096_RS02925 -CTRC943_RS02910 AP288_RS00150 -CTRC943_RS02910 ECS88FINAL_RS0103000 -CTRC943_RS02910 DU10_RS02980 -CTRC943_RS02910 A5291_RS02965 -CTRC943_RS02910 O169_RS02940 -CTRC943_RS02910 DU13_RS02975 -CTRC943_RS02910 CBP48_RS04360 -CTRC943_RS02910 CTL2C_RS04280 -CTRC943_RS02910 KW36_RS02925 -CTRC943_RS02910 BKB95_RS02975 -CTRC943_RS02910 BKB96_RS02965 -CTRC943_RS02910 BKB99_RS02960 -CTRC943_RS02910 L1224_RS02910 -CTRC943_RS02910 AKW53_RS04160 -CTRC943_RS02910 AQ244_RS00180 -CTRC943_RS02910 7619085 -CTRC943_RS02910 SW2_RS02935 -CTRC943_RS02910 ECS102511_RS02930 -CTRC943_RS02910 L1440_RS02910 -CTRC943_RS02910 CBP42_RS04370 -CTRC943_RS02910 L2BUCH2_RS02910 -CTRC943_RS02910 120161 -CTRC943_RS02910 SOTONIA3_RS02945 -CTRC943_RS02910 CTB_RS02965 -CTRC943_RS02910 AQ193_RS01055 -CTRC943_RS02910 BKB92_RS02965 -CTRC943_RS02910 E150_RS02935 -CTRC943_RS02910 BW688_RS04360 -CTRC943_RS02910 CTO_RS02965 -CTRC943_RS02910 L2BLST_RS02910 -CTRC943_RS02910 FCS84708_RS02930 -CTRC943_RS02910 BBV13_RS02970 -CTRC943_RS02910 CBP44_RS04365 -CTRC943_RS02910 AQ199_RS03630 -CTRC943_RS02910 BBV16_RS02980 -CTRC943_RS02910 BKB93_RS02970 -CTRC943_RS02910 G9768_RS02930 -CTRC943_RS02910 L3404_RS02905 -CTRC943_RS02910 BKC02_RS02960 -CTRC943_RS02910 gnl|Prokka|PADJNBJD_00578 -CTRC943_RS02910 AOT15_RS03730 -CTRC943_RS02910 NILJEPDF_00578 -CTRC943_RS02910 BKC01_RS02960 -CTRC943_RS02910 LJHENM_02910 -CTRC943_RS03070 CTRC943_RS03070 -CTRC943_RS03070 BKC01_RS03130 -CTRC943_RS03070 QSDFRQ_00610 -CTRC943_RS03070 JIEJKO_03075 -CTRC943_RS03070 SOTONK1_RS03100 -CTRC943_RS03070 CTJTET1_RS03110 -CTRC943_RS03070 BKC03_RS03130 -CTRC943_RS03070 KW39_RS03110 -CTRC943_RS03070 C15_RS0103165 -CTRC943_RS03070 ECS88FINAL_RS0103165 -CTRC943_RS03070 IaCS19096_RS03095 -CTRC943_RS03070 DU10_RS03145 -CTRC943_RS03070 A5291_RS03130 -CTRC943_RS03070 O169_RS03105 -CTRC943_RS03070 AQ244_RS00010 -CTRC943_RS03070 CTL2C_RS04440 -CTRC943_RS03070 DU13_RS03140 -CTRC943_RS03070 CBP48_RS04530 -CTRC943_RS03070 L1224_RS03070 -CTRC943_RS03070 KW36_RS03095 -CTRC943_RS03070 BKB95_RS03140 -CTRC943_RS03070 AKW53_RS04325 -CTRC943_RS03070 BKB96_RS03135 -CTRC943_RS03070 BKB99_RS03130 -CTRC943_RS03070 7618630 -CTRC943_RS03070 SW2_RS03100 -CTRC943_RS03070 L1440_RS03070 -CTRC943_RS03070 ECS102511_RS03095 -CTRC943_RS03070 CBP42_RS04535 -CTRC943_RS03070 L2BUCH2_RS03070 -CTRC943_RS03070 AQ193_RS00890 -CTRC943_RS03070 CTB_RS03130 -CTRC943_RS03070 SOTONIA3_RS03115 -CTRC943_RS03070 BKB92_RS03130 -CTRC943_RS03070 BW688_RS04525 -CTRC943_RS03070 119638 -CTRC943_RS03070 E150_RS03100 -CTRC943_RS03070 CTO_RS03130 -CTRC943_RS03070 L2BLST_RS03070 -CTRC943_RS03070 CBP44_RS04530 -CTRC943_RS03070 FCS84708_RS03095 -CTRC943_RS03070 BBV13_RS03135 -CTRC943_RS03070 AQ199_RS03795 -CTRC943_RS03070 BBV16_RS03145 -CTRC943_RS03070 BKB93_RS03135 -CTRC943_RS03070 G9768_RS03100 -CTRC943_RS03070 L3404_RS03065 -CTRC943_RS03070 gnl|Prokka|PADJNBJD_00610 -CTRC943_RS03070 NILJEPDF_00610 -CTRC943_RS03070 LJHENM_03065 -CTRC943_RS03070 BKC02_RS03130 -CTRC943_RS03070 AOT15_RS03900 -CTRC943_RS03070 AP288_RS01465 -CTRC943_RS03240 CTRC943_RS03240 -CTRC943_RS03240 JIEJKO_03235 -CTRC943_RS03240 BKC01_RS03295 -CTRC943_RS03240 QSDFRQ_00643 -CTRC943_RS03240 KW39_RS03280 -CTRC943_RS03240 BKC03_RS03295 -CTRC943_RS03240 CTJTET1_RS03280 -CTRC943_RS03240 ECS88FINAL_RS0103330 -CTRC943_RS03240 DU10_RS03310 -CTRC943_RS03240 SOTONK1_RS03265 -CTRC943_RS03240 O169_RS03275 -CTRC943_RS03240 IaCS19096_RS03260 -CTRC943_RS03240 C15_RS0103330 -CTRC943_RS03240 A5291_RS03305 -CTRC943_RS03240 AKW53_RS00015 -CTRC943_RS03240 DU13_RS03305 -CTRC943_RS03240 CTL2C_RS04610 -CTRC943_RS03240 CBP48_RS04695 -CTRC943_RS03240 7619109 -CTRC943_RS03240 SW2_RS03270 -CTRC943_RS03240 L1224_RS03240 -CTRC943_RS03240 KW36_RS03265 -CTRC943_RS03240 ECS102511_RS03265 -CTRC943_RS03240 AQ244_RS04650 -CTRC943_RS03240 L1440_RS03240 -CTRC943_RS03240 BKB95_RS03310 -CTRC943_RS03240 BKB96_RS03305 -CTRC943_RS03240 BKB99_RS03300 -CTRC943_RS03240 CBP42_RS04700 -CTRC943_RS03240 L2BUCH2_RS03240 -CTRC943_RS03240 BKB92_RS03295 -CTRC943_RS03240 CTB_RS03305 -CTRC943_RS03240 E150_RS03270 -CTRC943_RS03240 SOTONIA3_RS03285 -CTRC943_RS03240 AQ193_RS00720 -CTRC943_RS03240 BW688_RS04690 -CTRC943_RS03240 CTO_RS03300 -CTRC943_RS03240 FCS84708_RS03265 -CTRC943_RS03240 BBV13_RS03305 -CTRC943_RS03240 L2BLST_RS03240 -CTRC943_RS03240 CBP44_RS04695 -CTRC943_RS03240 120121 -CTRC943_RS03240 AQ199_RS03965 -CTRC943_RS03240 BBV16_RS03315 -CTRC943_RS03240 BKB93_RS03300 -CTRC943_RS03240 G9768_RS03265 -CTRC943_RS03240 L3404_RS03235 -CTRC943_RS03240 gnl|Prokka|PADJNBJD_00642 -CTRC943_RS03240 AP288_RS01635 -CTRC943_RS03240 BKC02_RS03295 -CTRC943_RS03240 NILJEPDF_00643 -CTRC943_RS03240 LJHENM_03230 -CTRC943_RS03240 AOT15_RS04065 -CTRC943_RS03415 CTRC943_RS03415 -CTRC943_RS03415 BKC03_RS03465 -CTRC943_RS03415 CBP48_RS00035 -CTRC943_RS03415 CTJTET1_RS03450 -CTRC943_RS03415 KW39_RS03450 -CTRC943_RS03415 DU10_RS03480 -CTRC943_RS03415 SOTONK1_RS03430 -CTRC943_RS03415 ECS88FINAL_RS0103510 -CTRC943_RS03415 IaCS19096_RS03425 -CTRC943_RS03415 C15_RS0103505 -CTRC943_RS03415 A5291_RS03475 -CTRC943_RS03415 O169_RS03445 -CTRC943_RS03415 DU13_RS03480 -CTRC943_RS03415 AKW53_RS00180 -CTRC943_RS03415 BKB95_RS03485 -CTRC943_RS03415 CBP42_RS00035 -CTRC943_RS03415 SW2_RS03440 -CTRC943_RS03415 CTL2C_RS00035 -CTRC943_RS03415 L1224_RS03415 -CTRC943_RS03415 ECS102511_RS03430 -CTRC943_RS03415 L1440_RS03415 -CTRC943_RS03415 BKB96_RS03475 -CTRC943_RS03415 BKB99_RS03470 -CTRC943_RS03415 AQ244_RS04480 -CTRC943_RS03415 CBP44_RS00035 -CTRC943_RS03415 L2BUCH2_RS03415 -CTRC943_RS03415 BKB92_RS03465 -CTRC943_RS03415 CTB_RS03470 -CTRC943_RS03415 SOTONIA3_RS03450 -CTRC943_RS03415 E150_RS03440 -CTRC943_RS03415 AQ193_RS00555 -CTRC943_RS03415 CTO_RS03465 -CTRC943_RS03415 BBV13_RS03470 -CTRC943_RS03415 FCS84708_RS03430 -CTRC943_RS03415 L2BLST_RS03415 -CTRC943_RS03415 7618208 -CTRC943_RS03415 BBV16_RS03480 -CTRC943_RS03415 BW688_RS00035 -CTRC943_RS03415 AQ199_RS04130 -CTRC943_RS03415 BKB93_RS03470 -CTRC943_RS03415 G9768_RS03430 -CTRC943_RS03415 gnl|Prokka|PADJNBJD_00675 -CTRC943_RS03415 L3404_RS03410 -CTRC943_RS03415 BKC02_RS03465 -CTRC943_RS03415 NILJEPDF_00676 -CTRC943_RS03415 LJHENM_03395 -CTRC943_RS03415 AOT15_RS04230 -CTRC943_RS03415 AP288_RS01800 -CTRC943_RS03415 JIEJKO_03400 -CTRC943_RS03415 BKC01_RS03465 -CTRC943_RS03415 QSDFRQ_00676 -CTRC943_RS03415 119687 F -CTRC943_RS03415 119689 F -CTRC943_RS03585 CTRC943_RS03585 -CTRC943_RS03585 BKC03_RS03630 -CTRC943_RS03585 CBP48_RS00200 -CTRC943_RS03585 CTJTET1_RS03620 -CTRC943_RS03585 KW39_RS03615 -CTRC943_RS03585 DU10_RS03645 -CTRC943_RS03585 SOTONK1_RS03600 -CTRC943_RS03585 ECS88FINAL_RS0103690 -CTRC943_RS03585 IaCS19096_RS03595 -CTRC943_RS03585 C15_RS0103680 -CTRC943_RS03585 A5291_RS03645 -CTRC943_RS03585 O169_RS03610 -CTRC943_RS03585 DU13_RS03645 -CTRC943_RS03585 KW36_RS03600 -CTRC943_RS03585 AKW53_RS00345 -CTRC943_RS03585 BKB95_RS03650 -CTRC943_RS03585 CBP42_RS00200 -CTRC943_RS03585 SW2_RS03605 -CTRC943_RS03585 CTL2C_RS00200 -CTRC943_RS03585 L1224_RS03580 -CTRC943_RS03585 ECS102511_RS03595 -CTRC943_RS03585 L1440_RS03580 -CTRC943_RS03585 BKB96_RS03640 -CTRC943_RS03585 BKB99_RS03635 -CTRC943_RS03585 AQ244_RS04310 -CTRC943_RS03585 CBP44_RS00200 -CTRC943_RS03585 L2BUCH2_RS03580 -CTRC943_RS03585 BKB92_RS03630 -CTRC943_RS03585 CTB_RS03640 -CTRC943_RS03585 SOTONIA3_RS03620 -CTRC943_RS03585 E150_RS03605 -CTRC943_RS03585 AQ193_RS00390 -CTRC943_RS03585 CTO_RS03635 -CTRC943_RS03585 BBV13_RS03640 -CTRC943_RS03585 FCS84708_RS03595 -CTRC943_RS03585 L2BLST_RS03580 -CTRC943_RS03585 BBV16_RS03650 -CTRC943_RS03585 BW688_RS00200 -CTRC943_RS03585 AQ199_RS04295 -CTRC943_RS03585 BKB93_RS03635 -CTRC943_RS03585 7618231 -CTRC943_RS03585 119724 -CTRC943_RS03585 G9768_RS03600 -CTRC943_RS03585 gnl|Prokka|PADJNBJD_00708 -CTRC943_RS03585 L3404_RS03575 -CTRC943_RS03585 BKC02_RS03630 -CTRC943_RS03585 NILJEPDF_00709 -CTRC943_RS03585 LJHENM_03560 -CTRC943_RS03585 AOT15_RS04400 -CTRC943_RS03585 AP288_RS01965 -CTRC943_RS03585 JIEJKO_03565 -CTRC943_RS03585 BKC01_RS03630 -CTRC943_RS03585 QSDFRQ_00709 -CTRC943_RS03930 CTRC943_RS03930 -CTRC943_RS03930 AKW53_RS00685 -CTRC943_RS03930 BKC03_RS03980 -CTRC943_RS03930 CBP48_RS00550 -CTRC943_RS03930 CTJTET1_RS03965 -CTRC943_RS03930 KW39_RS03960 -CTRC943_RS03930 DU10_RS03995 -CTRC943_RS03930 A5291_RS03990 -CTRC943_RS03930 SOTONK1_RS03945 -CTRC943_RS03930 IaCS19096_RS03940 -CTRC943_RS03930 DU13_RS03995 -CTRC943_RS03930 C15_RS0104050 -CTRC943_RS03930 ECS88FINAL_RS0104055 -CTRC943_RS03930 O169_RS03955 -CTRC943_RS03930 KW36_RS03945 -CTRC943_RS03930 BKB95_RS04000 -CTRC943_RS03930 CBP42_RS00550 -CTRC943_RS03930 CTL2C_RS00545 -CTRC943_RS03930 L1224_RS03925 -CTRC943_RS03930 SW2_RS03950 -CTRC943_RS03930 L1440_RS03920 -CTRC943_RS03930 ECS102511_RS03940 -CTRC943_RS03930 BKB96_RS03985 -CTRC943_RS03930 BKB99_RS03980 -CTRC943_RS03930 AQ244_RS03965 -CTRC943_RS03930 CBP44_RS00550 -CTRC943_RS03930 L2BUCH2_RS03925 -CTRC943_RS03930 BKB92_RS03980 -CTRC943_RS03930 CTB_RS03985 -CTRC943_RS03930 SOTONIA3_RS03965 -CTRC943_RS03930 AQ193_RS00045 -CTRC943_RS03930 E150_RS03950 -CTRC943_RS03930 CTO_RS03980 -CTRC943_RS03930 BBV13_RS03985 -CTRC943_RS03930 FCS84708_RS03940 -CTRC943_RS03930 L2BLST_RS03925 -CTRC943_RS03930 BBV16_RS03995 -CTRC943_RS03930 7618264 -CTRC943_RS03930 119775 -CTRC943_RS03930 BW688_RS00550 -CTRC943_RS03930 AQ199_RS04640 -CTRC943_RS03930 BKB93_RS03985 -CTRC943_RS03930 G9768_RS03945 -CTRC943_RS03930 gnl|Prokka|PADJNBJD_00776 -CTRC943_RS03930 L3404_RS03920 -CTRC943_RS03930 NILJEPDF_00777 -CTRC943_RS03930 BKC02_RS03980 -CTRC943_RS03930 LJHENM_03910 -CTRC943_RS03930 AOT15_RS04745 -CTRC943_RS03930 AP288_RS02315 -CTRC943_RS03930 JIEJKO_03910 -CTRC943_RS03930 QSDFRQ_00777 -CTRC943_RS03930 BKC01_RS03985 -CTRC943_RS04130 CTRC943_RS04130 -CTRC943_RS04130 AOT15_RS01730 -CTRC943_RS04130 CTJTET1_RS04320 -CTRC943_RS04130 KW39_RS04160 -CTRC943_RS04130 BKC03_RS04180 -CTRC943_RS04130 CBP48_RS00750 -CTRC943_RS04130 A5291_RS04185 -CTRC943_RS04130 ECS88FINAL_RS0104230 -CTRC943_RS04130 DU10_RS04195 -CTRC943_RS04130 SOTONK1_RS04145 -CTRC943_RS04130 IaCS19096_RS04140 -CTRC943_RS04130 DU13_RS04195 -CTRC943_RS04130 C15_RS0104255 -CTRC943_RS04130 O169_RS04155 -CTRC943_RS04130 KW36_RS04145 -CTRC943_RS04130 BKB95_RS04200 -CTRC943_RS04130 CBP42_RS00750 -CTRC943_RS04130 CTL2C_RS00745 -CTRC943_RS04130 L1224_RS04125 -CTRC943_RS04130 BKB96_RS04185 -CTRC943_RS04130 SW2_RS04150 -CTRC943_RS04130 L1440_RS04120 -CTRC943_RS04130 ECS102511_RS04140 -CTRC943_RS04130 BKB99_RS04180 -CTRC943_RS04130 CBP44_RS00750 -CTRC943_RS04130 CTB_RS04180 -CTRC943_RS04130 L2BUCH2_RS04125 -CTRC943_RS04130 BKB92_RS04180 -CTRC943_RS04130 SOTONIA3_RS04165 -CTRC943_RS04130 CTO_RS04175 -CTRC943_RS04130 AP288_RS02445 -CTRC943_RS04130 E150_RS04150 -CTRC943_RS04130 BBV13_RS04185 -CTRC943_RS04130 119805 -CTRC943_RS04130 FCS84708_RS04140 -CTRC943_RS04130 AQ199_RS00070 -CTRC943_RS04130 7618283 -CTRC943_RS04130 L2BLST_RS04125 -CTRC943_RS04130 AQ193_RS04630 -CTRC943_RS04130 BBV16_RS04195 -CTRC943_RS04130 AQ244_RS02620 -CTRC943_RS04130 BW688_RS00750 -CTRC943_RS04130 gnl|Prokka|PADJNBJD_00814 -CTRC943_RS04130 BKB93_RS04185 -CTRC943_RS04130 NILJEPDF_00815 -CTRC943_RS04130 G9768_RS04145 -CTRC943_RS04130 L3404_RS04120 -CTRC943_RS04130 LJHENM_04100 -CTRC943_RS04130 JIEJKO_04100 -CTRC943_RS04130 BKC02_RS04180 -CTRC943_RS04130 QSDFRQ_00815 -CTRC943_RS04130 AKW53_RS00860 -CTRC943_RS04130 BKC01_RS04185 -CTRC943_RS04295 CTRC943_RS04295 -CTRC943_RS04295 AKW53_RS01030 -CTRC943_RS04295 BKC01_RS04355 -CTRC943_RS04295 AOT15_RS01895 -CTRC943_RS04295 CTJTET1_RS04485 -CTRC943_RS04295 CBP48_RS00920 -CTRC943_RS04295 BKC03_RS04350 -CTRC943_RS04295 A5291_RS04350 -CTRC943_RS04295 KW39_RS04330 -CTRC943_RS04295 SOTONK1_RS04315 -CTRC943_RS04295 ECS88FINAL_RS0104400 -CTRC943_RS04295 IaCS19096_RS04305 -CTRC943_RS04295 DU10_RS04365 -CTRC943_RS04295 C15_RS0104425 -CTRC943_RS04295 DU13_RS04365 -CTRC943_RS04295 O169_RS04325 -CTRC943_RS04295 KW36_RS04310 -CTRC943_RS04295 CBP42_RS00920 -CTRC943_RS04295 CTL2C_RS00910 -CTRC943_RS04295 L1224_RS04290 -CTRC943_RS04295 BKB95_RS04370 -CTRC943_RS04295 L1440_RS04285 -CTRC943_RS04295 BKB96_RS04355 -CTRC943_RS04295 BKB99_RS04350 -CTRC943_RS04295 SW2_RS04320 -CTRC943_RS04295 ECS102511_RS04310 -CTRC943_RS04295 CBP44_RS00920 -CTRC943_RS04295 L2BUCH2_RS04290 -CTRC943_RS04295 CTB_RS04345 -CTRC943_RS04295 SOTONIA3_RS04330 -CTRC943_RS04295 BKB92_RS04350 -CTRC943_RS04295 CTO_RS04340 -CTRC943_RS04295 AQ193_RS04460 -CTRC943_RS04295 L2BLST_RS04290 -CTRC943_RS04295 AP288_RS02615 -CTRC943_RS04295 BBV13_RS04355 -CTRC943_RS04295 E150_RS04320 -CTRC943_RS04295 gnl|Prokka|PADJNBJD_00845 -CTRC943_RS04295 FCS84708_RS04310 -CTRC943_RS04295 AQ199_RS00240 -CTRC943_RS04295 AQ244_RS02445 -CTRC943_RS04295 BBV16_RS04360 -CTRC943_RS04295 BW688_RS00920 -CTRC943_RS04295 7618302 -CTRC943_RS04295 119834 -CTRC943_RS04295 NILJEPDF_00846 -CTRC943_RS04295 LJHENM_04255 -CTRC943_RS04295 L3404_RS04285 -CTRC943_RS04295 G9768_RS04315 -CTRC943_RS04295 JIEJKO_04255 -CTRC943_RS04295 BKB93_RS04355 -CTRC943_RS04295 QSDFRQ_00846 -CTRC943_RS04295 BKC02_RS04350 -CTRC943_RS04455 CTRC943_RS04455 -CTRC943_RS04455 AOT15_RS02050 -CTRC943_RS04455 CTJTET1_RS04640 -CTRC943_RS04455 KW39_RS04490 -CTRC943_RS04455 BKC03_RS04515 -CTRC943_RS04455 CBP48_RS01090 -CTRC943_RS04455 A5291_RS04505 -CTRC943_RS04455 SOTONK1_RS04470 -CTRC943_RS04455 ECS88FINAL_RS0104570 -CTRC943_RS04455 IaCS19096_RS04465 -CTRC943_RS04455 C15_RS0104590 -CTRC943_RS04455 DU10_RS04535 -CTRC943_RS04455 O169_RS04490 -CTRC943_RS04455 KW36_RS04470 -CTRC943_RS04455 DU13_RS04535 -CTRC943_RS04455 BKB95_RS04535 -CTRC943_RS04455 CBP42_RS01090 -CTRC943_RS04455 CTL2C_RS01070 -CTRC943_RS04455 L1224_RS04450 -CTRC943_RS04455 BKB96_RS04520 -CTRC943_RS04455 L1440_RS04445 -CTRC943_RS04455 BKB99_RS04515 -CTRC943_RS04455 SW2_RS04480 -CTRC943_RS04455 ECS102511_RS04475 -CTRC943_RS04455 CBP44_RS01090 -CTRC943_RS04455 CTB_RS04500 -CTRC943_RS04455 L2BUCH2_RS04450 -CTRC943_RS04455 SOTONIA3_RS04485 -CTRC943_RS04455 CTO_RS04495 -CTRC943_RS04455 BBV13_RS04510 -CTRC943_RS04455 BKB92_RS04520 -CTRC943_RS04455 AP288_RS02780 -CTRC943_RS04455 BBV16_RS04515 -CTRC943_RS04455 E150_RS04485 -CTRC943_RS04455 L2BLST_RS04450 -CTRC943_RS04455 AQ193_RS04295 -CTRC943_RS04455 gnl|Prokka|PADJNBJD_00877 -CTRC943_RS04455 FCS84708_RS04470 -CTRC943_RS04455 AQ199_RS00405 -CTRC943_RS04455 AQ244_RS02280 -CTRC943_RS04455 BW688_RS01090 -CTRC943_RS04455 119867 -CTRC943_RS04455 NILJEPDF_00878 -CTRC943_RS04455 7618324 -CTRC943_RS04455 G9768_RS04470 -CTRC943_RS04455 LJHENM_04420 -CTRC943_RS04455 L3404_RS04445 -CTRC943_RS04455 JIEJKO_04415 -CTRC943_RS04455 QSDFRQ_00878 -CTRC943_RS04455 BKB93_RS04525 -CTRC943_RS04455 BKC02_RS04515 -CTRC943_RS04455 AKW53_RS01195 -CTRC943_RS04455 BKC01_RS04520 -CTRC943_RS04620 CTRC943_RS04620 -CTRC943_RS04620 AOT15_RS02215 -CTRC943_RS04620 CTJTET1_RS04805 -CTRC943_RS04620 KW39_RS04655 -CTRC943_RS04620 BKC03_RS04690 -CTRC943_RS04620 CBP48_RS01265 -CTRC943_RS04620 A5291_RS04670 -CTRC943_RS04620 SOTONK1_RS04635 -CTRC943_RS04620 ECS88FINAL_RS0104745 -CTRC943_RS04620 IaCS19096_RS04630 -CTRC943_RS04620 C15_RS0104765 -CTRC943_RS04620 DU10_RS04710 -CTRC943_RS04620 O169_RS04655 -CTRC943_RS04620 KW36_RS04635 -CTRC943_RS04620 DU13_RS04710 -CTRC943_RS04620 CTL2C_RS01235 -CTRC943_RS04620 BKB95_RS04710 -CTRC943_RS04620 CBP42_RS01265 -CTRC943_RS04620 L1224_RS04615 -CTRC943_RS04620 BKB96_RS04695 -CTRC943_RS04620 L1440_RS04610 -CTRC943_RS04620 BKB99_RS04690 -CTRC943_RS04620 SW2_RS04645 -CTRC943_RS04620 ECS102511_RS04640 -CTRC943_RS04620 CBP44_RS01265 -CTRC943_RS04620 CTB_RS04665 -CTRC943_RS04620 L2BUCH2_RS04615 -CTRC943_RS04620 SOTONIA3_RS04650 -CTRC943_RS04620 CTO_RS04660 -CTRC943_RS04620 AP288_RS02945 -CTRC943_RS04620 BBV13_RS04680 -CTRC943_RS04620 BKB92_RS04695 -CTRC943_RS04620 BBV16_RS04685 -CTRC943_RS04620 E150_RS04650 -CTRC943_RS04620 gnl|Prokka|PADJNBJD_00910 -CTRC943_RS04620 L2BLST_RS04615 -CTRC943_RS04620 AQ193_RS04130 -CTRC943_RS04620 FCS84708_RS04635 -CTRC943_RS04620 AQ199_RS00570 -CTRC943_RS04620 NILJEPDF_00911 -CTRC943_RS04620 BW688_RS01265 -CTRC943_RS04620 AQ244_RS02115 -CTRC943_RS04620 119930 -CTRC943_RS04620 JIEJKO_04580 -CTRC943_RS04620 7618763 -CTRC943_RS04620 QSDFRQ_00911 -CTRC943_RS04620 G9768_RS04635 -CTRC943_RS04620 LJHENM_04590 -CTRC943_RS04620 L3404_RS04610 -CTRC943_RS04620 BKB93_RS04700 -CTRC943_RS04620 BKC02_RS04690 -CTRC943_RS04620 AKW53_RS01360 -CTRC943_RS04620 BKC01_RS04695 -CTJTET1_RS00050 CTJTET1_RS00050 -CTJTET1_RS00050 AKW53_RS01535 -CTJTET1_RS00050 DU10_RS00050 -CTJTET1_RS00050 CTRC943_RS00050 -CTJTET1_RS00050 O169_RS00050 -CTJTET1_RS00050 CBP48_RS01440 -CTJTET1_RS00050 ECS88FINAL_RS0100055 -CTJTET1_RS00050 DU13_RS00050 -CTJTET1_RS00050 KW39_RS00050 -CTJTET1_RS00050 BKB95_RS00050 -CTJTET1_RS00050 KW36_RS00050 -CTJTET1_RS00050 AOT15_RS00905 -CTJTET1_RS00050 SW2_RS00050 -CTJTET1_RS00050 ECS102511_RS00050 -CTJTET1_RS00050 CTB_RS00050 -CTJTET1_RS00050 CTL2C_RS01415 -CTJTET1_RS00050 CBP42_RS01440 -CTJTET1_RS00050 L1224_RS00050 -CTJTET1_RS00050 BKB96_RS00050 -CTJTET1_RS00050 BKB99_RS00050 -CTJTET1_RS00050 CTO_RS00050 -CTJTET1_RS00050 SOTONIA3_RS00050 -CTJTET1_RS00050 L1440_RS00050 -CTJTET1_RS00050 BKB92_RS00050 -CTJTET1_RS00050 119208 -CTJTET1_RS00050 CBP44_RS01440 -CTJTET1_RS00050 E150_RS00050 -CTJTET1_RS00050 L2BUCH2_RS00050 -CTJTET1_RS00050 AQ193_RS03955 -CTJTET1_RS00050 BKB93_RS00050 -CTJTET1_RS00050 FCS84708_RS00050 -CTJTET1_RS00050 AP288_RS03120 -CTJTET1_RS00050 AQ244_RS01940 -CTJTET1_RS00050 BBV13_RS00050 -CTJTET1_RS00050 G9768_RS00050 -CTJTET1_RS00050 BW688_RS01440 -CTJTET1_RS00050 L2BLST_RS00050 -CTJTET1_RS00050 AQ199_RS00745 -CTJTET1_RS00050 BKC02_RS00050 -CTJTET1_RS00050 BBV16_RS00050 -CTJTET1_RS00050 BKC01_RS00050 -CTJTET1_RS00050 7618357 -CTJTET1_RS00050 gnl|Prokka|PADJNBJD_00010 -CTJTET1_RS00050 LJHENM_00050 -CTJTET1_RS00050 A5291_RS00050 -CTJTET1_RS00050 SOTONK1_RS00050 -CTJTET1_RS00050 JIEJKO_00045 -CTJTET1_RS00050 NILJEPDF_00010 -CTJTET1_RS00050 L3404_RS00050 -CTJTET1_RS00050 IaCS19096_RS00050 -CTJTET1_RS00050 BKC03_RS00050 -CTJTET1_RS00050 C15_RS0100050 -CTJTET1_RS00050 QSDFRQ_00010 -CTJTET1_RS00545 CTJTET1_RS00545 -CTJTET1_RS00545 O169_RS00545 -CTJTET1_RS00545 DU13_RS00560 -CTJTET1_RS00545 7618406 -CTJTET1_RS00545 CTRC943_RS00545 -CTJTET1_RS00545 KW36_RS00545 -CTJTET1_RS00545 CBP48_RS01945 -CTJTET1_RS00545 SW2_RS00545 -CTJTET1_RS00545 BKB95_RS00555 -CTJTET1_RS00545 AOT15_RS00410 -CTJTET1_RS00545 CTL2C_RS01910 -CTJTET1_RS00545 AQ244_RS02720 -CTJTET1_RS00545 BKB96_RS00555 -CTJTET1_RS00545 CBP42_RS01945 -CTJTET1_RS00545 BKB99_RS00555 -CTJTET1_RS00545 L1224_RS00545 -CTJTET1_RS00545 BKB92_RS00555 -CTJTET1_RS00545 SOTONIA3_RS00545 -CTJTET1_RS00545 L1440_RS00545 -CTJTET1_RS00545 E150_RS00545 -CTJTET1_RS00545 CBP44_RS01950 -CTJTET1_RS00545 119284 -CTJTET1_RS00545 BKB93_RS00555 -CTJTET1_RS00545 L2BUCH2_RS00545 -CTJTET1_RS00545 AP288_RS03615 -CTJTET1_RS00545 AQ199_RS01240 -CTJTET1_RS00545 G9768_RS00545 -CTJTET1_RS00545 L2BLST_RS00545 -CTJTET1_RS00545 AQ193_RS03450 -CTJTET1_RS00545 BW688_RS01945 -CTJTET1_RS00545 BKC02_RS00555 -CTJTET1_RS00545 gnl|Prokka|PADJNBJD_00107 -CTJTET1_RS00545 LJHENM_00535 -CTJTET1_RS00545 BKC01_RS00555 -CTJTET1_RS00545 NILJEPDF_00107 -CTJTET1_RS00545 AKW53_RS02040 -CTJTET1_RS00545 SOTONK1_RS00545 -CTJTET1_RS00545 JIEJKO_00540 -CTJTET1_RS00545 L3404_RS00545 -CTJTET1_RS00545 QSDFRQ_00107 -CTJTET1_RS00545 IaCS19096_RS00545 -CTJTET1_RS00545 BKC03_RS00555 -CTJTET1_RS00545 C15_RS0100560 -CTJTET1_RS00545 DU10_RS00555 -CTJTET1_RS00545 CTB_RS00545 F -CTJTET1_RS00545 CTO_RS00545 F -CTJTET1_RS00545 BBV13_RS00550 F -CTJTET1_RS00545 BBV16_RS00550 F -CTJTET1_RS00545 A5291_RS00545 F -CTJTET1_RS00545 CTB_RS00550 F -CTJTET1_RS00545 CTO_RS00550 F -CTJTET1_RS00545 BBV13_RS00555 F -CTJTET1_RS00545 BBV16_RS00555 F -CTJTET1_RS00545 A5291_RS00550 F -CTJTET1_RS00715 CTJTET1_RS00715 -CTJTET1_RS00715 C15_RS0100740 -CTJTET1_RS00715 BKB95_RS00725 -CTJTET1_RS00715 AQ244_RS02890 -CTJTET1_RS00715 BKB96_RS00725 -CTJTET1_RS00715 BKB99_RS00725 -CTJTET1_RS00715 SOTONIA3_RS00715 -CTJTET1_RS00715 G9768_RS00715 -CTJTET1_RS00715 BKC01_RS00725 -CTJTET1_RS00715 SOTONK1_RS00715 -CTJTET1_RS00715 IaCS19096_RS00715 -CTJTET1_RS00715 BKC03_RS00725 -CTJTET1_RS00715 CTRC943_RS00715 -CTJTET1_RS00715 ECS88FINAL_RS0100740 -CTJTET1_RS00715 KW39_RS00715 -CTJTET1_RS00715 DU10_RS00725 -CTJTET1_RS00715 O169_RS00715 -CTJTET1_RS00715 DU13_RS00730 -CTJTET1_RS00715 7618844 -CTJTET1_RS00715 KW36_RS00715 -CTJTET1_RS00715 AOT15_RS00240 -CTJTET1_RS00715 CBP48_RS02115 -CTJTET1_RS00715 SW2_RS00715 -CTJTET1_RS00715 ECS102511_RS00715 -CTJTET1_RS00715 CTL2C_RS02080 -CTJTET1_RS00715 CTB_RS00720 -CTJTET1_RS00715 L1224_RS00715 -CTJTET1_RS00715 CBP42_RS02115 -CTJTET1_RS00715 CTO_RS00720 -CTJTET1_RS00715 L1440_RS00715 -CTJTET1_RS00715 BKB92_RS00725 -CTJTET1_RS00715 E150_RS00715 -CTJTET1_RS00715 L2BUCH2_RS00715 -CTJTET1_RS00715 CBP44_RS02120 -CTJTET1_RS00715 FCS84708_RS00715 -CTJTET1_RS00715 AP288_RS03785 -CTJTET1_RS00715 BKB93_RS00725 -CTJTET1_RS00715 120562 -CTJTET1_RS00715 AQ193_RS03280 -CTJTET1_RS00715 AQ199_RS01410 -CTJTET1_RS00715 BBV13_RS00725 -CTJTET1_RS00715 L2BLST_RS00715 -CTJTET1_RS00715 BW688_RS02115 -CTJTET1_RS00715 BBV16_RS00725 -CTJTET1_RS00715 BKC02_RS00725 -CTJTET1_RS00715 gnl|Prokka|PADJNBJD_00141 -CTJTET1_RS00715 LJHENM_00705 -CTJTET1_RS00715 AKW53_RS02210 -CTJTET1_RS00715 NILJEPDF_00141 -CTJTET1_RS00715 A5291_RS00720 -CTJTET1_RS00715 L3404_RS00715 -CTJTET1_RS00715 JIEJKO_00710 -CTJTET1_RS00715 QSDFRQ_00141 -CTJTET1_RS01765 CTJTET1_RS01765 -CTJTET1_RS01765 DU10_RS01780 -CTJTET1_RS01765 QSDFRQ_00345 -CTJTET1_RS01765 C15_RS0101795 -CTJTET1_RS01765 SOTONK1_RS01755 -CTJTET1_RS01765 A5291_RS01780 -CTJTET1_RS01765 KW39_RS01765 -CTJTET1_RS01765 IaCS19096_RS01750 -CTJTET1_RS01765 119457 -CTJTET1_RS01765 ECS88FINAL_RS0101785 -CTJTET1_RS01765 O169_RS01765 -CTJTET1_RS01765 DU13_RS01775 -CTJTET1_RS01765 7618515 -CTJTET1_RS01765 CTL2C_RS03100 -CTJTET1_RS01765 AP288_RS01325 -CTJTET1_RS01765 BKB95_RS01775 -CTJTET1_RS01765 CBP48_RS03160 -CTJTET1_RS01765 L1224_RS01730 -CTJTET1_RS01765 KW36_RS01750 -CTJTET1_RS01765 AOT15_RS02750 -CTJTET1_RS01765 BKB96_RS01760 -CTJTET1_RS01765 SW2_RS01755 -CTJTET1_RS01765 BKB99_RS01760 -CTJTET1_RS01765 L1440_RS01730 -CTJTET1_RS01765 ECS102511_RS01755 -CTJTET1_RS01765 AQ244_RS01355 -CTJTET1_RS01765 CBP42_RS03160 -CTJTET1_RS01765 CTB_RS01780 -CTJTET1_RS01765 SOTONIA3_RS01765 -CTJTET1_RS01765 L2BUCH2_RS01730 -CTJTET1_RS01765 BKB92_RS01770 -CTJTET1_RS01765 CTO_RS01780 -CTJTET1_RS01765 E150_RS01760 -CTJTET1_RS01765 L2BLST_RS01730 -CTJTET1_RS01765 FCS84708_RS01750 -CTJTET1_RS01765 AQ193_RS02230 -CTJTET1_RS01765 BW688_RS03160 -CTJTET1_RS01765 BKB93_RS01770 -CTJTET1_RS01765 CBP44_RS03165 -CTJTET1_RS01765 BBV13_RS01785 -CTJTET1_RS01765 AQ199_RS02450 -CTJTET1_RS01765 G9768_RS01755 -CTJTET1_RS01765 L3404_RS01730 -CTJTET1_RS01765 BBV16_RS01785 -CTJTET1_RS01765 BKC02_RS01760 -CTJTET1_RS01765 BKC01_RS01760 -CTJTET1_RS01765 AKW53_RS03255 -CTJTET1_RS01765 gnl|Prokka|PADJNBJD_00345 -CTJTET1_RS01765 NILJEPDF_00345 -CTJTET1_RS01765 CTRC943_RS01735 -CTJTET1_RS01765 LJHENM_01740 -CTJTET1_RS01765 JIEJKO_01735 -CTJTET1_RS01765 BKC03_RS01760 -CTJTET1_RS01930 CTJTET1_RS01930 -CTJTET1_RS01930 QSDFRQ_00378 -CTJTET1_RS01930 C15_RS0101965 -CTJTET1_RS01930 SOTONK1_RS01920 -CTJTET1_RS01930 DU10_RS01950 -CTJTET1_RS01930 A5291_RS01945 -CTJTET1_RS01930 KW39_RS01930 -CTJTET1_RS01930 IaCS19096_RS01915 -CTJTET1_RS01930 ECS88FINAL_RS0101955 -CTJTET1_RS01930 O169_RS01930 -CTJTET1_RS01930 DU13_RS01945 -CTJTET1_RS01930 7618967 -CTJTET1_RS01930 120349 -CTJTET1_RS01930 CTL2C_RS03265 -CTJTET1_RS01930 AP288_RS01160 -CTJTET1_RS01930 L1224_RS01895 -CTJTET1_RS01930 KW36_RS01915 -CTJTET1_RS01930 AOT15_RS02915 -CTJTET1_RS01930 BKB95_RS01945 -CTJTET1_RS01930 BKB96_RS01925 -CTJTET1_RS01930 CBP48_RS03330 -CTJTET1_RS01930 SW2_RS01920 -CTJTET1_RS01930 BKB99_RS01925 -CTJTET1_RS01930 L1440_RS01895 -CTJTET1_RS01930 ECS102511_RS01920 -CTJTET1_RS01930 AQ244_RS01190 -CTJTET1_RS01930 CTB_RS01945 -CTJTET1_RS01930 SOTONIA3_RS01930 -CTJTET1_RS01930 L2BUCH2_RS01895 -CTJTET1_RS01930 BKB92_RS01935 -CTJTET1_RS01930 CBP42_RS03340 -CTJTET1_RS01930 CTO_RS01945 -CTJTET1_RS01930 E150_RS01925 -CTJTET1_RS01930 L2BLST_RS01895 -CTJTET1_RS01930 BW688_RS03325 -CTJTET1_RS01930 FCS84708_RS01915 -CTJTET1_RS01930 AQ193_RS02065 -CTJTET1_RS01930 BKB93_RS01935 -CTJTET1_RS01930 BBV13_RS01950 -CTJTET1_RS01930 CBP44_RS03335 -CTJTET1_RS01930 AQ199_RS02615 -CTJTET1_RS01930 G9768_RS01920 -CTJTET1_RS01930 L3404_RS01895 -CTJTET1_RS01930 BBV16_RS01950 -CTJTET1_RS01930 BKC02_RS01925 -CTJTET1_RS01930 BKC01_RS01925 -CTJTET1_RS01930 AKW53_RS03420 -CTJTET1_RS01930 gnl|Prokka|PADJNBJD_00378 -CTJTET1_RS01930 NILJEPDF_00378 -CTJTET1_RS01930 CTRC943_RS01900 -CTJTET1_RS01930 LJHENM_01905 -CTJTET1_RS01930 JIEJKO_01900 -CTJTET1_RS01930 BKC03_RS01925 -CTJTET1_RS02090 CTJTET1_RS02090 -CTJTET1_RS02090 QSDFRQ_00410 -CTJTET1_RS02090 C15_RS0102125 -CTJTET1_RS02090 A5291_RS02105 -CTJTET1_RS02090 SOTONK1_RS02080 -CTJTET1_RS02090 DU10_RS02110 -CTJTET1_RS02090 KW39_RS02090 -CTJTET1_RS02090 IaCS19096_RS02075 -CTJTET1_RS02090 ECS88FINAL_RS0102120 -CTJTET1_RS02090 O169_RS02090 -CTJTET1_RS02090 DU13_RS02105 -CTJTET1_RS02090 7618546 -CTJTET1_RS02090 CTL2C_RS03425 -CTJTET1_RS02090 AP288_RS01000 -CTJTET1_RS02090 CBP48_RS03490 -CTJTET1_RS02090 119508 -CTJTET1_RS02090 L1224_RS02055 -CTJTET1_RS02090 KW36_RS02075 -CTJTET1_RS02090 AOT15_RS03075 -CTJTET1_RS02090 BKB95_RS02105 -CTJTET1_RS02090 BKB96_RS02085 -CTJTET1_RS02090 SW2_RS02080 -CTJTET1_RS02090 BKB99_RS02085 -CTJTET1_RS02090 L1440_RS02055 -CTJTET1_RS02090 ECS102511_RS02080 -CTJTET1_RS02090 AQ244_RS01030 -CTJTET1_RS02090 CTB_RS02105 -CTJTET1_RS02090 CBP42_RS03500 -CTJTET1_RS02090 SOTONIA3_RS02090 -CTJTET1_RS02090 L2BUCH2_RS02055 -CTJTET1_RS02090 BKB92_RS02095 -CTJTET1_RS02090 CTO_RS02105 -CTJTET1_RS02090 E150_RS02085 -CTJTET1_RS02090 L2BLST_RS02055 -CTJTET1_RS02090 BW688_RS03485 -CTJTET1_RS02090 FCS84708_RS02075 -CTJTET1_RS02090 AQ193_RS01905 -CTJTET1_RS02090 BBV13_RS02110 -CTJTET1_RS02090 BKB93_RS02095 -CTJTET1_RS02090 CBP44_RS03495 -CTJTET1_RS02090 AQ199_RS02775 -CTJTET1_RS02090 G9768_RS02080 -CTJTET1_RS02090 BBV16_RS02110 -CTJTET1_RS02090 L3404_RS02055 -CTJTET1_RS02090 BKC02_RS02085 -CTJTET1_RS02090 BKC01_RS02085 -CTJTET1_RS02090 AKW53_RS03580 -CTJTET1_RS02090 gnl|Prokka|PADJNBJD_00410 -CTJTET1_RS02090 NILJEPDF_00410 -CTJTET1_RS02090 CTRC943_RS02060 -CTJTET1_RS02090 LJHENM_02065 -CTJTET1_RS02090 JIEJKO_02060 -CTJTET1_RS02090 BKC03_RS02085 -CTJTET1_RS02260 CTJTET1_RS02260 -CTJTET1_RS02260 QSDFRQ_00444 -CTJTET1_RS02260 C15_RS01000000104935 -CTJTET1_RS02260 SOTONK1_RS02250 -CTJTET1_RS02260 DU10_RS02285 -CTJTET1_RS02260 A5291_RS02280 -CTJTET1_RS02260 KW39_RS02260 -CTJTET1_RS02260 IaCS19096_RS02245 -CTJTET1_RS02260 ECS88FINAL_RS01000000104930 -CTJTET1_RS02260 O169_RS02260 -CTJTET1_RS02260 DU13_RS02280 -CTJTET1_RS02260 7618567 -CTJTET1_RS02260 AP288_RS00830 -CTJTET1_RS02260 BKB96_RS02265 -CTJTET1_RS02260 BKB99_RS02260 -CTJTET1_RS02260 CBP48_RS03665 -CTJTET1_RS02260 CTL2C_RS03600 -CTJTET1_RS02260 KW36_RS02245 -CTJTET1_RS02260 AOT15_RS03245 -CTJTET1_RS02260 BKB95_RS02280 -CTJTET1_RS02260 119541 -CTJTET1_RS02260 L1224_RS02230 -CTJTET1_RS02260 SW2_RS02255 -CTJTET1_RS02260 ECS102511_RS02250 -CTJTET1_RS02260 L1440_RS02230 -CTJTET1_RS02260 AQ244_RS00860 -CTJTET1_RS02260 CBP42_RS03675 -CTJTET1_RS02260 CTB_RS02280 -CTJTET1_RS02260 L2BUCH2_RS02225 -CTJTET1_RS02260 BKB92_RS02270 -CTJTET1_RS02260 SOTONIA3_RS02265 -CTJTET1_RS02260 CTO_RS02280 -CTJTET1_RS02260 E150_RS02255 -CTJTET1_RS02260 BW688_RS03660 -CTJTET1_RS02260 L2BLST_RS02230 -CTJTET1_RS02260 FCS84708_RS02245 -CTJTET1_RS02260 AQ193_RS01735 -CTJTET1_RS02260 BBV13_RS02285 -CTJTET1_RS02260 CBP44_RS03670 -CTJTET1_RS02260 BKB93_RS02275 -CTJTET1_RS02260 AQ199_RS02945 -CTJTET1_RS02260 G9768_RS02250 -CTJTET1_RS02260 BBV16_RS02290 -CTJTET1_RS02260 L3404_RS02225 -CTJTET1_RS02260 BKC02_RS02260 -CTJTET1_RS02260 BKC01_RS02260 -CTJTET1_RS02260 AKW53_RS03750 -CTJTET1_RS02260 gnl|Prokka|PADJNBJD_00444 -CTJTET1_RS02260 NILJEPDF_00444 -CTJTET1_RS02260 CTRC943_RS02230 -CTJTET1_RS02260 LJHENM_02240 -CTJTET1_RS02260 JIEJKO_02235 -CTJTET1_RS02260 BKC03_RS02260 -CTJTET1_RS02415 CTJTET1_RS02415 -CTJTET1_RS02415 AOT15_RS00030 -CTJTET1_RS02415 C15_RS0102465 -CTJTET1_RS02415 SOTONK1_RS02405 -CTJTET1_RS02415 DU10_RS02445 -CTJTET1_RS02415 KW39_RS02415 -CTJTET1_RS02415 IaCS19096_RS02400 -CTJTET1_RS02415 A5291_RS02440 -CTJTET1_RS02415 ECS88FINAL_RS0102460 -CTJTET1_RS02415 7618580 -CTJTET1_RS02415 O169_RS02415 -CTJTET1_RS02415 DU13_RS02440 -CTJTET1_RS02415 CBP48_RS03825 -CTJTET1_RS02415 AP288_RS00675 -CTJTET1_RS02415 BKB95_RS02440 -CTJTET1_RS02415 BKB96_RS02430 -CTJTET1_RS02415 BKB99_RS02425 -CTJTET1_RS02415 CTL2C_RS03755 -CTJTET1_RS02415 KW36_RS02400 -CTJTET1_RS02415 119561 -CTJTET1_RS02415 L1224_RS02385 -CTJTET1_RS02415 SW2_RS02410 -CTJTET1_RS02415 ECS102511_RS02405 -CTJTET1_RS02415 L1440_RS02385 -CTJTET1_RS02415 AQ244_RS00705 -CTJTET1_RS02415 CBP42_RS03835 -CTJTET1_RS02415 L2BUCH2_RS02380 -CTJTET1_RS02415 BKB92_RS02430 -CTJTET1_RS02415 CTB_RS02440 -CTJTET1_RS02415 SOTONIA3_RS02420 -CTJTET1_RS02415 E150_RS02410 -CTJTET1_RS02415 CTO_RS02440 -CTJTET1_RS02415 BBV13_RS02445 -CTJTET1_RS02415 BW688_RS03825 -CTJTET1_RS02415 CBP44_RS03830 -CTJTET1_RS02415 L2BLST_RS02385 -CTJTET1_RS02415 FCS84708_RS02400 -CTJTET1_RS02415 AQ193_RS01580 -CTJTET1_RS02415 BKB93_RS02435 -CTJTET1_RS02415 BBV16_RS02450 -CTJTET1_RS02415 AQ199_RS03100 -CTJTET1_RS02415 G9768_RS02405 -CTJTET1_RS02415 L3404_RS02380 -CTJTET1_RS02415 BKC02_RS02425 -CTJTET1_RS02415 gnl|Prokka|PADJNBJD_00474 -CTJTET1_RS02415 AKW53_RS03905 -CTJTET1_RS02415 BKC01_RS02425 -CTJTET1_RS02415 NILJEPDF_00474 -CTJTET1_RS02415 LJHENM_02390 -CTJTET1_RS02415 CTRC943_RS02385 -CTJTET1_RS02415 JIEJKO_02390 -CTJTET1_RS02415 QSDFRQ_00474 -CTJTET1_RS02415 BKC03_RS02425 -CTJTET1_RS03260 CTJTET1_RS03260 -CTJTET1_RS03260 ECS88FINAL_RS0103310 -CTJTET1_RS03260 DU10_RS03290 -CTJTET1_RS03260 SOTONK1_RS03245 -CTJTET1_RS03260 O169_RS03255 -CTJTET1_RS03260 IaCS19096_RS03240 -CTJTET1_RS03260 C15_RS0103310 -CTJTET1_RS03260 A5291_RS03285 -CTJTET1_RS03260 DU13_RS03285 -CTJTET1_RS03260 CTL2C_RS04590 -CTJTET1_RS03260 AKW53_RS04470 -CTJTET1_RS03260 CBP48_RS04675 -CTJTET1_RS03260 7619106 -CTJTET1_RS03260 SW2_RS03250 -CTJTET1_RS03260 L1224_RS03220 -CTJTET1_RS03260 KW36_RS03245 -CTJTET1_RS03260 ECS102511_RS03245 -CTJTET1_RS03260 L1440_RS03220 -CTJTET1_RS03260 BKB95_RS03290 -CTJTET1_RS03260 BKB96_RS03285 -CTJTET1_RS03260 BKB99_RS03280 -CTJTET1_RS03260 CBP42_RS04680 -CTJTET1_RS03260 L2BUCH2_RS03220 -CTJTET1_RS03260 BKB92_RS03275 -CTJTET1_RS03260 CTB_RS03285 -CTJTET1_RS03260 AQ244_RS04670 -CTJTET1_RS03260 E150_RS03250 -CTJTET1_RS03260 SOTONIA3_RS03265 -CTJTET1_RS03260 BW688_RS04670 -CTJTET1_RS03260 CTO_RS03280 -CTJTET1_RS03260 FCS84708_RS03245 -CTJTET1_RS03260 L2BLST_RS03220 -CTJTET1_RS03260 CBP44_RS04675 -CTJTET1_RS03260 120125 -CTJTET1_RS03260 AQ199_RS03945 -CTJTET1_RS03260 BKB93_RS03280 -CTJTET1_RS03260 G9768_RS03245 -CTJTET1_RS03260 L3404_RS03215 -CTJTET1_RS03260 AQ193_RS00740 -CTJTET1_RS03260 gnl|Prokka|PADJNBJD_00638 -CTJTET1_RS03260 AP288_RS01615 -CTJTET1_RS03260 BKC02_RS03275 -CTJTET1_RS03260 NILJEPDF_00639 -CTJTET1_RS03260 LJHENM_03210 -CTJTET1_RS03260 AOT15_RS04045 -CTJTET1_RS03260 CTRC943_RS03220 -CTJTET1_RS03260 JIEJKO_03215 -CTJTET1_RS03260 BKC01_RS03275 -CTJTET1_RS03260 QSDFRQ_00639 -CTJTET1_RS03260 KW39_RS03260 -CTJTET1_RS03260 BKC03_RS03275 -CTJTET1_RS03430 CTJTET1_RS03430 -CTJTET1_RS03430 KW39_RS03430 -CTJTET1_RS03430 DU10_RS03460 -CTJTET1_RS03430 SOTONK1_RS03410 -CTJTET1_RS03430 ECS88FINAL_RS0103490 -CTJTET1_RS03430 IaCS19096_RS03405 -CTJTET1_RS03430 C15_RS0103485 -CTJTET1_RS03430 A5291_RS03455 -CTJTET1_RS03430 O169_RS03425 -CTJTET1_RS03430 DU13_RS03460 -CTJTET1_RS03430 AKW53_RS00160 -CTJTET1_RS03430 KW36_RS03410 -CTJTET1_RS03430 BKB95_RS03465 -CTJTET1_RS03430 CBP42_RS00015 -CTJTET1_RS03430 SW2_RS03420 -CTJTET1_RS03430 CTL2C_RS00015 -CTJTET1_RS03430 L1224_RS03395 -CTJTET1_RS03430 ECS102511_RS03410 -CTJTET1_RS03430 L1440_RS03395 -CTJTET1_RS03430 BKB96_RS03455 -CTJTET1_RS03430 BKB99_RS03450 -CTJTET1_RS03430 CBP44_RS00015 -CTJTET1_RS03430 L2BUCH2_RS03395 -CTJTET1_RS03430 BKB92_RS03445 -CTJTET1_RS03430 CTB_RS03450 -CTJTET1_RS03430 SOTONIA3_RS03430 -CTJTET1_RS03430 AQ244_RS04500 -CTJTET1_RS03430 E150_RS03420 -CTJTET1_RS03430 CTO_RS03445 -CTJTET1_RS03430 BBV13_RS03450 -CTJTET1_RS03430 FCS84708_RS03410 -CTJTET1_RS03430 L2BLST_RS03395 -CTJTET1_RS03430 7618660 -CTJTET1_RS03430 BBV16_RS03460 -CTJTET1_RS03430 BW688_RS00015 -CTJTET1_RS03430 120091 -CTJTET1_RS03430 AQ199_RS04110 -CTJTET1_RS03430 BKB93_RS03450 -CTJTET1_RS03430 AQ193_RS00575 -CTJTET1_RS03430 G9768_RS03410 -CTJTET1_RS03430 gnl|Prokka|PADJNBJD_00671 -CTJTET1_RS03430 L3404_RS03390 -CTJTET1_RS03430 BKC02_RS03445 -CTJTET1_RS03430 NILJEPDF_00672 -CTJTET1_RS03430 LJHENM_03375 -CTJTET1_RS03430 AOT15_RS04210 -CTJTET1_RS03430 AP288_RS01780 -CTJTET1_RS03430 JIEJKO_03380 -CTJTET1_RS03430 BKC01_RS03445 -CTJTET1_RS03430 QSDFRQ_00672 -CTJTET1_RS03430 CTRC943_RS03395 -CTJTET1_RS03430 BKC03_RS03445 -CTJTET1_RS03430 CBP48_RS00015 -CTJTET1_RS03605 CTJTET1_RS03605 -CTJTET1_RS03605 KW39_RS03600 -CTJTET1_RS03605 DU10_RS03630 -CTJTET1_RS03605 SOTONK1_RS03585 -CTJTET1_RS03605 ECS88FINAL_RS0103675 -CTJTET1_RS03605 IaCS19096_RS03580 -CTJTET1_RS03605 C15_RS0103665 -CTJTET1_RS03605 A5291_RS03630 -CTJTET1_RS03605 O169_RS03595 -CTJTET1_RS03605 DU13_RS03630 -CTJTET1_RS03605 KW36_RS03585 -CTJTET1_RS03605 AKW53_RS00330 -CTJTET1_RS03605 BKB95_RS03635 -CTJTET1_RS03605 CBP42_RS00185 -CTJTET1_RS03605 SW2_RS03590 -CTJTET1_RS03605 CTL2C_RS00185 -CTJTET1_RS03605 L1224_RS03565 -CTJTET1_RS03605 ECS102511_RS03580 -CTJTET1_RS03605 L1440_RS03565 -CTJTET1_RS03605 BKB96_RS03625 -CTJTET1_RS03605 BKB99_RS03620 -CTJTET1_RS03605 CBP44_RS00185 -CTJTET1_RS03605 L2BUCH2_RS03565 -CTJTET1_RS03605 BKB92_RS03615 -CTJTET1_RS03605 CTB_RS03625 -CTJTET1_RS03605 SOTONIA3_RS03605 -CTJTET1_RS03605 AQ244_RS04325 -CTJTET1_RS03605 E150_RS03590 -CTJTET1_RS03605 CTO_RS03620 -CTJTET1_RS03605 BBV13_RS03625 -CTJTET1_RS03605 FCS84708_RS03580 -CTJTET1_RS03605 L2BLST_RS03565 -CTJTET1_RS03605 BBV16_RS03635 -CTJTET1_RS03605 BW688_RS00185 -CTJTET1_RS03605 AQ199_RS04280 -CTJTET1_RS03605 BKB93_RS03620 -CTJTET1_RS03605 7618228 -CTJTET1_RS03605 119720 -CTJTET1_RS03605 AQ193_RS00405 -CTJTET1_RS03605 G9768_RS03585 -CTJTET1_RS03605 gnl|Prokka|PADJNBJD_00705 -CTJTET1_RS03605 L3404_RS03560 -CTJTET1_RS03605 BKC02_RS03615 -CTJTET1_RS03605 NILJEPDF_00706 -CTJTET1_RS03605 LJHENM_03545 -CTJTET1_RS03605 AOT15_RS04385 -CTJTET1_RS03605 AP288_RS01950 -CTJTET1_RS03605 JIEJKO_03550 -CTJTET1_RS03605 BKC01_RS03615 -CTJTET1_RS03605 QSDFRQ_00706 -CTJTET1_RS03605 CTRC943_RS03570 -CTJTET1_RS03605 BKC03_RS03615 -CTJTET1_RS03605 CBP48_RS00185 -CTJTET1_RS03785 CTJTET1_RS03785 -CTJTET1_RS03785 KW39_RS03780 -CTJTET1_RS03785 DU10_RS03815 -CTJTET1_RS03785 CBP48_RS00370 -CTJTET1_RS03785 A5291_RS03810 -CTJTET1_RS03785 SOTONK1_RS03765 -CTJTET1_RS03785 IaCS19096_RS03760 -CTJTET1_RS03785 DU13_RS03815 -CTJTET1_RS03785 C15_RS0103870 -CTJTET1_RS03785 ECS88FINAL_RS0103870 -CTJTET1_RS03785 O169_RS03775 -CTJTET1_RS03785 KW36_RS03765 -CTJTET1_RS03785 BKB95_RS03820 -CTJTET1_RS03785 CBP42_RS00370 -CTJTET1_RS03785 SW2_RS03770 -CTJTET1_RS03785 CTL2C_RS00365 -CTJTET1_RS03785 L1224_RS03745 -CTJTET1_RS03785 ECS102511_RS03760 -CTJTET1_RS03785 BKB96_RS03805 -CTJTET1_RS03785 BKB99_RS03800 -CTJTET1_RS03785 L1440_RS03745 -CTJTET1_RS03785 CBP44_RS00370 -CTJTET1_RS03785 L2BUCH2_RS03745 -CTJTET1_RS03785 BKB92_RS03800 -CTJTET1_RS03785 CTB_RS03805 -CTJTET1_RS03785 SOTONIA3_RS03785 -CTJTET1_RS03785 AQ244_RS04145 -CTJTET1_RS03785 E150_RS03770 -CTJTET1_RS03785 CTO_RS03800 -CTJTET1_RS03785 BBV13_RS03805 -CTJTET1_RS03785 FCS84708_RS03760 -CTJTET1_RS03785 BBV16_RS03815 -CTJTET1_RS03785 L2BLST_RS03745 -CTJTET1_RS03785 120052 -CTJTET1_RS03785 AQ193_RS00225 -CTJTET1_RS03785 BW688_RS00370 -CTJTET1_RS03785 AQ199_RS04460 -CTJTET1_RS03785 BKB93_RS03805 -CTJTET1_RS03785 G9768_RS03765 -CTJTET1_RS03785 gnl|Prokka|PADJNBJD_00741 -CTJTET1_RS03785 L3404_RS03740 -CTJTET1_RS03785 BKC02_RS03800 -CTJTET1_RS03785 NILJEPDF_00742 -CTJTET1_RS03785 LJHENM_03735 -CTJTET1_RS03785 AOT15_RS04565 -CTJTET1_RS03785 AP288_RS02135 -CTJTET1_RS03785 JIEJKO_03735 -CTJTET1_RS03785 BKC01_RS03805 -CTJTET1_RS03785 QSDFRQ_00742 -CTJTET1_RS03785 CTRC943_RS03750 -CTJTET1_RS03785 AKW53_RS00505 -CTJTET1_RS03785 BKC03_RS03800 -CTJTET1_RS03950 CTJTET1_RS03950 -CTJTET1_RS03950 KW39_RS03945 -CTJTET1_RS03950 DU10_RS03980 -CTJTET1_RS03950 A5291_RS03975 -CTJTET1_RS03950 SOTONK1_RS03930 -CTJTET1_RS03950 IaCS19096_RS03925 -CTJTET1_RS03950 DU13_RS03980 -CTJTET1_RS03950 C15_RS0104035 -CTJTET1_RS03950 ECS88FINAL_RS0104040 -CTJTET1_RS03950 O169_RS03940 -CTJTET1_RS03950 KW36_RS03930 -CTJTET1_RS03950 BKB95_RS03985 -CTJTET1_RS03950 CBP42_RS00535 -CTJTET1_RS03950 CTL2C_RS00530 -CTJTET1_RS03950 L1224_RS03910 -CTJTET1_RS03950 SW2_RS03935 -CTJTET1_RS03950 L1440_RS03905 -CTJTET1_RS03950 ECS102511_RS03925 -CTJTET1_RS03950 BKB96_RS03970 -CTJTET1_RS03950 BKB99_RS03965 -CTJTET1_RS03950 CBP44_RS00535 -CTJTET1_RS03950 L2BUCH2_RS03910 -CTJTET1_RS03950 BKB92_RS03965 -CTJTET1_RS03950 CTB_RS03970 -CTJTET1_RS03950 SOTONIA3_RS03950 -CTJTET1_RS03950 AQ244_RS03980 -CTJTET1_RS03950 E150_RS03935 -CTJTET1_RS03950 CTO_RS03965 -CTJTET1_RS03950 BBV13_RS03970 -CTJTET1_RS03950 FCS84708_RS03925 -CTJTET1_RS03950 L2BLST_RS03910 -CTJTET1_RS03950 BBV16_RS03980 -CTJTET1_RS03950 7618705 -CTJTET1_RS03950 120020 -CTJTET1_RS03950 BW688_RS00535 -CTJTET1_RS03950 AQ193_RS00060 -CTJTET1_RS03950 AQ199_RS04625 -CTJTET1_RS03950 BKB93_RS03970 -CTJTET1_RS03950 G9768_RS03930 -CTJTET1_RS03950 gnl|Prokka|PADJNBJD_00773 -CTJTET1_RS03950 L3404_RS03905 -CTJTET1_RS03950 NILJEPDF_00774 -CTJTET1_RS03950 BKC02_RS03965 -CTJTET1_RS03950 LJHENM_03895 -CTJTET1_RS03950 AOT15_RS04730 -CTJTET1_RS03950 AP288_RS02300 -CTJTET1_RS03950 JIEJKO_03895 -CTJTET1_RS03950 QSDFRQ_00774 -CTJTET1_RS03950 BKC01_RS03970 -CTJTET1_RS03950 CTRC943_RS03915 -CTJTET1_RS03950 AKW53_RS00670 -CTJTET1_RS03950 BKC03_RS03965 -CTJTET1_RS03950 CBP48_RS00535 -CTJTET1_RS04145 CTJTET1_RS04145 -CTJTET1_RS04315 CTJTET1_RS04315 -CTJTET1_RS04315 KW39_RS04155 -CTJTET1_RS04315 BKC03_RS04175 -CTJTET1_RS04315 CBP48_RS00745 -CTJTET1_RS04315 A5291_RS04180 -CTJTET1_RS04315 ECS88FINAL_RS0104225 -CTJTET1_RS04315 DU10_RS04190 -CTJTET1_RS04315 SOTONK1_RS04140 -CTJTET1_RS04315 IaCS19096_RS04135 -CTJTET1_RS04315 DU13_RS04190 -CTJTET1_RS04315 C15_RS0104250 -CTJTET1_RS04315 O169_RS04150 -CTJTET1_RS04315 KW36_RS04140 -CTJTET1_RS04315 BKB95_RS04195 -CTJTET1_RS04315 CBP42_RS00745 -CTJTET1_RS04315 CTL2C_RS00740 -CTJTET1_RS04315 L1224_RS04120 -CTJTET1_RS04315 BKB96_RS04180 -CTJTET1_RS04315 SW2_RS04145 -CTJTET1_RS04315 L1440_RS04115 -CTJTET1_RS04315 ECS102511_RS04135 -CTJTET1_RS04315 BKB99_RS04175 -CTJTET1_RS04315 CBP44_RS00745 -CTJTET1_RS04315 CTB_RS04175 -CTJTET1_RS04315 L2BUCH2_RS04120 -CTJTET1_RS04315 BKB92_RS04175 -CTJTET1_RS04315 SOTONIA3_RS04160 -CTJTET1_RS04315 CTO_RS04170 -CTJTET1_RS04315 AP288_RS02440 -CTJTET1_RS04315 E150_RS04145 -CTJTET1_RS04315 BBV13_RS04180 -CTJTET1_RS04315 119803 -CTJTET1_RS04315 FCS84708_RS04135 -CTJTET1_RS04315 AQ199_RS00065 -CTJTET1_RS04315 7618282 -CTJTET1_RS04315 L2BLST_RS04120 -CTJTET1_RS04315 BBV16_RS04190 -CTJTET1_RS04315 BW688_RS00745 -CTJTET1_RS04315 gnl|Prokka|PADJNBJD_00813 -CTJTET1_RS04315 AQ193_RS04635 -CTJTET1_RS04315 AQ244_RS02625 -CTJTET1_RS04315 BKB93_RS04180 -CTJTET1_RS04315 NILJEPDF_00814 -CTJTET1_RS04315 G9768_RS04140 -CTJTET1_RS04315 L3404_RS04115 -CTJTET1_RS04315 LJHENM_04095 -CTJTET1_RS04315 JIEJKO_04095 -CTJTET1_RS04315 BKC02_RS04175 -CTJTET1_RS04315 QSDFRQ_00814 -CTJTET1_RS04315 AKW53_RS00855 -CTJTET1_RS04315 BKC01_RS04180 -CTJTET1_RS04315 CTRC943_RS04125 -CTJTET1_RS04315 AOT15_RS01725 -CTJTET1_RS04475 CTJTET1_RS04475 -CTJTET1_RS04475 BKC03_RS04340 -CTJTET1_RS04475 A5291_RS04340 -CTJTET1_RS04475 KW39_RS04320 -CTJTET1_RS04475 SOTONK1_RS04305 -CTJTET1_RS04475 ECS88FINAL_RS01000000105000 -CTJTET1_RS04475 IaCS19096_RS04295 -CTJTET1_RS04475 DU10_RS04355 -CTJTET1_RS04475 C15_RS0104415 -CTJTET1_RS04475 DU13_RS04355 -CTJTET1_RS04475 O169_RS04315 -CTJTET1_RS04475 KW36_RS04300 -CTJTET1_RS04475 BKB95_RS04360 -CTJTET1_RS04475 BKB96_RS04345 -CTJTET1_RS04475 BKB99_RS04340 -CTJTET1_RS04475 SW2_RS04310 -CTJTET1_RS04475 ECS102511_RS04300 -CTJTET1_RS04475 CTB_RS04335 -CTJTET1_RS04475 SOTONIA3_RS04320 -CTJTET1_RS04475 BKB92_RS04340 -CTJTET1_RS04475 CTO_RS04330 -CTJTET1_RS04475 AP288_RS02605 -CTJTET1_RS04475 BBV13_RS04345 -CTJTET1_RS04475 E150_RS04310 -CTJTET1_RS04475 FCS84708_RS04300 -CTJTET1_RS04475 AQ199_RS00230 -CTJTET1_RS04475 BBV16_RS04350 -CTJTET1_RS04475 119831 -CTJTET1_RS04475 AQ193_RS04470 -CTJTET1_RS04475 G9768_RS04305 -CTJTET1_RS04475 AQ244_RS02455 -CTJTET1_RS04475 BKB93_RS04345 -CTJTET1_RS04475 BKC02_RS04340 -CTJTET1_RS04475 AKW53_RS01020 -CTJTET1_RS04475 BKC01_RS04345 -CTJTET1_RS04475 AOT15_RS01885 -CTJTET1_RS04635 CTJTET1_RS04635 -CTJTET1_RS04635 KW39_RS04485 -CTJTET1_RS04635 BKC03_RS04510 -CTJTET1_RS04635 CBP48_RS01085 -CTJTET1_RS04635 A5291_RS04500 -CTJTET1_RS04635 SOTONK1_RS04465 -CTJTET1_RS04635 ECS88FINAL_RS0104565 -CTJTET1_RS04635 IaCS19096_RS04460 -CTJTET1_RS04635 C15_RS0104585 -CTJTET1_RS04635 DU10_RS04530 -CTJTET1_RS04635 O169_RS04485 -CTJTET1_RS04635 KW36_RS04465 -CTJTET1_RS04635 DU13_RS04530 -CTJTET1_RS04635 BKB95_RS04530 -CTJTET1_RS04635 CBP42_RS01085 -CTJTET1_RS04635 CTL2C_RS01065 -CTJTET1_RS04635 L1224_RS04445 -CTJTET1_RS04635 BKB96_RS04515 -CTJTET1_RS04635 L1440_RS04440 -CTJTET1_RS04635 BKB99_RS04510 -CTJTET1_RS04635 SW2_RS04475 -CTJTET1_RS04635 ECS102511_RS04470 -CTJTET1_RS04635 CBP44_RS01085 -CTJTET1_RS04635 CTB_RS04495 -CTJTET1_RS04635 L2BUCH2_RS04445 -CTJTET1_RS04635 SOTONIA3_RS04480 -CTJTET1_RS04635 CTO_RS04490 -CTJTET1_RS04635 BBV13_RS04505 -CTJTET1_RS04635 BKB92_RS04515 -CTJTET1_RS04635 AP288_RS02775 -CTJTET1_RS04635 BBV16_RS04510 -CTJTET1_RS04635 E150_RS04480 -CTJTET1_RS04635 L2BLST_RS04445 -CTJTET1_RS04635 gnl|Prokka|PADJNBJD_00876 -CTJTET1_RS04635 FCS84708_RS04465 -CTJTET1_RS04635 AQ199_RS00400 -CTJTET1_RS04635 AQ193_RS04300 -CTJTET1_RS04635 BW688_RS01085 -CTJTET1_RS04635 119865 -CTJTET1_RS04635 NILJEPDF_00877 -CTJTET1_RS04635 7618323 -CTJTET1_RS04635 AQ244_RS02285 -CTJTET1_RS04635 G9768_RS04465 -CTJTET1_RS04635 LJHENM_04415 -CTJTET1_RS04635 L3404_RS04440 -CTJTET1_RS04635 JIEJKO_04410 -CTJTET1_RS04635 QSDFRQ_00877 -CTJTET1_RS04635 BKB93_RS04520 -CTJTET1_RS04635 BKC02_RS04510 -CTJTET1_RS04635 AKW53_RS01190 -CTJTET1_RS04635 BKC01_RS04515 -CTJTET1_RS04635 CTRC943_RS04450 -CTJTET1_RS04635 AOT15_RS02045 -ECS88FINAL_RS0100035 ECS88FINAL_RS0100035 -ECS88FINAL_RS0100035 DU13_RS00035 -ECS88FINAL_RS0100035 KW39_RS00035 -ECS88FINAL_RS0100035 BKB95_RS00035 -ECS88FINAL_RS0100035 KW36_RS00035 -ECS88FINAL_RS0100035 SW2_RS00035 -ECS88FINAL_RS0100035 ECS102511_RS00035 -ECS88FINAL_RS0100035 CTB_RS00035 -ECS88FINAL_RS0100035 CTL2C_RS01400 -ECS88FINAL_RS0100035 CBP42_RS01425 -ECS88FINAL_RS0100035 L1224_RS00035 -ECS88FINAL_RS0100035 AOT15_RS00920 -ECS88FINAL_RS0100035 BKB96_RS00035 -ECS88FINAL_RS0100035 BKB99_RS00035 -ECS88FINAL_RS0100035 CTO_RS00035 -ECS88FINAL_RS0100035 SOTONIA3_RS00035 -ECS88FINAL_RS0100035 L1440_RS00035 -ECS88FINAL_RS0100035 BKB92_RS00035 -ECS88FINAL_RS0100035 120663 -ECS88FINAL_RS0100035 CBP44_RS01425 -ECS88FINAL_RS0100035 E150_RS00035 -ECS88FINAL_RS0100035 L2BUCH2_RS00035 -ECS88FINAL_RS0100035 BKB93_RS00035 -ECS88FINAL_RS0100035 FCS84708_RS00035 -ECS88FINAL_RS0100035 AP288_RS03105 -ECS88FINAL_RS0100035 BBV13_RS00035 -ECS88FINAL_RS0100035 G9768_RS00035 -ECS88FINAL_RS0100035 BW688_RS01425 -ECS88FINAL_RS0100035 L2BLST_RS00035 -ECS88FINAL_RS0100035 AQ199_RS00730 -ECS88FINAL_RS0100035 BKC02_RS00035 -ECS88FINAL_RS0100035 AQ193_RS03970 -ECS88FINAL_RS0100035 BBV16_RS00035 -ECS88FINAL_RS0100035 BKC01_RS00035 -ECS88FINAL_RS0100035 7618780 -ECS88FINAL_RS0100035 gnl|Prokka|PADJNBJD_00007 -ECS88FINAL_RS0100035 LJHENM_00035 -ECS88FINAL_RS0100035 A5291_RS00035 -ECS88FINAL_RS0100035 SOTONK1_RS00035 -ECS88FINAL_RS0100035 AQ244_RS01955 -ECS88FINAL_RS0100035 JIEJKO_00030 -ECS88FINAL_RS0100035 NILJEPDF_00007 -ECS88FINAL_RS0100035 L3404_RS00035 -ECS88FINAL_RS0100035 IaCS19096_RS00035 -ECS88FINAL_RS0100035 BKC03_RS00035 -ECS88FINAL_RS0100035 C15_RS0100035 -ECS88FINAL_RS0100035 QSDFRQ_00007 -ECS88FINAL_RS0100035 CTJTET1_RS00035 -ECS88FINAL_RS0100035 AKW53_RS01520 -ECS88FINAL_RS0100035 DU10_RS00035 -ECS88FINAL_RS0100035 CTRC943_RS00035 -ECS88FINAL_RS0100035 O169_RS00035 -ECS88FINAL_RS0100035 CBP48_RS01425 -ECS88FINAL_RS0100210 ECS88FINAL_RS0100210 -ECS88FINAL_RS0100210 DU13_RS00210 -ECS88FINAL_RS0100210 KW39_RS00205 -ECS88FINAL_RS0100210 KW36_RS00205 -ECS88FINAL_RS0100210 BKB95_RS00210 -ECS88FINAL_RS0100210 SW2_RS00205 -ECS88FINAL_RS0100210 ECS102511_RS00205 -ECS88FINAL_RS0100210 CTL2C_RS01570 -ECS88FINAL_RS0100210 CBP42_RS01600 -ECS88FINAL_RS0100210 CTB_RS00205 -ECS88FINAL_RS0100210 L1224_RS00205 -ECS88FINAL_RS0100210 AOT15_RS00750 -ECS88FINAL_RS0100210 BKB96_RS00210 -ECS88FINAL_RS0100210 L1440_RS00205 -ECS88FINAL_RS0100210 BKB99_RS00210 -ECS88FINAL_RS0100210 BKB92_RS00210 -ECS88FINAL_RS0100210 CTO_RS00205 -ECS88FINAL_RS0100210 SOTONIA3_RS00205 -ECS88FINAL_RS0100210 120639 -ECS88FINAL_RS0100210 CBP44_RS01605 -ECS88FINAL_RS0100210 E150_RS00205 -ECS88FINAL_RS0100210 L2BUCH2_RS00205 -ECS88FINAL_RS0100210 BKB93_RS00210 -ECS88FINAL_RS0100210 FCS84708_RS00205 -ECS88FINAL_RS0100210 AP288_RS03275 -ECS88FINAL_RS0100210 BBV13_RS00210 -ECS88FINAL_RS0100210 AQ199_RS00900 -ECS88FINAL_RS0100210 BW688_RS01600 -ECS88FINAL_RS0100210 G9768_RS00205 -ECS88FINAL_RS0100210 L2BLST_RS00205 -ECS88FINAL_RS0100210 BKC02_RS00210 -ECS88FINAL_RS0100210 AQ193_RS03800 -ECS88FINAL_RS0100210 AQ244_RS01785 -ECS88FINAL_RS0100210 BBV16_RS00210 -ECS88FINAL_RS0100210 gnl|Prokka|PADJNBJD_00041 -ECS88FINAL_RS0100210 JIEJKO_00200 -ECS88FINAL_RS0100210 BKC01_RS00210 -ECS88FINAL_RS0100210 7618795 -ECS88FINAL_RS0100210 NILJEPDF_00041 -ECS88FINAL_RS0100210 LJHENM_00210 -ECS88FINAL_RS0100210 A5291_RS00205 -ECS88FINAL_RS0100210 SOTONK1_RS00205 -ECS88FINAL_RS0100210 L3404_RS00205 -ECS88FINAL_RS0100210 AKW53_RS01695 -ECS88FINAL_RS0100210 IaCS19096_RS00205 -ECS88FINAL_RS0100210 BKC03_RS00210 -ECS88FINAL_RS0100210 QSDFRQ_00041 -ECS88FINAL_RS0100210 C15_RS0100205 -ECS88FINAL_RS0100210 DU10_RS00210 -ECS88FINAL_RS0100210 CTRC943_RS00205 -ECS88FINAL_RS0100210 CTJTET1_RS00205 -ECS88FINAL_RS0100210 O169_RS00205 -ECS88FINAL_RS0100210 CBP48_RS01600 -ECS88FINAL_RS0100385 ECS88FINAL_RS0100385 -ECS88FINAL_RS0100385 KW39_RS00370 -ECS88FINAL_RS0100385 BKB95_RS00380 -ECS88FINAL_RS0100385 SW2_RS00370 -ECS88FINAL_RS0100385 ECS102511_RS00370 -ECS88FINAL_RS0100385 CTB_RS00370 -ECS88FINAL_RS0100385 CTL2C_RS01735 -ECS88FINAL_RS0100385 CBP42_RS01770 -ECS88FINAL_RS0100385 BKB96_RS00380 -ECS88FINAL_RS0100385 L1224_RS00370 -ECS88FINAL_RS0100385 AOT15_RS00585 -ECS88FINAL_RS0100385 BKB99_RS00380 -ECS88FINAL_RS0100385 CTO_RS00370 -ECS88FINAL_RS0100385 L1440_RS00370 -ECS88FINAL_RS0100385 BKB92_RS00380 -ECS88FINAL_RS0100385 SOTONIA3_RS00370 -ECS88FINAL_RS0100385 CBP44_RS01775 -ECS88FINAL_RS0100385 119264 -ECS88FINAL_RS0100385 E150_RS00370 -ECS88FINAL_RS0100385 L2BUCH2_RS00370 -ECS88FINAL_RS0100385 BKB93_RS00380 -ECS88FINAL_RS0100385 FCS84708_RS00370 -ECS88FINAL_RS0100385 AP288_RS03440 -ECS88FINAL_RS0100385 BBV13_RS00375 -ECS88FINAL_RS0100385 AQ199_RS01065 -ECS88FINAL_RS0100385 BW688_RS01770 -ECS88FINAL_RS0100385 G9768_RS00370 -ECS88FINAL_RS0100385 L2BLST_RS00370 -ECS88FINAL_RS0100385 BKC02_RS00380 -ECS88FINAL_RS0100385 BBV16_RS00375 -ECS88FINAL_RS0100385 gnl|Prokka|PADJNBJD_00073 -ECS88FINAL_RS0100385 AQ193_RS03625 -ECS88FINAL_RS0100385 AQ244_RS01620 -ECS88FINAL_RS0100385 NILJEPDF_00073 -ECS88FINAL_RS0100385 LJHENM_00370 -ECS88FINAL_RS0100385 A5291_RS00370 -ECS88FINAL_RS0100385 BKC01_RS00380 -ECS88FINAL_RS0100385 SOTONK1_RS00370 -ECS88FINAL_RS0100385 L3404_RS00370 -ECS88FINAL_RS0100385 JIEJKO_00370 -ECS88FINAL_RS0100385 AKW53_RS01860 -ECS88FINAL_RS0100385 QSDFRQ_00073 -ECS88FINAL_RS0100385 IaCS19096_RS00370 -ECS88FINAL_RS0100385 BKC03_RS00380 -ECS88FINAL_RS0100385 C15_RS0100380 -ECS88FINAL_RS0100385 DU10_RS00380 -ECS88FINAL_RS0100385 7618393 -ECS88FINAL_RS0100385 CTRC943_RS00370 -ECS88FINAL_RS0100385 CTJTET1_RS00370 -ECS88FINAL_RS0100385 O169_RS00370 -ECS88FINAL_RS0100385 KW36_RS00370 -ECS88FINAL_RS0100385 DU13_RS00385 -ECS88FINAL_RS0100385 CBP48_RS01770 -ECS88FINAL_RS0100550 ECS88FINAL_RS0100550 -ECS88FINAL_RS0100550 KW36_RS00535 -ECS88FINAL_RS0100550 CBP48_RS01935 -ECS88FINAL_RS0100550 SW2_RS00535 -ECS88FINAL_RS0100550 BKB95_RS00545 -ECS88FINAL_RS0100550 ECS102511_RS00535 -ECS88FINAL_RS0100550 CTB_RS00535 -ECS88FINAL_RS0100550 CTL2C_RS01900 -ECS88FINAL_RS0100550 AQ244_RS02710 -ECS88FINAL_RS0100550 BKB96_RS00545 -ECS88FINAL_RS0100550 CBP42_RS01935 -ECS88FINAL_RS0100550 AOT15_RS00420 -ECS88FINAL_RS0100550 BKB99_RS00545 -ECS88FINAL_RS0100550 L1224_RS00535 -ECS88FINAL_RS0100550 BKB92_RS00545 -ECS88FINAL_RS0100550 CTO_RS00535 -ECS88FINAL_RS0100550 SOTONIA3_RS00535 -ECS88FINAL_RS0100550 L1440_RS00535 -ECS88FINAL_RS0100550 E150_RS00535 -ECS88FINAL_RS0100550 CBP44_RS01940 -ECS88FINAL_RS0100550 119282 -ECS88FINAL_RS0100550 BKB93_RS00545 -ECS88FINAL_RS0100550 L2BUCH2_RS00535 -ECS88FINAL_RS0100550 AP288_RS03605 -ECS88FINAL_RS0100550 FCS84708_RS00535 -ECS88FINAL_RS0100550 AQ199_RS01230 -ECS88FINAL_RS0100550 BBV13_RS00540 -ECS88FINAL_RS0100550 G9768_RS00535 -ECS88FINAL_RS0100550 L2BLST_RS00535 -ECS88FINAL_RS0100550 BW688_RS01935 -ECS88FINAL_RS0100550 BKC02_RS00545 -ECS88FINAL_RS0100550 BBV16_RS00540 -ECS88FINAL_RS0100550 gnl|Prokka|PADJNBJD_00105 -ECS88FINAL_RS0100550 LJHENM_00525 -ECS88FINAL_RS0100550 BKC01_RS00545 -ECS88FINAL_RS0100550 NILJEPDF_00105 -ECS88FINAL_RS0100550 AKW53_RS02030 -ECS88FINAL_RS0100550 AQ193_RS03460 -ECS88FINAL_RS0100550 A5291_RS00535 -ECS88FINAL_RS0100550 SOTONK1_RS00535 -ECS88FINAL_RS0100550 JIEJKO_00530 -ECS88FINAL_RS0100550 L3404_RS00535 -ECS88FINAL_RS0100550 QSDFRQ_00105 -ECS88FINAL_RS0100550 IaCS19096_RS00535 -ECS88FINAL_RS0100550 BKC03_RS00545 -ECS88FINAL_RS0100550 C15_RS0100550 -ECS88FINAL_RS0100550 DU10_RS00545 -ECS88FINAL_RS0100550 CTJTET1_RS00535 -ECS88FINAL_RS0100550 O169_RS00535 -ECS88FINAL_RS0100550 DU13_RS00550 -ECS88FINAL_RS0100550 7618405 -ECS88FINAL_RS0100550 CTRC943_RS00535 -ECS88FINAL_RS0100550 KW39_RS00535 -ECS88FINAL_RS01000000104915 ECS88FINAL_RS01000000104915 -ECS88FINAL_RS01000000104915 SW2_RS00900 -ECS88FINAL_RS01000000104915 ECS102511_RS00900 -ECS88FINAL_RS01000000104915 BKB92_RS00905 -ECS88FINAL_RS01000000104915 E150_RS00900 -ECS88FINAL_RS01000000104915 FCS84708_RS00900 -ECS88FINAL_RS01000000104915 AP288_RS03970 -ECS88FINAL_RS01000000104915 BKB93_RS00905 -ECS88FINAL_RS01000000104915 AQ199_RS01595 -ECS88FINAL_RS01000000104915 AQ193_RS03090 -ECS88FINAL_RS01000000104915 AKW53_RS02395 -ECS88FINAL_RS01000000104915 DU10_RS00915 -ECS88FINAL_RS0101770 ECS88FINAL_RS0101770 -ECS88FINAL_RS0101770 O169_RS01750 -ECS88FINAL_RS0101770 DU13_RS01760 -ECS88FINAL_RS0101770 7618512 -ECS88FINAL_RS0101770 CTL2C_RS03085 -ECS88FINAL_RS0101770 BKB95_RS01760 -ECS88FINAL_RS0101770 CBP48_RS03145 -ECS88FINAL_RS0101770 L1224_RS01715 -ECS88FINAL_RS0101770 KW36_RS01735 -ECS88FINAL_RS0101770 AOT15_RS02735 -ECS88FINAL_RS0101770 BKB96_RS01745 -ECS88FINAL_RS0101770 SW2_RS01740 -ECS88FINAL_RS0101770 BKB99_RS01745 -ECS88FINAL_RS0101770 L1440_RS01715 -ECS88FINAL_RS0101770 ECS102511_RS01740 -ECS88FINAL_RS0101770 AP288_RS01340 -ECS88FINAL_RS0101770 CBP42_RS03145 -ECS88FINAL_RS0101770 CTB_RS01765 -ECS88FINAL_RS0101770 SOTONIA3_RS01750 -ECS88FINAL_RS0101770 L2BUCH2_RS01715 -ECS88FINAL_RS0101770 BKB92_RS01755 -ECS88FINAL_RS0101770 CTO_RS01765 -ECS88FINAL_RS0101770 AQ244_RS01370 -ECS88FINAL_RS0101770 E150_RS01745 -ECS88FINAL_RS0101770 L2BLST_RS01715 -ECS88FINAL_RS0101770 FCS84708_RS01735 -ECS88FINAL_RS0101770 BW688_RS03145 -ECS88FINAL_RS0101770 BKB93_RS01755 -ECS88FINAL_RS0101770 CBP44_RS03150 -ECS88FINAL_RS0101770 BBV13_RS01770 -ECS88FINAL_RS0101770 AQ199_RS02435 -ECS88FINAL_RS0101770 G9768_RS01740 -ECS88FINAL_RS0101770 L3404_RS01715 -ECS88FINAL_RS0101770 BBV16_RS01770 -ECS88FINAL_RS0101770 BKC02_RS01745 -ECS88FINAL_RS0101770 AQ193_RS02245 -ECS88FINAL_RS0101770 BKC01_RS01745 -ECS88FINAL_RS0101770 AKW53_RS03240 -ECS88FINAL_RS0101770 gnl|Prokka|PADJNBJD_00342 -ECS88FINAL_RS0101770 NILJEPDF_00342 -ECS88FINAL_RS0101770 CTRC943_RS01720 -ECS88FINAL_RS0101770 LJHENM_01725 -ECS88FINAL_RS0101770 JIEJKO_01720 -ECS88FINAL_RS0101770 BKC03_RS01745 -ECS88FINAL_RS0101770 CTJTET1_RS01750 -ECS88FINAL_RS0101770 DU10_RS01765 -ECS88FINAL_RS0101770 QSDFRQ_00342 -ECS88FINAL_RS0101770 C15_RS0101780 -ECS88FINAL_RS0101770 SOTONK1_RS01740 -ECS88FINAL_RS0101770 A5291_RS01765 -ECS88FINAL_RS0101770 KW39_RS01750 -ECS88FINAL_RS0101770 IaCS19096_RS01735 -ECS88FINAL_RS0101770 119454 -ECS88FINAL_RS0101940 ECS88FINAL_RS0101940 -ECS88FINAL_RS0101940 O169_RS01915 -ECS88FINAL_RS0101940 DU13_RS01930 -ECS88FINAL_RS0101940 CTL2C_RS03250 -ECS88FINAL_RS0101940 119485 -ECS88FINAL_RS0101940 L1224_RS01880 -ECS88FINAL_RS0101940 KW36_RS01900 -ECS88FINAL_RS0101940 AOT15_RS02900 -ECS88FINAL_RS0101940 BKB95_RS01930 -ECS88FINAL_RS0101940 BKB96_RS01910 -ECS88FINAL_RS0101940 CBP48_RS03315 -ECS88FINAL_RS0101940 SW2_RS01905 -ECS88FINAL_RS0101940 BKB99_RS01910 -ECS88FINAL_RS0101940 L1440_RS01880 -ECS88FINAL_RS0101940 ECS102511_RS01905 -ECS88FINAL_RS0101940 AP288_RS01175 -ECS88FINAL_RS0101940 CTB_RS01930 -ECS88FINAL_RS0101940 SOTONIA3_RS01915 -ECS88FINAL_RS0101940 L2BUCH2_RS01880 -ECS88FINAL_RS0101940 BKB92_RS01920 -ECS88FINAL_RS0101940 CBP42_RS03325 -ECS88FINAL_RS0101940 CTO_RS01930 -ECS88FINAL_RS0101940 AQ244_RS01205 -ECS88FINAL_RS0101940 E150_RS01910 -ECS88FINAL_RS0101940 L2BLST_RS01880 -ECS88FINAL_RS0101940 FCS84708_RS01900 -ECS88FINAL_RS0101940 BKB93_RS01920 -ECS88FINAL_RS0101940 BBV13_RS01935 -ECS88FINAL_RS0101940 CBP44_RS03320 -ECS88FINAL_RS0101940 AQ199_RS02600 -ECS88FINAL_RS0101940 G9768_RS01905 -ECS88FINAL_RS0101940 L3404_RS01880 -ECS88FINAL_RS0101940 BBV16_RS01935 -ECS88FINAL_RS0101940 BKC02_RS01910 -ECS88FINAL_RS0101940 AQ193_RS02080 -ECS88FINAL_RS0101940 BKC01_RS01910 -ECS88FINAL_RS0101940 AKW53_RS03405 -ECS88FINAL_RS0101940 gnl|Prokka|PADJNBJD_00375 -ECS88FINAL_RS0101940 NILJEPDF_00375 -ECS88FINAL_RS0101940 CTRC943_RS01885 -ECS88FINAL_RS0101940 LJHENM_01890 -ECS88FINAL_RS0101940 JIEJKO_01885 -ECS88FINAL_RS0101940 BKC03_RS01910 -ECS88FINAL_RS0101940 CTJTET1_RS01915 -ECS88FINAL_RS0101940 QSDFRQ_00375 -ECS88FINAL_RS0101940 C15_RS0101950 -ECS88FINAL_RS0101940 SOTONK1_RS01905 -ECS88FINAL_RS0101940 DU10_RS01935 -ECS88FINAL_RS0101940 A5291_RS01930 -ECS88FINAL_RS0101940 KW39_RS01915 -ECS88FINAL_RS0101940 IaCS19096_RS01900 -ECS88FINAL_RS0102105 ECS88FINAL_RS0102105 -ECS88FINAL_RS0102105 O169_RS02075 -ECS88FINAL_RS0102105 DU13_RS02090 -ECS88FINAL_RS0102105 7618984 -ECS88FINAL_RS0102105 CTL2C_RS03410 -ECS88FINAL_RS0102105 CBP48_RS03475 -ECS88FINAL_RS0102105 120322 -ECS88FINAL_RS0102105 L1224_RS02040 -ECS88FINAL_RS0102105 KW36_RS02060 -ECS88FINAL_RS0102105 AOT15_RS03060 -ECS88FINAL_RS0102105 BKB95_RS02090 -ECS88FINAL_RS0102105 BKB96_RS02070 -ECS88FINAL_RS0102105 SW2_RS02065 -ECS88FINAL_RS0102105 BKB99_RS02070 -ECS88FINAL_RS0102105 L1440_RS02040 -ECS88FINAL_RS0102105 ECS102511_RS02065 -ECS88FINAL_RS0102105 AP288_RS01015 -ECS88FINAL_RS0102105 CTB_RS02090 -ECS88FINAL_RS0102105 CBP42_RS03485 -ECS88FINAL_RS0102105 SOTONIA3_RS02075 -ECS88FINAL_RS0102105 L2BUCH2_RS02040 -ECS88FINAL_RS0102105 BKB92_RS02080 -ECS88FINAL_RS0102105 CTO_RS02090 -ECS88FINAL_RS0102105 AQ244_RS01045 -ECS88FINAL_RS0102105 E150_RS02070 -ECS88FINAL_RS0102105 L2BLST_RS02040 -ECS88FINAL_RS0102105 BW688_RS03470 -ECS88FINAL_RS0102105 FCS84708_RS02060 -ECS88FINAL_RS0102105 BBV13_RS02095 -ECS88FINAL_RS0102105 BKB93_RS02080 -ECS88FINAL_RS0102105 CBP44_RS03480 -ECS88FINAL_RS0102105 AQ199_RS02760 -ECS88FINAL_RS0102105 G9768_RS02065 -ECS88FINAL_RS0102105 BBV16_RS02095 -ECS88FINAL_RS0102105 L3404_RS02040 -ECS88FINAL_RS0102105 BKC02_RS02070 -ECS88FINAL_RS0102105 AQ193_RS01920 -ECS88FINAL_RS0102105 BKC01_RS02070 -ECS88FINAL_RS0102105 AKW53_RS03565 -ECS88FINAL_RS0102105 gnl|Prokka|PADJNBJD_00407 -ECS88FINAL_RS0102105 NILJEPDF_00407 -ECS88FINAL_RS0102105 CTRC943_RS02045 -ECS88FINAL_RS0102105 LJHENM_02050 -ECS88FINAL_RS0102105 JIEJKO_02045 -ECS88FINAL_RS0102105 BKC03_RS02070 -ECS88FINAL_RS0102105 CTJTET1_RS02075 -ECS88FINAL_RS0102105 QSDFRQ_00407 -ECS88FINAL_RS0102105 C15_RS0102110 -ECS88FINAL_RS0102105 A5291_RS02090 -ECS88FINAL_RS0102105 SOTONK1_RS02065 -ECS88FINAL_RS0102105 DU10_RS02095 -ECS88FINAL_RS0102105 KW39_RS02075 -ECS88FINAL_RS0102105 IaCS19096_RS02060 -ECS88FINAL_RS0102275 ECS88FINAL_RS0102275 -ECS88FINAL_RS0102275 O169_RS02240 -ECS88FINAL_RS0102275 DU13_RS02260 -ECS88FINAL_RS0102275 7618996 -ECS88FINAL_RS0102275 BKB96_RS02245 -ECS88FINAL_RS0102275 BKB99_RS02240 -ECS88FINAL_RS0102275 CBP48_RS03645 -ECS88FINAL_RS0102275 CTL2C_RS03580 -ECS88FINAL_RS0102275 KW36_RS02225 -ECS88FINAL_RS0102275 AOT15_RS03225 -ECS88FINAL_RS0102275 BKB95_RS02260 -ECS88FINAL_RS0102275 120303 -ECS88FINAL_RS0102275 L1224_RS02210 -ECS88FINAL_RS0102275 SW2_RS02235 -ECS88FINAL_RS0102275 ECS102511_RS02230 -ECS88FINAL_RS0102275 L1440_RS02210 -ECS88FINAL_RS0102275 AP288_RS00850 -ECS88FINAL_RS0102275 CBP42_RS03655 -ECS88FINAL_RS0102275 CTB_RS02260 -ECS88FINAL_RS0102275 L2BUCH2_RS02205 -ECS88FINAL_RS0102275 BKB92_RS02250 -ECS88FINAL_RS0102275 SOTONIA3_RS02245 -ECS88FINAL_RS0102275 CTO_RS02260 -ECS88FINAL_RS0102275 E150_RS02235 -ECS88FINAL_RS0102275 AQ244_RS00880 -ECS88FINAL_RS0102275 BW688_RS03640 -ECS88FINAL_RS0102275 L2BLST_RS02210 -ECS88FINAL_RS0102275 FCS84708_RS02225 -ECS88FINAL_RS0102275 BBV13_RS02265 -ECS88FINAL_RS0102275 CBP44_RS03650 -ECS88FINAL_RS0102275 BKB93_RS02255 -ECS88FINAL_RS0102275 AQ199_RS02925 -ECS88FINAL_RS0102275 G9768_RS02230 -ECS88FINAL_RS0102275 BBV16_RS02270 -ECS88FINAL_RS0102275 L3404_RS02205 -ECS88FINAL_RS0102275 BKC02_RS02240 -ECS88FINAL_RS0102275 AQ193_RS01755 -ECS88FINAL_RS0102275 BKC01_RS02240 -ECS88FINAL_RS0102275 AKW53_RS03730 -ECS88FINAL_RS0102275 gnl|Prokka|PADJNBJD_00440 -ECS88FINAL_RS0102275 NILJEPDF_00440 -ECS88FINAL_RS0102275 CTRC943_RS02210 -ECS88FINAL_RS0102275 LJHENM_02220 -ECS88FINAL_RS0102275 JIEJKO_02215 -ECS88FINAL_RS0102275 BKC03_RS02240 -ECS88FINAL_RS0102275 CTJTET1_RS02240 -ECS88FINAL_RS0102275 QSDFRQ_00440 -ECS88FINAL_RS0102275 C15_RS0102275 -ECS88FINAL_RS0102275 SOTONK1_RS02230 -ECS88FINAL_RS0102275 DU10_RS02265 -ECS88FINAL_RS0102275 A5291_RS02260 -ECS88FINAL_RS0102275 KW39_RS02240 -ECS88FINAL_RS0102275 IaCS19096_RS02225 -ECS88FINAL_RS01000000104940 ECS88FINAL_RS01000000104940 -ECS88FINAL_RS01000000104940 IaCS19096_RS02575 -ECS88FINAL_RS01000000104940 DU10_RS02620 -ECS88FINAL_RS01000000104940 O169_RS02590 -ECS88FINAL_RS01000000104940 A5291_RS02615 -ECS88FINAL_RS01000000104940 DU13_RS02615 -ECS88FINAL_RS01000000104940 7618196 -ECS88FINAL_RS01000000104940 AKW53_RS04635 -ECS88FINAL_RS01000000104940 CBP48_RS04000 -ECS88FINAL_RS01000000104940 CTL2C_RS03930 -ECS88FINAL_RS01000000104940 KW36_RS02575 -ECS88FINAL_RS01000000104940 BKB96_RS02605 -ECS88FINAL_RS01000000104940 BKB99_RS02600 -ECS88FINAL_RS01000000104940 SW2_RS02585 -ECS88FINAL_RS01000000104940 L1224_RS02560 -ECS88FINAL_RS01000000104940 ECS102511_RS02580 -ECS88FINAL_RS01000000104940 L1440_RS02560 -ECS88FINAL_RS01000000104940 AP288_RS00500 -ECS88FINAL_RS01000000104940 120256 -ECS88FINAL_RS01000000104940 CBP42_RS04010 -ECS88FINAL_RS01000000104940 L2BUCH2_RS02560 -ECS88FINAL_RS01000000104940 BKB92_RS02605 -ECS88FINAL_RS01000000104940 CTB_RS02615 -ECS88FINAL_RS01000000104940 AQ244_RS00530 -ECS88FINAL_RS01000000104940 E150_RS02585 -ECS88FINAL_RS01000000104940 BW688_RS04000 -ECS88FINAL_RS01000000104940 CTO_RS02615 -ECS88FINAL_RS01000000104940 FCS84708_RS02575 -ECS88FINAL_RS01000000104940 L2BLST_RS02560 -ECS88FINAL_RS01000000104940 BBV13_RS02620 -ECS88FINAL_RS01000000104940 CBP44_RS04005 -ECS88FINAL_RS01000000104940 AQ199_RS03275 -ECS88FINAL_RS01000000104940 BKB93_RS02610 -ECS88FINAL_RS01000000104940 BBV16_RS02630 -ECS88FINAL_RS01000000104940 AQ193_RS01405 -ECS88FINAL_RS01000000104940 L3404_RS02555 -ECS88FINAL_RS01000000104940 BKC02_RS02600 -ECS88FINAL_RS01000000104940 AOT15_RS03515 -ECS88FINAL_RS01000000104940 gnl|Prokka|PADJNBJD_00508 -ECS88FINAL_RS01000000104940 BKC01_RS02600 -ECS88FINAL_RS01000000104940 NILJEPDF_00508 -ECS88FINAL_RS01000000104940 LJHENM_02555 -ECS88FINAL_RS01000000104940 CTRC943_RS02560 -ECS88FINAL_RS01000000104940 JIEJKO_02560 -ECS88FINAL_RS01000000104940 QSDFRQ_00508 -ECS88FINAL_RS01000000104940 SOTONK1_RS02580 -ECS88FINAL_RS01000000104940 BKC03_RS02600 -ECS88FINAL_RS01000000104940 KW39_RS02590 -ECS88FINAL_RS0104215 ECS88FINAL_RS0104215 -ECS88FINAL_RS0104215 DU10_RS04180 -ECS88FINAL_RS0104215 DU13_RS04180 -ECS88FINAL_RS0104215 O169_RS04140 -ECS88FINAL_RS0104215 SW2_RS04135 -ECS88FINAL_RS0104215 ECS102511_RS04125 -ECS88FINAL_RS0104215 BKB92_RS04165 -ECS88FINAL_RS0104215 AP288_RS02430 -ECS88FINAL_RS0104215 E150_RS04135 -ECS88FINAL_RS0104215 FCS84708_RS04125 -ECS88FINAL_RS0104215 AQ199_RS00055 -ECS88FINAL_RS0104215 BKB93_RS04170 -ECS88FINAL_RS0104215 LJHENM_04085 -ECS88FINAL_RS0104215 AQ193_RS04645 -ECS88FINAL_RS0104215 AKW53_RS00845 -ECS88FINAL_RS0104215 KW39_RS04145 -ECS88FINAL_RS0104215 A5291_RS04170 -ECS88FINAL_RS0104215 SOTONK1_RS04130 -ECS88FINAL_RS0104215 IaCS19096_RS04125 -ECS88FINAL_RS0104215 C15_RS0104240 -ECS88FINAL_RS0104215 KW36_RS04130 -ECS88FINAL_RS0104215 BKB95_RS04185 -ECS88FINAL_RS0104215 CBP42_RS00735 -ECS88FINAL_RS0104215 CTL2C_RS00730 -ECS88FINAL_RS0104215 L1224_RS04110 -ECS88FINAL_RS0104215 BKB96_RS04170 -ECS88FINAL_RS0104215 L1440_RS04105 -ECS88FINAL_RS0104215 BKB99_RS04165 -ECS88FINAL_RS0104215 CBP44_RS00735 -ECS88FINAL_RS0104215 CTB_RS04165 -ECS88FINAL_RS0104215 L2BUCH2_RS04110 -ECS88FINAL_RS0104215 SOTONIA3_RS04150 -ECS88FINAL_RS0104215 CTO_RS04160 -ECS88FINAL_RS0104215 BBV13_RS04170 -ECS88FINAL_RS0104215 119800 -ECS88FINAL_RS0104215 7618280 -ECS88FINAL_RS0104215 L2BLST_RS04110 -ECS88FINAL_RS0104215 BBV16_RS04180 -ECS88FINAL_RS0104215 BW688_RS00735 -ECS88FINAL_RS0104215 gnl|Prokka|PADJNBJD_00811 -ECS88FINAL_RS0104215 NILJEPDF_00812 -ECS88FINAL_RS0104215 G9768_RS04130 -ECS88FINAL_RS0104215 L3404_RS04105 -ECS88FINAL_RS0104215 JIEJKO_04085 -ECS88FINAL_RS0104215 BKC02_RS04165 -ECS88FINAL_RS0104215 QSDFRQ_00812 -ECS88FINAL_RS0104215 AQ244_RS02635 -ECS88FINAL_RS0104215 BKC01_RS04170 -ECS88FINAL_RS0104215 CTRC943_RS04115 -ECS88FINAL_RS0104215 AOT15_RS01715 -ECS88FINAL_RS0104215 CTJTET1_RS04305 -ECS88FINAL_RS0104215 BKC03_RS04165 -ECS88FINAL_RS0104215 CBP48_RS00735 -KW39_RS00030 KW39_RS00030 -KW39_RS00030 BKB95_RS00030 -KW39_RS00030 KW36_RS00030 -KW39_RS00030 SW2_RS00030 -KW39_RS00030 ECS102511_RS00030 -KW39_RS00030 CTB_RS00030 -KW39_RS00030 CTL2C_RS01395 -KW39_RS00030 CBP42_RS01420 -KW39_RS00030 L1224_RS00030 -KW39_RS00030 BKB96_RS00030 -KW39_RS00030 BKB99_RS00030 -KW39_RS00030 CTO_RS00030 -KW39_RS00030 SOTONIA3_RS00030 -KW39_RS00030 L1440_RS00030 -KW39_RS00030 AOT15_RS00925 -KW39_RS00030 BKB92_RS00030 -KW39_RS00030 120664 -KW39_RS00030 CBP44_RS01420 -KW39_RS00030 E150_RS00030 -KW39_RS00030 L2BUCH2_RS00030 -KW39_RS00030 BKB93_RS00030 -KW39_RS00030 FCS84708_RS00030 -KW39_RS00030 AP288_RS03100 -KW39_RS00030 BBV13_RS00030 -KW39_RS00030 G9768_RS00030 -KW39_RS00030 BW688_RS01420 -KW39_RS00030 L2BLST_RS00030 -KW39_RS00030 AQ199_RS00725 -KW39_RS00030 BKC02_RS00030 -KW39_RS00030 AQ193_RS03975 -KW39_RS00030 BKC01_RS00030 -KW39_RS00030 7618779 -KW39_RS00030 gnl|Prokka|PADJNBJD_00006 -KW39_RS00030 LJHENM_00030 -KW39_RS00030 A5291_RS00030 -KW39_RS00030 SOTONK1_RS00030 -KW39_RS00030 JIEJKO_00025 -KW39_RS00030 NILJEPDF_00006 -KW39_RS00030 L3404_RS00030 -KW39_RS00030 IaCS19096_RS00030 -KW39_RS00030 AQ244_RS01960 -KW39_RS00030 BKC03_RS00030 -KW39_RS00030 C15_RS0100030 -KW39_RS00030 QSDFRQ_00006 -KW39_RS00030 CTJTET1_RS00030 -KW39_RS00030 AKW53_RS01515 -KW39_RS00030 DU10_RS00030 -KW39_RS00030 CTRC943_RS00030 -KW39_RS00030 O169_RS00030 -KW39_RS00030 CBP48_RS01420 -KW39_RS00030 ECS88FINAL_RS0100030 -KW39_RS00030 DU13_RS00030 -KW39_RS00200 KW39_RS00200 -KW39_RS00200 KW36_RS00200 -KW39_RS00200 BKB95_RS00205 -KW39_RS00200 SW2_RS00200 -KW39_RS00200 ECS102511_RS00200 -KW39_RS00200 CTL2C_RS01565 -KW39_RS00200 CBP42_RS01595 -KW39_RS00200 CTB_RS00200 -KW39_RS00200 L1224_RS00200 -KW39_RS00200 BKB96_RS00205 -KW39_RS00200 L1440_RS00200 -KW39_RS00200 AOT15_RS00755 -KW39_RS00200 BKB99_RS00205 -KW39_RS00200 BKB92_RS00205 -KW39_RS00200 CTO_RS00200 -KW39_RS00200 SOTONIA3_RS00200 -KW39_RS00200 120641 -KW39_RS00200 CBP44_RS01600 -KW39_RS00200 E150_RS00200 -KW39_RS00200 L2BUCH2_RS00200 -KW39_RS00200 BKB93_RS00205 -KW39_RS00200 FCS84708_RS00200 -KW39_RS00200 AP288_RS03270 -KW39_RS00200 BBV13_RS00205 -KW39_RS00200 AQ199_RS00895 -KW39_RS00200 BW688_RS01595 -KW39_RS00200 G9768_RS00200 -KW39_RS00200 L2BLST_RS00200 -KW39_RS00200 BKC02_RS00205 -KW39_RS00200 BBV16_RS00205 -KW39_RS00200 gnl|Prokka|PADJNBJD_00040 -KW39_RS00200 AQ193_RS03805 -KW39_RS00200 JIEJKO_00195 -KW39_RS00200 BKC01_RS00205 -KW39_RS00200 7618794 -KW39_RS00200 NILJEPDF_00040 -KW39_RS00200 LJHENM_00205 -KW39_RS00200 A5291_RS00200 -KW39_RS00200 SOTONK1_RS00200 -KW39_RS00200 L3404_RS00200 -KW39_RS00200 AQ244_RS01790 -KW39_RS00200 AKW53_RS01690 -KW39_RS00200 IaCS19096_RS00200 -KW39_RS00200 BKC03_RS00205 -KW39_RS00200 QSDFRQ_00040 -KW39_RS00200 C15_RS0100200 -KW39_RS00200 DU10_RS00205 -KW39_RS00200 CTRC943_RS00200 -KW39_RS00200 CTJTET1_RS00200 -KW39_RS00200 O169_RS00200 -KW39_RS00200 CBP48_RS01595 -KW39_RS00200 ECS88FINAL_RS0100205 -KW39_RS00200 DU13_RS00205 -KW39_RS00365 KW39_RS00365 -KW39_RS00365 BKB95_RS00375 -KW39_RS00365 SW2_RS00365 -KW39_RS00365 ECS102511_RS00365 -KW39_RS00365 CTB_RS00365 -KW39_RS00365 CTL2C_RS01730 -KW39_RS00365 CBP42_RS01765 -KW39_RS00365 BKB96_RS00375 -KW39_RS00365 L1224_RS00365 -KW39_RS00365 BKB99_RS00375 -KW39_RS00365 CTO_RS00365 -KW39_RS00365 L1440_RS00365 -KW39_RS00365 AOT15_RS00590 -KW39_RS00365 BKB92_RS00375 -KW39_RS00365 SOTONIA3_RS00365 -KW39_RS00365 CBP44_RS01770 -KW39_RS00365 119262 -KW39_RS00365 E150_RS00365 -KW39_RS00365 L2BUCH2_RS00365 -KW39_RS00365 BKB93_RS00375 -KW39_RS00365 FCS84708_RS00365 -KW39_RS00365 AP288_RS03435 -KW39_RS00365 BBV13_RS00370 -KW39_RS00365 AQ199_RS01060 -KW39_RS00365 BW688_RS01765 -KW39_RS00365 G9768_RS00365 -KW39_RS00365 L2BLST_RS00365 -KW39_RS00365 BKC02_RS00375 -KW39_RS00365 BBV16_RS00370 -KW39_RS00365 gnl|Prokka|PADJNBJD_00072 -KW39_RS00365 NILJEPDF_00072 -KW39_RS00365 LJHENM_00365 -KW39_RS00365 A5291_RS00365 -KW39_RS00365 BKC01_RS00375 -KW39_RS00365 SOTONK1_RS00365 -KW39_RS00365 L3404_RS00365 -KW39_RS00365 AQ193_RS03630 -KW39_RS00365 AQ244_RS01625 -KW39_RS00365 JIEJKO_00365 -KW39_RS00365 AKW53_RS01855 -KW39_RS00365 QSDFRQ_00072 -KW39_RS00365 IaCS19096_RS00365 -KW39_RS00365 BKC03_RS00375 -KW39_RS00365 C15_RS0100375 -KW39_RS00365 DU10_RS00375 -KW39_RS00365 7618392 -KW39_RS00365 CTRC943_RS00365 -KW39_RS00365 CTJTET1_RS00365 -KW39_RS00365 O169_RS00365 -KW39_RS00365 KW36_RS00365 -KW39_RS00365 DU13_RS00380 -KW39_RS00365 CBP48_RS01765 -KW39_RS00365 ECS88FINAL_RS0100380 -KW39_RS01585 KW39_RS01585 -KW39_RS01585 CTJTET1_RS01595 -KW39_RS01585 JIEJKO_01565 -KW39_RS01585 C15_RS0101625 -KW39_RS01585 SOTONK1_RS01585 -KW39_RS01585 ECS88FINAL_RS0101605 -KW39_RS01585 120423 -KW39_RS01585 QSDFRQ_00311 -KW39_RS01585 IaCS19096_RS01580 -KW39_RS01585 A5291_RS01610 -KW39_RS01585 O169_RS01590 -KW39_RS01585 DU13_RS01595 -KW39_RS01585 CBP48_RS02975 -KW39_RS01585 7618928 -KW39_RS01585 SW2_RS01575 -KW39_RS01585 BKB95_RS01600 -KW39_RS01585 CTL2C_RS02930 -KW39_RS01585 KW36_RS01580 -KW39_RS01585 ECS102511_RS01575 -KW39_RS01585 AOT15_RS02580 -KW39_RS01585 BKB96_RS01585 -KW39_RS01585 L1224_RS01560 -KW39_RS01585 BKB99_RS01585 -KW39_RS01585 L1440_RS01560 -KW39_RS01585 CBP42_RS02975 -KW39_RS01585 AQ244_RS03765 -KW39_RS01585 SOTONIA3_RS01595 -KW39_RS01585 BKB92_RS01590 -KW39_RS01585 CTB_RS01610 -KW39_RS01585 E150_RS01580 -KW39_RS01585 L2BUCH2_RS01565 -KW39_RS01585 CTO_RS01605 -KW39_RS01585 FCS84708_RS01575 -KW39_RS01585 AP288_RS04645 -KW39_RS01585 CBP44_RS02980 -KW39_RS01585 BKB93_RS01590 -KW39_RS01585 L2BLST_RS01565 -KW39_RS01585 AQ199_RS02270 -KW39_RS01585 BW688_RS02985 -KW39_RS01585 AQ193_RS02410 -KW39_RS01585 BBV13_RS01615 -KW39_RS01585 G9768_RS01585 -KW39_RS01585 BKC02_RS01585 -KW39_RS01585 L3404_RS01560 -KW39_RS01585 AKW53_RS03075 -KW39_RS01585 BBV16_RS01615 -KW39_RS01585 BKC01_RS01590 -KW39_RS01585 gnl|Prokka|PADJNBJD_00311 -KW39_RS01585 NILJEPDF_00311 -KW39_RS01585 LJHENM_01565 -KW39_RS01585 CTRC943_RS01565 -KW39_RS01585 BKC03_RS01585 -KW39_RS01585 DU10_RS01600 -KW39_RS02080 KW39_RS02080 -KW39_RS02080 IaCS19096_RS02065 -KW39_RS02080 ECS88FINAL_RS0102110 -KW39_RS02080 O169_RS02080 -KW39_RS02080 DU13_RS02095 -KW39_RS02080 7618544 -KW39_RS02080 CTL2C_RS03415 -KW39_RS02080 CBP48_RS03480 -KW39_RS02080 119505 -KW39_RS02080 L1224_RS02045 -KW39_RS02080 KW36_RS02065 -KW39_RS02080 AOT15_RS03065 -KW39_RS02080 BKB95_RS02095 -KW39_RS02080 BKB96_RS02075 -KW39_RS02080 SW2_RS02070 -KW39_RS02080 BKB99_RS02075 -KW39_RS02080 L1440_RS02045 -KW39_RS02080 ECS102511_RS02070 -KW39_RS02080 AP288_RS01010 -KW39_RS02080 CTB_RS02095 -KW39_RS02080 CBP42_RS03490 -KW39_RS02080 SOTONIA3_RS02080 -KW39_RS02080 L2BUCH2_RS02045 -KW39_RS02080 BKB92_RS02085 -KW39_RS02080 AQ244_RS01040 -KW39_RS02080 CTO_RS02095 -KW39_RS02080 E150_RS02075 -KW39_RS02080 L2BLST_RS02045 -KW39_RS02080 BW688_RS03475 -KW39_RS02080 FCS84708_RS02065 -KW39_RS02080 BBV13_RS02100 -KW39_RS02080 BKB93_RS02085 -KW39_RS02080 CBP44_RS03485 -KW39_RS02080 AQ199_RS02765 -KW39_RS02080 G9768_RS02070 -KW39_RS02080 AQ193_RS01915 -KW39_RS02080 BBV16_RS02100 -KW39_RS02080 L3404_RS02045 -KW39_RS02080 BKC02_RS02075 -KW39_RS02080 BKC01_RS02075 -KW39_RS02080 AKW53_RS03570 -KW39_RS02080 gnl|Prokka|PADJNBJD_00408 -KW39_RS02080 NILJEPDF_00408 -KW39_RS02080 CTRC943_RS02050 -KW39_RS02080 LJHENM_02055 -KW39_RS02080 JIEJKO_02050 -KW39_RS02080 BKC03_RS02075 -KW39_RS02080 CTJTET1_RS02080 -KW39_RS02080 QSDFRQ_00408 -KW39_RS02080 C15_RS0102115 -KW39_RS02080 A5291_RS02095 -KW39_RS02080 SOTONK1_RS02070 -KW39_RS02080 DU10_RS02100 -KW39_RS02405 KW39_RS02405 -KW39_RS02405 ECS88FINAL_RS0102450 -KW39_RS02405 O169_RS02405 -KW39_RS02405 DU13_RS02430 -KW39_RS02405 SW2_RS02400 -KW39_RS02405 ECS102511_RS02395 -KW39_RS02405 AP288_RS00685 -KW39_RS02405 BKB92_RS02420 -KW39_RS02405 E150_RS02400 -KW39_RS02405 FCS84708_RS02390 -KW39_RS02405 BKB93_RS02425 -KW39_RS02405 AQ199_RS03090 -KW39_RS02405 AQ193_RS01590 -KW39_RS02405 AKW53_RS03895 -KW39_RS02405 DU10_RS02435 -KW39_RS02595 KW39_RS02595 -KW39_RS02595 C15_RS0102640 -KW39_RS02595 ECS88FINAL_RS0102635 -KW39_RS02595 IaCS19096_RS02580 -KW39_RS02595 DU10_RS02625 -KW39_RS02595 O169_RS02595 -KW39_RS02595 A5291_RS02620 -KW39_RS02595 AKW53_RS04630 -KW39_RS02595 DU13_RS02620 -KW39_RS02595 7619025 -KW39_RS02595 CBP48_RS04005 -KW39_RS02595 CTL2C_RS03935 -KW39_RS02595 KW36_RS02580 -KW39_RS02595 BKB95_RS02620 -KW39_RS02595 BKB96_RS02610 -KW39_RS02595 BKB99_RS02605 -KW39_RS02595 SW2_RS02590 -KW39_RS02595 L1224_RS02565 -KW39_RS02595 ECS102511_RS02585 -KW39_RS02595 AP288_RS00495 -KW39_RS02595 L1440_RS02565 -KW39_RS02595 120255 -KW39_RS02595 CBP42_RS04015 -KW39_RS02595 L2BUCH2_RS02565 -KW39_RS02595 AQ244_RS00525 -KW39_RS02595 SOTONIA3_RS02600 -KW39_RS02595 BKB92_RS02610 -KW39_RS02595 CTB_RS02620 -KW39_RS02595 E150_RS02590 -KW39_RS02595 BW688_RS04005 -KW39_RS02595 CTO_RS02620 -KW39_RS02595 FCS84708_RS02580 -KW39_RS02595 L2BLST_RS02565 -KW39_RS02595 BBV13_RS02625 -KW39_RS02595 CBP44_RS04010 -KW39_RS02595 AQ199_RS03280 -KW39_RS02595 BKB93_RS02615 -KW39_RS02595 AQ193_RS01400 -KW39_RS02595 BBV16_RS02635 -KW39_RS02595 G9768_RS02585 -KW39_RS02595 AOT15_RS03510 -KW39_RS02595 L3404_RS02560 -KW39_RS02595 BKC02_RS02605 -KW39_RS02595 gnl|Prokka|PADJNBJD_00509 -KW39_RS02595 BKC01_RS02605 -KW39_RS02595 NILJEPDF_00509 -KW39_RS02595 LJHENM_02560 -KW39_RS02595 CTRC943_RS02565 -KW39_RS02595 JIEJKO_02565 -KW39_RS02595 QSDFRQ_00509 -KW39_RS02595 SOTONK1_RS02585 -KW39_RS02595 CTJTET1_RS02595 -KW39_RS02595 BKC03_RS02605 -KW39_RS02760 KW39_RS02760 -KW39_RS02760 C15_RS0102820 -KW39_RS02760 ECS88FINAL_RS0102815 -KW39_RS02760 IaCS19096_RS02745 -KW39_RS02760 DU10_RS02795 -KW39_RS02760 O169_RS02760 -KW39_RS02760 A5291_RS02785 -KW39_RS02760 DU13_RS02790 -KW39_RS02760 CBP48_RS04175 -KW39_RS02760 7619053 -KW39_RS02760 CTL2C_RS04100 -KW39_RS02760 KW36_RS02745 -KW39_RS02760 AKW53_RS03975 -KW39_RS02760 BKB95_RS02790 -KW39_RS02760 BKB96_RS02780 -KW39_RS02760 BKB99_RS02775 -KW39_RS02760 SW2_RS02755 -KW39_RS02760 L1224_RS02730 -KW39_RS02760 ECS102511_RS02750 -KW39_RS02760 AP288_RS00330 -KW39_RS02760 L1440_RS02730 -KW39_RS02760 120211 -KW39_RS02760 CBP42_RS04185 -KW39_RS02760 L2BUCH2_RS02730 -KW39_RS02760 AQ244_RS00360 -KW39_RS02760 SOTONIA3_RS02765 -KW39_RS02760 BKB92_RS02780 -KW39_RS02760 CTB_RS02785 -KW39_RS02760 E150_RS02755 -KW39_RS02760 BW688_RS04175 -KW39_RS02760 CTO_RS02785 -KW39_RS02760 FCS84708_RS02745 -KW39_RS02760 L2BLST_RS02730 -KW39_RS02760 BBV13_RS02790 -KW39_RS02760 CBP44_RS04180 -KW39_RS02760 AQ199_RS03445 -KW39_RS02760 BKB93_RS02785 -KW39_RS02760 AQ193_RS01235 -KW39_RS02760 BBV16_RS02800 -KW39_RS02760 G9768_RS02750 -KW39_RS02760 L3404_RS02725 -KW39_RS02760 BKC02_RS02775 -KW39_RS02760 gnl|Prokka|PADJNBJD_00542 -KW39_RS02760 NILJEPDF_00542 -KW39_RS02760 BKC01_RS02775 -KW39_RS02760 LJHENM_02730 -KW39_RS02760 CTRC943_RS02730 -KW39_RS02760 AOT15_RS01550 -KW39_RS02760 QSDFRQ_00542 -KW39_RS02760 JIEJKO_02735 -KW39_RS02760 SOTONK1_RS02750 -KW39_RS02760 CTJTET1_RS02760 -KW39_RS02760 BKC03_RS02775 -KW39_RS02925 KW39_RS02925 -KW39_RS02925 C15_RS0102985 -KW39_RS02925 ECS88FINAL_RS0102980 -KW39_RS02925 IaCS19096_RS02910 -KW39_RS02925 DU10_RS02960 -KW39_RS02925 O169_RS02925 -KW39_RS02925 A5291_RS02950 -KW39_RS02925 DU13_RS02955 -KW39_RS02925 CBP48_RS04340 -KW39_RS02925 CTL2C_RS04265 -KW39_RS02925 KW36_RS02910 -KW39_RS02925 AKW53_RS04140 -KW39_RS02925 BKB95_RS02955 -KW39_RS02925 BKB96_RS02945 -KW39_RS02925 BKB99_RS02940 -KW39_RS02925 7619084 -KW39_RS02925 SW2_RS02920 -KW39_RS02925 L1224_RS02895 -KW39_RS02925 ECS102511_RS02915 -KW39_RS02925 AP288_RS00165 -KW39_RS02925 L1440_RS02895 -KW39_RS02925 CBP42_RS04350 -KW39_RS02925 120163 -KW39_RS02925 L2BUCH2_RS02895 -KW39_RS02925 AQ244_RS00195 -KW39_RS02925 SOTONIA3_RS02930 -KW39_RS02925 BKB92_RS02945 -KW39_RS02925 CTB_RS02950 -KW39_RS02925 E150_RS02920 -KW39_RS02925 BW688_RS04340 -KW39_RS02925 CTO_RS02950 -KW39_RS02925 FCS84708_RS02910 -KW39_RS02925 L2BLST_RS02895 -KW39_RS02925 BBV13_RS02955 -KW39_RS02925 CBP44_RS04345 -KW39_RS02925 AQ199_RS03610 -KW39_RS02925 BKB93_RS02950 -KW39_RS02925 AQ193_RS01070 -KW39_RS02925 BBV16_RS02965 -KW39_RS02925 G9768_RS02915 -KW39_RS02925 L3404_RS02890 -KW39_RS02925 BKC02_RS02940 -KW39_RS02925 gnl|Prokka|PADJNBJD_00575 -KW39_RS02925 AOT15_RS03715 -KW39_RS02925 NILJEPDF_00575 -KW39_RS02925 BKC01_RS02940 -KW39_RS02925 LJHENM_02895 -KW39_RS02925 CTRC943_RS02895 -KW39_RS02925 QSDFRQ_00575 -KW39_RS02925 JIEJKO_02900 -KW39_RS02925 SOTONK1_RS02915 -KW39_RS02925 CTJTET1_RS02925 -KW39_RS02925 BKC03_RS02940 -KW39_RS03085 KW39_RS03085 -KW39_RS03085 C15_RS0103140 -KW39_RS03085 ECS88FINAL_RS0103135 -KW39_RS03085 IaCS19096_RS03070 -KW39_RS03085 DU10_RS03120 -KW39_RS03085 A5291_RS03105 -KW39_RS03085 O169_RS03080 -KW39_RS03085 CTL2C_RS04415 -KW39_RS03085 DU13_RS03115 -KW39_RS03085 CBP48_RS04505 -KW39_RS03085 L1224_RS03045 -KW39_RS03085 KW36_RS03070 -KW39_RS03085 BKB95_RS03115 -KW39_RS03085 AKW53_RS04300 -KW39_RS03085 BKB96_RS03110 -KW39_RS03085 BKB99_RS03105 -KW39_RS03085 7619094 -KW39_RS03085 SW2_RS03075 -KW39_RS03085 L1440_RS03045 -KW39_RS03085 ECS102511_RS03070 -KW39_RS03085 AP288_RS00010 -KW39_RS03085 CBP42_RS04510 -KW39_RS03085 L2BUCH2_RS03045 -KW39_RS03085 AQ244_RS00035 -KW39_RS03085 CTB_RS03105 -KW39_RS03085 SOTONIA3_RS03090 -KW39_RS03085 BKB92_RS03105 -KW39_RS03085 BW688_RS04500 -KW39_RS03085 120147 -KW39_RS03085 E150_RS03075 -KW39_RS03085 CTO_RS03105 -KW39_RS03085 L2BLST_RS03045 -KW39_RS03085 CBP44_RS04505 -KW39_RS03085 FCS84708_RS03070 -KW39_RS03085 BBV13_RS03110 -KW39_RS03085 AQ199_RS03770 -KW39_RS03085 BBV16_RS03120 -KW39_RS03085 BKB93_RS03110 -KW39_RS03085 AQ193_RS00915 -KW39_RS03085 G9768_RS03075 -KW39_RS03085 L3404_RS03040 -KW39_RS03085 gnl|Prokka|PADJNBJD_00605 -KW39_RS03085 NILJEPDF_00605 -KW39_RS03085 LJHENM_03040 -KW39_RS03085 BKC02_RS03105 -KW39_RS03085 AOT15_RS03875 -KW39_RS03085 CTRC943_RS03045 -KW39_RS03085 BKC01_RS03105 -KW39_RS03085 QSDFRQ_00605 -KW39_RS03085 JIEJKO_03050 -KW39_RS03085 SOTONK1_RS03075 -KW39_RS03085 CTJTET1_RS03085 -KW39_RS03085 BKC03_RS03105 -KW39_RS04150 KW39_RS04150 -KW39_RS04150 BKC03_RS04170 -KW39_RS04150 CBP48_RS00740 -KW39_RS04150 A5291_RS04175 -KW39_RS04150 ECS88FINAL_RS0104220 -KW39_RS04150 DU10_RS04185 -KW39_RS04150 SOTONK1_RS04135 -KW39_RS04150 IaCS19096_RS04130 -KW39_RS04150 DU13_RS04185 -KW39_RS04150 C15_RS0104245 -KW39_RS04150 O169_RS04145 -KW39_RS04150 KW36_RS04135 -KW39_RS04150 BKB95_RS04190 -KW39_RS04150 CBP42_RS00740 -KW39_RS04150 CTL2C_RS00735 -KW39_RS04150 L1224_RS04115 -KW39_RS04150 BKB96_RS04175 -KW39_RS04150 SW2_RS04140 -KW39_RS04150 L1440_RS04110 -KW39_RS04150 ECS102511_RS04130 -KW39_RS04150 BKB99_RS04170 -KW39_RS04150 CBP44_RS00740 -KW39_RS04150 CTB_RS04170 -KW39_RS04150 L2BUCH2_RS04115 -KW39_RS04150 BKB92_RS04170 -KW39_RS04150 SOTONIA3_RS04155 -KW39_RS04150 CTO_RS04165 -KW39_RS04150 AP288_RS02435 -KW39_RS04150 E150_RS04140 -KW39_RS04150 BBV13_RS04175 -KW39_RS04150 119802 -KW39_RS04150 FCS84708_RS04130 -KW39_RS04150 AQ199_RS00060 -KW39_RS04150 7618281 -KW39_RS04150 L2BLST_RS04115 -KW39_RS04150 BBV16_RS04185 -KW39_RS04150 BW688_RS00740 -KW39_RS04150 gnl|Prokka|PADJNBJD_00812 -KW39_RS04150 BKB93_RS04175 -KW39_RS04150 NILJEPDF_00813 -KW39_RS04150 G9768_RS04135 -KW39_RS04150 L3404_RS04110 -KW39_RS04150 AQ193_RS04640 -KW39_RS04150 LJHENM_04090 -KW39_RS04150 AQ244_RS02630 -KW39_RS04150 JIEJKO_04090 -KW39_RS04150 BKC02_RS04170 -KW39_RS04150 QSDFRQ_00813 -KW39_RS04150 AKW53_RS00850 -KW39_RS04150 BKC01_RS04175 -KW39_RS04150 CTRC943_RS04120 -KW39_RS04150 AOT15_RS01720 -KW39_RS04150 CTJTET1_RS04310 -KW39_RS04480 KW39_RS04480 -KW39_RS04480 BKC03_RS04505 -KW39_RS04480 CBP48_RS01080 -KW39_RS04480 A5291_RS04495 -KW39_RS04480 SOTONK1_RS04460 -KW39_RS04480 ECS88FINAL_RS0104560 -KW39_RS04480 IaCS19096_RS04455 -KW39_RS04480 C15_RS0104580 -KW39_RS04480 DU10_RS04525 -KW39_RS04480 O169_RS04480 -KW39_RS04480 KW36_RS04460 -KW39_RS04480 DU13_RS04525 -KW39_RS04480 BKB95_RS04525 -KW39_RS04480 CBP42_RS01080 -KW39_RS04480 CTL2C_RS01060 -KW39_RS04480 L1224_RS04440 -KW39_RS04480 BKB96_RS04510 -KW39_RS04480 L1440_RS04435 -KW39_RS04480 BKB99_RS04505 -KW39_RS04480 SW2_RS04470 -KW39_RS04480 ECS102511_RS04465 -KW39_RS04480 CBP44_RS01080 -KW39_RS04480 CTB_RS04490 -KW39_RS04480 L2BUCH2_RS04440 -KW39_RS04480 SOTONIA3_RS04475 -KW39_RS04480 CTO_RS04485 -KW39_RS04480 BBV13_RS04500 -KW39_RS04480 BKB92_RS04510 -KW39_RS04480 AP288_RS02770 -KW39_RS04480 BBV16_RS04505 -KW39_RS04480 E150_RS04475 -KW39_RS04480 L2BLST_RS04440 -KW39_RS04480 gnl|Prokka|PADJNBJD_00875 -KW39_RS04480 FCS84708_RS04460 -KW39_RS04480 AQ199_RS00395 -KW39_RS04480 BW688_RS01080 -KW39_RS04480 119955 -KW39_RS04480 NILJEPDF_00876 -KW39_RS04480 7618747 -KW39_RS04480 AQ193_RS04305 -KW39_RS04480 G9768_RS04460 -KW39_RS04480 LJHENM_04410 -KW39_RS04480 L3404_RS04435 -KW39_RS04480 JIEJKO_04405 -KW39_RS04480 QSDFRQ_00876 -KW39_RS04480 AQ244_RS02290 -KW39_RS04480 BKB93_RS04515 -KW39_RS04480 BKC02_RS04505 -KW39_RS04480 AKW53_RS01185 -KW39_RS04480 BKC01_RS04510 -KW39_RS04480 CTRC943_RS04445 -KW39_RS04480 AOT15_RS02040 -KW39_RS04480 CTJTET1_RS04630 -KW39_RS04645 KW39_RS04645 -KW39_RS04645 BKC03_RS04680 -KW39_RS04645 CBP48_RS01255 -KW39_RS04645 A5291_RS04660 -KW39_RS04645 SOTONK1_RS04625 -KW39_RS04645 ECS88FINAL_RS0104735 -KW39_RS04645 IaCS19096_RS04620 -KW39_RS04645 C15_RS0104755 -KW39_RS04645 DU10_RS04700 -KW39_RS04645 O169_RS04645 -KW39_RS04645 KW36_RS04625 -KW39_RS04645 DU13_RS04700 -KW39_RS04645 CTL2C_RS01225 -KW39_RS04645 BKB95_RS04700 -KW39_RS04645 CBP42_RS01255 -KW39_RS04645 L1224_RS04605 -KW39_RS04645 BKB96_RS04685 -KW39_RS04645 L1440_RS04600 -KW39_RS04645 BKB99_RS04680 -KW39_RS04645 SW2_RS04635 -KW39_RS04645 ECS102511_RS04630 -KW39_RS04645 CBP44_RS01255 -KW39_RS04645 CTB_RS04655 -KW39_RS04645 L2BUCH2_RS04605 -KW39_RS04645 SOTONIA3_RS04640 -KW39_RS04645 CTO_RS04650 -KW39_RS04645 AP288_RS02935 -KW39_RS04645 BBV13_RS04670 -KW39_RS04645 BKB92_RS04685 -KW39_RS04645 BBV16_RS04675 -KW39_RS04645 E150_RS04640 -KW39_RS04645 gnl|Prokka|PADJNBJD_00908 -KW39_RS04645 L2BLST_RS04605 -KW39_RS04645 FCS84708_RS04625 -KW39_RS04645 AQ199_RS00560 -KW39_RS04645 NILJEPDF_00909 -KW39_RS04645 BW688_RS01255 -KW39_RS04645 119933 -KW39_RS04645 AQ193_RS04140 -KW39_RS04645 JIEJKO_04570 -KW39_RS04645 7618761 -KW39_RS04645 QSDFRQ_00909 -KW39_RS04645 G9768_RS04625 -KW39_RS04645 LJHENM_04580 -KW39_RS04645 L3404_RS04600 -KW39_RS04645 BKB93_RS04690 -KW39_RS04645 AQ244_RS02125 -KW39_RS04645 BKC02_RS04680 -KW39_RS04645 AKW53_RS01350 -KW39_RS04645 BKC01_RS04685 -KW39_RS04645 CTRC943_RS04610 -KW39_RS04645 AOT15_RS02205 -KW39_RS04645 CTJTET1_RS04795 -O169_RS00040 O169_RS00040 -O169_RS00040 CBP48_RS01430 -O169_RS00040 ECS88FINAL_RS0100045 -O169_RS00040 DU13_RS00040 -O169_RS00040 KW39_RS00040 -O169_RS00040 BKB95_RS00040 -O169_RS00040 KW36_RS00040 -O169_RS00040 SW2_RS00040 -O169_RS00040 ECS102511_RS00040 -O169_RS00040 CTB_RS00040 -O169_RS00040 CTL2C_RS01405 -O169_RS00040 AOT15_RS00915 -O169_RS00040 CBP42_RS01430 -O169_RS00040 L1224_RS00040 -O169_RS00040 BKB96_RS00040 -O169_RS00040 BKB99_RS00040 -O169_RS00040 CTO_RS00040 -O169_RS00040 SOTONIA3_RS00040 -O169_RS00040 L1440_RS00040 -O169_RS00040 BKB92_RS00040 -O169_RS00040 119207 -O169_RS00040 CBP44_RS01430 -O169_RS00040 E150_RS00040 -O169_RS00040 L2BUCH2_RS00040 -O169_RS00040 BKB93_RS00040 -O169_RS00040 FCS84708_RS00040 -O169_RS00040 AP288_RS03110 -O169_RS00040 BBV13_RS00040 -O169_RS00040 G9768_RS00040 -O169_RS00040 AQ193_RS03965 -O169_RS00040 BW688_RS01430 -O169_RS00040 L2BLST_RS00040 -O169_RS00040 AQ199_RS00735 -O169_RS00040 BKC02_RS00040 -O169_RS00040 AQ244_RS01950 -O169_RS00040 BBV16_RS00040 -O169_RS00040 BKC01_RS00040 -O169_RS00040 7618356 -O169_RS00040 gnl|Prokka|PADJNBJD_00008 -O169_RS00040 LJHENM_00040 -O169_RS00040 A5291_RS00040 -O169_RS00040 SOTONK1_RS00040 -O169_RS00040 JIEJKO_00035 -O169_RS00040 NILJEPDF_00008 -O169_RS00040 L3404_RS00040 -O169_RS00040 IaCS19096_RS00040 -O169_RS00040 BKC03_RS00040 -O169_RS00040 C15_RS0100040 -O169_RS00040 QSDFRQ_00008 -O169_RS00040 CTJTET1_RS00040 -O169_RS00040 AKW53_RS01525 -O169_RS00040 DU10_RS00040 -O169_RS00040 CTRC943_RS00040 -O169_RS00210 O169_RS00210 -O169_RS00210 CBP48_RS01605 -O169_RS00210 ECS88FINAL_RS01000000104875 -O169_RS00210 DU13_RS00215 -O169_RS00210 KW39_RS00210 -O169_RS00210 KW36_RS00210 -O169_RS00210 BKB95_RS00215 -O169_RS00210 SW2_RS00210 -O169_RS00210 ECS102511_RS00210 -O169_RS00210 CTL2C_RS01575 -O169_RS00210 AOT15_RS00745 -O169_RS00210 CBP42_RS01605 -O169_RS00210 CTB_RS00210 -O169_RS00210 L1224_RS00210 -O169_RS00210 BKB96_RS00215 -O169_RS00210 L1440_RS00210 -O169_RS00210 BKB99_RS00215 -O169_RS00210 BKB92_RS00215 -O169_RS00210 CTO_RS00210 -O169_RS00210 SOTONIA3_RS00210 -O169_RS00210 119236 -O169_RS00210 CBP44_RS01610 -O169_RS00210 E150_RS00210 -O169_RS00210 L2BUCH2_RS00210 -O169_RS00210 BKB93_RS00215 -O169_RS00210 FCS84708_RS00210 -O169_RS00210 AP288_RS03280 -O169_RS00210 BBV13_RS00215 -O169_RS00210 AQ199_RS00905 -O169_RS00210 BW688_RS01605 -O169_RS00210 G9768_RS00210 -O169_RS00210 L2BLST_RS00210 -O169_RS00210 AQ193_RS03795 -O169_RS00210 AQ244_RS01780 -O169_RS00210 BKC02_RS00215 -O169_RS00210 BBV16_RS00215 -O169_RS00210 BKC01_RS00215 -O169_RS00210 7618375 -O169_RS00210 A5291_RS00210 -O169_RS00210 SOTONK1_RS00210 -O169_RS00210 L3404_RS00210 -O169_RS00210 AKW53_RS01700 -O169_RS00210 IaCS19096_RS00210 -O169_RS00210 BKC03_RS00215 -O169_RS00210 C15_RS01000000104890 -O169_RS00210 DU10_RS00215 -O169_RS00210 CTRC943_RS00210 -O169_RS00210 CTJTET1_RS00210 -O169_RS00375 O169_RS00375 -O169_RS00375 KW36_RS00375 -O169_RS00375 DU13_RS00390 -O169_RS00375 CBP48_RS01775 -O169_RS00375 ECS88FINAL_RS0100390 -O169_RS00375 KW39_RS00375 -O169_RS00375 BKB95_RS00385 -O169_RS00375 SW2_RS00375 -O169_RS00375 ECS102511_RS00375 -O169_RS00375 CTB_RS00375 -O169_RS00375 CTL2C_RS01740 -O169_RS00375 AOT15_RS00580 -O169_RS00375 CBP42_RS01775 -O169_RS00375 BKB96_RS00385 -O169_RS00375 L1224_RS00375 -O169_RS00375 BKB99_RS00385 -O169_RS00375 CTO_RS00375 -O169_RS00375 L1440_RS00375 -O169_RS00375 BKB92_RS00385 -O169_RS00375 SOTONIA3_RS00375 -O169_RS00375 CBP44_RS01780 -O169_RS00375 119265 -O169_RS00375 E150_RS00375 -O169_RS00375 L2BUCH2_RS00375 -O169_RS00375 BKB93_RS00385 -O169_RS00375 FCS84708_RS00375 -O169_RS00375 AP288_RS03445 -O169_RS00375 BBV13_RS00380 -O169_RS00375 AQ199_RS01070 -O169_RS00375 BW688_RS01775 -O169_RS00375 G9768_RS00375 -O169_RS00375 L2BLST_RS00375 -O169_RS00375 AQ193_RS03620 -O169_RS00375 AQ244_RS01615 -O169_RS00375 BKC02_RS00385 -O169_RS00375 BBV16_RS00380 -O169_RS00375 gnl|Prokka|PADJNBJD_00074 -O169_RS00375 NILJEPDF_00074 -O169_RS00375 LJHENM_00375 -O169_RS00375 A5291_RS00375 -O169_RS00375 BKC01_RS00385 -O169_RS00375 SOTONK1_RS00375 -O169_RS00375 L3404_RS00375 -O169_RS00375 JIEJKO_00375 -O169_RS00375 AKW53_RS01865 -O169_RS00375 QSDFRQ_00074 -O169_RS00375 IaCS19096_RS00375 -O169_RS00375 BKC03_RS00385 -O169_RS00375 C15_RS0100385 -O169_RS00375 DU10_RS00385 -O169_RS00375 7618394 -O169_RS00375 CTRC943_RS00375 -O169_RS00375 CTJTET1_RS00375 -O169_RS00705 O169_RS00705 -O169_RS00705 DU13_RS00720 -O169_RS00705 7618426 -O169_RS00705 KW36_RS00705 -O169_RS00705 CBP48_RS02105 -O169_RS00705 SW2_RS00705 -O169_RS00705 BKB95_RS00715 -O169_RS00705 ECS102511_RS00705 -O169_RS00705 AOT15_RS00250 -O169_RS00705 CTL2C_RS02070 -O169_RS00705 CTB_RS00710 -O169_RS00705 L1224_RS00705 -O169_RS00705 AQ244_RS02880 -O169_RS00705 BKB96_RS00715 -O169_RS00705 CBP42_RS02105 -O169_RS00705 BKB99_RS00715 -O169_RS00705 CTO_RS00710 -O169_RS00705 L1440_RS00705 -O169_RS00705 BKB92_RS00715 -O169_RS00705 SOTONIA3_RS00705 -O169_RS00705 E150_RS00705 -O169_RS00705 L2BUCH2_RS00705 -O169_RS00705 CBP44_RS02110 -O169_RS00705 FCS84708_RS00705 -O169_RS00705 AP288_RS03775 -O169_RS00705 BKB93_RS00715 -O169_RS00705 119315 -O169_RS00705 AQ199_RS01400 -O169_RS00705 BBV13_RS00715 -O169_RS00705 G9768_RS00705 -O169_RS00705 L2BLST_RS00705 -O169_RS00705 BW688_RS02105 -O169_RS00705 AQ193_RS03290 -O169_RS00705 BBV16_RS00715 -O169_RS00705 BKC02_RS00715 -O169_RS00705 gnl|Prokka|PADJNBJD_00139 -O169_RS00705 LJHENM_00695 -O169_RS00705 AKW53_RS02200 -O169_RS00705 BKC01_RS00715 -O169_RS00705 NILJEPDF_00139 -O169_RS00705 A5291_RS00710 -O169_RS00705 L3404_RS00705 -O169_RS00705 SOTONK1_RS00705 -O169_RS00705 JIEJKO_00700 -O169_RS00705 QSDFRQ_00139 -O169_RS00705 CTJTET1_RS00705 -O169_RS00705 IaCS19096_RS00705 -O169_RS00705 BKC03_RS00715 -O169_RS00705 C15_RS0100730 -O169_RS00705 CTRC943_RS00705 -O169_RS00705 ECS88FINAL_RS0100730 -O169_RS00705 KW39_RS00705 -O169_RS00705 DU10_RS00715 -O169_RS00900 O169_RS00900 -O169_RS00900 DU13_RS00905 -O169_RS00900 LJHENM_00880 -O169_RS00900 A5291_RS00920 -O169_RS00900 KW39_RS00900 -O169_RS00900 BKB96_RS00895 -O169_RS00900 BKB99_RS00895 -O169_RS00900 SOTONIA3_RS00910 -O169_RS01070 O169_RS01070 -O169_RS01070 DU13_RS01075 -O169_RS01070 SW2_RS01060 -O169_RS01070 BKB95_RS01080 -O169_RS01070 CBP48_RS02455 -O169_RS01070 KW36_RS01065 -O169_RS01070 ECS102511_RS01060 -O169_RS01070 BKB96_RS01065 -O169_RS01070 CTL2C_RS02415 -O169_RS01070 BKB99_RS01065 -O169_RS01070 L1224_RS01045 -O169_RS01070 L1440_RS01045 -O169_RS01070 AQ244_RS03245 -O169_RS01070 BKB92_RS01065 -O169_RS01070 CBP42_RS02455 -O169_RS01070 SOTONIA3_RS01080 -O169_RS01070 E150_RS01060 -O169_RS01070 CTB_RS01090 -O169_RS01070 AOT15_RS01300 -O169_RS01070 L2BUCH2_RS01050 -O169_RS01070 CTO_RS01090 -O169_RS01070 FCS84708_RS01060 -O169_RS01070 AP288_RS04130 -O169_RS01070 BKB93_RS01065 -O169_RS01070 CBP44_RS02460 -O169_RS01070 AQ199_RS01755 -O169_RS01070 L2BLST_RS01050 -O169_RS01070 BW688_RS02460 -O169_RS01070 BBV13_RS01095 -O169_RS01070 G9768_RS01070 -O169_RS01070 BKC02_RS01065 -O169_RS01070 L3404_RS01045 -O169_RS01070 AKW53_RS02555 -O169_RS01070 BBV16_RS01095 -O169_RS01070 BKC01_RS01065 -O169_RS01070 119375 -O169_RS01070 AQ193_RS02930 -O169_RS01070 DU10_RS01075 -O169_RS01070 gnl|Prokka|PADJNBJD_00209 -O169_RS01070 BKC03_RS01065 -O169_RS01070 NILJEPDF_00209 -O169_RS01070 LJHENM_01050 -O169_RS01070 CTRC943_RS01050 -O169_RS01070 CTJTET1_RS01080 -O169_RS01070 C15_RS0101100 -O169_RS01070 SOTONK1_RS01065 -O169_RS01070 ECS88FINAL_RS0101085 -O169_RS01070 KW39_RS01070 -O169_RS01070 JIEJKO_01050 -O169_RS01070 A5291_RS01090 -O169_RS01070 IaCS19096_RS01065 -O169_RS01070 7618462 -O169_RS01070 QSDFRQ_00209 -O169_RS01250 O169_RS01250 -O169_RS01250 DU13_RS01255 -O169_RS01250 7618478 -O169_RS01250 SW2_RS01240 -O169_RS01250 BKB95_RS01260 -O169_RS01250 CBP48_RS02635 -O169_RS01250 KW36_RS01245 -O169_RS01250 ECS102511_RS01240 -O169_RS01250 BKB96_RS01245 -O169_RS01250 CTL2C_RS02595 -O169_RS01250 BKB99_RS01245 -O169_RS01250 L1224_RS01225 -O169_RS01250 L1440_RS01225 -O169_RS01250 AQ244_RS03425 -O169_RS01250 BKB92_RS01245 -O169_RS01250 CBP42_RS02635 -O169_RS01250 SOTONIA3_RS01260 -O169_RS01250 CTB_RS01270 -O169_RS01250 E150_RS01240 -O169_RS01250 AOT15_RS01120 -O169_RS01250 L2BUCH2_RS01230 -O169_RS01250 CTO_RS01270 -O169_RS01250 FCS84708_RS01240 -O169_RS01250 AP288_RS04310 -O169_RS01250 BKB93_RS01245 -O169_RS01250 CBP44_RS02640 -O169_RS01250 AQ199_RS01935 -O169_RS01250 L2BLST_RS01230 -O169_RS01250 BW688_RS02640 -O169_RS01250 BBV13_RS01275 -O169_RS01250 G9768_RS01250 -O169_RS01250 BKC02_RS01245 -O169_RS01250 L3404_RS01225 -O169_RS01250 AKW53_RS02735 -O169_RS01250 BBV16_RS01275 -O169_RS01250 BKC01_RS01245 -O169_RS01250 AQ193_RS02750 -O169_RS01250 gnl|Prokka|PADJNBJD_00244 -O169_RS01250 DU10_RS01255 -O169_RS01250 119400 -O169_RS01250 NILJEPDF_00244 -O169_RS01250 LJHENM_01225 -O169_RS01250 BKC03_RS01245 -O169_RS01250 CTRC943_RS01230 -O169_RS01250 CTJTET1_RS01260 -O169_RS01250 KW39_RS01250 -O169_RS01250 JIEJKO_01225 -O169_RS01250 C15_RS0101280 -O169_RS01250 SOTONK1_RS01245 -O169_RS01250 ECS88FINAL_RS0101265 -O169_RS01250 QSDFRQ_00244 -O169_RS01250 A5291_RS01270 -O169_RS01250 IaCS19096_RS01245 -O169_RS01745 O169_RS01745 -O169_RS01745 DU13_RS01755 -O169_RS01745 7618952 -O169_RS01745 CTL2C_RS03080 -O169_RS01745 BKB95_RS01755 -O169_RS01745 CBP48_RS03140 -O169_RS01745 L1224_RS01710 -O169_RS01745 KW36_RS01730 -O169_RS01745 AOT15_RS02730 -O169_RS01745 BKB96_RS01740 -O169_RS01745 SW2_RS01735 -O169_RS01745 BKB99_RS01740 -O169_RS01745 L1440_RS01710 -O169_RS01745 ECS102511_RS01735 -O169_RS01745 CBP42_RS03140 -O169_RS01745 CTB_RS01760 -O169_RS01745 SOTONIA3_RS01745 -O169_RS01745 L2BUCH2_RS01710 -O169_RS01745 AP288_RS01345 -O169_RS01745 BKB92_RS01750 -O169_RS01745 CTO_RS01760 -O169_RS01745 E150_RS01740 -O169_RS01745 L2BLST_RS01710 -O169_RS01745 AQ244_RS01375 -O169_RS01745 FCS84708_RS01730 -O169_RS01745 BW688_RS03140 -O169_RS01745 BKB93_RS01750 -O169_RS01745 CBP44_RS03145 -O169_RS01745 BBV13_RS01765 -O169_RS01745 AQ199_RS02430 -O169_RS01745 G9768_RS01735 -O169_RS01745 L3404_RS01710 -O169_RS01745 BBV16_RS01765 -O169_RS01745 BKC02_RS01740 -O169_RS01745 BKC01_RS01740 -O169_RS01745 AKW53_RS03235 -O169_RS01745 AQ193_RS02250 -O169_RS01745 gnl|Prokka|PADJNBJD_00341 -O169_RS01745 NILJEPDF_00341 -O169_RS01745 CTRC943_RS01715 -O169_RS01745 LJHENM_01720 -O169_RS01745 JIEJKO_01715 -O169_RS01745 BKC03_RS01740 -O169_RS01745 CTJTET1_RS01745 -O169_RS01745 DU10_RS01760 -O169_RS01745 QSDFRQ_00341 -O169_RS01745 C15_RS0101775 -O169_RS01745 SOTONK1_RS01735 -O169_RS01745 A5291_RS01760 -O169_RS01745 KW39_RS01745 -O169_RS01745 IaCS19096_RS01730 -O169_RS01745 120372 -O169_RS01745 ECS88FINAL_RS0101765 -O169_RS01910 O169_RS01910 -O169_RS01910 DU13_RS01925 -O169_RS01910 119484 -O169_RS01910 CTL2C_RS03245 -O169_RS01910 7618531 -O169_RS01910 L1224_RS01875 -O169_RS01910 KW36_RS01895 -O169_RS01910 AOT15_RS02895 -O169_RS01910 BKB95_RS01925 -O169_RS01910 BKB96_RS01905 -O169_RS01910 CBP48_RS03310 -O169_RS01910 SW2_RS01900 -O169_RS01910 BKB99_RS01905 -O169_RS01910 L1440_RS01875 -O169_RS01910 ECS102511_RS01900 -O169_RS01910 CTB_RS01925 -O169_RS01910 SOTONIA3_RS01910 -O169_RS01910 L2BUCH2_RS01875 -O169_RS01910 AP288_RS01180 -O169_RS01910 BKB92_RS01915 -O169_RS01910 CBP42_RS03320 -O169_RS01910 CTO_RS01925 -O169_RS01910 E150_RS01905 -O169_RS01910 L2BLST_RS01875 -O169_RS01910 AQ244_RS01210 -O169_RS01910 FCS84708_RS01895 -O169_RS01910 BW688_RS03305 -O169_RS01910 BKB93_RS01915 -O169_RS01910 BBV13_RS01930 -O169_RS01910 CBP44_RS03315 -O169_RS01910 AQ199_RS02595 -O169_RS01910 G9768_RS01900 -O169_RS01910 L3404_RS01875 -O169_RS01910 BBV16_RS01930 -O169_RS01910 BKC02_RS01905 -O169_RS01910 BKC01_RS01905 -O169_RS01910 AKW53_RS03400 -O169_RS01910 AQ193_RS02085 -O169_RS01910 gnl|Prokka|PADJNBJD_00374 -O169_RS01910 NILJEPDF_00374 -O169_RS01910 CTRC943_RS01880 -O169_RS01910 LJHENM_01885 -O169_RS01910 JIEJKO_01880 -O169_RS01910 BKC03_RS01905 -O169_RS01910 CTJTET1_RS01910 -O169_RS01910 QSDFRQ_00374 -O169_RS01910 C15_RS0101945 -O169_RS01910 SOTONK1_RS01900 -O169_RS01910 DU10_RS01930 -O169_RS01910 A5291_RS01925 -O169_RS01910 KW39_RS01910 -O169_RS01910 IaCS19096_RS01895 -O169_RS01910 ECS88FINAL_RS0101935 -O169_RS02070 O169_RS02070 -O169_RS02070 DU13_RS02085 -O169_RS02070 7618543 -O169_RS02070 CTL2C_RS03405 -O169_RS02070 CBP48_RS03470 -O169_RS02070 119504 -O169_RS02070 L1224_RS02035 -O169_RS02070 KW36_RS02055 -O169_RS02070 AOT15_RS03055 -O169_RS02070 BKB95_RS02085 -O169_RS02070 BKB96_RS02065 -O169_RS02070 SW2_RS02060 -O169_RS02070 BKB99_RS02065 -O169_RS02070 L1440_RS02035 -O169_RS02070 ECS102511_RS02060 -O169_RS02070 CTB_RS02085 -O169_RS02070 CBP42_RS03480 -O169_RS02070 SOTONIA3_RS02070 -O169_RS02070 L2BUCH2_RS02035 -O169_RS02070 AP288_RS01020 -O169_RS02070 BKB92_RS02075 -O169_RS02070 CTO_RS02085 -O169_RS02070 E150_RS02065 -O169_RS02070 L2BLST_RS02035 -O169_RS02070 AQ244_RS01050 -O169_RS02070 BW688_RS03465 -O169_RS02070 FCS84708_RS02055 -O169_RS02070 BBV13_RS02090 -O169_RS02070 BKB93_RS02075 -O169_RS02070 CBP44_RS03475 -O169_RS02070 AQ199_RS02755 -O169_RS02070 G9768_RS02060 -O169_RS02070 BBV16_RS02090 -O169_RS02070 L3404_RS02035 -O169_RS02070 BKC02_RS02065 -O169_RS02070 BKC01_RS02065 -O169_RS02070 AKW53_RS03560 -O169_RS02070 AQ193_RS01925 -O169_RS02070 gnl|Prokka|PADJNBJD_00406 -O169_RS02070 NILJEPDF_00406 -O169_RS02070 CTRC943_RS02040 -O169_RS02070 LJHENM_02045 -O169_RS02070 JIEJKO_02040 -O169_RS02070 BKC03_RS02065 -O169_RS02070 CTJTET1_RS02070 -O169_RS02070 QSDFRQ_00406 -O169_RS02070 C15_RS0102105 -O169_RS02070 A5291_RS02085 -O169_RS02070 SOTONK1_RS02060 -O169_RS02070 DU10_RS02090 -O169_RS02070 KW39_RS02070 -O169_RS02070 IaCS19096_RS02055 -O169_RS02070 ECS88FINAL_RS0102100 -O169_RS02235 O169_RS02235 -O169_RS02235 DU13_RS02255 -O169_RS02235 7618995 -O169_RS02235 BKB96_RS02240 -O169_RS02235 BKB99_RS02235 -O169_RS02235 CBP48_RS03640 -O169_RS02235 CTL2C_RS03575 -O169_RS02235 KW36_RS02220 -O169_RS02235 AOT15_RS03220 -O169_RS02235 BKB95_RS02255 -O169_RS02235 120305 -O169_RS02235 L1224_RS02205 -O169_RS02235 SW2_RS02230 -O169_RS02235 ECS102511_RS02225 -O169_RS02235 L1440_RS02205 -O169_RS02235 CBP42_RS03650 -O169_RS02235 CTB_RS02255 -O169_RS02235 L2BUCH2_RS02200 -O169_RS02235 AP288_RS00855 -O169_RS02235 BKB92_RS02245 -O169_RS02235 SOTONIA3_RS02240 -O169_RS02235 CTO_RS02255 -O169_RS02235 E150_RS02230 -O169_RS02235 BW688_RS03635 -O169_RS02235 L2BLST_RS02205 -O169_RS02235 FCS84708_RS02220 -O169_RS02235 AQ244_RS00885 -O169_RS02235 BBV13_RS02260 -O169_RS02235 CBP44_RS03645 -O169_RS02235 BKB93_RS02250 -O169_RS02235 AQ199_RS02920 -O169_RS02235 G9768_RS02225 -O169_RS02235 BBV16_RS02265 -O169_RS02235 L3404_RS02200 -O169_RS02235 BKC02_RS02235 -O169_RS02235 BKC01_RS02235 -O169_RS02235 AKW53_RS03725 -O169_RS02235 AQ193_RS01760 -O169_RS02235 gnl|Prokka|PADJNBJD_00439 -O169_RS02235 NILJEPDF_00439 -O169_RS02235 CTRC943_RS02205 -O169_RS02235 LJHENM_02215 -O169_RS02235 JIEJKO_02210 -O169_RS02235 BKC03_RS02235 -O169_RS02235 CTJTET1_RS02235 -O169_RS02235 QSDFRQ_00439 -O169_RS02235 C15_RS0102270 -O169_RS02235 SOTONK1_RS02225 -O169_RS02235 DU10_RS02260 -O169_RS02235 A5291_RS02255 -O169_RS02235 KW39_RS02235 -O169_RS02235 IaCS19096_RS02220 -O169_RS02235 ECS88FINAL_RS0102270 -O169_RS02395 O169_RS02395 -O169_RS02395 DU13_RS02420 -O169_RS02395 7619012 -O169_RS02395 BKB96_RS02405 -O169_RS02395 BKB99_RS02400 -O169_RS02395 CBP48_RS03805 -O169_RS02395 120278 -O169_RS02395 CTL2C_RS03735 -O169_RS02395 KW36_RS02380 -O169_RS02395 BKB95_RS02420 -O169_RS02395 L1224_RS02365 -O169_RS02395 SW2_RS02390 -O169_RS02395 ECS102511_RS02385 -O169_RS02395 L1440_RS02365 -O169_RS02395 CBP42_RS03815 -O169_RS02395 CTB_RS02415 -O169_RS02395 L2BUCH2_RS02360 -O169_RS02395 AP288_RS00695 -O169_RS02395 BKB92_RS02410 -O169_RS02395 SOTONIA3_RS02400 -O169_RS02395 CTO_RS02415 -O169_RS02395 E150_RS02390 -O169_RS02395 BW688_RS03800 -O169_RS02395 L2BLST_RS02365 -O169_RS02395 FCS84708_RS02380 -O169_RS02395 AQ244_RS00725 -O169_RS02395 BBV13_RS02420 -O169_RS02395 CBP44_RS03810 -O169_RS02395 BKB93_RS02415 -O169_RS02395 AQ199_RS03080 -O169_RS02395 G9768_RS02385 -O169_RS02395 L3404_RS02360 -O169_RS02395 BKC02_RS02400 -O169_RS02395 AKW53_RS03885 -O169_RS02395 BKC01_RS02400 -O169_RS02395 gnl|Prokka|PADJNBJD_00471 -O169_RS02395 AQ193_RS01600 -O169_RS02395 NILJEPDF_00471 -O169_RS02395 LJHENM_02375 -O169_RS02395 CTRC943_RS02365 -O169_RS02395 JIEJKO_02375 -O169_RS02395 BKC03_RS02400 -O169_RS02395 QSDFRQ_00471 -O169_RS02395 CTJTET1_RS02395 -O169_RS02395 AOT15_RS00010 -O169_RS02395 C15_RS0102435 -O169_RS02395 SOTONK1_RS02385 -O169_RS02395 DU10_RS02425 -O169_RS02395 A5291_RS02415 -O169_RS02395 KW39_RS02395 -O169_RS02395 IaCS19096_RS02380 -O169_RS02395 ECS88FINAL_RS0102435 -O169_RS02750 O169_RS02750 -O169_RS02750 A5291_RS02775 -O169_RS02750 DU13_RS02780 -O169_RS02750 CBP48_RS04165 -O169_RS02750 7619051 -O169_RS02750 CTL2C_RS04090 -O169_RS02750 KW36_RS02735 -O169_RS02750 AKW53_RS03965 -O169_RS02750 BKB95_RS02780 -O169_RS02750 BKB96_RS02770 -O169_RS02750 BKB99_RS02765 -O169_RS02750 SW2_RS02745 -O169_RS02750 L1224_RS02720 -O169_RS02750 ECS102511_RS02740 -O169_RS02750 L1440_RS02720 -O169_RS02750 120214 -O169_RS02750 AP288_RS00340 -O169_RS02750 CBP42_RS04175 -O169_RS02750 L2BUCH2_RS02720 -O169_RS02750 SOTONIA3_RS02755 -O169_RS02750 BKB92_RS02770 -O169_RS02750 CTB_RS02775 -O169_RS02750 E150_RS02745 -O169_RS02750 AQ244_RS00370 -O169_RS02750 BW688_RS04165 -O169_RS02750 CTO_RS02775 -O169_RS02750 FCS84708_RS02735 -O169_RS02750 L2BLST_RS02720 -O169_RS02750 BBV13_RS02780 -O169_RS02750 CBP44_RS04170 -O169_RS02750 AQ199_RS03435 -O169_RS02750 BKB93_RS02775 -O169_RS02750 BBV16_RS02790 -O169_RS02750 G9768_RS02740 -O169_RS02750 L3404_RS02715 -O169_RS02750 BKC02_RS02765 -O169_RS02750 gnl|Prokka|PADJNBJD_00540 -O169_RS02750 AQ193_RS01245 -O169_RS02750 NILJEPDF_00540 -O169_RS02750 BKC01_RS02765 -O169_RS02750 LJHENM_02720 -O169_RS02750 CTRC943_RS02720 -O169_RS02750 AOT15_RS01540 -O169_RS02750 QSDFRQ_00540 -O169_RS02750 JIEJKO_02725 -O169_RS02750 SOTONK1_RS02740 -O169_RS02750 CTJTET1_RS02750 -O169_RS02750 BKC03_RS02765 -O169_RS02750 KW39_RS02750 -O169_RS02750 C15_RS0102810 -O169_RS02750 ECS88FINAL_RS0102805 -O169_RS02750 IaCS19096_RS02735 -O169_RS02750 DU10_RS02785 -O169_RS02915 O169_RS02915 -O169_RS02915 A5291_RS02940 -O169_RS02915 DU13_RS02945 -O169_RS02915 CBP48_RS04330 -O169_RS02915 CTL2C_RS04255 -O169_RS02915 KW36_RS02900 -O169_RS02915 AKW53_RS04130 -O169_RS02915 BKB95_RS02945 -O169_RS02915 BKB96_RS02935 -O169_RS02915 BKB99_RS02930 -O169_RS02915 7619082 -O169_RS02915 SW2_RS02910 -O169_RS02915 L1224_RS02885 -O169_RS02915 ECS102511_RS02905 -O169_RS02915 L1440_RS02885 -O169_RS02915 AP288_RS00175 -O169_RS02915 CBP42_RS04340 -O169_RS02915 120166 -O169_RS02915 L2BUCH2_RS02885 -O169_RS02915 SOTONIA3_RS02920 -O169_RS02915 BKB92_RS02935 -O169_RS02915 CTB_RS02940 -O169_RS02915 E150_RS02910 -O169_RS02915 AQ244_RS00205 -O169_RS02915 BW688_RS04330 -O169_RS02915 CTO_RS02940 -O169_RS02915 FCS84708_RS02900 -O169_RS02915 L2BLST_RS02885 -O169_RS02915 BBV13_RS02945 -O169_RS02915 CBP44_RS04335 -O169_RS02915 AQ199_RS03600 -O169_RS02915 BKB93_RS02940 -O169_RS02915 BBV16_RS02955 -O169_RS02915 G9768_RS02905 -O169_RS02915 L3404_RS02880 -O169_RS02915 BKC02_RS02930 -O169_RS02915 gnl|Prokka|PADJNBJD_00573 -O169_RS02915 AOT15_RS03705 -O169_RS02915 AQ193_RS01080 -O169_RS02915 NILJEPDF_00573 -O169_RS02915 BKC01_RS02930 -O169_RS02915 LJHENM_02885 -O169_RS02915 CTRC943_RS02885 -O169_RS02915 QSDFRQ_00573 -O169_RS02915 JIEJKO_02890 -O169_RS02915 SOTONK1_RS02905 -O169_RS02915 CTJTET1_RS02915 -O169_RS02915 BKC03_RS02930 -O169_RS02915 KW39_RS02915 -O169_RS02915 C15_RS0102975 -O169_RS02915 ECS88FINAL_RS0102970 -O169_RS02915 IaCS19096_RS02900 -O169_RS02915 DU10_RS02950 -O169_RS04290 O169_RS04290 -O169_RS04290 KW36_RS04275 -O169_RS04290 BKB95_RS04335 -O169_RS04290 CBP42_RS00885 -O169_RS04290 CTL2C_RS00875 -O169_RS04290 L1224_RS04255 -O169_RS04290 BKB96_RS04320 -O169_RS04290 L1440_RS04250 -O169_RS04290 BKB99_RS04315 -O169_RS04290 SW2_RS04285 -O169_RS04290 ECS102511_RS04275 -O169_RS04290 CBP44_RS00885 -O169_RS04290 CTB_RS04310 -O169_RS04290 L2BUCH2_RS04255 -O169_RS04290 SOTONIA3_RS04295 -O169_RS04290 BKB92_RS04315 -O169_RS04290 CTO_RS04305 -O169_RS04290 AP288_RS02580 -O169_RS04290 BBV13_RS04320 -O169_RS04290 E150_RS04285 -O169_RS04290 L2BLST_RS04255 -O169_RS04290 FCS84708_RS04275 -O169_RS04290 AQ199_RS00205 -O169_RS04290 BBV16_RS04325 -O169_RS04290 119974 -O169_RS04290 gnl|Prokka|PADJNBJD_00839 -O169_RS04290 BW688_RS00885 -O169_RS04290 7618735 -O169_RS04290 NILJEPDF_00840 -O169_RS04290 G9768_RS04280 -O169_RS04290 LJHENM_04225 -O169_RS04290 L3404_RS04250 -O169_RS04290 BKB93_RS04320 -O169_RS04290 JIEJKO_04225 -O169_RS04290 QSDFRQ_00840 -O169_RS04290 BKC02_RS04315 -O169_RS04290 AKW53_RS00995 -O169_RS04290 BKC01_RS04320 -O169_RS04290 CTRC943_RS04260 -O169_RS04290 AOT15_RS01860 -O169_RS04290 CTJTET1_RS04450 -O169_RS04290 AQ193_RS04495 -O169_RS04290 BKC03_RS04315 -O169_RS04290 CBP48_RS00885 -O169_RS04290 A5291_RS04315 -O169_RS04290 KW39_RS04295 -O169_RS04290 SOTONK1_RS04280 -O169_RS04290 ECS88FINAL_RS0104370 -O169_RS04290 IaCS19096_RS04270 -O169_RS04290 AQ244_RS02480 -O169_RS04290 DU10_RS04330 -O169_RS04290 C15_RS0104390 -O169_RS04290 DU13_RS04330 -O169_RS04460 O169_RS04460 -O169_RS04460 KW36_RS04440 -O169_RS04460 DU13_RS04505 -O169_RS04460 BKB95_RS04505 -O169_RS04460 CBP42_RS01060 -O169_RS04460 CTL2C_RS01040 -O169_RS04460 L1224_RS04420 -O169_RS04460 BKB96_RS04490 -O169_RS04460 L1440_RS04415 -O169_RS04460 BKB99_RS04485 -O169_RS04460 SW2_RS04450 -O169_RS04460 ECS102511_RS04445 -O169_RS04460 CBP44_RS01060 -O169_RS04460 CTB_RS04470 -O169_RS04460 L2BUCH2_RS04420 -O169_RS04460 SOTONIA3_RS04455 -O169_RS04460 CTO_RS04465 -O169_RS04460 BKB92_RS04490 -O169_RS04460 AP288_RS02750 -O169_RS04460 BBV13_RS04480 -O169_RS04460 E150_RS04455 -O169_RS04460 gnl|Prokka|PADJNBJD_00870 -O169_RS04460 L2BLST_RS04420 -O169_RS04460 BBV16_RS04485 -O169_RS04460 FCS84708_RS04440 -O169_RS04460 AQ199_RS00375 -O169_RS04460 119859 -O169_RS04460 NILJEPDF_00871 -O169_RS04460 BW688_RS01060 -O169_RS04460 7618319 -O169_RS04460 LJHENM_04385 -O169_RS04460 JIEJKO_04380 -O169_RS04460 QSDFRQ_00871 -O169_RS04460 G9768_RS04440 -O169_RS04460 L3404_RS04415 -O169_RS04460 BKB93_RS04495 -O169_RS04460 BKC02_RS04485 -O169_RS04460 AKW53_RS01165 -O169_RS04460 BKC01_RS04490 -O169_RS04460 CTRC943_RS04425 -O169_RS04460 AOT15_RS02020 -O169_RS04460 CTJTET1_RS04610 -O169_RS04460 AQ193_RS04325 -O169_RS04460 KW39_RS04460 -O169_RS04460 BKC03_RS04485 -O169_RS04460 CBP48_RS01060 -O169_RS04460 A5291_RS04475 -O169_RS04460 AQ244_RS02310 -O169_RS04460 SOTONK1_RS04440 -O169_RS04460 ECS88FINAL_RS0104535 -O169_RS04460 IaCS19096_RS04435 -O169_RS04460 C15_RS0104555 -O169_RS04460 DU10_RS04505 -O169_RS04625 O169_RS04625 -O169_RS04625 KW36_RS04605 -O169_RS04625 DU13_RS04680 -O169_RS04625 CTL2C_RS01205 -O169_RS04625 BKB95_RS04680 -O169_RS04625 CBP42_RS01235 -O169_RS04625 L1224_RS04585 -O169_RS04625 BKB96_RS04665 -O169_RS04625 L1440_RS04580 -O169_RS04625 BKB99_RS04660 -O169_RS04625 SW2_RS04615 -O169_RS04625 ECS102511_RS04610 -O169_RS04625 CBP44_RS01235 -O169_RS04625 CTB_RS04635 -O169_RS04625 L2BUCH2_RS04585 -O169_RS04625 SOTONIA3_RS04620 -O169_RS04625 CTO_RS04630 -O169_RS04625 AP288_RS02915 -O169_RS04625 BBV13_RS04650 -O169_RS04625 BKB92_RS04665 -O169_RS04625 BBV16_RS04655 -O169_RS04625 E150_RS04620 -O169_RS04625 gnl|Prokka|PADJNBJD_00904 -O169_RS04625 L2BLST_RS04585 -O169_RS04625 FCS84708_RS04605 -O169_RS04625 AQ199_RS00540 -O169_RS04625 NILJEPDF_00905 -O169_RS04625 BW688_RS01235 -O169_RS04625 119936 -O169_RS04625 JIEJKO_04550 -O169_RS04625 7618759 -O169_RS04625 QSDFRQ_00905 -O169_RS04625 G9768_RS04605 -O169_RS04625 LJHENM_04560 -O169_RS04625 L3404_RS04580 -O169_RS04625 BKB93_RS04670 -O169_RS04625 BKC02_RS04660 -O169_RS04625 AKW53_RS01330 -O169_RS04625 BKC01_RS04665 -O169_RS04625 CTRC943_RS04590 -O169_RS04625 AOT15_RS02185 -O169_RS04625 CTJTET1_RS04775 -O169_RS04625 AQ193_RS04160 -O169_RS04625 KW39_RS04625 -O169_RS04625 BKC03_RS04660 -O169_RS04625 CBP48_RS01235 -O169_RS04625 A5291_RS04640 -O169_RS04625 SOTONK1_RS04605 -O169_RS04625 ECS88FINAL_RS0104715 -O169_RS04625 IaCS19096_RS04600 -O169_RS04625 AQ244_RS02145 -O169_RS04625 C15_RS0104735 -O169_RS04625 DU10_RS04680 -KW36_RS00025 KW36_RS00025 -KW36_RS00025 SW2_RS00025 -KW36_RS00025 ECS102511_RS00025 -KW36_RS00025 CTB_RS00025 -KW36_RS00025 CTL2C_RS01390 -KW36_RS00025 CBP42_RS01415 -KW36_RS00025 L1224_RS00025 -KW36_RS00025 BKB96_RS00025 -KW36_RS00025 BKB99_RS00025 -KW36_RS00025 CTO_RS00025 -KW36_RS00025 SOTONIA3_RS00025 -KW36_RS00025 L1440_RS00025 -KW36_RS00025 BKB92_RS00025 -KW36_RS00025 119205 -KW36_RS00025 AOT15_RS00930 -KW36_RS00025 CBP44_RS01415 -KW36_RS00025 E150_RS00025 -KW36_RS00025 L2BUCH2_RS00025 -KW36_RS00025 BKB93_RS00025 -KW36_RS00025 FCS84708_RS00025 -KW36_RS00025 AP288_RS03095 -KW36_RS00025 BBV13_RS00025 -KW36_RS00025 G9768_RS00025 -KW36_RS00025 BW688_RS01415 -KW36_RS00025 L2BLST_RS00025 -KW36_RS00025 AQ199_RS00720 -KW36_RS00025 BKC02_RS00025 -KW36_RS00025 BKC01_RS00025 -KW36_RS00025 7618355 -KW36_RS00025 gnl|Prokka|PADJNBJD_00005 -KW36_RS00025 LJHENM_00025 -KW36_RS00025 A5291_RS00025 -KW36_RS00025 SOTONK1_RS00025 -KW36_RS00025 BBV16_RS00025 -KW36_RS00025 JIEJKO_00020 -KW36_RS00025 NILJEPDF_00005 -KW36_RS00025 L3404_RS00025 -KW36_RS00025 AQ193_RS03980 -KW36_RS00025 IaCS19096_RS00025 -KW36_RS00025 BKC03_RS00025 -KW36_RS00025 C15_RS0100025 -KW36_RS00025 QSDFRQ_00005 -KW36_RS00025 CTJTET1_RS00025 -KW36_RS00025 AKW53_RS01510 -KW36_RS00025 AQ244_RS01965 -KW36_RS00025 DU10_RS00025 -KW36_RS00025 CTRC943_RS00025 -KW36_RS00025 O169_RS00025 -KW36_RS00025 CBP48_RS01415 -KW36_RS00025 ECS88FINAL_RS0100025 -KW36_RS00025 DU13_RS00025 -KW36_RS00025 KW39_RS00025 -KW36_RS00025 BKB95_RS00025 -KW36_RS00190 KW36_RS00190 -KW36_RS00190 BKB95_RS00195 -KW36_RS00190 CTB_RS00190 -KW36_RS00190 BKB96_RS00195 -KW36_RS00190 BKB99_RS00195 -KW36_RS00190 CTO_RS00190 -KW36_RS00190 SOTONIA3_RS00190 -KW36_RS00190 120644 -KW36_RS00190 AOT15_RS00765 -KW36_RS00190 BBV13_RS00195 -KW36_RS00190 G9768_RS00190 -KW36_RS00190 BKC02_RS00195 -KW36_RS00190 BBV16_RS00195 -KW36_RS00190 BKC01_RS00195 -KW36_RS00190 A5291_RS00190 -KW36_RS00190 SOTONK1_RS00190 -KW36_RS00190 IaCS19096_RS00190 -KW36_RS00190 AQ244_RS01800 -KW36_RS00190 BKC03_RS00195 -KW36_RS00190 C15_RS0100190 -KW36_RS00190 CTJTET1_RS00190 -KW36_RS00695 KW36_RS00695 -KW36_RS00695 CBP48_RS02095 -KW36_RS00695 SW2_RS00695 -KW36_RS00695 BKB95_RS00705 -KW36_RS00695 ECS102511_RS00695 -KW36_RS00695 CTL2C_RS02060 -KW36_RS00695 CTB_RS00700 -KW36_RS00695 L1224_RS00695 -KW36_RS00695 AQ244_RS02870 -KW36_RS00695 BKB96_RS00705 -KW36_RS00695 CBP42_RS02095 -KW36_RS00695 AOT15_RS00260 -KW36_RS00695 BKB99_RS00705 -KW36_RS00695 L1440_RS00695 -KW36_RS00695 BKB92_RS00705 -KW36_RS00695 SOTONIA3_RS00695 -KW36_RS00695 E150_RS00695 -KW36_RS00695 L2BUCH2_RS00695 -KW36_RS00695 CBP44_RS02100 -KW36_RS00695 FCS84708_RS00695 -KW36_RS00695 AP288_RS03765 -KW36_RS00695 BKB93_RS00705 -KW36_RS00695 119312 -KW36_RS00695 AQ199_RS01390 -KW36_RS00695 BBV13_RS00705 -KW36_RS00695 G9768_RS00695 -KW36_RS00695 L2BLST_RS00695 -KW36_RS00695 BW688_RS02095 -KW36_RS00695 BBV16_RS00705 -KW36_RS00695 BKC02_RS00705 -KW36_RS00695 gnl|Prokka|PADJNBJD_00137 -KW36_RS00695 LJHENM_00685 -KW36_RS00695 AKW53_RS02190 -KW36_RS00695 BKC01_RS00705 -KW36_RS00695 NILJEPDF_00137 -KW36_RS00695 A5291_RS00700 -KW36_RS00695 L3404_RS00695 -KW36_RS00695 SOTONK1_RS00695 -KW36_RS00695 AQ193_RS03300 -KW36_RS00695 JIEJKO_00690 -KW36_RS00695 QSDFRQ_00137 -KW36_RS00695 IaCS19096_RS00695 -KW36_RS00695 BKC03_RS00705 -KW36_RS00695 C15_RS0100720 -KW36_RS00695 CTRC943_RS00695 -KW36_RS00695 KW39_RS00695 -KW36_RS00695 DU10_RS00705 -KW36_RS00695 O169_RS00695 -KW36_RS00695 DU13_RS00710 -KW36_RS00695 7618424 -KW36_RS00875 KW36_RS00875 -KW36_RS00875 BKB96_RS00875 -KW36_RS00875 SW2_RS00875 -KW36_RS00875 BKB99_RS00875 -KW36_RS00875 ECS102511_RS00875 -KW36_RS00875 CBP48_RS02275 -KW36_RS00875 CTL2C_RS02235 -KW36_RS00875 L1224_RS00865 -KW36_RS00875 AQ244_RS03055 -KW36_RS00875 SOTONIA3_RS00890 -KW36_RS00875 L1440_RS00865 -KW36_RS00875 BKB92_RS00880 -KW36_RS00875 AOT15_RS00080 -KW36_RS00875 CBP42_RS02275 -KW36_RS00875 CTB_RS00900 -KW36_RS00875 E150_RS00875 -KW36_RS00875 CTO_RS00900 -KW36_RS00875 L2BUCH2_RS00870 -KW36_RS00875 FCS84708_RS00875 -KW36_RS00875 AP288_RS03945 -KW36_RS00875 BKB93_RS00880 -KW36_RS00875 AQ199_RS01570 -KW36_RS00875 CBP44_RS02280 -KW36_RS00875 G9768_RS00880 -KW36_RS00875 L2BLST_RS00870 -KW36_RS00875 BW688_RS02275 -KW36_RS00875 BKC02_RS00875 -KW36_RS00875 BBV13_RS00905 -KW36_RS00875 BKC01_RS00875 -KW36_RS00875 AKW53_RS02370 -KW36_RS00875 BBV16_RS00905 -KW36_RS00875 BKC03_RS00875 -KW36_RS00875 CTJTET1_RS00890 -KW36_RS00875 DU10_RS00890 -KW36_RS00875 C15_RS0100910 -KW36_RS00875 SOTONK1_RS00875 -KW36_RS00875 KW39_RS00880 -KW36_RS00875 IaCS19096_RS00875 -KW36_RS00875 CTRC943_RS00870 -KW36_RS00875 ECS88FINAL_RS0100895 -KW36_RS00875 O169_RS00880 -KW36_RS00875 AQ193_RS03115 -KW36_RS00875 DU13_RS00885 -KW36_RS00875 A5291_RS00900 -KW36_RS00875 BKB95_RS00890 -KW36_RS01045 KW36_RS01045 -KW36_RS01045 ECS102511_RS01040 -KW36_RS01045 BKB96_RS01045 -KW36_RS01045 CTL2C_RS02395 -KW36_RS01045 BKB99_RS01045 -KW36_RS01045 L1224_RS01025 -KW36_RS01045 L1440_RS01025 -KW36_RS01045 AQ244_RS03225 -KW36_RS01045 BKB92_RS01045 -KW36_RS01045 CBP42_RS02435 -KW36_RS01045 SOTONIA3_RS01060 -KW36_RS01045 E150_RS01040 -KW36_RS01045 CTB_RS01070 -KW36_RS01045 L2BUCH2_RS01030 -KW36_RS01045 CTO_RS01070 -KW36_RS01045 FCS84708_RS01040 -KW36_RS01045 AP288_RS04110 -KW36_RS01045 BKB93_RS01045 -KW36_RS01045 CBP44_RS02440 -KW36_RS01045 AQ199_RS01735 -KW36_RS01045 L2BLST_RS01030 -KW36_RS01045 BW688_RS02440 -KW36_RS01045 AOT15_RS01320 -KW36_RS01045 BBV13_RS01075 -KW36_RS01045 G9768_RS01050 -KW36_RS01045 BKC02_RS01045 -KW36_RS01045 L3404_RS01025 -KW36_RS01045 AKW53_RS02535 -KW36_RS01045 BBV16_RS01075 -KW36_RS01045 BKC01_RS01045 -KW36_RS01045 119369 -KW36_RS01045 DU10_RS01055 -KW36_RS01045 gnl|Prokka|PADJNBJD_00205 -KW36_RS01045 BKC03_RS01045 -KW36_RS01045 NILJEPDF_00205 -KW36_RS01045 LJHENM_01030 -KW36_RS01045 CTRC943_RS01030 -KW36_RS01045 CTJTET1_RS01060 -KW36_RS01045 C15_RS0101080 -KW36_RS01045 SOTONK1_RS01045 -KW36_RS01045 ECS88FINAL_RS0101065 -KW36_RS01045 KW39_RS01050 -KW36_RS01045 JIEJKO_01030 -KW36_RS01045 A5291_RS01070 -KW36_RS01045 IaCS19096_RS01045 -KW36_RS01045 7618458 -KW36_RS01045 QSDFRQ_00205 -KW36_RS01045 O169_RS01050 -KW36_RS01045 DU13_RS01055 -KW36_RS01045 AQ193_RS02950 -KW36_RS01045 SW2_RS01040 -KW36_RS01045 BKB95_RS01060 -KW36_RS01045 CBP48_RS02435 -KW36_RS01225 KW36_RS01225 -KW36_RS01225 ECS102511_RS01220 -KW36_RS01225 BKB96_RS01225 -KW36_RS01225 CTL2C_RS02575 -KW36_RS01225 BKB99_RS01225 -KW36_RS01225 L1224_RS01205 -KW36_RS01225 L1440_RS01205 -KW36_RS01225 AQ244_RS03405 -KW36_RS01225 BKB92_RS01225 -KW36_RS01225 CBP42_RS02615 -KW36_RS01225 SOTONIA3_RS01240 -KW36_RS01225 CTB_RS01250 -KW36_RS01225 E150_RS01220 -KW36_RS01225 L2BUCH2_RS01210 -KW36_RS01225 CTO_RS01250 -KW36_RS01225 FCS84708_RS01220 -KW36_RS01225 AP288_RS04290 -KW36_RS01225 BKB93_RS01225 -KW36_RS01225 CBP44_RS02620 -KW36_RS01225 AQ199_RS01915 -KW36_RS01225 L2BLST_RS01210 -KW36_RS01225 BW688_RS02620 -KW36_RS01225 BBV13_RS01255 -KW36_RS01225 AOT15_RS01140 -KW36_RS01225 G9768_RS01230 -KW36_RS01225 BKC02_RS01225 -KW36_RS01225 L3404_RS01205 -KW36_RS01225 AKW53_RS02715 -KW36_RS01225 BBV16_RS01255 -KW36_RS01225 BKC01_RS01225 -KW36_RS01225 119394 -KW36_RS01225 gnl|Prokka|PADJNBJD_00240 -KW36_RS01225 DU10_RS01235 -KW36_RS01225 NILJEPDF_00240 -KW36_RS01225 LJHENM_01205 -KW36_RS01225 BKC03_RS01225 -KW36_RS01225 CTRC943_RS01210 -KW36_RS01225 CTJTET1_RS01240 -KW36_RS01225 KW39_RS01230 -KW36_RS01225 JIEJKO_01205 -KW36_RS01225 C15_RS0101260 -KW36_RS01225 SOTONK1_RS01225 -KW36_RS01225 ECS88FINAL_RS0101245 -KW36_RS01225 QSDFRQ_00240 -KW36_RS01225 A5291_RS01250 -KW36_RS01225 IaCS19096_RS01225 -KW36_RS01225 O169_RS01230 -KW36_RS01225 DU13_RS01235 -KW36_RS01225 7618474 -KW36_RS01225 AQ193_RS02770 -KW36_RS01225 SW2_RS01220 -KW36_RS01225 BKB95_RS01240 -KW36_RS01225 CBP48_RS02615 -KW36_RS01385 KW36_RS01385 -KW36_RS01385 ECS102511_RS01380 -KW36_RS01385 AOT15_RS02385 -KW36_RS01385 BKB96_RS01390 -KW36_RS01385 CTL2C_RS02735 -KW36_RS01385 BKB99_RS01390 -KW36_RS01385 L1224_RS01365 -KW36_RS01385 L1440_RS01365 -KW36_RS01385 AQ244_RS03570 -KW36_RS01385 CBP42_RS02780 -KW36_RS01385 SOTONIA3_RS01400 -KW36_RS01385 BKB92_RS01395 -KW36_RS01385 CTB_RS01415 -KW36_RS01385 E150_RS01385 -KW36_RS01385 L2BUCH2_RS01370 -KW36_RS01385 CTO_RS01410 -KW36_RS01385 FCS84708_RS01380 -KW36_RS01385 AP288_RS04450 -KW36_RS01385 BKB93_RS01395 -KW36_RS01385 CBP44_RS02785 -KW36_RS01385 AQ199_RS02075 -KW36_RS01385 L2BLST_RS01370 -KW36_RS01385 BBV13_RS01420 -KW36_RS01385 BW688_RS02785 -KW36_RS01385 G9768_RS01390 -KW36_RS01385 BKC02_RS01390 -KW36_RS01385 BBV16_RS01420 -KW36_RS01385 L3404_RS01365 -KW36_RS01385 AKW53_RS02875 -KW36_RS01385 BKC01_RS01395 -KW36_RS01385 gnl|Prokka|PADJNBJD_00272 -KW36_RS01385 DU10_RS01400 -KW36_RS01385 NILJEPDF_00272 -KW36_RS01385 LJHENM_01370 -KW36_RS01385 BKC03_RS01390 -KW36_RS01385 CTRC943_RS01370 -KW36_RS01385 CTJTET1_RS01400 -KW36_RS01385 KW39_RS01390 -KW36_RS01385 JIEJKO_01370 -KW36_RS01385 119425 -KW36_RS01385 C15_RS0101425 -KW36_RS01385 SOTONK1_RS01390 -KW36_RS01385 ECS88FINAL_RS0101410 -KW36_RS01385 QSDFRQ_00272 -KW36_RS01385 IaCS19096_RS01385 -KW36_RS01385 A5291_RS01415 -KW36_RS01385 O169_RS01395 -KW36_RS01385 DU13_RS01400 -KW36_RS01385 AQ193_RS02605 -KW36_RS01385 7618494 -KW36_RS01385 SW2_RS01380 -KW36_RS01385 BKB95_RS01405 -KW36_RS01385 CBP48_RS02780 -KW36_RS03380 KW36_RS03380 -KW36_RS03380 CTL2C_RS04735 -KW36_RS03380 BKB95_RS03435 -KW36_RS03380 CBP48_RS04815 -KW36_RS03380 7619125 -KW36_RS03380 SW2_RS03390 -KW36_RS03380 L1224_RS03365 -KW36_RS03380 ECS102511_RS03380 -KW36_RS03380 L1440_RS03365 -KW36_RS03380 BKB96_RS03425 -KW36_RS03380 BKB99_RS03420 -KW36_RS03380 CBP42_RS04820 -KW36_RS03380 L2BUCH2_RS03365 -KW36_RS03380 BKB92_RS03415 -KW36_RS03380 CTB_RS03420 -KW36_RS03380 SOTONIA3_RS03400 -KW36_RS03380 E150_RS03390 -KW36_RS03380 CTO_RS03415 -KW36_RS03380 BBV13_RS03420 -KW36_RS03380 BW688_RS04810 -KW36_RS03380 FCS84708_RS03380 -KW36_RS03380 L2BLST_RS03365 -KW36_RS03380 CBP44_RS04815 -KW36_RS03380 120096 -KW36_RS03380 BBV16_RS03430 -KW36_RS03380 AQ199_RS04080 -KW36_RS03380 BKB93_RS03420 -KW36_RS03380 G9768_RS03380 -KW36_RS03380 gnl|Prokka|PADJNBJD_00665 -KW36_RS03380 L3404_RS03360 -KW36_RS03380 AQ244_RS04530 -KW36_RS03380 BKC02_RS03415 -KW36_RS03380 NILJEPDF_00666 -KW36_RS03380 LJHENM_03345 -KW36_RS03380 AOT15_RS04180 -KW36_RS03380 AP288_RS01750 -KW36_RS03380 BKC01_RS03415 -KW36_RS03380 QSDFRQ_00666 -KW36_RS03380 CTRC943_RS03365 -KW36_RS03380 BKC03_RS03415 -KW36_RS03380 CTJTET1_RS03400 -KW36_RS03380 KW39_RS03400 -KW36_RS03380 AQ193_RS00605 -KW36_RS03380 DU10_RS03430 -KW36_RS03380 SOTONK1_RS03380 -KW36_RS03380 ECS88FINAL_RS0103455 -KW36_RS03380 IaCS19096_RS03375 -KW36_RS03380 C15_RS0103450 -KW36_RS03380 A5291_RS03425 -KW36_RS03380 O169_RS03395 -KW36_RS03380 DU13_RS03430 -KW36_RS03380 AKW53_RS00130 -KW36_RS03380 JIEJKO_03350 F -KW36_RS03915 KW36_RS03915 -KW36_RS03915 BKB95_RS03970 -KW36_RS03915 CBP42_RS00520 -KW36_RS03915 CTL2C_RS00515 -KW36_RS03915 L1224_RS03895 -KW36_RS03915 SW2_RS03920 -KW36_RS03915 L1440_RS03890 -KW36_RS03915 ECS102511_RS03910 -KW36_RS03915 BKB96_RS03955 -KW36_RS03915 BKB99_RS03950 -KW36_RS03915 CBP44_RS00520 -KW36_RS03915 L2BUCH2_RS03895 -KW36_RS03915 BKB92_RS03950 -KW36_RS03915 CTB_RS03955 -KW36_RS03915 SOTONIA3_RS03935 -KW36_RS03915 E150_RS03920 -KW36_RS03915 CTO_RS03950 -KW36_RS03915 BBV13_RS03955 -KW36_RS03915 FCS84708_RS03910 -KW36_RS03915 L2BLST_RS03895 -KW36_RS03915 BBV16_RS03965 -KW36_RS03915 7618702 -KW36_RS03915 120025 -KW36_RS03915 BW688_RS00520 -KW36_RS03915 AQ199_RS04610 -KW36_RS03915 AQ244_RS03995 -KW36_RS03915 BKB93_RS03955 -KW36_RS03915 G9768_RS03915 -KW36_RS03915 gnl|Prokka|PADJNBJD_00770 -KW36_RS03915 L3404_RS03890 -KW36_RS03915 NILJEPDF_00771 -KW36_RS03915 BKC02_RS03950 -KW36_RS03915 LJHENM_03880 -KW36_RS03915 AOT15_RS04715 -KW36_RS03915 AP288_RS02285 -KW36_RS03915 AQ193_RS00075 -KW36_RS03915 JIEJKO_03880 -KW36_RS03915 QSDFRQ_00771 -KW36_RS03915 BKC01_RS03955 -KW36_RS03915 CTRC943_RS03900 -KW36_RS03915 AKW53_RS00655 -KW36_RS03915 BKC03_RS03950 -KW36_RS03915 CBP48_RS00520 -KW36_RS03915 CTJTET1_RS03935 -KW36_RS03915 KW39_RS03930 -KW36_RS03915 DU10_RS03965 -KW36_RS03915 A5291_RS03960 -KW36_RS03915 SOTONK1_RS03915 -KW36_RS03915 IaCS19096_RS03910 -KW36_RS03915 DU13_RS03965 -KW36_RS03915 C15_RS0104020 -KW36_RS03915 ECS88FINAL_RS0104025 -KW36_RS03915 O169_RS03925 -KW36_RS04115 KW36_RS04115 -KW36_RS04115 BKB95_RS04170 -KW36_RS04115 CBP42_RS00720 -KW36_RS04115 CTL2C_RS00715 -KW36_RS04115 L1224_RS04095 -KW36_RS04115 BKB96_RS04155 -KW36_RS04115 SW2_RS04120 -KW36_RS04115 L1440_RS04090 -KW36_RS04115 ECS102511_RS04110 -KW36_RS04115 BKB99_RS04150 -KW36_RS04115 CBP44_RS00720 -KW36_RS04115 CTB_RS04150 -KW36_RS04115 L2BUCH2_RS04095 -KW36_RS04115 BKB92_RS04150 -KW36_RS04115 SOTONIA3_RS04135 -KW36_RS04115 CTO_RS04145 -KW36_RS04115 AP288_RS02415 -KW36_RS04115 E150_RS04120 -KW36_RS04115 BBV13_RS04155 -KW36_RS04115 119795 -KW36_RS04115 FCS84708_RS04110 -KW36_RS04115 AQ199_RS00040 -KW36_RS04115 7618277 -KW36_RS04115 L2BLST_RS04095 -KW36_RS04115 BBV16_RS04165 -KW36_RS04115 BW688_RS00720 -KW36_RS04115 gnl|Prokka|PADJNBJD_00808 -KW36_RS04115 BKB93_RS04155 -KW36_RS04115 NILJEPDF_00809 -KW36_RS04115 G9768_RS04115 -KW36_RS04115 L3404_RS04090 -KW36_RS04115 LJHENM_04070 -KW36_RS04115 JIEJKO_04070 -KW36_RS04115 BKC02_RS04150 -KW36_RS04115 QSDFRQ_00809 -KW36_RS04115 AKW53_RS00830 -KW36_RS04115 BKC01_RS04155 -KW36_RS04115 CTRC943_RS04100 -KW36_RS04115 AOT15_RS01700 -KW36_RS04115 CTJTET1_RS04290 -KW36_RS04115 KW39_RS04130 -KW36_RS04115 AQ193_RS04660 -KW36_RS04115 BKC03_RS04150 -KW36_RS04115 CBP48_RS00720 -KW36_RS04115 A5291_RS04155 -KW36_RS04115 ECS88FINAL_RS0104200 -KW36_RS04115 AQ244_RS02650 -KW36_RS04115 DU10_RS04165 -KW36_RS04115 SOTONK1_RS04115 -KW36_RS04115 IaCS19096_RS04110 -KW36_RS04115 DU13_RS04165 -KW36_RS04115 C15_RS0104225 -KW36_RS04115 O169_RS04125 -ECS102511_RS00010 ECS102511_RS00010 -ECS102511_RS00010 CTB_RS00010 -ECS102511_RS00010 CTL2C_RS01375 -ECS102511_RS00010 CBP42_RS01400 -ECS102511_RS00010 L1224_RS00010 -ECS102511_RS00010 BKB96_RS00010 -ECS102511_RS00010 BKB99_RS00010 -ECS102511_RS00010 CTO_RS00010 -ECS102511_RS00010 SOTONIA3_RS00010 -ECS102511_RS00010 L1440_RS00010 -ECS102511_RS00010 BKB92_RS00010 -ECS102511_RS00010 120666 -ECS102511_RS00010 CBP44_RS01400 -ECS102511_RS00010 E150_RS00010 -ECS102511_RS00010 L2BUCH2_RS00010 -ECS102511_RS00010 BKB93_RS00010 -ECS102511_RS00010 FCS84708_RS00010 -ECS102511_RS00010 AOT15_RS00945 -ECS102511_RS00010 AP288_RS03080 -ECS102511_RS00010 BBV13_RS00010 -ECS102511_RS00010 G9768_RS00010 -ECS102511_RS00010 BW688_RS01400 -ECS102511_RS00010 L2BLST_RS00010 -ECS102511_RS00010 AQ199_RS00705 -ECS102511_RS00010 BKC02_RS00010 -ECS102511_RS00010 BKC01_RS00010 -ECS102511_RS00010 7618778 -ECS102511_RS00010 gnl|Prokka|PADJNBJD_00002 -ECS102511_RS00010 LJHENM_00010 -ECS102511_RS00010 A5291_RS00010 -ECS102511_RS00010 SOTONK1_RS00010 -ECS102511_RS00010 BBV16_RS00010 -ECS102511_RS00010 JIEJKO_00005 -ECS102511_RS00010 NILJEPDF_00002 -ECS102511_RS00010 L3404_RS00010 -ECS102511_RS00010 IaCS19096_RS00010 -ECS102511_RS00010 BKC03_RS00010 -ECS102511_RS00010 C15_RS0100010 -ECS102511_RS00010 QSDFRQ_00002 -ECS102511_RS00010 CTJTET1_RS00010 -ECS102511_RS00010 AKW53_RS01495 -ECS102511_RS00010 DU10_RS00010 -ECS102511_RS00010 CTRC943_RS00010 -ECS102511_RS00010 O169_RS00010 -ECS102511_RS00010 CBP48_RS01400 -ECS102511_RS00010 ECS88FINAL_RS0100010 -ECS102511_RS00010 AQ193_RS03995 -ECS102511_RS00010 DU13_RS00010 -ECS102511_RS00010 KW39_RS00010 -ECS102511_RS00010 BKB95_RS00010 -ECS102511_RS00010 KW36_RS00010 -ECS102511_RS00010 AQ244_RS01980 -ECS102511_RS00010 SW2_RS00010 -ECS102511_RS00170 ECS102511_RS00170 -ECS102511_RS00170 CTB_RS00170 -ECS102511_RS00170 CTL2C_RS01535 -ECS102511_RS00170 CBP42_RS01565 -ECS102511_RS00170 L1224_RS00170 -ECS102511_RS00170 BKB96_RS00175 -ECS102511_RS00170 BKB99_RS00175 -ECS102511_RS00170 CTO_RS00170 -ECS102511_RS00170 SOTONIA3_RS00170 -ECS102511_RS00170 L1440_RS00170 -ECS102511_RS00170 BKB92_RS00175 -ECS102511_RS00170 120649 -ECS102511_RS00170 CBP44_RS01570 -ECS102511_RS00170 E150_RS00170 -ECS102511_RS00170 L2BUCH2_RS00170 -ECS102511_RS00170 BKB93_RS00175 -ECS102511_RS00170 FCS84708_RS00170 -ECS102511_RS00170 AP288_RS03240 -ECS102511_RS00170 AOT15_RS00785 -ECS102511_RS00170 BBV13_RS00175 -ECS102511_RS00170 G9768_RS00170 -ECS102511_RS00170 AQ199_RS00865 -ECS102511_RS00170 BW688_RS01565 -ECS102511_RS00170 L2BLST_RS00170 -ECS102511_RS00170 BKC02_RS00175 -ECS102511_RS00170 BBV16_RS00175 -ECS102511_RS00170 BKC01_RS00175 -ECS102511_RS00170 gnl|Prokka|PADJNBJD_00035 -ECS102511_RS00170 LJHENM_00175 -ECS102511_RS00170 A5291_RS00170 -ECS102511_RS00170 SOTONK1_RS00170 -ECS102511_RS00170 JIEJKO_00170 -ECS102511_RS00170 7618789 -ECS102511_RS00170 NILJEPDF_00035 -ECS102511_RS00170 L3404_RS00170 -ECS102511_RS00170 IaCS19096_RS00170 -ECS102511_RS00170 AKW53_RS01660 -ECS102511_RS00170 BKC03_RS00175 -ECS102511_RS00170 C15_RS0100170 -ECS102511_RS00170 QSDFRQ_00035 -ECS102511_RS00170 CTJTET1_RS00170 -ECS102511_RS00170 DU10_RS00175 -ECS102511_RS00170 CTRC943_RS00170 -ECS102511_RS00170 O169_RS00170 -ECS102511_RS00170 CBP48_RS01565 -ECS102511_RS00170 ECS88FINAL_RS0100175 -ECS102511_RS00170 DU13_RS00175 -ECS102511_RS00170 KW39_RS00170 -ECS102511_RS00170 KW36_RS00170 -ECS102511_RS00170 AQ193_RS03835 -ECS102511_RS00170 BKB95_RS00175 -ECS102511_RS00170 SW2_RS00170 -ECS102511_RS00170 AQ244_RS01820 -ECS102511_RS00345 ECS102511_RS00345 -ECS102511_RS00345 CTB_RS00345 -ECS102511_RS00345 CTL2C_RS01710 -ECS102511_RS00345 CBP42_RS01740 -ECS102511_RS00345 BKB96_RS00350 -ECS102511_RS00345 L1224_RS00345 -ECS102511_RS00345 BKB99_RS00350 -ECS102511_RS00345 CTO_RS00345 -ECS102511_RS00345 L1440_RS00345 -ECS102511_RS00345 BKB92_RS00350 -ECS102511_RS00345 SOTONIA3_RS00345 -ECS102511_RS00345 CBP44_RS01745 -ECS102511_RS00345 120619 -ECS102511_RS00345 E150_RS00345 -ECS102511_RS00345 L2BUCH2_RS00345 -ECS102511_RS00345 BKB93_RS00350 -ECS102511_RS00345 FCS84708_RS00345 -ECS102511_RS00345 AP288_RS03415 -ECS102511_RS00345 AOT15_RS00610 -ECS102511_RS00345 BBV13_RS00350 -ECS102511_RS00345 AQ199_RS01040 -ECS102511_RS00345 BW688_RS01740 -ECS102511_RS00345 G9768_RS00345 -ECS102511_RS00345 L2BLST_RS00345 -ECS102511_RS00345 BKC02_RS00350 -ECS102511_RS00345 BBV16_RS00350 -ECS102511_RS00345 gnl|Prokka|PADJNBJD_00068 -ECS102511_RS00345 NILJEPDF_00068 -ECS102511_RS00345 LJHENM_00345 -ECS102511_RS00345 A5291_RS00345 -ECS102511_RS00345 BKC01_RS00350 -ECS102511_RS00345 SOTONK1_RS00345 -ECS102511_RS00345 L3404_RS00345 -ECS102511_RS00345 JIEJKO_00345 -ECS102511_RS00345 AKW53_RS01835 -ECS102511_RS00345 QSDFRQ_00068 -ECS102511_RS00345 IaCS19096_RS00345 -ECS102511_RS00345 BKC03_RS00350 -ECS102511_RS00345 C15_RS0100350 -ECS102511_RS00345 DU10_RS00350 -ECS102511_RS00345 7618808 -ECS102511_RS00345 CTRC943_RS00345 -ECS102511_RS00345 CTJTET1_RS00345 -ECS102511_RS00345 O169_RS00345 -ECS102511_RS00345 KW36_RS00345 -ECS102511_RS00345 DU13_RS00355 -ECS102511_RS00345 CBP48_RS01740 -ECS102511_RS00345 ECS88FINAL_RS0100360 -ECS102511_RS00345 KW39_RS00345 -ECS102511_RS00345 AQ193_RS03650 -ECS102511_RS00345 AQ244_RS01645 -ECS102511_RS00345 BKB95_RS00350 -ECS102511_RS00345 SW2_RS00345 -ECS102511_RS00510 ECS102511_RS00510 -ECS102511_RS00510 CTB_RS00510 -ECS102511_RS00510 CTL2C_RS01875 -ECS102511_RS00510 CBP42_RS01910 -ECS102511_RS00510 BKB96_RS00520 -ECS102511_RS00510 L1224_RS00510 -ECS102511_RS00510 BKB99_RS00520 -ECS102511_RS00510 BKB92_RS00520 -ECS102511_RS00510 CTO_RS00510 -ECS102511_RS00510 L1440_RS00510 -ECS102511_RS00510 SOTONIA3_RS00510 -ECS102511_RS00510 E150_RS00510 -ECS102511_RS00510 CBP44_RS01915 -ECS102511_RS00510 120586 -ECS102511_RS00510 L2BUCH2_RS00510 -ECS102511_RS00510 BKB93_RS00520 -ECS102511_RS00510 FCS84708_RS00510 -ECS102511_RS00510 AOT15_RS00445 -ECS102511_RS00510 AP288_RS03580 -ECS102511_RS00510 BBV13_RS00515 -ECS102511_RS00510 AQ199_RS01205 -ECS102511_RS00510 L2BLST_RS00510 -ECS102511_RS00510 BW688_RS01910 -ECS102511_RS00510 G9768_RS00510 -ECS102511_RS00510 BBV16_RS00515 -ECS102511_RS00510 BKC02_RS00520 -ECS102511_RS00510 gnl|Prokka|PADJNBJD_00100 -ECS102511_RS00510 LJHENM_00500 -ECS102511_RS00510 NILJEPDF_00100 -ECS102511_RS00510 BKC01_RS00520 -ECS102511_RS00510 A5291_RS00510 -ECS102511_RS00510 JIEJKO_00505 -ECS102511_RS00510 SOTONK1_RS00510 -ECS102511_RS00510 L3404_RS00510 -ECS102511_RS00510 QSDFRQ_00100 -ECS102511_RS00510 IaCS19096_RS00510 -ECS102511_RS00510 BKC03_RS00520 -ECS102511_RS00510 DU10_RS00520 -ECS102511_RS00510 C15_RS0100520 -ECS102511_RS00510 7618829 -ECS102511_RS00510 CTRC943_RS00510 -ECS102511_RS00510 CTJTET1_RS00510 -ECS102511_RS00510 O169_RS00510 -ECS102511_RS00510 DU13_RS00525 -ECS102511_RS00510 ECS88FINAL_RS0100525 -ECS102511_RS00510 KW39_RS00510 -ECS102511_RS00510 KW36_RS00510 -ECS102511_RS00510 CBP48_RS01910 -ECS102511_RS00510 AQ193_RS03485 -ECS102511_RS00510 SW2_RS00510 -ECS102511_RS00510 BKB95_RS00520 -ECS102511_RS00680 ECS102511_RS00680 -ECS102511_RS00680 CTL2C_RS02045 -ECS102511_RS00680 CTB_RS00685 -ECS102511_RS00680 L1224_RS00680 -ECS102511_RS00680 AQ244_RS02855 -ECS102511_RS00680 BKB96_RS00690 -ECS102511_RS00680 CBP42_RS02080 -ECS102511_RS00680 BKB99_RS00690 -ECS102511_RS00680 L1440_RS00680 -ECS102511_RS00680 BKB92_RS00690 -ECS102511_RS00680 CTO_RS00685 -ECS102511_RS00680 SOTONIA3_RS00680 -ECS102511_RS00680 E150_RS00680 -ECS102511_RS00680 L2BUCH2_RS00680 -ECS102511_RS00680 AOT15_RS00275 -ECS102511_RS00680 CBP44_RS02085 -ECS102511_RS00680 FCS84708_RS00680 -ECS102511_RS00680 AP288_RS03750 -ECS102511_RS00680 BKB93_RS00690 -ECS102511_RS00680 120566 -ECS102511_RS00680 AQ199_RS01375 -ECS102511_RS00680 BBV13_RS00690 -ECS102511_RS00680 G9768_RS00680 -ECS102511_RS00680 L2BLST_RS00680 -ECS102511_RS00680 BW688_RS02080 -ECS102511_RS00680 BBV16_RS00690 -ECS102511_RS00680 BKC02_RS00690 -ECS102511_RS00680 gnl|Prokka|PADJNBJD_00134 -ECS102511_RS00680 LJHENM_00670 -ECS102511_RS00680 AKW53_RS02175 -ECS102511_RS00680 BKC01_RS00690 -ECS102511_RS00680 NILJEPDF_00134 -ECS102511_RS00680 A5291_RS00685 -ECS102511_RS00680 L3404_RS00680 -ECS102511_RS00680 SOTONK1_RS00680 -ECS102511_RS00680 JIEJKO_00675 -ECS102511_RS00680 QSDFRQ_00134 -ECS102511_RS00680 IaCS19096_RS00680 -ECS102511_RS00680 BKC03_RS00690 -ECS102511_RS00680 C15_RS0100705 -ECS102511_RS00680 CTRC943_RS00680 -ECS102511_RS00680 CTJTET1_RS00680 -ECS102511_RS00680 KW39_RS00680 -ECS102511_RS00680 DU10_RS00690 -ECS102511_RS00680 ECS88FINAL_RS0100705 -ECS102511_RS00680 O169_RS00680 -ECS102511_RS00680 DU13_RS00695 -ECS102511_RS00680 7618842 -ECS102511_RS00680 KW36_RS00680 -ECS102511_RS00680 AQ193_RS03315 -ECS102511_RS00680 CBP48_RS02080 -ECS102511_RS00680 SW2_RS00680 -ECS102511_RS00680 BKB95_RS00690 -ECS102511_RS01540 ECS102511_RS01540 -ECS102511_RS01540 KW36_RS01545 -ECS102511_RS01540 AOT15_RS02545 -ECS102511_RS01540 BKB96_RS01550 -ECS102511_RS01540 CTL2C_RS02895 -ECS102511_RS01540 BKB99_RS01550 -ECS102511_RS01540 L1224_RS01525 -ECS102511_RS01540 L1440_RS01525 -ECS102511_RS01540 AQ244_RS03730 -ECS102511_RS01540 CBP42_RS02940 -ECS102511_RS01540 SOTONIA3_RS01560 -ECS102511_RS01540 BKB92_RS01555 -ECS102511_RS01540 CTB_RS01575 -ECS102511_RS01540 E150_RS01545 -ECS102511_RS01540 L2BUCH2_RS01530 -ECS102511_RS01540 CTO_RS01570 -ECS102511_RS01540 FCS84708_RS01540 -ECS102511_RS01540 AP288_RS04610 -ECS102511_RS01540 BKB93_RS01555 -ECS102511_RS01540 CBP44_RS02945 -ECS102511_RS01540 AQ199_RS02235 -ECS102511_RS01540 L2BLST_RS01530 -ECS102511_RS01540 BBV13_RS01580 -ECS102511_RS01540 BW688_RS02950 -ECS102511_RS01540 G9768_RS01550 -ECS102511_RS01540 BKC02_RS01550 -ECS102511_RS01540 AKW53_RS03040 -ECS102511_RS01540 BBV16_RS01580 -ECS102511_RS01540 L3404_RS01525 -ECS102511_RS01540 BKC01_RS01555 -ECS102511_RS01540 gnl|Prokka|PADJNBJD_00304 -ECS102511_RS01540 NILJEPDF_00304 -ECS102511_RS01540 LJHENM_01530 -ECS102511_RS01540 BKC03_RS01550 -ECS102511_RS01540 DU10_RS01565 -ECS102511_RS01540 CTRC943_RS01530 -ECS102511_RS01540 CTJTET1_RS01560 -ECS102511_RS01540 KW39_RS01550 -ECS102511_RS01540 JIEJKO_01530 -ECS102511_RS01540 C15_RS0101595 -ECS102511_RS01540 SOTONK1_RS01550 -ECS102511_RS01540 ECS88FINAL_RS0101575 -ECS102511_RS01540 120428 -ECS102511_RS01540 QSDFRQ_00304 -ECS102511_RS01540 IaCS19096_RS01545 -ECS102511_RS01540 A5291_RS01575 -ECS102511_RS01540 O169_RS01555 -ECS102511_RS01540 DU13_RS01560 -ECS102511_RS01540 AQ193_RS02445 -ECS102511_RS01540 SW2_RS01540 -ECS102511_RS01540 BKB95_RS01565 -ECS102511_RS01540 CBP48_RS02940 -ECS102511_RS01540 7618925 -FCS84708_RS00110 FCS84708_RS00110 -FCS84708_RS00110 AP288_RS03180 -FCS84708_RS00110 BBV13_RS00115 -FCS84708_RS00110 G9768_RS00110 -FCS84708_RS00110 AQ199_RS00805 -FCS84708_RS00110 BW688_RS01505 -FCS84708_RS00110 L2BLST_RS00110 -FCS84708_RS00110 BKC02_RS00115 -FCS84708_RS00110 BBV16_RS00115 -FCS84708_RS00110 BKC01_RS00115 -FCS84708_RS00110 gnl|Prokka|PADJNBJD_00023 -FCS84708_RS00110 LJHENM_00115 -FCS84708_RS00110 A5291_RS00110 -FCS84708_RS00110 SOTONK1_RS00110 -FCS84708_RS00110 AQ193_RS03895 -FCS84708_RS00110 JIEJKO_00110 -FCS84708_RS00110 7618788 -FCS84708_RS00110 NILJEPDF_00023 -FCS84708_RS00110 L3404_RS00110 -FCS84708_RS00110 IaCS19096_RS00110 -FCS84708_RS00110 AQ244_RS01880 -FCS84708_RS00110 BKC03_RS00115 -FCS84708_RS00110 C15_RS0100110 -FCS84708_RS00110 AKW53_RS01595 -FCS84708_RS00110 QSDFRQ_00023 -FCS84708_RS00110 CTJTET1_RS00110 -FCS84708_RS00110 DU10_RS00115 -FCS84708_RS00110 CTRC943_RS00110 -FCS84708_RS00110 O169_RS00110 -FCS84708_RS00110 CBP48_RS01505 -FCS84708_RS00110 ECS88FINAL_RS0100115 -FCS84708_RS00110 DU13_RS00115 -FCS84708_RS00110 KW39_RS00110 -FCS84708_RS00110 BKB95_RS00115 -FCS84708_RS00110 SW2_RS00110 -FCS84708_RS00110 ECS102511_RS00110 -FCS84708_RS00110 CTB_RS00110 -FCS84708_RS00110 CTL2C_RS01475 -FCS84708_RS00110 CBP42_RS01505 -FCS84708_RS00110 L1224_RS00110 -FCS84708_RS00110 BKB96_RS00115 -FCS84708_RS00110 BKB99_RS00115 -FCS84708_RS00110 CTO_RS00110 -FCS84708_RS00110 SOTONIA3_RS00110 -FCS84708_RS00110 L1440_RS00110 -FCS84708_RS00110 AOT15_RS00845 -FCS84708_RS00110 BKB92_RS00115 -FCS84708_RS00110 120650 -FCS84708_RS00110 CBP44_RS01510 -FCS84708_RS00110 E150_RS00110 -FCS84708_RS00110 L2BUCH2_RS00110 -FCS84708_RS00110 BKB93_RS00115 -FCS84708_RS00280 FCS84708_RS00280 -FCS84708_RS00280 AP288_RS03350 -FCS84708_RS00280 BBV13_RS00285 -FCS84708_RS00280 AQ199_RS00975 -FCS84708_RS00280 BW688_RS01675 -FCS84708_RS00280 G9768_RS00280 -FCS84708_RS00280 L2BLST_RS00280 -FCS84708_RS00280 BKC02_RS00285 -FCS84708_RS00280 BBV16_RS00285 -FCS84708_RS00280 gnl|Prokka|PADJNBJD_00055 -FCS84708_RS00280 NILJEPDF_00055 -FCS84708_RS00280 LJHENM_00280 -FCS84708_RS00280 JIEJKO_00275 -FCS84708_RS00280 BKC01_RS00285 -FCS84708_RS00280 A5291_RS00280 -FCS84708_RS00280 SOTONK1_RS00280 -FCS84708_RS00280 L3404_RS00280 -FCS84708_RS00280 AQ193_RS03715 -FCS84708_RS00280 AQ244_RS01710 -FCS84708_RS00280 AKW53_RS01770 -FCS84708_RS00280 QSDFRQ_00055 -FCS84708_RS00280 IaCS19096_RS00280 -FCS84708_RS00280 BKC03_RS00285 -FCS84708_RS00280 7618801 -FCS84708_RS00280 C15_RS0100280 -FCS84708_RS00280 DU10_RS00285 -FCS84708_RS00280 CTRC943_RS00280 -FCS84708_RS00280 CTJTET1_RS00280 -FCS84708_RS00280 O169_RS00280 -FCS84708_RS00280 KW36_RS00280 -FCS84708_RS00280 DU13_RS00290 -FCS84708_RS00280 CBP48_RS01675 -FCS84708_RS00280 ECS88FINAL_RS0100285 -FCS84708_RS00280 KW39_RS00280 -FCS84708_RS00280 BKB95_RS00285 -FCS84708_RS00280 SW2_RS00280 -FCS84708_RS00280 ECS102511_RS00280 -FCS84708_RS00280 CTL2C_RS01645 -FCS84708_RS00280 CBP42_RS01675 -FCS84708_RS00280 CTB_RS00280 -FCS84708_RS00280 BKB96_RS00285 -FCS84708_RS00280 L1224_RS00280 -FCS84708_RS00280 BKB99_RS00285 -FCS84708_RS00280 L1440_RS00280 -FCS84708_RS00280 AOT15_RS00675 -FCS84708_RS00280 BKB92_RS00285 -FCS84708_RS00280 CTO_RS00280 -FCS84708_RS00280 SOTONIA3_RS00280 -FCS84708_RS00280 120630 -FCS84708_RS00280 CBP44_RS01680 -FCS84708_RS00280 E150_RS00280 -FCS84708_RS00280 L2BUCH2_RS00280 -FCS84708_RS00280 BKB93_RS00285 -FCS84708_RS00450 FCS84708_RS00450 -FCS84708_RS00450 AP288_RS03520 -FCS84708_RS00450 AQ199_RS01145 -FCS84708_RS00450 BBV13_RS00455 -FCS84708_RS00450 L2BLST_RS00450 -FCS84708_RS00450 BW688_RS01850 -FCS84708_RS00450 G9768_RS00450 -FCS84708_RS00450 BKC02_RS00460 -FCS84708_RS00450 gnl|Prokka|PADJNBJD_00088 -FCS84708_RS00450 LJHENM_00440 -FCS84708_RS00450 BBV16_RS00455 -FCS84708_RS00450 NILJEPDF_00088 -FCS84708_RS00450 AQ244_RS01540 -FCS84708_RS00450 A5291_RS00450 -FCS84708_RS00450 AQ193_RS03545 -FCS84708_RS00450 JIEJKO_00445 -FCS84708_RS00450 BKC01_RS00460 -FCS84708_RS00450 SOTONK1_RS00450 -FCS84708_RS00450 L3404_RS00450 -FCS84708_RS00450 AKW53_RS01940 -FCS84708_RS00450 QSDFRQ_00088 -FCS84708_RS00450 IaCS19096_RS00450 -FCS84708_RS00450 BKC03_RS00460 -FCS84708_RS00450 DU10_RS00460 -FCS84708_RS00450 C15_RS0100455 -FCS84708_RS00450 7618818 -FCS84708_RS00450 CTRC943_RS00450 -FCS84708_RS00450 CTJTET1_RS00450 -FCS84708_RS00450 O169_RS00450 -FCS84708_RS00450 DU13_RS00465 -FCS84708_RS00450 ECS88FINAL_RS0100460 -FCS84708_RS00450 KW36_RS00450 -FCS84708_RS00450 CBP48_RS01850 -FCS84708_RS00450 KW39_RS00450 -FCS84708_RS00450 SW2_RS00450 -FCS84708_RS00450 BKB95_RS00460 -FCS84708_RS00450 ECS102511_RS00450 -FCS84708_RS00450 CTB_RS00450 -FCS84708_RS00450 CTL2C_RS01815 -FCS84708_RS00450 CBP42_RS01850 -FCS84708_RS00450 BKB96_RS00460 -FCS84708_RS00450 L1224_RS00450 -FCS84708_RS00450 AOT15_RS00505 -FCS84708_RS00450 BKB99_RS00460 -FCS84708_RS00450 BKB92_RS00460 -FCS84708_RS00450 CTO_RS00450 -FCS84708_RS00450 L1440_RS00450 -FCS84708_RS00450 SOTONIA3_RS00450 -FCS84708_RS00450 E150_RS00450 -FCS84708_RS00450 CBP44_RS01855 -FCS84708_RS00450 120603 -FCS84708_RS00450 L2BUCH2_RS00450 -FCS84708_RS00450 BKB93_RS00460 -FCS84708_RS00790 FCS84708_RS00790 -FCS84708_RS00790 AP288_RS03860 -FCS84708_RS00790 BKB93_RS00800 -FCS84708_RS00790 119337 -FCS84708_RS00790 AQ199_RS01485 -FCS84708_RS00790 BBV13_RS00800 -FCS84708_RS00790 G9768_RS00790 -FCS84708_RS00790 L2BLST_RS00790 -FCS84708_RS00790 BW688_RS02190 -FCS84708_RS00790 BBV16_RS00800 -FCS84708_RS00790 BKC02_RS00800 -FCS84708_RS00790 gnl|Prokka|PADJNBJD_00156 -FCS84708_RS00790 LJHENM_00780 -FCS84708_RS00790 AKW53_RS02285 -FCS84708_RS00790 AQ193_RS03205 -FCS84708_RS00790 BKC01_RS00800 -FCS84708_RS00790 NILJEPDF_00156 -FCS84708_RS00790 A5291_RS00795 -FCS84708_RS00790 L3404_RS00790 -FCS84708_RS00790 SOTONK1_RS00790 -FCS84708_RS00790 JIEJKO_00785 -FCS84708_RS00790 QSDFRQ_00156 -FCS84708_RS00790 CTJTET1_RS00790 -FCS84708_RS00790 IaCS19096_RS00790 -FCS84708_RS00790 BKC03_RS00800 -FCS84708_RS00790 C15_RS0100815 -FCS84708_RS00790 CTRC943_RS00790 -FCS84708_RS00790 ECS88FINAL_RS0100815 -FCS84708_RS00790 KW39_RS00790 -FCS84708_RS00790 DU10_RS00800 -FCS84708_RS00790 O169_RS00790 -FCS84708_RS00790 DU13_RS00805 -FCS84708_RS00790 KW36_RS00790 -FCS84708_RS00790 CBP48_RS02190 -FCS84708_RS00790 SW2_RS00790 -FCS84708_RS00790 BKB95_RS00800 -FCS84708_RS00790 7618440 -FCS84708_RS00790 ECS102511_RS00790 -FCS84708_RS00790 CTL2C_RS02155 -FCS84708_RS00790 CTB_RS00795 -FCS84708_RS00790 AOT15_RS00165 -FCS84708_RS00790 L1224_RS00790 -FCS84708_RS00790 AQ244_RS02965 -FCS84708_RS00790 BKB96_RS00800 -FCS84708_RS00790 CBP42_RS02190 -FCS84708_RS00790 L1440_RS00790 -FCS84708_RS00790 BKB99_RS00800 -FCS84708_RS00790 CTO_RS00795 -FCS84708_RS00790 BKB92_RS00800 -FCS84708_RS00790 SOTONIA3_RS00790 -FCS84708_RS00790 E150_RS00790 -FCS84708_RS00790 L2BUCH2_RS00790 -FCS84708_RS00790 CBP44_RS02195 -FCS84708_RS01810 FCS84708_RS01810 -FCS84708_RS01810 BW688_RS03220 -FCS84708_RS01810 BKB93_RS01830 -FCS84708_RS01810 CBP44_RS03225 -FCS84708_RS01810 BBV13_RS01845 -FCS84708_RS01810 AQ199_RS02510 -FCS84708_RS01810 G9768_RS01815 -FCS84708_RS01810 L3404_RS01790 -FCS84708_RS01810 BBV16_RS01845 -FCS84708_RS01810 BKC02_RS01820 -FCS84708_RS01810 BKC01_RS01820 -FCS84708_RS01810 AKW53_RS03315 -FCS84708_RS01810 AQ193_RS02170 -FCS84708_RS01810 gnl|Prokka|PADJNBJD_00357 -FCS84708_RS01810 NILJEPDF_00357 -FCS84708_RS01810 CTRC943_RS01795 -FCS84708_RS01810 LJHENM_01800 -FCS84708_RS01810 JIEJKO_01795 -FCS84708_RS01810 BKC03_RS01820 -FCS84708_RS01810 CTJTET1_RS01825 -FCS84708_RS01810 DU10_RS01840 -FCS84708_RS01810 QSDFRQ_00357 -FCS84708_RS01810 C15_RS0101855 -FCS84708_RS01810 SOTONK1_RS01815 -FCS84708_RS01810 A5291_RS01840 -FCS84708_RS01810 KW39_RS01825 -FCS84708_RS01810 IaCS19096_RS01810 -FCS84708_RS01810 120364 -FCS84708_RS01810 ECS88FINAL_RS0101845 -FCS84708_RS01810 DU13_RS01835 -FCS84708_RS01810 O169_RS01825 -FCS84708_RS01810 7618958 -FCS84708_RS01810 CTL2C_RS03160 -FCS84708_RS01810 BKB95_RS01835 -FCS84708_RS01810 CBP48_RS03220 -FCS84708_RS01810 L1224_RS01790 -FCS84708_RS01810 KW36_RS01810 -FCS84708_RS01810 AOT15_RS02810 -FCS84708_RS01810 BKB96_RS01820 -FCS84708_RS01810 SW2_RS01815 -FCS84708_RS01810 BKB99_RS01820 -FCS84708_RS01810 L1440_RS01790 -FCS84708_RS01810 ECS102511_RS01815 -FCS84708_RS01810 CBP42_RS03230 -FCS84708_RS01810 CTB_RS01840 -FCS84708_RS01810 SOTONIA3_RS01825 -FCS84708_RS01810 L2BUCH2_RS01790 -FCS84708_RS01810 AP288_RS01265 -FCS84708_RS01810 BKB92_RS01830 -FCS84708_RS01810 CTO_RS01840 -FCS84708_RS01810 E150_RS01820 -FCS84708_RS01810 L2BLST_RS01790 -FCS84708_RS01810 AQ244_RS01295 -FCS84708_RS02135 FCS84708_RS02135 -FCS84708_RS02135 BKB93_RS02160 -FCS84708_RS02135 CBP44_RS03560 -FCS84708_RS02135 AQ199_RS02835 -FCS84708_RS02135 BBV16_RS02175 -FCS84708_RS02135 G9768_RS02140 -FCS84708_RS02135 L3404_RS02115 -FCS84708_RS02135 BKC02_RS02150 -FCS84708_RS02135 BKC01_RS02150 -FCS84708_RS02135 AKW53_RS03640 -FCS84708_RS02135 AQ193_RS01845 -FCS84708_RS02135 gnl|Prokka|PADJNBJD_00422 -FCS84708_RS02135 NILJEPDF_00422 -FCS84708_RS02135 CTRC943_RS02120 -FCS84708_RS02135 LJHENM_02130 -FCS84708_RS02135 JIEJKO_02125 -FCS84708_RS02135 BKC03_RS02150 -FCS84708_RS02135 CTJTET1_RS02150 -FCS84708_RS02135 QSDFRQ_00422 -FCS84708_RS02135 C15_RS0102185 -FCS84708_RS02135 A5291_RS02165 -FCS84708_RS02135 SOTONK1_RS02140 -FCS84708_RS02135 DU10_RS02175 -FCS84708_RS02135 KW39_RS02150 -FCS84708_RS02135 IaCS19096_RS02135 -FCS84708_RS02135 ECS88FINAL_RS0102180 -FCS84708_RS02135 O169_RS02150 -FCS84708_RS02135 DU13_RS02170 -FCS84708_RS02135 7618990 -FCS84708_RS02135 CTL2C_RS03485 -FCS84708_RS02135 CBP48_RS03555 -FCS84708_RS02135 120312 -FCS84708_RS02135 L1224_RS02115 -FCS84708_RS02135 KW36_RS02135 -FCS84708_RS02135 AOT15_RS03135 -FCS84708_RS02135 BKB95_RS02170 -FCS84708_RS02135 BKB96_RS02150 -FCS84708_RS02135 SW2_RS02140 -FCS84708_RS02135 BKB99_RS02150 -FCS84708_RS02135 L1440_RS02115 -FCS84708_RS02135 ECS102511_RS02140 -FCS84708_RS02135 CTB_RS02165 -FCS84708_RS02135 CBP42_RS03565 -FCS84708_RS02135 SOTONIA3_RS02150 -FCS84708_RS02135 L2BUCH2_RS02115 -FCS84708_RS02135 AP288_RS00940 -FCS84708_RS02135 BKB92_RS02160 -FCS84708_RS02135 CTO_RS02165 -FCS84708_RS02135 E150_RS02145 -FCS84708_RS02135 L2BLST_RS02115 -FCS84708_RS02135 AQ244_RS00970 -FCS84708_RS02135 BBV13_RS02175 -FCS84708_RS02135 BW688_RS03550 -FCS84708_RS02980 FCS84708_RS02980 -FCS84708_RS02980 BBV13_RS03020 -FCS84708_RS02980 AQ199_RS03680 -FCS84708_RS02980 BBV16_RS03030 -FCS84708_RS02980 BKB93_RS03020 -FCS84708_RS02980 G9768_RS02985 -FCS84708_RS02980 L3404_RS02950 -FCS84708_RS02980 gnl|Prokka|PADJNBJD_00588 -FCS84708_RS02980 BKC02_RS03015 -FCS84708_RS02980 NILJEPDF_00588 -FCS84708_RS02980 LJHENM_02955 -FCS84708_RS02980 AOT15_RS03785 -FCS84708_RS02980 AQ193_RS01005 -FCS84708_RS02980 CTRC943_RS02955 -FCS84708_RS02980 BKC01_RS03015 -FCS84708_RS02980 QSDFRQ_00588 -FCS84708_RS02980 JIEJKO_02965 -FCS84708_RS02980 SOTONK1_RS02985 -FCS84708_RS02980 CTJTET1_RS02995 -FCS84708_RS02980 BKC03_RS03015 -FCS84708_RS02980 KW39_RS02995 -FCS84708_RS02980 C15_RS0103050 -FCS84708_RS02980 ECS88FINAL_RS0103045 -FCS84708_RS02980 IaCS19096_RS02980 -FCS84708_RS02980 DU10_RS03030 -FCS84708_RS02980 A5291_RS03015 -FCS84708_RS02980 O169_RS02990 -FCS84708_RS02980 CTL2C_RS04325 -FCS84708_RS02980 DU13_RS03025 -FCS84708_RS02980 CBP48_RS04415 -FCS84708_RS02980 L1224_RS02955 -FCS84708_RS02980 KW36_RS02980 -FCS84708_RS02980 BKB95_RS03025 -FCS84708_RS02980 7618619 -FCS84708_RS02980 AKW53_RS04210 -FCS84708_RS02980 BKB96_RS03020 -FCS84708_RS02980 BKB99_RS03015 -FCS84708_RS02980 SW2_RS02985 -FCS84708_RS02980 L1440_RS02955 -FCS84708_RS02980 ECS102511_RS02980 -FCS84708_RS02980 CBP42_RS04420 -FCS84708_RS02980 L2BUCH2_RS02955 -FCS84708_RS02980 AP288_RS00100 -FCS84708_RS02980 119621 -FCS84708_RS02980 CTB_RS03015 -FCS84708_RS02980 SOTONIA3_RS03000 -FCS84708_RS02980 BKB92_RS03015 -FCS84708_RS02980 BW688_RS04410 -FCS84708_RS02980 E150_RS02985 -FCS84708_RS02980 CTO_RS03015 -FCS84708_RS02980 L2BLST_RS02955 -FCS84708_RS02980 AQ244_RS00125 -FCS84708_RS02980 CBP44_RS04415 -FCS84708_RS03145 FCS84708_RS03145 -FCS84708_RS03145 BBV13_RS03180 -FCS84708_RS03145 AQ244_RS04770 -FCS84708_RS03145 AQ199_RS03845 -FCS84708_RS03145 BBV16_RS03190 -FCS84708_RS03145 BKB93_RS03180 -FCS84708_RS03145 G9768_RS03145 -FCS84708_RS03145 L3404_RS03115 -FCS84708_RS03145 gnl|Prokka|PADJNBJD_00619 -FCS84708_RS03145 NILJEPDF_00619 -FCS84708_RS03145 LJHENM_03110 -FCS84708_RS03145 BKC02_RS03175 -FCS84708_RS03145 AOT15_RS03945 -FCS84708_RS03145 AP288_RS01515 -FCS84708_RS03145 AQ193_RS00840 -FCS84708_RS03145 CTRC943_RS03120 -FCS84708_RS03145 BKC01_RS03175 -FCS84708_RS03145 QSDFRQ_00619 -FCS84708_RS03145 JIEJKO_03120 -FCS84708_RS03145 SOTONK1_RS03145 -FCS84708_RS03145 CTJTET1_RS03160 -FCS84708_RS03145 BKC03_RS03175 -FCS84708_RS03145 KW39_RS03160 -FCS84708_RS03145 C15_RS0103210 -FCS84708_RS03145 ECS88FINAL_RS0103210 -FCS84708_RS03145 IaCS19096_RS03140 -FCS84708_RS03145 DU10_RS03190 -FCS84708_RS03145 A5291_RS03180 -FCS84708_RS03145 O169_RS03155 -FCS84708_RS03145 CTL2C_RS04490 -FCS84708_RS03145 DU13_RS03185 -FCS84708_RS03145 CBP48_RS04575 -FCS84708_RS03145 L1224_RS03120 -FCS84708_RS03145 KW36_RS03145 -FCS84708_RS03145 BKB95_RS03185 -FCS84708_RS03145 AKW53_RS04370 -FCS84708_RS03145 BKB96_RS03180 -FCS84708_RS03145 BKB99_RS03175 -FCS84708_RS03145 7618638 -FCS84708_RS03145 SW2_RS03150 -FCS84708_RS03145 L1440_RS03120 -FCS84708_RS03145 ECS102511_RS03145 -FCS84708_RS03145 CBP42_RS04580 -FCS84708_RS03145 L2BUCH2_RS03120 -FCS84708_RS03145 CTB_RS03180 -FCS84708_RS03145 SOTONIA3_RS03160 -FCS84708_RS03145 BKB92_RS03175 -FCS84708_RS03145 BW688_RS04570 -FCS84708_RS03145 119650 -FCS84708_RS03145 E150_RS03150 -FCS84708_RS03145 CTO_RS03175 -FCS84708_RS03145 L2BLST_RS03120 -FCS84708_RS03145 CBP44_RS04575 -FCS84708_RS03485 FCS84708_RS03485 -FCS84708_RS03485 L2BLST_RS03470 -FCS84708_RS03485 AQ244_RS04425 -FCS84708_RS03485 7618214 -FCS84708_RS03485 BBV16_RS03535 -FCS84708_RS03485 BW688_RS00090 -FCS84708_RS03485 AQ199_RS04185 -FCS84708_RS03485 BKB93_RS03525 -FCS84708_RS03485 119698 -FCS84708_RS03485 G9768_RS03485 -FCS84708_RS03485 gnl|Prokka|PADJNBJD_00686 -FCS84708_RS03485 L3404_RS03465 -FCS84708_RS03485 BKC02_RS03520 -FCS84708_RS03485 NILJEPDF_00687 -FCS84708_RS03485 LJHENM_03450 -FCS84708_RS03485 AOT15_RS04285 -FCS84708_RS03485 AP288_RS01855 -FCS84708_RS03485 AQ193_RS00500 -FCS84708_RS03485 JIEJKO_03455 -FCS84708_RS03485 BKC01_RS03520 -FCS84708_RS03485 QSDFRQ_00687 -FCS84708_RS03485 CTRC943_RS03470 -FCS84708_RS03485 BKC03_RS03520 -FCS84708_RS03485 CBP48_RS00090 -FCS84708_RS03485 CTJTET1_RS03505 -FCS84708_RS03485 KW39_RS03505 -FCS84708_RS03485 DU10_RS03535 -FCS84708_RS03485 SOTONK1_RS03485 -FCS84708_RS03485 ECS88FINAL_RS0103565 -FCS84708_RS03485 IaCS19096_RS03480 -FCS84708_RS03485 C15_RS0103560 -FCS84708_RS03485 A5291_RS03530 -FCS84708_RS03485 O169_RS03500 -FCS84708_RS03485 DU13_RS03535 -FCS84708_RS03485 KW36_RS03485 -FCS84708_RS03485 AKW53_RS00235 -FCS84708_RS03485 BKB95_RS03540 -FCS84708_RS03485 CBP42_RS00090 -FCS84708_RS03485 SW2_RS03495 -FCS84708_RS03485 CTL2C_RS00090 -FCS84708_RS03485 L1224_RS03470 -FCS84708_RS03485 ECS102511_RS03485 -FCS84708_RS03485 L1440_RS03470 -FCS84708_RS03485 BKB96_RS03530 -FCS84708_RS03485 BKB99_RS03525 -FCS84708_RS03485 CBP44_RS00090 -FCS84708_RS03485 L2BUCH2_RS03470 -FCS84708_RS03485 BKB92_RS03520 -FCS84708_RS03485 CTB_RS03525 -FCS84708_RS03485 SOTONIA3_RS03505 -FCS84708_RS03485 E150_RS03495 -FCS84708_RS03485 CTO_RS03520 -FCS84708_RS03485 BBV13_RS03525 -FCS84708_RS03665 FCS84708_RS03665 -FCS84708_RS03665 L2BLST_RS03650 -FCS84708_RS03665 BBV16_RS03720 -FCS84708_RS03665 AQ244_RS04240 -FCS84708_RS03665 BW688_RS00270 -FCS84708_RS03665 120062 -FCS84708_RS03665 AQ199_RS04365 -FCS84708_RS03665 BKB93_RS03705 -FCS84708_RS03665 7618679 -FCS84708_RS03665 G9768_RS03670 -FCS84708_RS03665 gnl|Prokka|PADJNBJD_00722 -FCS84708_RS03665 L3404_RS03645 -FCS84708_RS03665 BKC02_RS03700 -FCS84708_RS03665 NILJEPDF_00723 -FCS84708_RS03665 LJHENM_03635 -FCS84708_RS03665 AOT15_RS04470 -FCS84708_RS03665 AP288_RS02035 -FCS84708_RS03665 AQ193_RS00320 -FCS84708_RS03665 JIEJKO_03640 -FCS84708_RS03665 BKC01_RS03700 -FCS84708_RS03665 QSDFRQ_00723 -FCS84708_RS03665 CTRC943_RS03655 -FCS84708_RS03665 BKC03_RS03700 -FCS84708_RS03665 CBP48_RS00270 -FCS84708_RS03665 CTJTET1_RS03690 -FCS84708_RS03665 KW39_RS03685 -FCS84708_RS03665 DU10_RS03715 -FCS84708_RS03665 SOTONK1_RS03670 -FCS84708_RS03665 ECS88FINAL_RS0103765 -FCS84708_RS03665 IaCS19096_RS03665 -FCS84708_RS03665 C15_RS0103760 -FCS84708_RS03665 O169_RS03680 -FCS84708_RS03665 DU13_RS03715 -FCS84708_RS03665 KW36_RS03670 -FCS84708_RS03665 BKB95_RS03720 -FCS84708_RS03665 CBP42_RS00270 -FCS84708_RS03665 SW2_RS03675 -FCS84708_RS03665 CTL2C_RS00270 -FCS84708_RS03665 L1224_RS03650 -FCS84708_RS03665 ECS102511_RS03665 -FCS84708_RS03665 L1440_RS03650 -FCS84708_RS03665 BKB96_RS03710 -FCS84708_RS03665 BKB99_RS03705 -FCS84708_RS03665 CBP44_RS00270 -FCS84708_RS03665 L2BUCH2_RS03650 -FCS84708_RS03665 BKB92_RS03700 -FCS84708_RS03665 CTB_RS03710 -FCS84708_RS03665 SOTONIA3_RS03690 -FCS84708_RS03665 E150_RS03675 -FCS84708_RS03665 CTO_RS03705 -FCS84708_RS03665 BBV13_RS03710 -FCS84708_RS03835 FCS84708_RS03835 -FCS84708_RS03835 L2BLST_RS03820 -FCS84708_RS03835 BBV16_RS03890 -FCS84708_RS03835 7618257 -FCS84708_RS03835 119765 -FCS84708_RS03835 AQ244_RS04070 -FCS84708_RS03835 BW688_RS00445 -FCS84708_RS03835 AQ199_RS04535 -FCS84708_RS03835 BKB93_RS03880 -FCS84708_RS03835 G9768_RS03840 -FCS84708_RS03835 gnl|Prokka|PADJNBJD_00755 -FCS84708_RS03835 L3404_RS03815 -FCS84708_RS03835 NILJEPDF_00756 -FCS84708_RS03835 AQ193_RS00150 -FCS84708_RS03835 BKC02_RS03875 -FCS84708_RS03835 LJHENM_03805 -FCS84708_RS03835 AOT15_RS04640 -FCS84708_RS03835 AP288_RS02210 -FCS84708_RS03835 JIEJKO_03805 -FCS84708_RS03835 QSDFRQ_00756 -FCS84708_RS03835 BKC01_RS03880 -FCS84708_RS03835 CTRC943_RS03825 -FCS84708_RS03835 AKW53_RS00580 -FCS84708_RS03835 BKC03_RS03875 -FCS84708_RS03835 CBP48_RS00445 -FCS84708_RS03835 CTJTET1_RS03860 -FCS84708_RS03835 KW39_RS03855 -FCS84708_RS03835 DU10_RS03890 -FCS84708_RS03835 A5291_RS03885 -FCS84708_RS03835 SOTONK1_RS03840 -FCS84708_RS03835 IaCS19096_RS03835 -FCS84708_RS03835 DU13_RS03890 -FCS84708_RS03835 C15_RS0103945 -FCS84708_RS03835 ECS88FINAL_RS0103945 -FCS84708_RS03835 O169_RS03850 -FCS84708_RS03835 KW36_RS03840 -FCS84708_RS03835 BKB95_RS03895 -FCS84708_RS03835 CBP42_RS00445 -FCS84708_RS03835 CTL2C_RS00440 -FCS84708_RS03835 L1224_RS03820 -FCS84708_RS03835 SW2_RS03845 -FCS84708_RS03835 L1440_RS03815 -FCS84708_RS03835 ECS102511_RS03835 -FCS84708_RS03835 BKB96_RS03880 -FCS84708_RS03835 BKB99_RS03875 -FCS84708_RS03835 CBP44_RS00445 -FCS84708_RS03835 L2BUCH2_RS03820 -FCS84708_RS03835 BKB92_RS03875 -FCS84708_RS03835 CTB_RS03880 -FCS84708_RS03835 SOTONIA3_RS03860 -FCS84708_RS03835 E150_RS03845 -FCS84708_RS03835 CTO_RS03875 -FCS84708_RS03835 BBV13_RS03880 -FCS84708_RS04015 FCS84708_RS04015 -FCS84708_RS04015 120008 -FCS84708_RS04015 L2BLST_RS04000 -FCS84708_RS04015 AP288_RS04725 -FCS84708_RS04015 BBV16_RS04070 -FCS84708_RS04015 7618713 -FCS84708_RS04015 BW688_RS00625 -FCS84708_RS04015 gnl|Prokka|PADJNBJD_00790 -FCS84708_RS04015 AQ199_RS04715 -FCS84708_RS04015 BKB93_RS04060 -FCS84708_RS04015 G9768_RS04020 -FCS84708_RS04015 L3404_RS03995 -FCS84708_RS04015 AQ193_RS04710 -FCS84708_RS04015 NILJEPDF_00791 -FCS84708_RS04015 LJHENM_03980 -FCS84708_RS04015 BKC02_RS04055 -FCS84708_RS04015 JIEJKO_03980 -FCS84708_RS04015 QSDFRQ_00791 -FCS84708_RS04015 BKC01_RS04060 -FCS84708_RS04015 CTRC943_RS04005 -FCS84708_RS04015 CTJTET1_RS04195 -FCS84708_RS04015 AKW53_RS00755 -FCS84708_RS04015 BKC03_RS04055 -FCS84708_RS04015 CBP48_RS00625 -FCS84708_RS04015 CTJTET1_RS04040 -FCS84708_RS04015 DU10_RS04070 -FCS84708_RS04015 A5291_RS04065 -FCS84708_RS04015 SOTONK1_RS04020 -FCS84708_RS04015 ECS88FINAL_RS0104120 -FCS84708_RS04015 IaCS19096_RS04015 -FCS84708_RS04015 DU13_RS04070 -FCS84708_RS04015 C15_RS0104125 -FCS84708_RS04015 O169_RS04030 -FCS84708_RS04015 KW36_RS04020 -FCS84708_RS04015 AOT15_RS02325 -FCS84708_RS04015 BKB95_RS04075 -FCS84708_RS04015 CBP42_RS00625 -FCS84708_RS04015 CTL2C_RS00620 -FCS84708_RS04015 L1224_RS04000 -FCS84708_RS04015 SW2_RS04025 -FCS84708_RS04015 L1440_RS03995 -FCS84708_RS04015 ECS102511_RS04015 -FCS84708_RS04015 BKB96_RS04060 -FCS84708_RS04015 BKB99_RS04055 -FCS84708_RS04015 CBP44_RS00625 -FCS84708_RS04015 L2BUCH2_RS04000 -FCS84708_RS04015 CTB_RS04060 -FCS84708_RS04015 BKB92_RS04055 -FCS84708_RS04015 SOTONIA3_RS04040 -FCS84708_RS04015 E150_RS04025 -FCS84708_RS04015 CTO_RS04055 -FCS84708_RS04015 AQ244_RS03865 -FCS84708_RS04015 BBV13_RS04060 -FCS84708_RS04195 FCS84708_RS04195 -FCS84708_RS04195 AQ199_RS00125 -FCS84708_RS04195 BKB93_RS04240 -FCS84708_RS04195 AKW53_RS00915 -FCS84708_RS04195 AQ193_RS04575 -FCS84708_RS04195 KW39_RS04215 -FCS84708_RS04195 ECS88FINAL_RS0104285 -FCS84708_RS04195 DU10_RS04250 -FCS84708_RS04195 DU13_RS04250 -FCS84708_RS04195 O169_RS04210 -FCS84708_RS04195 SW2_RS04205 -FCS84708_RS04195 ECS102511_RS04195 -FCS84708_RS04195 BKB92_RS04235 -FCS84708_RS04195 AP288_RS02500 -FCS84708_RS04195 E150_RS04205 -FCS84708_RS04355 FCS84708_RS04355 -FCS84708_RS04355 AQ199_RS00290 -FCS84708_RS04355 119845 -FCS84708_RS04355 NILJEPDF_00855 -FCS84708_RS04355 LJHENM_04300 -FCS84708_RS04355 L3404_RS04330 -FCS84708_RS04355 G9768_RS04360 -FCS84708_RS04355 JIEJKO_04300 -FCS84708_RS04355 QSDFRQ_00855 -FCS84708_RS04355 BKB93_RS04405 -FCS84708_RS04355 BKC02_RS04400 -FCS84708_RS04355 CTRC943_RS04340 -FCS84708_RS04355 BKC01_RS04405 -FCS84708_RS04355 AKW53_RS01080 -FCS84708_RS04355 AOT15_RS01940 -FCS84708_RS04355 CTJTET1_RS04530 -FCS84708_RS04355 CBP48_RS00970 -FCS84708_RS04355 AQ193_RS04410 -FCS84708_RS04355 BKC03_RS04400 -FCS84708_RS04355 A5291_RS04395 -FCS84708_RS04355 KW39_RS04375 -FCS84708_RS04355 SOTONK1_RS04360 -FCS84708_RS04355 IaCS19096_RS04355 -FCS84708_RS04355 C15_RS0104470 -FCS84708_RS04355 ECS88FINAL_RS0104450 -FCS84708_RS04355 AQ244_RS02390 -FCS84708_RS04355 DU10_RS04415 -FCS84708_RS04355 KW36_RS04360 -FCS84708_RS04355 DU13_RS04415 -FCS84708_RS04355 O169_RS04375 -FCS84708_RS04355 CBP42_RS00970 -FCS84708_RS04355 CTL2C_RS00955 -FCS84708_RS04355 L1224_RS04335 -FCS84708_RS04355 BKB95_RS04420 -FCS84708_RS04355 L1440_RS04330 -FCS84708_RS04355 BKB96_RS04405 -FCS84708_RS04355 BKB99_RS04400 -FCS84708_RS04355 SW2_RS04365 -FCS84708_RS04355 ECS102511_RS04360 -FCS84708_RS04355 CBP44_RS00970 -FCS84708_RS04355 L2BUCH2_RS04335 -FCS84708_RS04355 CTB_RS04390 -FCS84708_RS04355 SOTONIA3_RS04375 -FCS84708_RS04355 CTO_RS04385 -FCS84708_RS04355 BKB92_RS04400 -FCS84708_RS04355 L2BLST_RS04335 -FCS84708_RS04355 BBV13_RS04400 -FCS84708_RS04355 AP288_RS02665 -FCS84708_RS04355 BBV16_RS04405 -FCS84708_RS04355 E150_RS04370 -FCS84708_RS04355 gnl|Prokka|PADJNBJD_00854 -FCS84708_RS04355 BW688_RS00970 -FCS84708_RS04355 7618309 -FCS84708_RS04520 FCS84708_RS04520 -FCS84708_RS04520 AQ199_RS00455 -FCS84708_RS04520 NILJEPDF_00888 -FCS84708_RS04520 BW688_RS01150 -FCS84708_RS04520 119947 -FCS84708_RS04520 JIEJKO_04465 -FCS84708_RS04520 7618752 -FCS84708_RS04520 QSDFRQ_00888 -FCS84708_RS04520 G9768_RS04520 -FCS84708_RS04520 L3404_RS04495 -FCS84708_RS04520 BKB93_RS04585 -FCS84708_RS04520 BKC02_RS04575 -FCS84708_RS04520 AKW53_RS01245 -FCS84708_RS04520 BKC01_RS04580 -FCS84708_RS04520 CTRC943_RS04505 -FCS84708_RS04520 AOT15_RS02100 -FCS84708_RS04520 CTJTET1_RS04690 -FCS84708_RS04520 AQ193_RS04245 -FCS84708_RS04520 KW39_RS04540 -FCS84708_RS04520 BKC03_RS04575 -FCS84708_RS04520 CBP48_RS01150 -FCS84708_RS04520 A5291_RS04555 -FCS84708_RS04520 SOTONK1_RS04520 -FCS84708_RS04520 ECS88FINAL_RS0104630 -FCS84708_RS04520 IaCS19096_RS04515 -FCS84708_RS04520 AQ244_RS02230 -FCS84708_RS04520 C15_RS0104650 -FCS84708_RS04520 DU10_RS04595 -FCS84708_RS04520 O169_RS04540 -FCS84708_RS04520 KW36_RS04520 -FCS84708_RS04520 DU13_RS04595 -FCS84708_RS04520 BKB95_RS04595 -FCS84708_RS04520 CBP42_RS01150 -FCS84708_RS04520 CTL2C_RS01120 -FCS84708_RS04520 L1224_RS04500 -FCS84708_RS04520 BKB96_RS04580 -FCS84708_RS04520 L1440_RS04495 -FCS84708_RS04520 BKB99_RS04575 -FCS84708_RS04520 SW2_RS04530 -FCS84708_RS04520 ECS102511_RS04525 -FCS84708_RS04520 CBP44_RS01150 -FCS84708_RS04520 CTB_RS04550 -FCS84708_RS04520 L2BUCH2_RS04500 -FCS84708_RS04520 SOTONIA3_RS04535 -FCS84708_RS04520 CTO_RS04545 -FCS84708_RS04520 BBV13_RS04565 -FCS84708_RS04520 BKB92_RS04580 -FCS84708_RS04520 AP288_RS02830 -FCS84708_RS04520 BBV16_RS04570 -FCS84708_RS04520 E150_RS04535 -FCS84708_RS04520 gnl|Prokka|PADJNBJD_00887 -FCS84708_RS04520 L2BLST_RS04500 -FCS84708_RS04690 FCS84708_RS04690 -FCS84708_RS04690 AQ199_RS00625 -FCS84708_RS04690 BW688_RS01320 -FCS84708_RS04690 119922 -FCS84708_RS04690 JIEJKO_04625 -FCS84708_RS04690 QSDFRQ_00920 -FCS84708_RS04690 LJHENM_04635 -FCS84708_RS04690 L3404_RS04665 -FCS84708_RS04690 7618770 -FCS84708_RS04690 G9768_RS04690 -FCS84708_RS04690 BKB93_RS04750 -FCS84708_RS04690 BKC02_RS04740 -FCS84708_RS04690 CTRC943_RS04675 -FCS84708_RS04690 AKW53_RS01415 -FCS84708_RS04690 BKC01_RS04745 -FCS84708_RS04690 AOT15_RS02270 -FCS84708_RS04690 CTJTET1_RS04860 -FCS84708_RS04690 AQ193_RS04075 -FCS84708_RS04690 CBP48_RS01320 -FCS84708_RS04690 KW39_RS04710 -FCS84708_RS04690 BKC03_RS04740 -FCS84708_RS04690 SOTONK1_RS04690 -FCS84708_RS04690 A5291_RS04720 -FCS84708_RS04690 ECS88FINAL_RS0104790 -FCS84708_RS04690 IaCS19096_RS04685 -FCS84708_RS04690 AQ244_RS02060 -FCS84708_RS04690 C15_RS0104810 -FCS84708_RS04690 DU10_RS04760 -FCS84708_RS04690 O169_RS04710 -FCS84708_RS04690 KW36_RS04690 -FCS84708_RS04690 DU13_RS04760 -FCS84708_RS04690 CTL2C_RS01290 -FCS84708_RS04690 CBP42_RS01320 -FCS84708_RS04690 L1224_RS04670 -FCS84708_RS04690 BKB95_RS04760 -FCS84708_RS04690 L1440_RS04665 -FCS84708_RS04690 BKB96_RS04745 -FCS84708_RS04690 BKB99_RS04740 -FCS84708_RS04690 SW2_RS04700 -FCS84708_RS04690 ECS102511_RS04695 -FCS84708_RS04690 CBP44_RS01320 -FCS84708_RS04690 L2BUCH2_RS04670 -FCS84708_RS04690 CTB_RS04715 -FCS84708_RS04690 SOTONIA3_RS04705 -FCS84708_RS04690 AP288_RS03000 -FCS84708_RS04690 BKB92_RS04745 -FCS84708_RS04690 gnl|Prokka|PADJNBJD_00919 -FCS84708_RS04690 CTO_RS04710 -FCS84708_RS04690 L2BLST_RS04670 -FCS84708_RS04690 BBV13_RS04730 -FCS84708_RS04690 E150_RS04705 -FCS84708_RS04690 BBV16_RS04735 -FCS84708_RS04690 NILJEPDF_00920 -IaCS19096_RS00060 IaCS19096_RS00060 -IaCS19096_RS00060 BKC03_RS00060 -IaCS19096_RS00060 C15_RS0100060 -IaCS19096_RS00060 QSDFRQ_00012 -IaCS19096_RS00060 CTJTET1_RS00060 -IaCS19096_RS00060 DU10_RS00060 -IaCS19096_RS00060 CTRC943_RS00060 -IaCS19096_RS00060 AOT15_RS00895 -IaCS19096_RS00060 O169_RS00060 -IaCS19096_RS00060 CBP48_RS01450 -IaCS19096_RS00060 ECS88FINAL_RS0100065 -IaCS19096_RS00060 DU13_RS00060 -IaCS19096_RS00060 KW39_RS00060 -IaCS19096_RS00060 BKB95_RS00060 -IaCS19096_RS00060 KW36_RS00060 -IaCS19096_RS00060 ECS102511_RS00060 -IaCS19096_RS00060 CTB_RS00060 -IaCS19096_RS00060 CTL2C_RS01425 -IaCS19096_RS00060 CBP42_RS01450 -IaCS19096_RS00060 L1224_RS00060 -IaCS19096_RS00060 BKB96_RS00060 -IaCS19096_RS00060 BKB99_RS00060 -IaCS19096_RS00060 CTO_RS00060 -IaCS19096_RS00060 SOTONIA3_RS00060 -IaCS19096_RS00060 L1440_RS00060 -IaCS19096_RS00060 BKB92_RS00060 -IaCS19096_RS00060 120658 -IaCS19096_RS00060 CBP44_RS01450 -IaCS19096_RS00060 L2BUCH2_RS00060 -IaCS19096_RS00060 AQ244_RS01930 -IaCS19096_RS00060 BKB93_RS00060 -IaCS19096_RS00060 FCS84708_RS00060 -IaCS19096_RS00060 BBV13_RS00060 -IaCS19096_RS00060 G9768_RS00060 -IaCS19096_RS00060 BW688_RS01450 -IaCS19096_RS00060 L2BLST_RS00060 -IaCS19096_RS00060 BKC02_RS00060 -IaCS19096_RS00060 BBV16_RS00060 -IaCS19096_RS00060 BKC01_RS00060 -IaCS19096_RS00060 7618783 -IaCS19096_RS00060 gnl|Prokka|PADJNBJD_00012 -IaCS19096_RS00060 LJHENM_00060 -IaCS19096_RS00060 A5291_RS00060 -IaCS19096_RS00060 SOTONK1_RS00060 -IaCS19096_RS00060 JIEJKO_00055 -IaCS19096_RS00060 NILJEPDF_00012 -IaCS19096_RS00060 L3404_RS00060 -IaCS19096_RS00225 IaCS19096_RS00225 -IaCS19096_RS00225 BKC03_RS00230 -IaCS19096_RS00225 C15_RS0100225 -IaCS19096_RS00225 DU10_RS00230 -IaCS19096_RS00225 CTRC943_RS00225 -IaCS19096_RS00225 CTJTET1_RS00225 -IaCS19096_RS00225 O169_RS00225 -IaCS19096_RS00225 CBP48_RS01620 -IaCS19096_RS00225 ECS88FINAL_RS0100230 -IaCS19096_RS00225 AOT15_RS00730 -IaCS19096_RS00225 DU13_RS00230 -IaCS19096_RS00225 KW39_RS00225 -IaCS19096_RS00225 KW36_RS00225 -IaCS19096_RS00225 BKB95_RS00230 -IaCS19096_RS00225 SW2_RS00225 -IaCS19096_RS00225 ECS102511_RS00225 -IaCS19096_RS00225 CTL2C_RS01590 -IaCS19096_RS00225 CBP42_RS01620 -IaCS19096_RS00225 CTB_RS00225 -IaCS19096_RS00225 L1224_RS00225 -IaCS19096_RS00225 BKB96_RS00230 -IaCS19096_RS00225 L1440_RS00225 -IaCS19096_RS00225 BKB99_RS00230 -IaCS19096_RS00225 BKB92_RS00230 -IaCS19096_RS00225 CTO_RS00225 -IaCS19096_RS00225 SOTONIA3_RS00225 -IaCS19096_RS00225 120638 -IaCS19096_RS00225 CBP44_RS01625 -IaCS19096_RS00225 E150_RS00225 -IaCS19096_RS00225 L2BUCH2_RS00225 -IaCS19096_RS00225 AQ193_RS03780 -IaCS19096_RS00225 AQ244_RS01765 -IaCS19096_RS00225 BKB93_RS00230 -IaCS19096_RS00225 FCS84708_RS00225 -IaCS19096_RS00225 AP288_RS03295 -IaCS19096_RS00225 BBV13_RS00230 -IaCS19096_RS00225 AQ199_RS00920 -IaCS19096_RS00225 BW688_RS01620 -IaCS19096_RS00225 G9768_RS00225 -IaCS19096_RS00225 L2BLST_RS00225 -IaCS19096_RS00225 BKC02_RS00230 -IaCS19096_RS00225 gnl|Prokka|PADJNBJD_00044 -IaCS19096_RS00225 BBV16_RS00230 -IaCS19096_RS00225 JIEJKO_00215 -IaCS19096_RS00225 NILJEPDF_00044 -IaCS19096_RS00225 LJHENM_00225 -IaCS19096_RS00225 BKC01_RS00230 -IaCS19096_RS00225 7618796 -IaCS19096_RS00225 A5291_RS00225 -IaCS19096_RS00225 SOTONK1_RS00225 -IaCS19096_RS00225 L3404_RS00225 -IaCS19096_RS00225 AKW53_RS01715 -IaCS19096_RS00225 QSDFRQ_00044 -IaCS19096_RS00390 IaCS19096_RS00390 -IaCS19096_RS00390 BKC03_RS00400 -IaCS19096_RS00390 C15_RS0100400 -IaCS19096_RS00390 DU10_RS00400 -IaCS19096_RS00390 7618811 -IaCS19096_RS00390 CTRC943_RS00390 -IaCS19096_RS00390 CTJTET1_RS00390 -IaCS19096_RS00390 O169_RS00390 -IaCS19096_RS00390 KW36_RS00390 -IaCS19096_RS00390 DU13_RS00405 -IaCS19096_RS00390 CBP48_RS01790 -IaCS19096_RS00390 ECS88FINAL_RS0100405 -IaCS19096_RS00390 AOT15_RS00565 -IaCS19096_RS00390 KW39_RS00390 -IaCS19096_RS00390 BKB95_RS00400 -IaCS19096_RS00390 SW2_RS00390 -IaCS19096_RS00390 ECS102511_RS00390 -IaCS19096_RS00390 CTB_RS00390 -IaCS19096_RS00390 CTL2C_RS01755 -IaCS19096_RS00390 CBP42_RS01790 -IaCS19096_RS00390 BKB96_RS00400 -IaCS19096_RS00390 L1224_RS00390 -IaCS19096_RS00390 BKB99_RS00400 -IaCS19096_RS00390 CTO_RS00390 -IaCS19096_RS00390 L1440_RS00390 -IaCS19096_RS00390 BKB92_RS00400 -IaCS19096_RS00390 SOTONIA3_RS00390 -IaCS19096_RS00390 CBP44_RS01795 -IaCS19096_RS00390 120614 -IaCS19096_RS00390 E150_RS00390 -IaCS19096_RS00390 L2BUCH2_RS00390 -IaCS19096_RS00390 AQ193_RS03605 -IaCS19096_RS00390 AQ244_RS01600 -IaCS19096_RS00390 BKB93_RS00400 -IaCS19096_RS00390 FCS84708_RS00390 -IaCS19096_RS00390 AP288_RS03460 -IaCS19096_RS00390 BBV13_RS00395 -IaCS19096_RS00390 AQ199_RS01085 -IaCS19096_RS00390 BW688_RS01790 -IaCS19096_RS00390 G9768_RS00390 -IaCS19096_RS00390 L2BLST_RS00390 -IaCS19096_RS00390 BKC02_RS00400 -IaCS19096_RS00390 BBV16_RS00395 -IaCS19096_RS00390 gnl|Prokka|PADJNBJD_00077 -IaCS19096_RS00390 NILJEPDF_00077 -IaCS19096_RS00390 LJHENM_00390 -IaCS19096_RS00390 A5291_RS00390 -IaCS19096_RS00390 BKC01_RS00400 -IaCS19096_RS00390 SOTONK1_RS00390 -IaCS19096_RS00390 L3404_RS00390 -IaCS19096_RS00390 JIEJKO_00390 -IaCS19096_RS00390 AKW53_RS01880 -IaCS19096_RS00390 QSDFRQ_00077 -IaCS19096_RS00555 IaCS19096_RS00555 -IaCS19096_RS00555 BKC03_RS00565 -IaCS19096_RS00555 C15_RS0100570 -IaCS19096_RS00555 DU10_RS00565 -IaCS19096_RS00555 O169_RS00555 -IaCS19096_RS00555 DU13_RS00570 -IaCS19096_RS00555 7618407 -IaCS19096_RS00555 KW36_RS00555 -IaCS19096_RS00555 AOT15_RS00400 -IaCS19096_RS00555 CBP48_RS01955 -IaCS19096_RS00555 BKB95_RS00565 -IaCS19096_RS00555 AQ244_RS02730 -IaCS19096_RS00555 BKB96_RS00565 -IaCS19096_RS00555 CBP42_RS01955 -IaCS19096_RS00555 BKB99_RS00565 -IaCS19096_RS00555 BKB92_RS00565 -IaCS19096_RS00555 CBP44_RS01960 -IaCS19096_RS00555 119285 -IaCS19096_RS00555 BKB93_RS00565 -IaCS19096_RS00555 BKC02_RS00565 -IaCS19096_RS00555 gnl|Prokka|PADJNBJD_00109 -IaCS19096_RS00555 LJHENM_00545 -IaCS19096_RS00555 BKC01_RS00565 -IaCS19096_RS00555 NILJEPDF_00109 -IaCS19096_RS00555 SOTONK1_RS00555 -IaCS19096_RS00555 JIEJKO_00550 -IaCS19096_RS00555 QSDFRQ_00109 -IaCS19096_RS01410 IaCS19096_RS01410 -IaCS19096_RS01410 A5291_RS01440 -IaCS19096_RS01410 O169_RS01420 -IaCS19096_RS01410 DU13_RS01425 -IaCS19096_RS01410 7618908 -IaCS19096_RS01410 SW2_RS01405 -IaCS19096_RS01410 BKB95_RS01430 -IaCS19096_RS01410 CBP48_RS02805 -IaCS19096_RS01410 KW36_RS01410 -IaCS19096_RS01410 ECS102511_RS01405 -IaCS19096_RS01410 AOT15_RS02410 -IaCS19096_RS01410 BKB96_RS01415 -IaCS19096_RS01410 CTL2C_RS02760 -IaCS19096_RS01410 BKB99_RS01415 -IaCS19096_RS01410 L1224_RS01390 -IaCS19096_RS01410 L1440_RS01390 -IaCS19096_RS01410 AQ244_RS03595 -IaCS19096_RS01410 CBP42_RS02805 -IaCS19096_RS01410 SOTONIA3_RS01425 -IaCS19096_RS01410 BKB92_RS01420 -IaCS19096_RS01410 CTB_RS01440 -IaCS19096_RS01410 E150_RS01410 -IaCS19096_RS01410 L2BUCH2_RS01395 -IaCS19096_RS01410 CTO_RS01435 -IaCS19096_RS01410 FCS84708_RS01405 -IaCS19096_RS01410 AP288_RS04475 -IaCS19096_RS01410 BKB93_RS01420 -IaCS19096_RS01410 CBP44_RS02810 -IaCS19096_RS01410 AQ199_RS02100 -IaCS19096_RS01410 L2BLST_RS01395 -IaCS19096_RS01410 BBV13_RS01445 -IaCS19096_RS01410 BW688_RS02810 -IaCS19096_RS01410 G9768_RS01415 -IaCS19096_RS01410 BKC02_RS01415 -IaCS19096_RS01410 AQ193_RS02580 -IaCS19096_RS01410 BBV16_RS01445 -IaCS19096_RS01410 L3404_RS01390 -IaCS19096_RS01410 AKW53_RS02900 -IaCS19096_RS01410 BKC01_RS01420 -IaCS19096_RS01410 gnl|Prokka|PADJNBJD_00277 -IaCS19096_RS01410 DU10_RS01425 -IaCS19096_RS01410 NILJEPDF_00277 -IaCS19096_RS01410 LJHENM_01395 -IaCS19096_RS01410 BKC03_RS01415 -IaCS19096_RS01410 CTRC943_RS01395 -IaCS19096_RS01410 CTJTET1_RS01425 -IaCS19096_RS01410 KW39_RS01415 -IaCS19096_RS01410 JIEJKO_01395 -IaCS19096_RS01410 120454 -IaCS19096_RS01410 C15_RS0101450 -IaCS19096_RS01410 SOTONK1_RS01415 -IaCS19096_RS01410 ECS88FINAL_RS0101435 -IaCS19096_RS01410 QSDFRQ_00277 -IaCS19096_RS01570 IaCS19096_RS01570 -IaCS19096_RS01570 A5291_RS01600 -IaCS19096_RS01570 O169_RS01580 -IaCS19096_RS01570 DU13_RS01585 -IaCS19096_RS01570 SW2_RS01565 -IaCS19096_RS01570 BKB95_RS01590 -IaCS19096_RS01570 KW36_RS01570 -IaCS19096_RS01570 ECS102511_RS01565 -IaCS19096_RS01570 AOT15_RS02570 -IaCS19096_RS01570 BKB96_RS01575 -IaCS19096_RS01570 BKB99_RS01575 -IaCS19096_RS01570 AQ244_RS03755 -IaCS19096_RS01570 SOTONIA3_RS01585 -IaCS19096_RS01570 BKB92_RS01580 -IaCS19096_RS01570 CTB_RS01600 -IaCS19096_RS01570 E150_RS01570 -IaCS19096_RS01570 CTO_RS01595 -IaCS19096_RS01570 FCS84708_RS01565 -IaCS19096_RS01570 AP288_RS04635 -IaCS19096_RS01570 BKB93_RS01580 -IaCS19096_RS01570 AQ199_RS02260 -IaCS19096_RS01570 BBV13_RS01605 -IaCS19096_RS01570 G9768_RS01575 -IaCS19096_RS01570 BKC02_RS01575 -IaCS19096_RS01570 AKW53_RS03065 -IaCS19096_RS01570 AQ193_RS02420 -IaCS19096_RS01570 BBV16_RS01605 -IaCS19096_RS01570 BKC01_RS01580 -IaCS19096_RS01570 gnl|Prokka|PADJNBJD_00309 -IaCS19096_RS01570 NILJEPDF_00309 -IaCS19096_RS01570 LJHENM_01555 -IaCS19096_RS01570 BKC03_RS01575 -IaCS19096_RS01570 DU10_RS01590 -IaCS19096_RS01570 CTJTET1_RS01585 -IaCS19096_RS01570 KW39_RS01575 -IaCS19096_RS01570 JIEJKO_01555 -IaCS19096_RS01570 C15_RS01000000104925 -IaCS19096_RS01570 SOTONK1_RS01575 -IaCS19096_RS01570 ECS88FINAL_RS01000000104920 -IaCS19096_RS01570 119447 -IaCS19096_RS01570 QSDFRQ_00309 -IaCS19096_RS02390 IaCS19096_RS02390 -IaCS19096_RS02390 DU10_RS02440 -IaCS19096_RS02390 A5291_RS02430 -IaCS19096_RS02390 KW39_RS02410 -IaCS19096_RS02390 ECS88FINAL_RS0102455 -IaCS19096_RS02390 7619013 -IaCS19096_RS02390 O169_RS02410 -IaCS19096_RS02390 DU13_RS02435 -IaCS19096_RS02390 BKB96_RS02420 -IaCS19096_RS02390 BKB99_RS02415 -IaCS19096_RS02390 CBP48_RS03820 -IaCS19096_RS02390 CTL2C_RS03745 -IaCS19096_RS02390 KW36_RS02390 -IaCS19096_RS02390 BKB95_RS02435 -IaCS19096_RS02390 120275 -IaCS19096_RS02390 L1224_RS02375 -IaCS19096_RS02390 AP288_RS00680 -IaCS19096_RS02390 SW2_RS02405 -IaCS19096_RS02390 L1440_RS02375 -IaCS19096_RS02390 ECS102511_RS02400 -IaCS19096_RS02390 CBP42_RS03830 -IaCS19096_RS02390 L2BUCH2_RS02370 -IaCS19096_RS02390 CTB_RS02430 -IaCS19096_RS02390 SOTONIA3_RS02410 -IaCS19096_RS02390 BKB92_RS02425 -IaCS19096_RS02390 AQ244_RS00715 -IaCS19096_RS02390 CTO_RS02430 -IaCS19096_RS02390 E150_RS02405 -IaCS19096_RS02390 BBV13_RS02435 -IaCS19096_RS02390 BW688_RS03815 -IaCS19096_RS02390 L2BLST_RS02375 -IaCS19096_RS02390 CBP44_RS03825 -IaCS19096_RS02390 FCS84708_RS02395 -IaCS19096_RS02390 BBV16_RS02440 -IaCS19096_RS02390 BKB93_RS02430 -IaCS19096_RS02390 AQ193_RS01585 -IaCS19096_RS02390 G9768_RS02395 -IaCS19096_RS02390 AQ199_RS03095 -IaCS19096_RS02390 L3404_RS02370 -IaCS19096_RS02390 BKC02_RS02415 -IaCS19096_RS02390 BKC01_RS02415 -IaCS19096_RS02390 gnl|Prokka|PADJNBJD_00473 -IaCS19096_RS02390 AKW53_RS03900 -IaCS19096_RS02390 NILJEPDF_00473 -IaCS19096_RS02390 LJHENM_02385 -IaCS19096_RS02390 CTRC943_RS02375 -IaCS19096_RS02390 JIEJKO_02385 -IaCS19096_RS02390 BKC03_RS02415 -IaCS19096_RS02390 QSDFRQ_00473 -IaCS19096_RS02390 CTJTET1_RS02405 -IaCS19096_RS02390 AOT15_RS00020 -IaCS19096_RS02390 C15_RS0102450 -IaCS19096_RS02390 SOTONK1_RS02395 -AKW53_RS00135 AKW53_RS00135 -AKW53_RS00135 KW36_RS03385 -AKW53_RS00135 CTL2C_RS04740 -AKW53_RS00135 BKB95_RS03440 -AKW53_RS00135 CBP48_RS04820 -AKW53_RS00135 7618657 -AKW53_RS00135 SW2_RS03395 -AKW53_RS00135 L1224_RS03370 -AKW53_RS00135 ECS102511_RS03385 -AKW53_RS00135 L1440_RS03370 -AKW53_RS00135 BKB96_RS03430 -AKW53_RS00135 BKB99_RS03425 -AKW53_RS00135 CBP42_RS04825 -AKW53_RS00135 L2BUCH2_RS03370 -AKW53_RS00135 BKB92_RS03420 -AKW53_RS00135 CTB_RS03425 -AKW53_RS00135 SOTONIA3_RS03405 -AKW53_RS00135 E150_RS03395 -AKW53_RS00135 CTO_RS03420 -AKW53_RS00135 BBV13_RS03425 -AKW53_RS00135 BW688_RS04815 -AKW53_RS00135 FCS84708_RS03385 -AKW53_RS00135 L2BLST_RS03370 -AKW53_RS00135 CBP44_RS04820 -AKW53_RS00135 119680 -AKW53_RS00135 BBV16_RS03435 -AKW53_RS00135 AQ199_RS04085 -AKW53_RS00135 BKB93_RS03425 -AKW53_RS00135 G9768_RS03385 -AKW53_RS00135 AQ244_RS04525 -AKW53_RS00135 gnl|Prokka|PADJNBJD_00666 -AKW53_RS00135 L3404_RS03365 -AKW53_RS00135 BKC02_RS03420 -AKW53_RS00135 NILJEPDF_00667 -AKW53_RS00135 LJHENM_03350 -AKW53_RS00135 AOT15_RS04185 -AKW53_RS00135 AP288_RS01755 -AKW53_RS00135 JIEJKO_03355 -AKW53_RS00135 BKC01_RS03420 -AKW53_RS00135 QSDFRQ_00667 -AKW53_RS00135 CTRC943_RS03370 -AKW53_RS00135 AQ193_RS00600 -AKW53_RS00135 BKC03_RS03420 -AKW53_RS00135 CTJTET1_RS03405 -AKW53_RS00135 KW39_RS03405 -AKW53_RS00135 DU10_RS03435 -AKW53_RS00135 SOTONK1_RS03385 -AKW53_RS00135 ECS88FINAL_RS0103460 -AKW53_RS00135 IaCS19096_RS03380 -AKW53_RS00135 C15_RS0103455 -AKW53_RS00135 A5291_RS03430 -AKW53_RS00135 O169_RS03400 -AKW53_RS00135 DU13_RS03435 -AKW53_RS00510 AKW53_RS00510 -AKW53_RS00510 BKC03_RS03805 -AKW53_RS00510 CTJTET1_RS03790 -AKW53_RS00510 KW39_RS03785 -AKW53_RS00510 DU10_RS03820 -AKW53_RS00510 CBP48_RS00375 -AKW53_RS00510 A5291_RS03815 -AKW53_RS00510 SOTONK1_RS03770 -AKW53_RS00510 IaCS19096_RS03765 -AKW53_RS00510 DU13_RS03820 -AKW53_RS00510 C15_RS0103875 -AKW53_RS00510 ECS88FINAL_RS0103875 -AKW53_RS00510 O169_RS03780 -AKW53_RS00510 KW36_RS03770 -AKW53_RS00510 BKB95_RS03825 -AKW53_RS00510 CBP42_RS00375 -AKW53_RS00510 SW2_RS03775 -AKW53_RS00510 CTL2C_RS00370 -AKW53_RS00510 L1224_RS03750 -AKW53_RS00510 ECS102511_RS03765 -AKW53_RS00510 BKB96_RS03810 -AKW53_RS00510 BKB99_RS03805 -AKW53_RS00510 L1440_RS03750 -AKW53_RS00510 CBP44_RS00375 -AKW53_RS00510 L2BUCH2_RS03750 -AKW53_RS00510 AQ244_RS04140 -AKW53_RS00510 BKB92_RS03805 -AKW53_RS00510 CTB_RS03810 -AKW53_RS00510 SOTONIA3_RS03790 -AKW53_RS00510 E150_RS03775 -AKW53_RS00510 CTO_RS03805 -AKW53_RS00510 BBV13_RS03810 -AKW53_RS00510 FCS84708_RS03765 -AKW53_RS00510 AQ193_RS00220 -AKW53_RS00510 BBV16_RS03820 -AKW53_RS00510 L2BLST_RS03750 -AKW53_RS00510 7618251 -AKW53_RS00510 119755 -AKW53_RS00510 BW688_RS00375 -AKW53_RS00510 AQ199_RS04465 -AKW53_RS00510 BKB93_RS03810 -AKW53_RS00510 G9768_RS03770 -AKW53_RS00510 gnl|Prokka|PADJNBJD_00742 -AKW53_RS00510 L3404_RS03745 -AKW53_RS00510 BKC02_RS03805 -AKW53_RS00510 NILJEPDF_00743 -AKW53_RS00510 LJHENM_03740 -AKW53_RS00510 AOT15_RS04570 -AKW53_RS00510 AP288_RS02140 -AKW53_RS00510 JIEJKO_03740 -AKW53_RS00510 BKC01_RS03810 -AKW53_RS00510 QSDFRQ_00743 -AKW53_RS00510 CTRC943_RS03755 -AKW53_RS00680 AKW53_RS00680 -AKW53_RS00680 BKC03_RS03975 -AKW53_RS00680 CBP48_RS00545 -AKW53_RS00680 CTJTET1_RS03960 -AKW53_RS00680 KW39_RS03955 -AKW53_RS00680 DU10_RS03990 -AKW53_RS00680 A5291_RS03985 -AKW53_RS00680 SOTONK1_RS03940 -AKW53_RS00680 IaCS19096_RS03935 -AKW53_RS00680 DU13_RS03990 -AKW53_RS00680 C15_RS0104045 -AKW53_RS00680 ECS88FINAL_RS0104050 -AKW53_RS00680 O169_RS03950 -AKW53_RS00680 KW36_RS03940 -AKW53_RS00680 BKB95_RS03995 -AKW53_RS00680 CBP42_RS00545 -AKW53_RS00680 CTL2C_RS00540 -AKW53_RS00680 L1224_RS03920 -AKW53_RS00680 SW2_RS03945 -AKW53_RS00680 L1440_RS03915 -AKW53_RS00680 ECS102511_RS03935 -AKW53_RS00680 BKB96_RS03980 -AKW53_RS00680 BKB99_RS03975 -AKW53_RS00680 AQ244_RS03970 -AKW53_RS00680 CBP44_RS00545 -AKW53_RS00680 L2BUCH2_RS03920 -AKW53_RS00680 BKB92_RS03975 -AKW53_RS00680 CTB_RS03980 -AKW53_RS00680 SOTONIA3_RS03960 -AKW53_RS00680 E150_RS03945 -AKW53_RS00680 CTO_RS03975 -AKW53_RS00680 AQ193_RS00050 -AKW53_RS00680 BBV13_RS03980 -AKW53_RS00680 FCS84708_RS03935 -AKW53_RS00680 L2BLST_RS03920 -AKW53_RS00680 BBV16_RS03990 -AKW53_RS00680 7618263 -AKW53_RS00680 119774 -AKW53_RS00680 BW688_RS00545 -AKW53_RS00680 AQ199_RS04635 -AKW53_RS00680 BKB93_RS03980 -AKW53_RS00680 G9768_RS03940 -AKW53_RS00680 gnl|Prokka|PADJNBJD_00775 -AKW53_RS00680 L3404_RS03915 -AKW53_RS00680 NILJEPDF_00776 -AKW53_RS00680 BKC02_RS03975 -AKW53_RS00680 LJHENM_03905 -AKW53_RS00680 AOT15_RS04740 -AKW53_RS00680 AP288_RS02310 -AKW53_RS00680 JIEJKO_03905 -AKW53_RS00680 QSDFRQ_00776 -AKW53_RS00680 BKC01_RS03980 -AKW53_RS00680 CTRC943_RS03925 -AKW53_RS00870 AKW53_RS00870 -AKW53_RS00870 BKC01_RS04195 -AKW53_RS00870 CTRC943_RS04140 -AKW53_RS00870 AOT15_RS01740 -AKW53_RS00870 CTJTET1_RS04330 -AKW53_RS00870 KW39_RS04170 -AKW53_RS00870 BKC03_RS04190 -AKW53_RS00870 CBP48_RS00760 -AKW53_RS00870 A5291_RS04195 -AKW53_RS00870 ECS88FINAL_RS0104240 -AKW53_RS00870 DU10_RS04205 -AKW53_RS00870 SOTONK1_RS04155 -AKW53_RS00870 IaCS19096_RS04150 -AKW53_RS00870 DU13_RS04205 -AKW53_RS00870 C15_RS0104265 -AKW53_RS00870 O169_RS04165 -AKW53_RS00870 KW36_RS04155 -AKW53_RS00870 BKB95_RS04210 -AKW53_RS00870 CBP42_RS00760 -AKW53_RS00870 CTL2C_RS00755 -AKW53_RS00870 L1224_RS04135 -AKW53_RS00870 BKB96_RS04195 -AKW53_RS00870 SW2_RS04160 -AKW53_RS00870 L1440_RS04130 -AKW53_RS00870 ECS102511_RS04150 -AKW53_RS00870 BKB99_RS04190 -AKW53_RS00870 CBP44_RS00760 -AKW53_RS00870 CTB_RS04190 -AKW53_RS00870 L2BUCH2_RS04135 -AKW53_RS00870 BKB92_RS04190 -AKW53_RS00870 SOTONIA3_RS04175 -AKW53_RS00870 AQ193_RS04620 -AKW53_RS00870 CTO_RS04185 -AKW53_RS00870 AP288_RS02455 -AKW53_RS00870 AQ244_RS02610 -AKW53_RS00870 E150_RS04160 -AKW53_RS00870 BBV13_RS04195 -AKW53_RS00870 119988 -AKW53_RS00870 FCS84708_RS04150 -AKW53_RS00870 AQ199_RS00080 -AKW53_RS00870 7618726 -AKW53_RS00870 L2BLST_RS04135 -AKW53_RS00870 BBV16_RS04205 -AKW53_RS00870 BW688_RS00760 -AKW53_RS00870 gnl|Prokka|PADJNBJD_00816 -AKW53_RS00870 BKB93_RS04195 -AKW53_RS00870 NILJEPDF_00817 -AKW53_RS00870 G9768_RS04155 -AKW53_RS00870 L3404_RS04130 -AKW53_RS00870 LJHENM_04110 -AKW53_RS00870 JIEJKO_04110 -AKW53_RS00870 BKC02_RS04190 -AKW53_RS00870 QSDFRQ_00817 -AKW53_RS01200 AKW53_RS01200 -AKW53_RS01200 BKC01_RS04525 -AKW53_RS01200 CTRC943_RS04460 -AKW53_RS01200 AOT15_RS02055 -AKW53_RS01200 CTJTET1_RS04645 -AKW53_RS01200 KW39_RS04495 -AKW53_RS01200 BKC03_RS04520 -AKW53_RS01200 CBP48_RS01095 -AKW53_RS01200 A5291_RS04510 -AKW53_RS01200 SOTONK1_RS04475 -AKW53_RS01200 ECS88FINAL_RS0104575 -AKW53_RS01200 IaCS19096_RS04470 -AKW53_RS01200 C15_RS0104595 -AKW53_RS01200 DU10_RS04540 -AKW53_RS01200 O169_RS04495 -AKW53_RS01200 KW36_RS04475 -AKW53_RS01200 DU13_RS04540 -AKW53_RS01200 BKB95_RS04540 -AKW53_RS01200 CBP42_RS01095 -AKW53_RS01200 CTL2C_RS01075 -AKW53_RS01200 L1224_RS04455 -AKW53_RS01200 BKB96_RS04525 -AKW53_RS01200 L1440_RS04450 -AKW53_RS01200 BKB99_RS04520 -AKW53_RS01200 SW2_RS04485 -AKW53_RS01200 ECS102511_RS04480 -AKW53_RS01200 CBP44_RS01095 -AKW53_RS01200 CTB_RS04505 -AKW53_RS01200 L2BUCH2_RS04455 -AKW53_RS01200 SOTONIA3_RS04490 -AKW53_RS01200 CTO_RS04500 -AKW53_RS01200 AQ193_RS04290 -AKW53_RS01200 BBV13_RS04515 -AKW53_RS01200 BKB92_RS04525 -AKW53_RS01200 AP288_RS02785 -AKW53_RS01200 BBV16_RS04520 -AKW53_RS01200 E150_RS04490 -AKW53_RS01200 L2BLST_RS04455 -AKW53_RS01200 AQ244_RS02275 -AKW53_RS01200 gnl|Prokka|PADJNBJD_00878 -AKW53_RS01200 FCS84708_RS04475 -AKW53_RS01200 AQ199_RS00410 -AKW53_RS01200 BW688_RS01095 -AKW53_RS01200 119868 -AKW53_RS01200 NILJEPDF_00879 -AKW53_RS01200 7618325 -AKW53_RS01200 G9768_RS04475 -AKW53_RS01200 LJHENM_04425 -AKW53_RS01200 L3404_RS04450 -AKW53_RS01200 JIEJKO_04420 -AKW53_RS01200 QSDFRQ_00879 -AKW53_RS01200 BKB93_RS04530 -AKW53_RS01200 BKC02_RS04520 -AKW53_RS01365 AKW53_RS01365 -AKW53_RS01365 BKC01_RS04700 -AKW53_RS01365 CTRC943_RS04625 -AKW53_RS01365 AOT15_RS02220 -AKW53_RS01365 CTJTET1_RS04810 -AKW53_RS01365 KW39_RS04660 -AKW53_RS01365 BKC03_RS04695 -AKW53_RS01365 CBP48_RS01270 -AKW53_RS01365 A5291_RS04675 -AKW53_RS01365 SOTONK1_RS04640 -AKW53_RS01365 ECS88FINAL_RS0104750 -AKW53_RS01365 IaCS19096_RS04635 -AKW53_RS01365 C15_RS0104770 -AKW53_RS01365 DU10_RS04715 -AKW53_RS01365 O169_RS04660 -AKW53_RS01365 KW36_RS04640 -AKW53_RS01365 DU13_RS04715 -AKW53_RS01365 CTL2C_RS01240 -AKW53_RS01365 BKB95_RS04715 -AKW53_RS01365 CBP42_RS01270 -AKW53_RS01365 L1224_RS04620 -AKW53_RS01365 BKB96_RS04700 -AKW53_RS01365 L1440_RS04615 -AKW53_RS01365 BKB99_RS04695 -AKW53_RS01365 SW2_RS04650 -AKW53_RS01365 ECS102511_RS04645 -AKW53_RS01365 CBP44_RS01270 -AKW53_RS01365 CTB_RS04670 -AKW53_RS01365 L2BUCH2_RS04620 -AKW53_RS01365 SOTONIA3_RS04655 -AKW53_RS01365 CTO_RS04665 -AKW53_RS01365 AP288_RS02950 -AKW53_RS01365 AQ193_RS04125 -AKW53_RS01365 BBV13_RS04685 -AKW53_RS01365 BKB92_RS04700 -AKW53_RS01365 BBV16_RS04690 -AKW53_RS01365 E150_RS04655 -AKW53_RS01365 gnl|Prokka|PADJNBJD_00911 -AKW53_RS01365 L2BLST_RS04620 -AKW53_RS01365 FCS84708_RS04640 -AKW53_RS01365 AQ199_RS00575 -AKW53_RS01365 AQ244_RS02110 -AKW53_RS01365 NILJEPDF_00912 -AKW53_RS01365 BW688_RS01270 -AKW53_RS01365 119929 -AKW53_RS01365 JIEJKO_04585 -AKW53_RS01365 7618764 -AKW53_RS01365 QSDFRQ_00912 -AKW53_RS01365 G9768_RS04640 -AKW53_RS01365 LJHENM_04595 -AKW53_RS01365 L3404_RS04615 -AKW53_RS01365 BKB93_RS04705 -AKW53_RS01365 BKC02_RS04695 -AKW53_RS01720 AKW53_RS01720 -AKW53_RS01720 QSDFRQ_00045 -AKW53_RS01720 IaCS19096_RS00230 -AKW53_RS01720 BKC03_RS00235 -AKW53_RS01720 C15_RS0100230 -AKW53_RS01720 DU10_RS00235 -AKW53_RS01720 CTRC943_RS00230 -AKW53_RS01720 CTJTET1_RS00230 -AKW53_RS01720 AOT15_RS00725 -AKW53_RS01720 O169_RS00230 -AKW53_RS01720 CBP48_RS01625 -AKW53_RS01720 ECS88FINAL_RS0100235 -AKW53_RS01720 DU13_RS00235 -AKW53_RS01720 KW39_RS00230 -AKW53_RS01720 KW36_RS00230 -AKW53_RS01720 BKB95_RS00235 -AKW53_RS01720 SW2_RS00230 -AKW53_RS01720 ECS102511_RS00230 -AKW53_RS01720 CTL2C_RS01595 -AKW53_RS01720 CBP42_RS01625 -AKW53_RS01720 CTB_RS00230 -AKW53_RS01720 L1224_RS00230 -AKW53_RS01720 BKB96_RS00235 -AKW53_RS01720 L1440_RS00230 -AKW53_RS01720 BKB99_RS00235 -AKW53_RS01720 BKB92_RS00235 -AKW53_RS01720 CTO_RS00230 -AKW53_RS01720 SOTONIA3_RS00230 -AKW53_RS01720 120636 -AKW53_RS01720 AQ193_RS03775 -AKW53_RS01720 CBP44_RS01630 -AKW53_RS01720 E150_RS00230 -AKW53_RS01720 AQ244_RS01760 -AKW53_RS01720 L2BUCH2_RS00230 -AKW53_RS01720 BKB93_RS00235 -AKW53_RS01720 FCS84708_RS00230 -AKW53_RS01720 AP288_RS03300 -AKW53_RS01720 BBV13_RS00235 -AKW53_RS01720 AQ199_RS00925 -AKW53_RS01720 BW688_RS01625 -AKW53_RS01720 G9768_RS00230 -AKW53_RS01720 L2BLST_RS00230 -AKW53_RS01720 BKC02_RS00235 -AKW53_RS01720 gnl|Prokka|PADJNBJD_00045 -AKW53_RS01720 BBV16_RS00235 -AKW53_RS01720 JIEJKO_00220 -AKW53_RS01720 NILJEPDF_00045 -AKW53_RS01720 LJHENM_00230 -AKW53_RS01720 BKC01_RS00235 -AKW53_RS01720 7618797 -AKW53_RS01720 A5291_RS00230 -AKW53_RS01720 SOTONK1_RS00230 -AKW53_RS01720 L3404_RS00230 -AKW53_RS01885 AKW53_RS01885 -AKW53_RS01885 QSDFRQ_00078 -AKW53_RS01885 IaCS19096_RS00395 -AKW53_RS01885 BKC03_RS00405 -AKW53_RS01885 C15_RS0100405 -AKW53_RS01885 DU10_RS00405 -AKW53_RS01885 7618812 -AKW53_RS01885 CTRC943_RS00395 -AKW53_RS01885 CTJTET1_RS00395 -AKW53_RS01885 AOT15_RS00560 -AKW53_RS01885 O169_RS00395 -AKW53_RS01885 KW36_RS00395 -AKW53_RS01885 DU13_RS00410 -AKW53_RS01885 CBP48_RS01795 -AKW53_RS01885 ECS88FINAL_RS0100410 -AKW53_RS01885 KW39_RS00395 -AKW53_RS01885 BKB95_RS00405 -AKW53_RS01885 SW2_RS00395 -AKW53_RS01885 ECS102511_RS00395 -AKW53_RS01885 CTB_RS00395 -AKW53_RS01885 CTL2C_RS01760 -AKW53_RS01885 CBP42_RS01795 -AKW53_RS01885 BKB96_RS00405 -AKW53_RS01885 L1224_RS00395 -AKW53_RS01885 BKB99_RS00405 -AKW53_RS01885 CTO_RS00395 -AKW53_RS01885 L1440_RS00395 -AKW53_RS01885 BKB92_RS00405 -AKW53_RS01885 SOTONIA3_RS00395 -AKW53_RS01885 CBP44_RS01800 -AKW53_RS01885 120613 -AKW53_RS01885 E150_RS00395 -AKW53_RS01885 AQ193_RS03600 -AKW53_RS01885 AQ244_RS01595 -AKW53_RS01885 L2BUCH2_RS00395 -AKW53_RS01885 BKB93_RS00405 -AKW53_RS01885 FCS84708_RS00395 -AKW53_RS01885 AP288_RS03465 -AKW53_RS01885 BBV13_RS00400 -AKW53_RS01885 AQ199_RS01090 -AKW53_RS01885 BW688_RS01795 -AKW53_RS01885 G9768_RS00395 -AKW53_RS01885 L2BLST_RS00395 -AKW53_RS01885 BKC02_RS00405 -AKW53_RS01885 BBV16_RS00400 -AKW53_RS01885 gnl|Prokka|PADJNBJD_00078 -AKW53_RS01885 NILJEPDF_00078 -AKW53_RS01885 LJHENM_00395 -AKW53_RS01885 A5291_RS00395 -AKW53_RS01885 BKC01_RS00405 -AKW53_RS01885 SOTONK1_RS00395 -AKW53_RS01885 L3404_RS00395 -AKW53_RS01885 JIEJKO_00395 -AKW53_RS02945 AKW53_RS02945 -AKW53_RS02945 BBV16_RS01485 -AKW53_RS02945 L3404_RS01430 -AKW53_RS02945 BKC01_RS01460 -AKW53_RS02945 gnl|Prokka|PADJNBJD_00285 -AKW53_RS02945 DU10_RS01465 -AKW53_RS02945 NILJEPDF_00285 -AKW53_RS02945 LJHENM_01435 -AKW53_RS02945 BKC03_RS01455 -AKW53_RS02945 CTRC943_RS01435 -AKW53_RS02945 CTJTET1_RS01465 -AKW53_RS02945 KW39_RS01455 -AKW53_RS02945 JIEJKO_01435 -AKW53_RS02945 119431 -AKW53_RS02945 C15_RS0101490 -AKW53_RS02945 SOTONK1_RS01455 -AKW53_RS02945 ECS88FINAL_RS0101475 -AKW53_RS02945 QSDFRQ_00285 -AKW53_RS02945 IaCS19096_RS01450 -AKW53_RS02945 A5291_RS01480 -AKW53_RS02945 O169_RS01460 -AKW53_RS02945 DU13_RS01465 -AKW53_RS02945 7618498 -AKW53_RS02945 SW2_RS01445 -AKW53_RS02945 BKB95_RS01470 -AKW53_RS02945 CBP48_RS02845 -AKW53_RS02945 KW36_RS01450 -AKW53_RS02945 ECS102511_RS01445 -AKW53_RS02945 AOT15_RS02450 -AKW53_RS02945 BKB96_RS01455 -AKW53_RS02945 CTL2C_RS02800 -AKW53_RS02945 BKB99_RS01455 -AKW53_RS02945 L1224_RS01430 -AKW53_RS02945 AQ193_RS02540 -AKW53_RS02945 L1440_RS01430 -AKW53_RS02945 AQ244_RS03635 -AKW53_RS02945 CBP42_RS02845 -AKW53_RS02945 SOTONIA3_RS01465 -AKW53_RS02945 BKB92_RS01460 -AKW53_RS02945 CTB_RS01480 -AKW53_RS02945 E150_RS01450 -AKW53_RS02945 L2BUCH2_RS01435 -AKW53_RS02945 CTO_RS01475 -AKW53_RS02945 FCS84708_RS01445 -AKW53_RS02945 AP288_RS04515 -AKW53_RS02945 BKB93_RS01460 -AKW53_RS02945 CBP44_RS02850 -AKW53_RS02945 AQ199_RS02140 -AKW53_RS02945 L2BLST_RS01435 -AKW53_RS02945 BBV13_RS01485 -AKW53_RS02945 BW688_RS02855 -AKW53_RS02945 G9768_RS01455 -AKW53_RS02945 BKC02_RS01455 -AKW53_RS03275 AKW53_RS03275 -AKW53_RS03275 gnl|Prokka|PADJNBJD_00349 -AKW53_RS03275 NILJEPDF_00349 -AKW53_RS03275 CTRC943_RS01755 -AKW53_RS03275 AP288_RS01305 -AKW53_RS03275 LJHENM_01760 -AKW53_RS03275 JIEJKO_01755 -AKW53_RS03275 BKC03_RS01780 -AKW53_RS03275 CTJTET1_RS01785 -AKW53_RS03275 DU10_RS01800 -AKW53_RS03275 QSDFRQ_00349 -AKW53_RS03275 C15_RS0101815 -AKW53_RS03275 SOTONK1_RS01775 -AKW53_RS03275 A5291_RS01800 -AKW53_RS03275 KW39_RS01785 -AKW53_RS03275 IaCS19096_RS01770 -AKW53_RS03275 119464 -AKW53_RS03275 ECS88FINAL_RS0101805 -AKW53_RS03275 AQ244_RS01335 -AKW53_RS03275 O169_RS01785 -AKW53_RS03275 DU13_RS01795 -AKW53_RS03275 7618519 -AKW53_RS03275 CTL2C_RS03120 -AKW53_RS03275 BKB95_RS01795 -AKW53_RS03275 CBP48_RS03180 -AKW53_RS03275 L1224_RS01750 -AKW53_RS03275 KW36_RS01770 -AKW53_RS03275 AOT15_RS02770 -AKW53_RS03275 BKB96_RS01780 -AKW53_RS03275 SW2_RS01775 -AKW53_RS03275 BKB99_RS01780 -AKW53_RS03275 L1440_RS01750 -AKW53_RS03275 ECS102511_RS01775 -AKW53_RS03275 AQ193_RS02210 -AKW53_RS03275 CBP42_RS03190 -AKW53_RS03275 CTB_RS01800 -AKW53_RS03275 SOTONIA3_RS01785 -AKW53_RS03275 L2BUCH2_RS01750 -AKW53_RS03275 BKB92_RS01790 -AKW53_RS03275 CTO_RS01800 -AKW53_RS03275 E150_RS01780 -AKW53_RS03275 L2BLST_RS01750 -AKW53_RS03275 FCS84708_RS01770 -AKW53_RS03275 BW688_RS03180 -AKW53_RS03275 BKB93_RS01790 -AKW53_RS03275 CBP44_RS03185 -AKW53_RS03275 BBV13_RS01805 -AKW53_RS03275 AQ199_RS02470 -AKW53_RS03275 G9768_RS01775 -AKW53_RS03275 L3404_RS01750 -AKW53_RS03275 BBV16_RS01805 -AKW53_RS03275 BKC02_RS01780 -AKW53_RS03275 BKC01_RS01780 -AKW53_RS03440 AKW53_RS03440 -AKW53_RS03440 gnl|Prokka|PADJNBJD_00382 -AKW53_RS03440 NILJEPDF_00382 -AKW53_RS03440 CTRC943_RS01920 -AKW53_RS03440 AP288_RS01140 -AKW53_RS03440 LJHENM_01925 -AKW53_RS03440 JIEJKO_01920 -AKW53_RS03440 BKC03_RS01945 -AKW53_RS03440 CTJTET1_RS01950 -AKW53_RS03440 QSDFRQ_00382 -AKW53_RS03440 C15_RS0101985 -AKW53_RS03440 SOTONK1_RS01940 -AKW53_RS03440 DU10_RS01970 -AKW53_RS03440 A5291_RS01965 -AKW53_RS03440 KW39_RS01950 -AKW53_RS03440 IaCS19096_RS01935 -AKW53_RS03440 ECS88FINAL_RS0101975 -AKW53_RS03440 AQ244_RS01170 -AKW53_RS03440 O169_RS01950 -AKW53_RS03440 DU13_RS01965 -AKW53_RS03440 7618971 -AKW53_RS03440 120342 -AKW53_RS03440 CTL2C_RS03285 -AKW53_RS03440 L1224_RS01915 -AKW53_RS03440 KW36_RS01935 -AKW53_RS03440 AOT15_RS02935 -AKW53_RS03440 BKB95_RS01965 -AKW53_RS03440 BKB96_RS01945 -AKW53_RS03440 CBP48_RS03350 -AKW53_RS03440 SW2_RS01940 -AKW53_RS03440 BKB99_RS01945 -AKW53_RS03440 L1440_RS01915 -AKW53_RS03440 ECS102511_RS01940 -AKW53_RS03440 AQ193_RS02045 -AKW53_RS03440 CTB_RS01965 -AKW53_RS03440 SOTONIA3_RS01950 -AKW53_RS03440 L2BUCH2_RS01915 -AKW53_RS03440 BKB92_RS01955 -AKW53_RS03440 CBP42_RS03360 -AKW53_RS03440 CTO_RS01965 -AKW53_RS03440 E150_RS01945 -AKW53_RS03440 L2BLST_RS01915 -AKW53_RS03440 BW688_RS03345 -AKW53_RS03440 FCS84708_RS01935 -AKW53_RS03440 BKB93_RS01955 -AKW53_RS03440 BBV13_RS01970 -AKW53_RS03440 CBP44_RS03355 -AKW53_RS03440 AQ199_RS02635 -AKW53_RS03440 G9768_RS01940 -AKW53_RS03440 L3404_RS01915 -AKW53_RS03440 BBV16_RS01970 -AKW53_RS03440 BKC02_RS01945 -AKW53_RS03440 BKC01_RS01945 -AKW53_RS03600 AKW53_RS03600 -AKW53_RS03600 gnl|Prokka|PADJNBJD_00414 -AKW53_RS03600 NILJEPDF_00414 -AKW53_RS03600 CTRC943_RS02080 -AKW53_RS03600 AP288_RS00980 -AKW53_RS03600 LJHENM_02085 -AKW53_RS03600 JIEJKO_02080 -AKW53_RS03600 BKC03_RS02105 -AKW53_RS03600 CTJTET1_RS02110 -AKW53_RS03600 QSDFRQ_00414 -AKW53_RS03600 C15_RS0102145 -AKW53_RS03600 A5291_RS02125 -AKW53_RS03600 SOTONK1_RS02100 -AKW53_RS03600 DU10_RS02130 -AKW53_RS03600 KW39_RS02110 -AKW53_RS03600 IaCS19096_RS02095 -AKW53_RS03600 ECS88FINAL_RS0102140 -AKW53_RS03600 AQ244_RS01010 -AKW53_RS03600 O169_RS02110 -AKW53_RS03600 DU13_RS02125 -AKW53_RS03600 7618549 -AKW53_RS03600 CTL2C_RS03445 -AKW53_RS03600 CBP48_RS03510 -AKW53_RS03600 119513 -AKW53_RS03600 L1224_RS02075 -AKW53_RS03600 KW36_RS02095 -AKW53_RS03600 AOT15_RS03095 -AKW53_RS03600 BKB95_RS02125 -AKW53_RS03600 BKB96_RS02105 -AKW53_RS03600 SW2_RS02100 -AKW53_RS03600 BKB99_RS02105 -AKW53_RS03600 L1440_RS02075 -AKW53_RS03600 ECS102511_RS02100 -AKW53_RS03600 AQ193_RS01885 -AKW53_RS03600 CTB_RS02125 -AKW53_RS03600 CBP42_RS03520 -AKW53_RS03600 SOTONIA3_RS02110 -AKW53_RS03600 L2BUCH2_RS02075 -AKW53_RS03600 BKB92_RS02115 -AKW53_RS03600 CTO_RS02125 -AKW53_RS03600 E150_RS02105 -AKW53_RS03600 L2BLST_RS02075 -AKW53_RS03600 BW688_RS03505 -AKW53_RS03600 FCS84708_RS02095 -AKW53_RS03600 BBV13_RS02130 -AKW53_RS03600 BKB93_RS02115 -AKW53_RS03600 CBP44_RS03515 -AKW53_RS03600 AQ199_RS02795 -AKW53_RS03600 G9768_RS02100 -AKW53_RS03600 BBV16_RS02130 -AKW53_RS03600 L3404_RS02075 -AKW53_RS03600 BKC02_RS02105 -AKW53_RS03600 BKC01_RS02105 -AKW53_RS03770 AKW53_RS03770 -AKW53_RS03770 gnl|Prokka|PADJNBJD_00448 -AKW53_RS03770 NILJEPDF_00448 -AKW53_RS03770 CTRC943_RS02250 -AKW53_RS03770 AP288_RS00810 -AKW53_RS03770 LJHENM_02260 -AKW53_RS03770 JIEJKO_02255 -AKW53_RS03770 BKC03_RS02280 -AKW53_RS03770 CTJTET1_RS02280 -AKW53_RS03770 QSDFRQ_00448 -AKW53_RS03770 C15_RS0102315 -AKW53_RS03770 SOTONK1_RS02270 -AKW53_RS03770 DU10_RS02305 -AKW53_RS03770 A5291_RS02300 -AKW53_RS03770 KW39_RS02280 -AKW53_RS03770 IaCS19096_RS02265 -AKW53_RS03770 ECS88FINAL_RS0102315 -AKW53_RS03770 O169_RS02280 -AKW53_RS03770 AQ244_RS00840 -AKW53_RS03770 DU13_RS02300 -AKW53_RS03770 7618571 -AKW53_RS03770 BKB96_RS02285 -AKW53_RS03770 BKB99_RS02280 -AKW53_RS03770 CBP48_RS03685 -AKW53_RS03770 CTL2C_RS03620 -AKW53_RS03770 KW36_RS02265 -AKW53_RS03770 AOT15_RS03265 -AKW53_RS03770 BKB95_RS02300 -AKW53_RS03770 119547 -AKW53_RS03770 L1224_RS02250 -AKW53_RS03770 SW2_RS02275 -AKW53_RS03770 ECS102511_RS02270 -AKW53_RS03770 L1440_RS02250 -AKW53_RS03770 AQ193_RS01715 -AKW53_RS03770 CBP42_RS03695 -AKW53_RS03770 CTB_RS02300 -AKW53_RS03770 L2BUCH2_RS02245 -AKW53_RS03770 BKB92_RS02290 -AKW53_RS03770 SOTONIA3_RS02285 -AKW53_RS03770 CTO_RS02300 -AKW53_RS03770 E150_RS02275 -AKW53_RS03770 BW688_RS03680 -AKW53_RS03770 L2BLST_RS02250 -AKW53_RS03770 FCS84708_RS02265 -AKW53_RS03770 BBV13_RS02305 -AKW53_RS03770 CBP44_RS03690 -AKW53_RS03770 BKB93_RS02295 -AKW53_RS03770 AQ199_RS02965 -AKW53_RS03770 G9768_RS02270 -AKW53_RS03770 BBV16_RS02310 -AKW53_RS03770 L3404_RS02245 -AKW53_RS03770 BKC02_RS02280 -AKW53_RS03770 BKC01_RS02280 -AKW53_RS04270 AKW53_RS04270 -AKW53_RS04270 BKB96_RS03080 -AKW53_RS04270 BKB99_RS03075 -AKW53_RS04270 7619088 -AKW53_RS04270 SW2_RS03045 -AKW53_RS04270 L1440_RS03015 -AKW53_RS04270 ECS102511_RS03040 -AKW53_RS04270 CBP42_RS04480 -AKW53_RS04270 L2BUCH2_RS03015 -AKW53_RS04270 CTB_RS03075 -AKW53_RS04270 SOTONIA3_RS03060 -AKW53_RS04270 BKB92_RS03075 -AKW53_RS04270 BW688_RS04470 -AKW53_RS04270 120156 -AKW53_RS04270 E150_RS03045 -AKW53_RS04270 CTO_RS03075 -AKW53_RS04270 L2BLST_RS03015 -AKW53_RS04270 CBP44_RS04475 -AKW53_RS04270 FCS84708_RS03040 -AKW53_RS04270 BBV13_RS03080 -AKW53_RS04270 AP288_RS00040 -AKW53_RS04270 AQ199_RS03740 -AKW53_RS04270 BBV16_RS03090 -AKW53_RS04270 BKB93_RS03080 -AKW53_RS04270 G9768_RS03045 -AKW53_RS04270 L3404_RS03010 -AKW53_RS04270 gnl|Prokka|PADJNBJD_00599 -AKW53_RS04270 NILJEPDF_00599 -AKW53_RS04270 LJHENM_03010 -AKW53_RS04270 AQ244_RS00065 -AKW53_RS04270 BKC02_RS03075 -AKW53_RS04270 AOT15_RS03845 -AKW53_RS04270 CTRC943_RS03015 -AKW53_RS04270 BKC01_RS03075 -AKW53_RS04270 QSDFRQ_00599 -AKW53_RS04270 JIEJKO_03020 -AKW53_RS04270 SOTONK1_RS03045 -AKW53_RS04270 CTJTET1_RS03055 -AKW53_RS04270 BKC03_RS03075 -AKW53_RS04270 KW39_RS03055 -AKW53_RS04270 C15_RS0103110 -AKW53_RS04270 ECS88FINAL_RS0103105 -AKW53_RS04270 IaCS19096_RS03040 -AKW53_RS04270 DU10_RS03090 -AKW53_RS04270 A5291_RS03075 -AKW53_RS04270 O169_RS03050 -AKW53_RS04270 AQ193_RS00945 -AKW53_RS04270 CTL2C_RS04385 -AKW53_RS04270 DU13_RS03085 -AKW53_RS04270 CBP48_RS04475 -AKW53_RS04270 L1224_RS03015 -AKW53_RS04270 KW36_RS03040 -AKW53_RS04270 BKB95_RS03085 -AOT15_RS00880 AOT15_RS00880 -AOT15_RS00880 BKC01_RS00075 -AOT15_RS00880 7618359 -AOT15_RS00880 gnl|Prokka|PADJNBJD_00015 -AOT15_RS00880 LJHENM_00075 -AOT15_RS00880 A5291_RS00075 -AOT15_RS00880 SOTONK1_RS00075 -AOT15_RS00880 JIEJKO_00070 -AOT15_RS00880 NILJEPDF_00015 -AOT15_RS00880 L3404_RS00075 -AOT15_RS00880 IaCS19096_RS00075 -AOT15_RS00880 BKC03_RS00075 -AOT15_RS00880 C15_RS0100075 -AOT15_RS00880 AKW53_RS01560 -AOT15_RS00880 QSDFRQ_00015 -AOT15_RS00880 CTJTET1_RS00075 -AOT15_RS00880 DU10_RS00075 -AOT15_RS00880 CTRC943_RS00075 -AOT15_RS00880 O169_RS00075 -AOT15_RS00880 CBP48_RS01465 -AOT15_RS00880 ECS88FINAL_RS0100080 -AOT15_RS00880 DU13_RS00075 -AOT15_RS00880 KW39_RS00075 -AOT15_RS00880 BKB95_RS00075 -AOT15_RS00880 KW36_RS00075 -AOT15_RS00880 SW2_RS00075 -AOT15_RS00880 ECS102511_RS00075 -AOT15_RS00880 CTB_RS00075 -AOT15_RS00880 CTL2C_RS01440 -AOT15_RS00880 CBP42_RS01465 -AOT15_RS00880 AQ193_RS03930 -AOT15_RS00880 L1224_RS00075 -AOT15_RS00880 BKB96_RS00075 -AOT15_RS00880 AQ244_RS01915 -AOT15_RS00880 BKB99_RS00075 -AOT15_RS00880 CTO_RS00075 -AOT15_RS00880 SOTONIA3_RS00075 -AOT15_RS00880 L1440_RS00075 -AOT15_RS00880 BKB92_RS00075 -AOT15_RS00880 119211 -AOT15_RS00880 CBP44_RS01465 -AOT15_RS00880 E150_RS00075 -AOT15_RS00880 L2BUCH2_RS00075 -AOT15_RS00880 BKB93_RS00075 -AOT15_RS00880 FCS84708_RS00075 -AOT15_RS00880 AP288_RS03145 -AOT15_RS00880 BBV13_RS00075 -AOT15_RS00880 G9768_RS00075 -AOT15_RS00880 AQ199_RS00770 -AOT15_RS00880 BW688_RS01465 -AOT15_RS00880 L2BLST_RS00075 -AOT15_RS00880 BKC02_RS00075 -AOT15_RS00880 BBV16_RS00075 -AOT15_RS01890 AOT15_RS01890 -AOT15_RS01890 CTJTET1_RS04480 -AOT15_RS01890 CBP48_RS00915 -AOT15_RS01890 BKC03_RS04345 -AOT15_RS01890 A5291_RS04345 -AOT15_RS01890 KW39_RS04325 -AOT15_RS01890 SOTONK1_RS04310 -AOT15_RS01890 ECS88FINAL_RS0104395 -AOT15_RS01890 IaCS19096_RS04300 -AOT15_RS01890 DU10_RS04360 -AOT15_RS01890 C15_RS0104420 -AOT15_RS01890 DU13_RS04360 -AOT15_RS01890 O169_RS04320 -AOT15_RS01890 KW36_RS04305 -AOT15_RS01890 CBP42_RS00915 -AOT15_RS01890 CTL2C_RS00905 -AOT15_RS01890 L1224_RS04285 -AOT15_RS01890 BKB95_RS04365 -AOT15_RS01890 L1440_RS04280 -AOT15_RS01890 BKB96_RS04350 -AOT15_RS01890 BKB99_RS04345 -AOT15_RS01890 SW2_RS04315 -AOT15_RS01890 ECS102511_RS04305 -AOT15_RS01890 CBP44_RS00915 -AOT15_RS01890 L2BUCH2_RS04285 -AOT15_RS01890 CTB_RS04340 -AOT15_RS01890 SOTONIA3_RS04325 -AOT15_RS01890 BKB92_RS04345 -AOT15_RS01890 CTO_RS04335 -AOT15_RS01890 L2BLST_RS04285 -AOT15_RS01890 AP288_RS02610 -AOT15_RS01890 BBV13_RS04350 -AOT15_RS01890 E150_RS04315 -AOT15_RS01890 AQ193_RS04465 -AOT15_RS01890 gnl|Prokka|PADJNBJD_00844 -AOT15_RS01890 FCS84708_RS04305 -AOT15_RS01890 AQ199_RS00235 -AOT15_RS01890 BBV16_RS04355 -AOT15_RS01890 BW688_RS00915 -AOT15_RS01890 7618301 -AOT15_RS01890 119832 -AOT15_RS01890 NILJEPDF_00845 -AOT15_RS01890 AQ244_RS02450 -AOT15_RS01890 LJHENM_04250 -AOT15_RS01890 L3404_RS04280 -AOT15_RS01890 G9768_RS04310 -AOT15_RS01890 JIEJKO_04250 -AOT15_RS01890 BKB93_RS04350 -AOT15_RS01890 QSDFRQ_00845 -AOT15_RS01890 BKC02_RS04345 -AOT15_RS01890 CTRC943_RS04290 -AOT15_RS01890 AKW53_RS01025 -AOT15_RS01890 BKC01_RS04350 -AOT15_RS02715 AOT15_RS02715 -AOT15_RS02715 CTL2C_RS03065 -AOT15_RS02715 KW36_RS01715 -AOT15_RS02715 BKB96_RS01720 -AOT15_RS02715 CBP48_RS03120 -AOT15_RS02715 SW2_RS01720 -AOT15_RS02715 L1224_RS01695 -AOT15_RS02715 BKB99_RS01720 -AOT15_RS02715 ECS102511_RS01720 -AOT15_RS02715 L1440_RS01695 -AOT15_RS02715 SOTONIA3_RS01730 -AOT15_RS02715 BKB92_RS01730 -AOT15_RS02715 CBP42_RS03120 -AOT15_RS02715 E150_RS01725 -AOT15_RS02715 FCS84708_RS01715 -AOT15_RS02715 AP288_RS01360 -AOT15_RS02715 BKB93_RS01730 -AOT15_RS02715 BW688_RS03120 -AOT15_RS02715 CBP44_RS03125 -AOT15_RS02715 AQ199_RS02415 -AOT15_RS02715 AQ244_RS01390 -AOT15_RS02715 BKC02_RS01720 -AOT15_RS02715 L3404_RS01695 -AOT15_RS02715 AKW53_RS03220 -AOT15_RS02715 gnl|Prokka|PADJNBJD_00338 -AOT15_RS02715 NILJEPDF_00338 -AOT15_RS02715 CTRC943_RS01700 -AOT15_RS02715 BKC03_RS01720 -AOT15_RS02715 LJHENM_01705 -AOT15_RS02715 CTJTET1_RS01730 -AOT15_RS02715 JIEJKO_01700 -AOT15_RS02715 DU10_RS01740 -AOT15_RS02715 C15_RS0101760 -AOT15_RS02715 SOTONK1_RS01720 -AOT15_RS02715 QSDFRQ_00338 -AOT15_RS02715 KW39_RS01730 -AOT15_RS02715 IaCS19096_RS01715 -AOT15_RS02715 AQ193_RS02265 -AOT15_RS02715 ECS88FINAL_RS0101750 -AOT15_RS02715 120375 -AOT15_RS02715 DU13_RS01735 -AOT15_RS02715 BKB95_RS01735 -AOT15_RS03550 AOT15_RS03550 -AOT15_RS03550 L1440_RS02525 -AOT15_RS03550 120262 -AOT15_RS03550 CBP42_RS03975 -AOT15_RS03550 L2BUCH2_RS02525 -AOT15_RS03550 BKB92_RS02570 -AOT15_RS03550 CTB_RS02580 -AOT15_RS03550 SOTONIA3_RS02560 -AOT15_RS03550 E150_RS02550 -AOT15_RS03550 BW688_RS03965 -AOT15_RS03550 CTO_RS02580 -AOT15_RS03550 FCS84708_RS02540 -AOT15_RS03550 L2BLST_RS02525 -AOT15_RS03550 AKW53_RS04670 -AOT15_RS03550 BBV13_RS02585 -AOT15_RS03550 CBP44_RS03970 -AOT15_RS03550 AQ199_RS03240 -AOT15_RS03550 BKB93_RS02575 -AOT15_RS03550 BBV16_RS02595 -AOT15_RS03550 G9768_RS02545 -AOT15_RS03550 AP288_RS00535 -AOT15_RS03550 L3404_RS02520 -AOT15_RS03550 BKC02_RS02565 -AOT15_RS03550 gnl|Prokka|PADJNBJD_00501 -AOT15_RS03550 NILJEPDF_00501 -AOT15_RS03550 LJHENM_02520 -AOT15_RS03550 BKC01_RS02565 -AOT15_RS03550 CTRC943_RS02525 -AOT15_RS03550 AQ244_RS00565 -AOT15_RS03550 JIEJKO_02525 -AOT15_RS03550 QSDFRQ_00501 -AOT15_RS03550 SOTONK1_RS02545 -AOT15_RS03550 BKC03_RS02565 -AOT15_RS03550 CTJTET1_RS02555 -AOT15_RS03550 KW39_RS02555 -AOT15_RS03550 ECS88FINAL_RS0102595 -AOT15_RS03550 IaCS19096_RS02540 -AOT15_RS03550 DU10_RS02585 -AOT15_RS03550 C15_RS0102600 -AOT15_RS03550 O169_RS02555 -AOT15_RS03550 A5291_RS02580 -AOT15_RS03550 DU13_RS02580 -AOT15_RS03550 7619021 -AOT15_RS03550 CBP48_RS03965 -AOT15_RS03550 CTL2C_RS03895 -AOT15_RS03550 KW36_RS02540 -AOT15_RS03550 AQ193_RS01440 -AOT15_RS03550 BKB96_RS02570 -AOT15_RS03550 BKB99_RS02565 -AOT15_RS03550 SW2_RS02550 -AOT15_RS03550 L1224_RS02525 -AOT15_RS03550 ECS102511_RS02545 -AOT15_RS03550 BKB95_RS02580 -AOT15_RS03905 AOT15_RS03905 -AOT15_RS03905 AP288_RS01470 -AOT15_RS03905 CTRC943_RS03075 -AOT15_RS03905 BKC01_RS03135 -AOT15_RS03905 QSDFRQ_00611 -AOT15_RS03905 JIEJKO_03080 -AOT15_RS03905 SOTONK1_RS03105 -AOT15_RS03905 CTJTET1_RS03115 -AOT15_RS03905 BKC03_RS03135 -AOT15_RS03905 KW39_RS03115 -AOT15_RS03905 C15_RS0103170 -AOT15_RS03905 ECS88FINAL_RS0103170 -AOT15_RS03905 IaCS19096_RS03100 -AOT15_RS03905 DU10_RS03150 -AOT15_RS03905 A5291_RS03135 -AOT15_RS03905 O169_RS03110 -AOT15_RS03905 CTL2C_RS04445 -AOT15_RS03905 DU13_RS03145 -AOT15_RS03905 CBP48_RS04535 -AOT15_RS03905 L1224_RS03075 -AOT15_RS03905 KW36_RS03100 -AOT15_RS03905 BKB95_RS03145 -AOT15_RS03905 AKW53_RS04330 -AOT15_RS03905 BKB96_RS03140 -AOT15_RS03905 BKB99_RS03135 -AOT15_RS03905 7618631 -AOT15_RS03905 SW2_RS03105 -AOT15_RS03905 L1440_RS03075 -AOT15_RS03905 ECS102511_RS03100 -AOT15_RS03905 AQ193_RS00885 -AOT15_RS03905 CBP42_RS04540 -AOT15_RS03905 L2BUCH2_RS03075 -AOT15_RS03905 CTB_RS03135 -AOT15_RS03905 SOTONIA3_RS03120 -AOT15_RS03905 BKB92_RS03135 -AOT15_RS03905 BW688_RS04530 -AOT15_RS03905 119640 -AOT15_RS03905 E150_RS03105 -AOT15_RS03905 CTO_RS03135 -AOT15_RS03905 L2BLST_RS03075 -AOT15_RS03905 CBP44_RS04535 -AOT15_RS03905 FCS84708_RS03100 -AOT15_RS03905 BBV13_RS03140 -AOT15_RS03905 AQ199_RS03800 -AOT15_RS03905 BBV16_RS03150 -AOT15_RS03905 BKB93_RS03140 -AOT15_RS03905 G9768_RS03105 -AOT15_RS03905 L3404_RS03070 -AOT15_RS03905 gnl|Prokka|PADJNBJD_00611 -AOT15_RS03905 NILJEPDF_00611 -AOT15_RS03905 LJHENM_03070 -AOT15_RS03905 BKC02_RS03135 -AOT15_RS04755 AOT15_RS04755 -AOT15_RS04755 AP288_RS02325 -AOT15_RS04755 JIEJKO_03920 -AOT15_RS04755 QSDFRQ_00779 -AOT15_RS04755 BKC01_RS03995 -AOT15_RS04755 CTRC943_RS03940 -AOT15_RS04755 AKW53_RS00695 -AOT15_RS04755 BKC03_RS03990 -AOT15_RS04755 CBP48_RS00560 -AOT15_RS04755 CTJTET1_RS03975 -AOT15_RS04755 KW39_RS03970 -AOT15_RS04755 DU10_RS04005 -AOT15_RS04755 A5291_RS04000 -AOT15_RS04755 SOTONK1_RS03955 -AOT15_RS04755 IaCS19096_RS03950 -AOT15_RS04755 DU13_RS04005 -AOT15_RS04755 C15_RS0104060 -AOT15_RS04755 ECS88FINAL_RS0104065 -AOT15_RS04755 O169_RS03965 -AOT15_RS04755 KW36_RS03955 -AOT15_RS04755 AQ244_RS03955 -AOT15_RS04755 BKB95_RS04010 -AOT15_RS04755 CBP42_RS00560 -AOT15_RS04755 CTL2C_RS00555 -AOT15_RS04755 L1224_RS03935 -AOT15_RS04755 SW2_RS03960 -AOT15_RS04755 L1440_RS03930 -AOT15_RS04755 ECS102511_RS03950 -AOT15_RS04755 BKB96_RS03995 -AOT15_RS04755 BKB99_RS03990 -AOT15_RS04755 AQ193_RS00035 -AOT15_RS04755 CBP44_RS00560 -AOT15_RS04755 L2BUCH2_RS03935 -AOT15_RS04755 BKB92_RS03990 -AOT15_RS04755 CTB_RS03995 -AOT15_RS04755 SOTONIA3_RS03975 -AOT15_RS04755 E150_RS03960 -AOT15_RS04755 CTO_RS03990 -AOT15_RS04755 BBV13_RS03995 -AOT15_RS04755 FCS84708_RS03950 -AOT15_RS04755 L2BLST_RS03935 -AOT15_RS04755 BBV16_RS04005 -AOT15_RS04755 7618265 -AOT15_RS04755 119777 -AOT15_RS04755 BW688_RS00560 -AOT15_RS04755 AQ199_RS04650 -AOT15_RS04755 BKB93_RS03995 -AOT15_RS04755 G9768_RS03955 -AOT15_RS04755 gnl|Prokka|PADJNBJD_00778 -AOT15_RS04755 L3404_RS03930 -AOT15_RS04755 NILJEPDF_00779 -AOT15_RS04755 BKC02_RS03990 -AOT15_RS04755 LJHENM_03920 -AP288_RS00290 AP288_RS00290 -AP288_RS00290 L3404_RS02765 -AP288_RS00290 BKC02_RS02815 -AP288_RS00290 gnl|Prokka|PADJNBJD_00550 -AP288_RS00290 NILJEPDF_00550 -AP288_RS00290 BKC01_RS02815 -AP288_RS00290 LJHENM_02770 -AP288_RS00290 CTRC943_RS02770 -AP288_RS00290 AOT15_RS01590 -AP288_RS00290 AQ244_RS00320 -AP288_RS00290 QSDFRQ_00550 -AP288_RS00290 JIEJKO_02775 -AP288_RS00290 SOTONK1_RS02790 -AP288_RS00290 CTJTET1_RS02800 -AP288_RS00290 BKC03_RS02815 -AP288_RS00290 KW39_RS02800 -AP288_RS00290 C15_RS0102860 -AP288_RS00290 ECS88FINAL_RS0102855 -AP288_RS00290 IaCS19096_RS02785 -AP288_RS00290 DU10_RS02835 -AP288_RS00290 O169_RS02800 -AP288_RS00290 A5291_RS02825 -AP288_RS00290 DU13_RS02830 -AP288_RS00290 CBP48_RS04215 -AP288_RS00290 7619061 -AP288_RS00290 CTL2C_RS04140 -AP288_RS00290 KW36_RS02785 -AP288_RS00290 AKW53_RS04015 -AP288_RS00290 AQ193_RS01195 -AP288_RS00290 BKB95_RS02830 -AP288_RS00290 BKB96_RS02820 -AP288_RS00290 BKB99_RS02815 -AP288_RS00290 SW2_RS02795 -AP288_RS00290 L1224_RS02770 -AP288_RS00290 ECS102511_RS02790 -AP288_RS00290 L1440_RS02770 -AP288_RS00290 120198 -AP288_RS00290 CBP42_RS04225 -AP288_RS00290 L2BUCH2_RS02770 -AP288_RS00290 SOTONIA3_RS02805 -AP288_RS00290 BKB92_RS02820 -AP288_RS00290 CTB_RS02825 -AP288_RS00290 E150_RS02795 -AP288_RS00290 BW688_RS04215 -AP288_RS00290 CTO_RS02825 -AP288_RS00290 FCS84708_RS02785 -AP288_RS00290 L2BLST_RS02770 -AP288_RS00290 BBV13_RS02830 -AP288_RS00290 CBP44_RS04220 -AP288_RS00290 AQ199_RS03485 -AP288_RS00290 BKB93_RS02825 -AP288_RS00290 BBV16_RS02840 -AP288_RS00290 G9768_RS02790 -AP288_RS00455 AP288_RS00455 -AP288_RS00455 L3404_RS02600 -AP288_RS00455 BKC02_RS02645 -AP288_RS00455 BKC01_RS02645 -AP288_RS00455 gnl|Prokka|PADJNBJD_00518 -AP288_RS00455 NILJEPDF_00518 -AP288_RS00455 LJHENM_02605 -AP288_RS00455 CTRC943_RS02605 -AP288_RS00455 AQ244_RS00485 -AP288_RS00455 SOTONK1_RS02625 -AP288_RS00455 CTJTET1_RS02635 -AP288_RS00455 JIEJKO_02610 -AP288_RS00455 BKC03_RS02645 -AP288_RS00455 QSDFRQ_00518 -AP288_RS00455 KW39_RS02635 -AP288_RS00455 C15_RS0102690 -AP288_RS00455 ECS88FINAL_RS0102685 -AP288_RS00455 IaCS19096_RS02620 -AP288_RS00455 DU10_RS02665 -AP288_RS00455 O169_RS02635 -AP288_RS00455 A5291_RS02660 -AP288_RS00455 DU13_RS02660 -AP288_RS00455 CBP48_RS04045 -AP288_RS00455 CTL2C_RS03975 -AP288_RS00455 KW36_RS02620 -AP288_RS00455 AQ193_RS01360 -AP288_RS00455 BKB95_RS02660 -AP288_RS00455 BKB96_RS02650 -AP288_RS00455 BKB99_RS02645 -AP288_RS00455 7619032 -AP288_RS00455 SW2_RS02630 -AP288_RS00455 L1224_RS02605 -AP288_RS00455 ECS102511_RS02625 -AP288_RS00455 AOT15_RS03470 -AP288_RS00455 L1440_RS02605 -AP288_RS00455 CBP42_RS04055 -AP288_RS00455 120244 -AP288_RS00455 L2BUCH2_RS02605 -AP288_RS00455 SOTONIA3_RS02640 -AP288_RS00455 BKB92_RS02650 -AP288_RS00455 CTB_RS02660 -AP288_RS00455 E150_RS02630 -AP288_RS00455 BW688_RS04045 -AP288_RS00455 CTO_RS02660 -AP288_RS00455 FCS84708_RS02620 -AP288_RS00455 L2BLST_RS02605 -AP288_RS00455 AKW53_RS04590 -AP288_RS00455 BBV13_RS02665 -AP288_RS00455 CBP44_RS04050 -AP288_RS00455 AQ199_RS03320 -AP288_RS00455 BKB93_RS02655 -AP288_RS00455 BBV16_RS02675 -AP288_RS00455 G9768_RS02625 -AP288_RS00970 AP288_RS00970 -AP288_RS00970 BKC01_RS02115 -AP288_RS00970 AKW53_RS03610 -AP288_RS00970 gnl|Prokka|PADJNBJD_00416 -AP288_RS00970 NILJEPDF_00416 -AP288_RS00970 CTRC943_RS02090 -AP288_RS00970 LJHENM_02095 -AP288_RS00970 AQ244_RS01000 -AP288_RS00970 JIEJKO_02090 -AP288_RS00970 BKC03_RS02115 -AP288_RS00970 CTJTET1_RS02120 -AP288_RS00970 QSDFRQ_00416 -AP288_RS00970 C15_RS0102155 -AP288_RS00970 A5291_RS02135 -AP288_RS00970 SOTONK1_RS02110 -AP288_RS00970 DU10_RS02140 -AP288_RS00970 KW39_RS02120 -AP288_RS00970 IaCS19096_RS02105 -AP288_RS00970 ECS88FINAL_RS0102150 -AP288_RS00970 O169_RS02120 -AP288_RS00970 DU13_RS02135 -AP288_RS00970 7618551 -AP288_RS00970 CTL2C_RS03455 -AP288_RS00970 CBP48_RS03520 -AP288_RS00970 119516 -AP288_RS00970 L1224_RS02085 -AP288_RS00970 KW36_RS02105 -AP288_RS00970 AOT15_RS03105 -AP288_RS00970 BKB95_RS02135 -AP288_RS00970 BKB96_RS02115 -AP288_RS00970 SW2_RS02110 -AP288_RS00970 AQ193_RS01875 -AP288_RS00970 BKB99_RS02115 -AP288_RS00970 L1440_RS02085 -AP288_RS00970 ECS102511_RS02110 -AP288_RS00970 CTB_RS02135 -AP288_RS00970 CBP42_RS03530 -AP288_RS00970 SOTONIA3_RS02120 -AP288_RS00970 L2BUCH2_RS02085 -AP288_RS00970 BKB92_RS02125 -AP288_RS00970 CTO_RS02135 -AP288_RS00970 E150_RS02115 -AP288_RS00970 L2BLST_RS02085 -AP288_RS00970 BW688_RS03515 -AP288_RS00970 FCS84708_RS02105 -AP288_RS00970 BBV13_RS02140 -AP288_RS00970 BKB93_RS02125 -AP288_RS00970 CBP44_RS03525 -AP288_RS00970 AQ199_RS02805 -AP288_RS00970 G9768_RS02110 -AP288_RS00970 BBV16_RS02140 -AP288_RS00970 L3404_RS02085 -AP288_RS00970 BKC02_RS02115 -AP288_RS01130 AP288_RS01130 -AP288_RS01130 BKC01_RS01955 -AP288_RS01130 AKW53_RS03450 -AP288_RS01130 gnl|Prokka|PADJNBJD_00384 -AP288_RS01130 NILJEPDF_00384 -AP288_RS01130 CTRC943_RS01930 -AP288_RS01130 LJHENM_01935 -AP288_RS01130 AQ244_RS01160 -AP288_RS01130 JIEJKO_01930 -AP288_RS01130 BKC03_RS01955 -AP288_RS01130 CTJTET1_RS01960 -AP288_RS01130 QSDFRQ_00384 -AP288_RS01130 C15_RS0101995 -AP288_RS01130 SOTONK1_RS01950 -AP288_RS01130 DU10_RS01980 -AP288_RS01130 A5291_RS01975 -AP288_RS01130 KW39_RS01960 -AP288_RS01130 IaCS19096_RS01945 -AP288_RS01130 ECS88FINAL_RS0101985 -AP288_RS01130 O169_RS01960 -AP288_RS01130 DU13_RS01975 -AP288_RS01130 7618533 -AP288_RS01130 119487 -AP288_RS01130 CTL2C_RS03295 -AP288_RS01130 L1224_RS01925 -AP288_RS01130 KW36_RS01945 -AP288_RS01130 AOT15_RS02945 -AP288_RS01130 BKB95_RS01975 -AP288_RS01130 BKB96_RS01955 -AP288_RS01130 CBP48_RS03360 -AP288_RS01130 SW2_RS01950 -AP288_RS01130 AQ193_RS02035 -AP288_RS01130 BKB99_RS01955 -AP288_RS01130 L1440_RS01925 -AP288_RS01130 ECS102511_RS01950 -AP288_RS01130 CTB_RS01975 -AP288_RS01130 SOTONIA3_RS01960 -AP288_RS01130 L2BUCH2_RS01925 -AP288_RS01130 BKB92_RS01965 -AP288_RS01130 CBP42_RS03370 -AP288_RS01130 CTO_RS01975 -AP288_RS01130 E150_RS01955 -AP288_RS01130 L2BLST_RS01925 -AP288_RS01130 BW688_RS03355 -AP288_RS01130 FCS84708_RS01945 -AP288_RS01130 BKB93_RS01965 -AP288_RS01130 BBV13_RS01980 -AP288_RS01130 CBP44_RS03365 -AP288_RS01130 AQ199_RS02645 -AP288_RS01130 G9768_RS01950 -AP288_RS01130 L3404_RS01925 -AP288_RS01130 BBV16_RS01980 -AP288_RS01130 BKC02_RS01955 -AP288_RS01295 AP288_RS01295 -AP288_RS01295 BKC01_RS01790 -AP288_RS01295 AKW53_RS03285 -AP288_RS01295 gnl|Prokka|PADJNBJD_00351 -AP288_RS01295 NILJEPDF_00351 -AP288_RS01295 CTRC943_RS01765 -AP288_RS01295 LJHENM_01770 -AP288_RS01295 AQ244_RS01325 -AP288_RS01295 JIEJKO_01765 -AP288_RS01295 BKC03_RS01790 -AP288_RS01295 CTJTET1_RS01795 -AP288_RS01295 DU10_RS01810 -AP288_RS01295 QSDFRQ_00351 -AP288_RS01295 C15_RS0101825 -AP288_RS01295 SOTONK1_RS01785 -AP288_RS01295 A5291_RS01810 -AP288_RS01295 KW39_RS01795 -AP288_RS01295 IaCS19096_RS01780 -AP288_RS01295 120370 -AP288_RS01295 ECS88FINAL_RS0101815 -AP288_RS01295 O169_RS01795 -AP288_RS01295 DU13_RS01805 -AP288_RS01295 7618953 -AP288_RS01295 CTL2C_RS03130 -AP288_RS01295 BKB95_RS01805 -AP288_RS01295 CBP48_RS03190 -AP288_RS01295 L1224_RS01760 -AP288_RS01295 KW36_RS01780 -AP288_RS01295 AOT15_RS02780 -AP288_RS01295 BKB96_RS01790 -AP288_RS01295 SW2_RS01785 -AP288_RS01295 AQ193_RS02200 -AP288_RS01295 BKB99_RS01790 -AP288_RS01295 L1440_RS01760 -AP288_RS01295 ECS102511_RS01785 -AP288_RS01295 CBP42_RS03200 -AP288_RS01295 CTB_RS01810 -AP288_RS01295 SOTONIA3_RS01795 -AP288_RS01295 L2BUCH2_RS01760 -AP288_RS01295 BKB92_RS01800 -AP288_RS01295 CTO_RS01810 -AP288_RS01295 E150_RS01790 -AP288_RS01295 L2BLST_RS01760 -AP288_RS01295 FCS84708_RS01780 -AP288_RS01295 BW688_RS03190 -AP288_RS01295 BKB93_RS01800 -AP288_RS01295 CBP44_RS03195 -AP288_RS01295 BBV13_RS01815 -AP288_RS01295 AQ199_RS02480 -AP288_RS01295 G9768_RS01785 -AP288_RS01295 L3404_RS01760 -AP288_RS01295 BBV16_RS01815 -AP288_RS01295 BKC02_RS01790 -AP288_RS01650 AP288_RS01650 -AP288_RS01650 BKC02_RS03310 -AP288_RS01650 NILJEPDF_00646 -AP288_RS01650 LJHENM_03245 -AP288_RS01650 AOT15_RS04080 -AP288_RS01650 CTRC943_RS03255 -AP288_RS01650 JIEJKO_03250 -AP288_RS01650 BKC01_RS03310 -AP288_RS01650 QSDFRQ_00646 -AP288_RS01650 KW39_RS03295 -AP288_RS01650 BKC03_RS03310 -AP288_RS01650 CTJTET1_RS03295 -AP288_RS01650 ECS88FINAL_RS0103345 -AP288_RS01650 AQ244_RS04635 -AP288_RS01650 DU10_RS03325 -AP288_RS01650 SOTONK1_RS03280 -AP288_RS01650 O169_RS03290 -AP288_RS01650 IaCS19096_RS03275 -AP288_RS01650 C15_RS0103345 -AP288_RS01650 A5291_RS03320 -AP288_RS01650 AKW53_RS00030 -AP288_RS01650 DU13_RS03320 -AP288_RS01650 CTL2C_RS04625 -AP288_RS01650 CBP48_RS04710 -AP288_RS01650 7619110 -AP288_RS01650 SW2_RS03285 -AP288_RS01650 L1224_RS03255 -AP288_RS01650 KW36_RS03280 -AP288_RS01650 ECS102511_RS03280 -AP288_RS01650 L1440_RS03255 -AP288_RS01650 BKB95_RS03325 -AP288_RS01650 BKB96_RS03320 -AP288_RS01650 BKB99_RS03315 -AP288_RS01650 AQ193_RS00705 -AP288_RS01650 CBP42_RS04715 -AP288_RS01650 L2BUCH2_RS03255 -AP288_RS01650 BKB92_RS03310 -AP288_RS01650 CTB_RS03320 -AP288_RS01650 E150_RS03285 -AP288_RS01650 SOTONIA3_RS03300 -AP288_RS01650 BW688_RS04705 -AP288_RS01650 CTO_RS03315 -AP288_RS01650 FCS84708_RS03280 -AP288_RS01650 BBV13_RS03320 -AP288_RS01650 L2BLST_RS03255 -AP288_RS01650 CBP44_RS04710 -AP288_RS01650 120119 -AP288_RS01650 AQ199_RS03980 -AP288_RS01650 BBV16_RS03330 -AP288_RS01650 BKB93_RS03315 -AP288_RS01650 G9768_RS03280 -AP288_RS01650 L3404_RS03250 -AP288_RS01650 gnl|Prokka|PADJNBJD_00645 -AP288_RS02510 AP288_RS02510 -AP288_RS02510 BBV13_RS04250 -AP288_RS02510 119983 -AP288_RS02510 E150_RS04215 -AP288_RS02510 7618729 -AP288_RS02510 L2BLST_RS04185 -AP288_RS02510 FCS84708_RS04205 -AP288_RS02510 AQ199_RS00135 -AP288_RS02510 BBV16_RS04255 -AP288_RS02510 BW688_RS00815 -AP288_RS02510 gnl|Prokka|PADJNBJD_00826 -AP288_RS02510 NILJEPDF_00827 -AP288_RS02510 G9768_RS04210 -AP288_RS02510 L3404_RS04180 -AP288_RS02510 BKB93_RS04250 -AP288_RS02510 LJHENM_04160 -AP288_RS02510 JIEJKO_04160 -AP288_RS02510 BKC02_RS04245 -AP288_RS02510 QSDFRQ_00827 -AP288_RS02510 AQ193_RS04565 -AP288_RS02510 AKW53_RS00925 -AP288_RS02510 AQ244_RS02555 -AP288_RS02510 BKC01_RS04250 -AP288_RS02510 CTRC943_RS04190 -AP288_RS02510 AOT15_RS01790 -AP288_RS02510 CTJTET1_RS04380 -AP288_RS02510 BKC03_RS04245 -AP288_RS02510 CBP48_RS00815 -AP288_RS02510 A5291_RS04245 -AP288_RS02510 KW39_RS04225 -AP288_RS02510 SOTONK1_RS04210 -AP288_RS02510 ECS88FINAL_RS0104295 -AP288_RS02510 IaCS19096_RS04200 -AP288_RS02510 DU10_RS04260 -AP288_RS02510 C15_RS0104320 -AP288_RS02510 DU13_RS04260 -AP288_RS02510 O169_RS04220 -AP288_RS02510 KW36_RS04205 -AP288_RS02510 BKB95_RS04265 -AP288_RS02510 CBP42_RS00815 -AP288_RS02510 CTL2C_RS00805 -AP288_RS02510 L1224_RS04185 -AP288_RS02510 BKB96_RS04250 -AP288_RS02510 L1440_RS04180 -AP288_RS02510 BKB99_RS04245 -AP288_RS02510 SW2_RS04215 -AP288_RS02510 ECS102511_RS04205 -AP288_RS02510 CBP44_RS00815 -AP288_RS02510 CTB_RS04240 -AP288_RS02510 L2BUCH2_RS04185 -AP288_RS02510 SOTONIA3_RS04225 -AP288_RS02510 BKB92_RS04245 -AP288_RS02510 CTO_RS04235 -AP288_RS02675 AP288_RS02675 -AP288_RS02675 BBV16_RS04415 -AP288_RS02675 E150_RS04380 -AP288_RS02675 gnl|Prokka|PADJNBJD_00856 -AP288_RS02675 BW688_RS00980 -AP288_RS02675 7618311 -AP288_RS02675 FCS84708_RS04365 -AP288_RS02675 AQ199_RS00300 -AP288_RS02675 119848 -AP288_RS02675 NILJEPDF_00857 -AP288_RS02675 LJHENM_04310 -AP288_RS02675 L3404_RS04340 -AP288_RS02675 G9768_RS04370 -AP288_RS02675 JIEJKO_04310 -AP288_RS02675 QSDFRQ_00857 -AP288_RS02675 BKB93_RS04415 -AP288_RS02675 BKC02_RS04410 -AP288_RS02675 AQ193_RS04400 -AP288_RS02675 CTRC943_RS04350 -AP288_RS02675 BKC01_RS04415 -AP288_RS02675 AKW53_RS01090 -AP288_RS02675 AOT15_RS01950 -AP288_RS02675 CTJTET1_RS04540 -AP288_RS02675 AQ244_RS02380 -AP288_RS02675 CBP48_RS00980 -AP288_RS02675 BKC03_RS04410 -AP288_RS02675 A5291_RS04405 -AP288_RS02675 KW39_RS04385 -AP288_RS02675 SOTONK1_RS04370 -AP288_RS02675 IaCS19096_RS04365 -AP288_RS02675 C15_RS0104480 -AP288_RS02675 ECS88FINAL_RS0104460 -AP288_RS02675 DU10_RS04425 -AP288_RS02675 KW36_RS04370 -AP288_RS02675 DU13_RS04425 -AP288_RS02675 O169_RS04385 -AP288_RS02675 CBP42_RS00980 -AP288_RS02675 CTL2C_RS00965 -AP288_RS02675 L1224_RS04345 -AP288_RS02675 BKB95_RS04430 -AP288_RS02675 L1440_RS04340 -AP288_RS02675 BKB96_RS04415 -AP288_RS02675 BKB99_RS04410 -AP288_RS02675 SW2_RS04375 -AP288_RS02675 ECS102511_RS04370 -AP288_RS02675 CBP44_RS00980 -AP288_RS02675 L2BUCH2_RS04345 -AP288_RS02675 CTB_RS04400 -AP288_RS02675 SOTONIA3_RS04385 -AP288_RS02675 CTO_RS04395 -AP288_RS02675 BKB92_RS04410 -AP288_RS02675 L2BLST_RS04345 -AP288_RS02675 BBV13_RS04410 -AP288_RS02840 AP288_RS02840 -AP288_RS02840 BBV16_RS04580 -AP288_RS02840 E150_RS04545 -AP288_RS02840 gnl|Prokka|PADJNBJD_00889 -AP288_RS02840 L2BLST_RS04510 -AP288_RS02840 FCS84708_RS04530 -AP288_RS02840 AQ199_RS00465 -AP288_RS02840 NILJEPDF_00890 -AP288_RS02840 BW688_RS01160 -AP288_RS02840 119879 -AP288_RS02840 JIEJKO_04475 -AP288_RS02840 7618332 -AP288_RS02840 QSDFRQ_00890 -AP288_RS02840 G9768_RS04530 -AP288_RS02840 LJHENM_04485 -AP288_RS02840 L3404_RS04505 -AP288_RS02840 BKB93_RS04595 -AP288_RS02840 BKC02_RS04585 -AP288_RS02840 AQ193_RS04235 -AP288_RS02840 AKW53_RS01255 -AP288_RS02840 BKC01_RS04590 -AP288_RS02840 CTRC943_RS04515 -AP288_RS02840 AOT15_RS02110 -AP288_RS02840 AQ244_RS02220 -AP288_RS02840 CTJTET1_RS04700 -AP288_RS02840 KW39_RS04550 -AP288_RS02840 BKC03_RS04585 -AP288_RS02840 CBP48_RS01160 -AP288_RS02840 A5291_RS04565 -AP288_RS02840 SOTONK1_RS04530 -AP288_RS02840 ECS88FINAL_RS0104640 -AP288_RS02840 IaCS19096_RS04525 -AP288_RS02840 C15_RS0104660 -AP288_RS02840 DU10_RS04605 -AP288_RS02840 O169_RS04550 -AP288_RS02840 KW36_RS04530 -AP288_RS02840 DU13_RS04605 -AP288_RS02840 BKB95_RS04605 -AP288_RS02840 CBP42_RS01160 -AP288_RS02840 CTL2C_RS01130 -AP288_RS02840 L1224_RS04510 -AP288_RS02840 BKB96_RS04590 -AP288_RS02840 L1440_RS04505 -AP288_RS02840 BKB99_RS04585 -AP288_RS02840 SW2_RS04540 -AP288_RS02840 ECS102511_RS04535 -AP288_RS02840 CBP44_RS01160 -AP288_RS02840 CTB_RS04560 -AP288_RS02840 L2BUCH2_RS04510 -AP288_RS02840 SOTONIA3_RS04545 -AP288_RS02840 CTO_RS04555 -AP288_RS02840 BBV13_RS04575 -AP288_RS02840 BKB92_RS04590 -AP288_RS03020 AP288_RS03020 -AP288_RS03020 BKB92_RS04765 -AP288_RS03020 gnl|Prokka|PADJNBJD_00923 -AP288_RS03020 CTO_RS04730 -AP288_RS03020 L2BLST_RS04690 -AP288_RS03020 BBV13_RS04750 -AP288_RS03020 E150_RS04725 -AP288_RS03020 BBV16_RS04755 -AP288_RS03020 NILJEPDF_00924 -AP288_RS03020 FCS84708_RS04710 -AP288_RS03020 AQ199_RS00645 -AP288_RS03020 BW688_RS01340 -AP288_RS03020 119919 -AP288_RS03020 JIEJKO_04645 -AP288_RS03020 QSDFRQ_00924 -AP288_RS03020 LJHENM_04655 -AP288_RS03020 L3404_RS04685 -AP288_RS03020 G9768_RS04710 -AP288_RS03020 7618772 -AP288_RS03020 AQ193_RS04055 -AP288_RS03020 BKB93_RS04770 -AP288_RS03020 BKC02_RS04760 -AP288_RS03020 AQ244_RS02040 -AP288_RS03020 CTRC943_RS04695 -AP288_RS03020 AKW53_RS01435 -AP288_RS03020 BKC01_RS04765 -AP288_RS03020 AOT15_RS02290 -AP288_RS03020 CTJTET1_RS04880 -AP288_RS03020 CBP48_RS01340 -AP288_RS03020 KW39_RS04730 -AP288_RS03020 BKC03_RS04760 -AP288_RS03020 SOTONK1_RS04710 -AP288_RS03020 A5291_RS04740 -AP288_RS03020 ECS88FINAL_RS0104810 -AP288_RS03020 IaCS19096_RS04705 -AP288_RS03020 C15_RS0104830 -AP288_RS03020 DU10_RS04780 -AP288_RS03020 O169_RS04730 -AP288_RS03020 KW36_RS04710 -AP288_RS03020 DU13_RS04780 -AP288_RS03020 CTL2C_RS01310 -AP288_RS03020 CBP42_RS01340 -AP288_RS03020 L1224_RS04690 -AP288_RS03020 BKB95_RS04780 -AP288_RS03020 L1440_RS04685 -AP288_RS03020 BKB96_RS04765 -AP288_RS03020 BKB99_RS04760 -AP288_RS03020 SW2_RS04720 -AP288_RS03020 ECS102511_RS04715 -AP288_RS03020 CBP44_RS01340 -AP288_RS03020 L2BUCH2_RS04690 -AP288_RS03020 CTB_RS04735 -AP288_RS03020 SOTONIA3_RS04725 -AP288_RS04050 AP288_RS04050 -AP288_RS04050 BKB93_RS00985 -AP288_RS04050 CBP44_RS02380 -AP288_RS04050 AQ199_RS01675 -AP288_RS04050 L2BLST_RS00970 -AP288_RS04050 BW688_RS02380 -AP288_RS04050 BBV13_RS01015 -AP288_RS04050 G9768_RS00990 -AP288_RS04050 BKC02_RS00985 -AP288_RS04050 L3404_RS00965 -AP288_RS04050 AKW53_RS02475 -AP288_RS04050 120523 -AP288_RS04050 BBV16_RS01015 -AP288_RS04050 BKC01_RS00985 -AP288_RS04050 AQ193_RS03010 -AP288_RS04050 DU10_RS00995 -AP288_RS04050 gnl|Prokka|PADJNBJD_00193 -AP288_RS04050 BKC03_RS00985 -AP288_RS04050 NILJEPDF_00193 -AP288_RS04050 LJHENM_00970 -AP288_RS04050 CTRC943_RS00970 -AP288_RS04050 CTJTET1_RS01000 -AP288_RS04050 C15_RS0101020 -AP288_RS04050 SOTONK1_RS00985 -AP288_RS04050 ECS88FINAL_RS0101005 -AP288_RS04050 KW39_RS00990 -AP288_RS04050 JIEJKO_00970 -AP288_RS04050 7618864 -AP288_RS04050 A5291_RS01010 -AP288_RS04050 IaCS19096_RS00985 -AP288_RS04050 QSDFRQ_00193 -AP288_RS04050 O169_RS00990 -AP288_RS04050 DU13_RS00995 -AP288_RS04050 SW2_RS00980 -AP288_RS04050 BKB95_RS01000 -AP288_RS04050 CBP48_RS02375 -AP288_RS04050 KW36_RS00985 -AP288_RS04050 ECS102511_RS00980 -AP288_RS04050 BKB96_RS00985 -AP288_RS04050 CTL2C_RS02335 -AP288_RS04050 BKB99_RS00985 -AP288_RS04050 L1224_RS00965 -AP288_RS04050 L1440_RS00965 -AP288_RS04050 AQ244_RS03165 -AP288_RS04050 BKB92_RS00985 -AP288_RS04050 CBP42_RS02375 -AP288_RS04050 SOTONIA3_RS01000 -AP288_RS04050 E150_RS00980 -AP288_RS04050 CTB_RS01010 -AP288_RS04050 AOT15_RS01380 -AP288_RS04050 L2BUCH2_RS00970 -AP288_RS04050 CTO_RS01010 -AP288_RS04050 FCS84708_RS00980 -AP288_RS04220 AP288_RS04220 -AP288_RS04220 BKB93_RS01155 -AP288_RS04220 CBP44_RS02550 -AP288_RS04220 AQ199_RS01845 -AP288_RS04220 L2BLST_RS01140 -AP288_RS04220 BW688_RS02550 -AP288_RS04220 BBV13_RS01185 -AP288_RS04220 G9768_RS01160 -AP288_RS04220 BKC02_RS01155 -AP288_RS04220 L3404_RS01135 -AP288_RS04220 AKW53_RS02645 -AP288_RS04220 BBV16_RS01185 -AP288_RS04220 BKC01_RS01155 -AP288_RS04220 119391 -AP288_RS04220 AQ193_RS02840 -AP288_RS04220 DU10_RS01165 -AP288_RS04220 gnl|Prokka|PADJNBJD_00227 -AP288_RS04220 BKC03_RS01155 -AP288_RS04220 NILJEPDF_00227 -AP288_RS04220 LJHENM_01140 -AP288_RS04220 CTRC943_RS01140 -AP288_RS04220 CTJTET1_RS01170 -AP288_RS04220 C15_RS0101190 -AP288_RS04220 SOTONK1_RS01155 -AP288_RS04220 ECS88FINAL_RS0101175 -AP288_RS04220 KW39_RS01160 -AP288_RS04220 JIEJKO_01140 -AP288_RS04220 A5291_RS01180 -AP288_RS04220 IaCS19096_RS01155 -AP288_RS04220 7618472 -AP288_RS04220 QSDFRQ_00227 -AP288_RS04220 O169_RS01160 -AP288_RS04220 DU13_RS01165 -AP288_RS04220 SW2_RS01150 -AP288_RS04220 BKB95_RS01170 -AP288_RS04220 CBP48_RS02545 -AP288_RS04220 KW36_RS01155 -AP288_RS04220 ECS102511_RS01150 -AP288_RS04220 BKB96_RS01155 -AP288_RS04220 CTL2C_RS02505 -AP288_RS04220 BKB99_RS01155 -AP288_RS04220 L1224_RS01135 -AP288_RS04220 L1440_RS01135 -AP288_RS04220 AQ244_RS03335 -AP288_RS04220 BKB92_RS01155 -AP288_RS04220 CBP42_RS02545 -AP288_RS04220 SOTONIA3_RS01170 -AP288_RS04220 E150_RS01150 -AP288_RS04220 CTB_RS01180 -AP288_RS04220 AOT15_RS01210 -AP288_RS04220 L2BUCH2_RS01140 -AP288_RS04220 CTO_RS01180 -AP288_RS04220 FCS84708_RS01150 -AP288_RS04390 AP288_RS04390 -AP288_RS04390 BKB93_RS01325 -AP288_RS04390 CBP44_RS02720 -AP288_RS04390 AQ199_RS02015 -AP288_RS04390 L2BLST_RS01310 -AP288_RS04390 BBV13_RS01355 -AP288_RS04390 BW688_RS02720 -AP288_RS04390 G9768_RS01330 -AP288_RS04390 BKC02_RS01325 -AP288_RS04390 BBV16_RS01355 -AP288_RS04390 L3404_RS01305 -AP288_RS04390 AKW53_RS02815 -AP288_RS04390 BKC01_RS01325 -AP288_RS04390 AQ193_RS02670 -AP288_RS04390 gnl|Prokka|PADJNBJD_00260 -AP288_RS04390 DU10_RS01335 -AP288_RS04390 NILJEPDF_00260 -AP288_RS04390 LJHENM_01305 -AP288_RS04390 BKC03_RS01325 -AP288_RS04390 CTRC943_RS01310 -AP288_RS04390 CTJTET1_RS01340 -AP288_RS04390 KW39_RS01330 -AP288_RS04390 JIEJKO_01305 -AP288_RS04390 120468 -AP288_RS04390 C15_RS0101360 -AP288_RS04390 SOTONK1_RS01325 -AP288_RS04390 ECS88FINAL_RS0101345 -AP288_RS04390 QSDFRQ_00260 -AP288_RS04390 A5291_RS01350 -AP288_RS04390 O169_RS01330 -AP288_RS04390 IaCS19096_RS01325 -AP288_RS04390 DU13_RS01335 -AP288_RS04390 7618899 -AP288_RS04390 SW2_RS01320 -AP288_RS04390 BKB95_RS01340 -AP288_RS04390 CBP48_RS02715 -AP288_RS04390 KW36_RS01325 -AP288_RS04390 ECS102511_RS01320 -AP288_RS04390 BKB96_RS01325 -AP288_RS04390 CTL2C_RS02675 -AP288_RS04390 BKB99_RS01325 -AP288_RS04390 L1224_RS01305 -AP288_RS04390 L1440_RS01305 -AP288_RS04390 AQ244_RS03505 -AP288_RS04390 BKB92_RS01325 -AP288_RS04390 CBP42_RS02715 -AP288_RS04390 SOTONIA3_RS01340 -AP288_RS04390 CTB_RS01350 -AP288_RS04390 E150_RS01320 -AP288_RS04390 AOT15_RS01040 -AP288_RS04390 L2BUCH2_RS01310 -AP288_RS04390 CTO_RS01350 -AP288_RS04390 FCS84708_RS01320 -AP288_RS04550 AP288_RS04550 -AP288_RS04550 BKB93_RS01495 -AP288_RS04550 CBP44_RS02885 -AP288_RS04550 AQ199_RS02175 -AP288_RS04550 L2BLST_RS01470 -AP288_RS04550 BBV13_RS01520 -AP288_RS04550 BW688_RS02890 -AP288_RS04550 G9768_RS01490 -AP288_RS04550 BKC02_RS01490 -AP288_RS04550 AKW53_RS02980 -AP288_RS04550 BBV16_RS01520 -AP288_RS04550 L3404_RS01465 -AP288_RS04550 AQ193_RS02505 -AP288_RS04550 BKC01_RS01495 -AP288_RS04550 gnl|Prokka|PADJNBJD_00292 -AP288_RS04550 DU10_RS01500 -AP288_RS04550 NILJEPDF_00292 -AP288_RS04550 LJHENM_01470 -AP288_RS04550 BKC03_RS01490 -AP288_RS04550 CTRC943_RS01470 -AP288_RS04550 CTJTET1_RS01500 -AP288_RS04550 KW39_RS01490 -AP288_RS04550 JIEJKO_01470 -AP288_RS04550 C15_RS0101525 -AP288_RS04550 SOTONK1_RS01490 -AP288_RS04550 ECS88FINAL_RS0101510 -AP288_RS04550 120443 -AP288_RS04550 QSDFRQ_00292 -AP288_RS04550 IaCS19096_RS01485 -AP288_RS04550 A5291_RS01515 -AP288_RS04550 O169_RS01495 -AP288_RS04550 DU13_RS01500 -AP288_RS04550 SW2_RS01480 -AP288_RS04550 BKB95_RS01505 -AP288_RS04550 CBP48_RS02880 -AP288_RS04550 7618915 -AP288_RS04550 KW36_RS01485 -AP288_RS04550 ECS102511_RS01480 -AP288_RS04550 AOT15_RS02485 -AP288_RS04550 BKB96_RS01490 -AP288_RS04550 CTL2C_RS02835 -AP288_RS04550 BKB99_RS01490 -AP288_RS04550 L1224_RS01465 -AP288_RS04550 L1440_RS01465 -AP288_RS04550 AQ244_RS03670 -AP288_RS04550 CBP42_RS02880 -AP288_RS04550 SOTONIA3_RS01500 -AP288_RS04550 BKB92_RS01495 -AP288_RS04550 CTB_RS01515 -AP288_RS04550 E150_RS01485 -AP288_RS04550 L2BUCH2_RS01470 -AP288_RS04550 CTO_RS01510 -AP288_RS04550 FCS84708_RS01480 -AP288_RS04865 AP288_RS04865 -AP288_RS04865 IaCS19096_RS04780 -AP288_RS04865 L1224_RS04775 -AP288_RS04865 ECS102511_RS04785 -AP288_RS04865 AOT15_RS03410 -AP288_RS04865 L2BUCH2_RS04775 -AP288_RS04865 SOTONIA3_RS04810 -AP288_RS04865 BBV13_RS04820 -AP288_RS04865 L2BLST_RS04775 -AP288_RS04865 BBV16_RS04825 -AP288_RS04865 FCS84708_RS04780 -AP288_RS04865 AQ193_RS04765 -AP288_RS04865 CTO_RS04820 -AP288_RS04865 NILJEPDF_00939 -AP288_RS04865 gnl|Prokka|PADJNBJD_00941 -AP288_RS04865 L3404_RS04770 -AP288_RS04865 QSDFRQ_00939 -AP288_RS04865 AQ199_RS04820 -AP288_RS04865 AQ244_RS04900 -AP288_RS04865 A5291_RS04825 -AP288_RS04865 SOTONK1_RS04795 -AQ193_RS00280 AQ193_RS00280 -AQ193_RS00280 CBP44_RS00315 -AQ193_RS00280 L2BUCH2_RS03690 -AQ193_RS00280 BKB92_RS03745 -AQ193_RS00280 CTB_RS03750 -AQ193_RS00280 SOTONIA3_RS03730 -AQ193_RS00280 E150_RS03715 -AQ193_RS00280 CTO_RS03745 -AQ193_RS00280 BBV13_RS03750 -AQ193_RS00280 FCS84708_RS03705 -AQ193_RS00280 BBV16_RS03760 -AQ193_RS00280 L2BLST_RS03690 -AQ193_RS00280 119743 -AQ193_RS00280 BW688_RS00315 -AQ193_RS00280 7618243 -AQ193_RS00280 AQ199_RS04405 -AQ193_RS00280 BKB93_RS03750 -AQ193_RS00280 G9768_RS03710 -AQ193_RS00280 gnl|Prokka|PADJNBJD_00730 -AQ193_RS00280 L3404_RS03685 -AQ193_RS00280 BKC02_RS03745 -AQ193_RS00280 NILJEPDF_00731 -AQ193_RS00280 LJHENM_03680 -AQ193_RS00280 AOT15_RS04510 -AQ193_RS00280 AP288_RS02080 -AQ193_RS00280 JIEJKO_03680 -AQ193_RS00280 BKC01_RS03750 -AQ193_RS00280 QSDFRQ_00731 -AQ193_RS00280 CTRC943_RS03695 -AQ193_RS00280 AKW53_RS00450 -AQ193_RS00280 BKC03_RS03745 -AQ193_RS00280 CTJTET1_RS03730 -AQ193_RS00280 KW39_RS03725 -AQ193_RS00280 DU10_RS03760 -AQ193_RS00280 CBP48_RS00315 -AQ193_RS00280 A5291_RS03755 -AQ193_RS00280 SOTONK1_RS03710 -AQ193_RS00280 IaCS19096_RS03705 -AQ193_RS00280 DU13_RS03760 -AQ193_RS00280 C15_RS0103815 -AQ193_RS00280 ECS88FINAL_RS0103815 -AQ193_RS00280 O169_RS03720 -AQ193_RS00280 KW36_RS03710 -AQ193_RS00280 AQ244_RS04200 -AQ193_RS00280 BKB95_RS03765 -AQ193_RS00280 CBP42_RS00315 -AQ193_RS00280 SW2_RS03715 -AQ193_RS00280 CTL2C_RS00310 -AQ193_RS00280 L1224_RS03690 -AQ193_RS00280 ECS102511_RS03705 -AQ193_RS00280 BKB96_RS03750 -AQ193_RS00280 BKB99_RS03745 -AQ193_RS00280 L1440_RS03690 -AQ193_RS00455 AQ193_RS00455 -AQ193_RS00455 CBP44_RS00135 -AQ193_RS00455 L2BUCH2_RS03515 -AQ193_RS00455 BKB92_RS03565 -AQ193_RS00455 CTB_RS03575 -AQ193_RS00455 SOTONIA3_RS03555 -AQ193_RS00455 E150_RS03540 -AQ193_RS00455 CTO_RS03570 -AQ193_RS00455 BBV13_RS03575 -AQ193_RS00455 FCS84708_RS03530 -AQ193_RS00455 L2BLST_RS03515 -AQ193_RS00455 BBV16_RS03585 -AQ193_RS00455 BW688_RS00135 -AQ193_RS00455 AQ199_RS04230 -AQ193_RS00455 BKB93_RS03570 -AQ193_RS00455 7618220 -AQ193_RS00455 119708 -AQ193_RS00455 G9768_RS03535 -AQ193_RS00455 gnl|Prokka|PADJNBJD_00695 -AQ193_RS00455 L3404_RS03510 -AQ193_RS00455 BKC02_RS03565 -AQ193_RS00455 NILJEPDF_00696 -AQ193_RS00455 LJHENM_03495 -AQ193_RS00455 AOT15_RS04335 -AQ193_RS00455 AP288_RS01900 -AQ193_RS00455 JIEJKO_03500 -AQ193_RS00455 BKC01_RS03565 -AQ193_RS00455 QSDFRQ_00696 -AQ193_RS00455 CTRC943_RS03520 -AQ193_RS00455 BKC03_RS03565 -AQ193_RS00455 CBP48_RS00135 -AQ193_RS00455 CTJTET1_RS03555 -AQ193_RS00455 KW39_RS03550 -AQ193_RS00455 DU10_RS03580 -AQ193_RS00455 SOTONK1_RS03535 -AQ193_RS00455 ECS88FINAL_RS0103620 -AQ193_RS00455 IaCS19096_RS03530 -AQ193_RS00455 C15_RS0103610 -AQ193_RS00455 A5291_RS03580 -AQ193_RS00455 O169_RS03545 -AQ193_RS00455 DU13_RS03580 -AQ193_RS00455 AQ244_RS04375 -AQ193_RS00455 KW36_RS03535 -AQ193_RS00455 AKW53_RS00280 -AQ193_RS00455 BKB95_RS03585 -AQ193_RS00455 CBP42_RS00135 -AQ193_RS00455 SW2_RS03540 -AQ193_RS00455 CTL2C_RS00135 -AQ193_RS00455 L1224_RS03515 -AQ193_RS00455 ECS102511_RS03530 -AQ193_RS00455 L1440_RS03515 -AQ193_RS00455 BKB96_RS03575 -AQ193_RS00455 BKB99_RS03570 -AQ193_RS00630 AQ193_RS00630 -AQ193_RS00630 CBP42_RS04795 -AQ193_RS00630 L2BUCH2_RS03340 -AQ193_RS00630 CTB_RS03395 -AQ193_RS00630 BKB92_RS03390 -AQ193_RS00630 SOTONIA3_RS03375 -AQ193_RS00630 E150_RS03365 -AQ193_RS00630 CTO_RS03390 -AQ193_RS00630 BBV13_RS03395 -AQ193_RS00630 BW688_RS04785 -AQ193_RS00630 FCS84708_RS03355 -AQ193_RS00630 L2BLST_RS03340 -AQ193_RS00630 CBP44_RS04790 -AQ193_RS00630 119677 -AQ193_RS00630 BBV16_RS03405 -AQ193_RS00630 AQ199_RS04055 -AQ193_RS00630 BKB93_RS03395 -AQ193_RS00630 G9768_RS03355 -AQ193_RS00630 gnl|Prokka|PADJNBJD_00660 -AQ193_RS00630 L3404_RS03335 -AQ193_RS00630 BKC02_RS03390 -AQ193_RS00630 NILJEPDF_00661 -AQ193_RS00630 LJHENM_03320 -AQ193_RS00630 AOT15_RS04155 -AQ193_RS00630 AP288_RS01725 -AQ193_RS00630 JIEJKO_03325 -AQ193_RS00630 BKC01_RS03390 -AQ193_RS00630 QSDFRQ_00661 -AQ193_RS00630 CTRC943_RS03340 -AQ193_RS00630 BKC03_RS03390 -AQ193_RS00630 CTJTET1_RS03375 -AQ193_RS00630 KW39_RS03375 -AQ193_RS00630 DU10_RS03405 -AQ193_RS00630 SOTONK1_RS03355 -AQ193_RS00630 ECS88FINAL_RS0103425 -AQ193_RS00630 IaCS19096_RS03350 -AQ193_RS00630 C15_RS0103420 -AQ193_RS00630 A5291_RS03400 -AQ193_RS00630 O169_RS03370 -AQ193_RS00630 DU13_RS03405 -AQ193_RS00630 AQ244_RS04555 -AQ193_RS00630 AKW53_RS00105 -AQ193_RS00630 KW36_RS03355 -AQ193_RS00630 CTL2C_RS04710 -AQ193_RS00630 BKB95_RS03410 -AQ193_RS00630 CBP48_RS04790 -AQ193_RS00630 7618655 -AQ193_RS00630 SW2_RS03365 -AQ193_RS00630 L1224_RS03340 -AQ193_RS00630 ECS102511_RS03355 -AQ193_RS00630 L1440_RS03340 -AQ193_RS00630 BKB96_RS03400 -AQ193_RS00630 BKB99_RS03395 -AQ193_RS00790 AQ193_RS00790 -AQ193_RS00790 CBP42_RS04630 -AQ193_RS00790 L2BUCH2_RS03170 -AQ193_RS00790 BKB92_RS03225 -AQ193_RS00790 CTB_RS03235 -AQ193_RS00790 E150_RS03200 -AQ193_RS00790 SOTONIA3_RS03215 -AQ193_RS00790 BW688_RS04620 -AQ193_RS00790 CTO_RS03230 -AQ193_RS00790 FCS84708_RS03195 -AQ193_RS00790 L2BLST_RS03170 -AQ193_RS00790 BBV13_RS03235 -AQ193_RS00790 CBP44_RS04625 -AQ193_RS00790 120130 -AQ193_RS00790 AQ199_RS03895 -AQ193_RS00790 BKB93_RS03230 -AQ193_RS00790 BBV16_RS03245 -AQ193_RS00790 G9768_RS03195 -AQ193_RS00790 L3404_RS03165 -AQ193_RS00790 gnl|Prokka|PADJNBJD_00628 -AQ193_RS00790 AP288_RS01565 -AQ193_RS00790 BKC02_RS03225 -AQ193_RS00790 NILJEPDF_00629 -AQ193_RS00790 LJHENM_03160 -AQ193_RS00790 AOT15_RS03995 -AQ193_RS00790 CTRC943_RS03170 -AQ193_RS00790 JIEJKO_03165 -AQ193_RS00790 BKC01_RS03225 -AQ193_RS00790 QSDFRQ_00629 -AQ193_RS00790 KW39_RS03210 -AQ193_RS00790 BKC03_RS03225 -AQ193_RS00790 CTJTET1_RS03210 -AQ193_RS00790 ECS88FINAL_RS0103260 -AQ193_RS00790 AQ244_RS04720 -AQ193_RS00790 DU10_RS03240 -AQ193_RS00790 SOTONK1_RS03195 -AQ193_RS00790 O169_RS03205 -AQ193_RS00790 IaCS19096_RS03190 -AQ193_RS00790 C15_RS0103260 -AQ193_RS00790 A5291_RS03235 -AQ193_RS00790 DU13_RS03235 -AQ193_RS00790 CTL2C_RS04540 -AQ193_RS00790 AKW53_RS04420 -AQ193_RS00790 CBP48_RS04625 -AQ193_RS00790 7619103 -AQ193_RS00790 SW2_RS03200 -AQ193_RS00790 L1224_RS03170 -AQ193_RS00790 KW36_RS03195 -AQ193_RS00790 ECS102511_RS03195 -AQ193_RS00790 L1440_RS03170 -AQ193_RS00790 BKB95_RS03240 -AQ193_RS00790 BKB96_RS03235 -AQ193_RS00790 BKB99_RS03230 -AQ193_RS00965 AQ193_RS00965 -AQ193_RS00965 CBP42_RS04460 -AQ193_RS00965 L2BUCH2_RS02995 -AQ193_RS00965 CTB_RS03055 -AQ193_RS00965 SOTONIA3_RS03040 -AQ193_RS00965 BKB92_RS03055 -AQ193_RS00965 BW688_RS04450 -AQ193_RS00965 119632 -AQ193_RS00965 E150_RS03025 -AQ193_RS00965 CTO_RS03055 -AQ193_RS00965 L2BLST_RS02995 -AQ193_RS00965 CBP44_RS04455 -AQ193_RS00965 FCS84708_RS03020 -AQ193_RS00965 BBV13_RS03060 -AQ193_RS00965 AQ199_RS03720 -AQ193_RS00965 BBV16_RS03070 -AQ193_RS00965 BKB93_RS03060 -AQ193_RS00965 G9768_RS03025 -AQ193_RS00965 L3404_RS02990 -AQ193_RS00965 gnl|Prokka|PADJNBJD_00595 -AQ193_RS00965 NILJEPDF_00595 -AQ193_RS00965 LJHENM_02990 -AQ193_RS00965 BKC02_RS03055 -AQ193_RS00965 AOT15_RS03825 -AQ193_RS00965 CTRC943_RS02995 -AQ193_RS00965 BKC01_RS03055 -AQ193_RS00965 QSDFRQ_00595 -AQ193_RS00965 AP288_RS00060 -AQ193_RS00965 JIEJKO_03000 -AQ193_RS00965 SOTONK1_RS03025 -AQ193_RS00965 CTJTET1_RS03035 -AQ193_RS00965 BKC03_RS03055 -AQ193_RS00965 KW39_RS03035 -AQ193_RS00965 C15_RS0103090 -AQ193_RS00965 ECS88FINAL_RS01000000104955 -AQ193_RS00965 IaCS19096_RS03020 -AQ193_RS00965 AQ244_RS00085 -AQ193_RS00965 DU10_RS03070 -AQ193_RS00965 A5291_RS03055 -AQ193_RS00965 O169_RS03030 -AQ193_RS00965 CTL2C_RS04365 -AQ193_RS00965 DU13_RS03065 -AQ193_RS00965 CBP48_RS04455 -AQ193_RS00965 L1224_RS02995 -AQ193_RS00965 KW36_RS03020 -AQ193_RS00965 BKB95_RS03065 -AQ193_RS00965 AKW53_RS04250 -AQ193_RS00965 BKB96_RS03060 -AQ193_RS00965 BKB99_RS03055 -AQ193_RS00965 7618626 -AQ193_RS00965 SW2_RS03025 -AQ193_RS00965 L1440_RS02995 -AQ193_RS00965 ECS102511_RS03020 -AQ193_RS01125 AQ193_RS01125 -AQ193_RS01125 CBP42_RS04295 -AQ193_RS01125 120177 -AQ193_RS01125 L2BUCH2_RS02840 -AQ193_RS01125 SOTONIA3_RS02875 -AQ193_RS01125 BKB92_RS02890 -AQ193_RS01125 CTB_RS02895 -AQ193_RS01125 E150_RS02865 -AQ193_RS01125 BW688_RS04285 -AQ193_RS01125 CTO_RS02895 -AQ193_RS01125 FCS84708_RS02855 -AQ193_RS01125 L2BLST_RS02840 -AQ193_RS01125 BBV13_RS02900 -AQ193_RS01125 CBP44_RS04290 -AQ193_RS01125 AQ199_RS03555 -AQ193_RS01125 BKB93_RS02895 -AQ193_RS01125 BBV16_RS02910 -AQ193_RS01125 G9768_RS02860 -AQ193_RS01125 L3404_RS02835 -AQ193_RS01125 BKC02_RS02885 -AQ193_RS01125 gnl|Prokka|PADJNBJD_00564 -AQ193_RS01125 NILJEPDF_00564 -AQ193_RS01125 BKC01_RS02885 -AQ193_RS01125 LJHENM_02840 -AQ193_RS01125 AP288_RS00220 -AQ193_RS01125 CTRC943_RS02840 -AQ193_RS01125 AOT15_RS01660 -AQ193_RS01125 QSDFRQ_00564 -AQ193_RS01125 JIEJKO_02845 -AQ193_RS01125 SOTONK1_RS02860 -AQ193_RS01125 CTJTET1_RS02870 -AQ193_RS01125 BKC03_RS02885 -AQ193_RS01125 KW39_RS02870 -AQ193_RS01125 C15_RS0102930 -AQ193_RS01125 ECS88FINAL_RS0102925 -AQ193_RS01125 IaCS19096_RS02855 -AQ193_RS01125 AQ244_RS00250 -AQ193_RS01125 DU10_RS02905 -AQ193_RS01125 O169_RS02870 -AQ193_RS01125 A5291_RS02895 -AQ193_RS01125 DU13_RS02900 -AQ193_RS01125 CBP48_RS04285 -AQ193_RS01125 CTL2C_RS04210 -AQ193_RS01125 KW36_RS02855 -AQ193_RS01125 AKW53_RS04085 -AQ193_RS01125 BKB95_RS02900 -AQ193_RS01125 BKB96_RS02890 -AQ193_RS01125 BKB99_RS02885 -AQ193_RS01125 7619075 -AQ193_RS01125 SW2_RS02865 -AQ193_RS01125 L1224_RS02840 -AQ193_RS01125 ECS102511_RS02860 -AQ193_RS01125 L1440_RS02840 -AQ193_RS01290 AQ193_RS01290 -AQ193_RS01290 120228 -AQ193_RS01290 CBP42_RS04130 -AQ193_RS01290 L2BUCH2_RS02675 -AQ193_RS01290 SOTONIA3_RS02710 -AQ193_RS01290 BKB92_RS02725 -AQ193_RS01290 CTB_RS02730 -AQ193_RS01290 E150_RS02700 -AQ193_RS01290 BW688_RS04120 -AQ193_RS01290 CTO_RS02730 -AQ193_RS01290 FCS84708_RS02690 -AQ193_RS01290 L2BLST_RS02675 -AQ193_RS01290 BBV13_RS02735 -AQ193_RS01290 CBP44_RS04125 -AQ193_RS01290 AQ199_RS03390 -AQ193_RS01290 BKB93_RS02730 -AQ193_RS01290 BBV16_RS02745 -AQ193_RS01290 G9768_RS02695 -AQ193_RS01290 AKW53_RS04520 -AQ193_RS01290 L3404_RS02670 -AQ193_RS01290 BKC02_RS02720 -AQ193_RS01290 gnl|Prokka|PADJNBJD_00531 -AQ193_RS01290 NILJEPDF_00531 -AQ193_RS01290 BKC01_RS02720 -AQ193_RS01290 LJHENM_02675 -AQ193_RS01290 AP288_RS00385 -AQ193_RS01290 CTRC943_RS02675 -AQ193_RS01290 AOT15_RS01495 -AQ193_RS01290 QSDFRQ_00531 -AQ193_RS01290 JIEJKO_02680 -AQ193_RS01290 SOTONK1_RS02695 -AQ193_RS01290 CTJTET1_RS02705 -AQ193_RS01290 BKC03_RS02720 -AQ193_RS01290 KW39_RS02705 -AQ193_RS01290 C15_RS0102765 -AQ193_RS01290 ECS88FINAL_RS0102760 -AQ193_RS01290 IaCS19096_RS02690 -AQ193_RS01290 AQ244_RS00415 -AQ193_RS01290 DU10_RS02740 -AQ193_RS01290 O169_RS02705 -AQ193_RS01290 A5291_RS02730 -AQ193_RS01290 DU13_RS02735 -AQ193_RS01290 CBP48_RS04120 -AQ193_RS01290 7619042 -AQ193_RS01290 CTL2C_RS04045 -AQ193_RS01290 KW36_RS02690 -AQ193_RS01290 BKB95_RS02735 -AQ193_RS01290 BKB96_RS02725 -AQ193_RS01290 BKB99_RS02720 -AQ193_RS01290 SW2_RS02700 -AQ193_RS01290 L1224_RS02675 -AQ193_RS01290 ECS102511_RS02695 -AQ193_RS01290 L1440_RS02675 -AQ193_RS01455 AQ193_RS01455 -AQ193_RS01455 CTB_RS02565 -AQ193_RS01455 SOTONIA3_RS02545 -AQ193_RS01455 BKB92_RS02555 -AQ193_RS01455 E150_RS02535 -AQ193_RS01455 CTO_RS02565 -AQ193_RS01455 FCS84708_RS02525 -AQ193_RS01455 BBV13_RS02570 -AQ193_RS01455 AQ199_RS03225 -AQ193_RS01455 BBV16_RS02580 -AQ193_RS01455 BKB93_RS02560 -AQ193_RS01455 G9768_RS02530 -AQ193_RS01455 AKW53_RS04685 -AQ193_RS01455 L3404_RS02505 -AQ193_RS01455 BKC01_RS02550 -AQ193_RS01455 AP288_RS00550 -AQ193_RS01455 CTJTET1_RS02540 -AQ193_RS01455 KW39_RS02540 -AQ193_RS01455 C15_RS0102590 -AQ193_RS01455 ECS88FINAL_RS0102585 -AQ193_RS01455 DU10_RS02570 -AQ193_RS01455 A5291_RS02565 -AQ193_RS01455 O169_RS02540 -AQ193_RS01455 DU13_RS02565 -AQ193_RS01455 BKB96_RS02555 -AQ193_RS01455 BKB99_RS02550 -AQ193_RS01455 BKB95_RS02565 -AQ193_RS01455 SW2_RS02535 -AQ193_RS01455 ECS102511_RS02530 -AQ193_RS01640 AQ193_RS01640 -AQ193_RS01640 CBP42_RS03775 -AQ193_RS01640 CTB_RS02375 -AQ193_RS01640 L2BUCH2_RS02320 -AQ193_RS01640 BKB92_RS02370 -AQ193_RS01640 SOTONIA3_RS02360 -AQ193_RS01640 CTO_RS02375 -AQ193_RS01640 E150_RS02350 -AQ193_RS01640 BW688_RS03760 -AQ193_RS01640 L2BLST_RS02325 -AQ193_RS01640 FCS84708_RS02340 -AQ193_RS01640 BBV13_RS02380 -AQ193_RS01640 CBP44_RS03770 -AQ193_RS01640 BKB93_RS02375 -AQ193_RS01640 AQ199_RS03040 -AQ193_RS01640 G9768_RS02345 -AQ193_RS01640 BBV16_RS02385 -AQ193_RS01640 L3404_RS02320 -AQ193_RS01640 BKC02_RS02360 -AQ193_RS01640 BKC01_RS02360 -AQ193_RS01640 gnl|Prokka|PADJNBJD_00463 -AQ193_RS01640 AKW53_RS03845 -AQ193_RS01640 NILJEPDF_00463 -AQ193_RS01640 LJHENM_02335 -AQ193_RS01640 CTRC943_RS02325 -AQ193_RS01640 AP288_RS00735 -AQ193_RS01640 JIEJKO_02335 -AQ193_RS01640 BKC03_RS02360 -AQ193_RS01640 QSDFRQ_00463 -AQ193_RS01640 CTJTET1_RS02355 -AQ193_RS01640 C15_RS0102395 -AQ193_RS01640 SOTONK1_RS02345 -AQ193_RS01640 DU10_RS02385 -AQ193_RS01640 A5291_RS02375 -AQ193_RS01640 KW39_RS02355 -AQ193_RS01640 IaCS19096_RS02340 -AQ193_RS01640 ECS88FINAL_RS0102395 -AQ193_RS01640 O169_RS02355 -AQ193_RS01640 AQ244_RS00765 -AQ193_RS01640 DU13_RS02380 -AQ193_RS01640 7618577 -AQ193_RS01640 BKB96_RS02365 -AQ193_RS01640 BKB99_RS02360 -AQ193_RS01640 CBP48_RS03765 -AQ193_RS01640 119556 -AQ193_RS01640 CTL2C_RS03695 -AQ193_RS01640 KW36_RS02340 -AQ193_RS01640 AOT15_RS03340 -AQ193_RS01640 BKB95_RS02380 -AQ193_RS01640 L1224_RS02325 -AQ193_RS01640 SW2_RS02350 -AQ193_RS01640 ECS102511_RS02345 -AQ193_RS01640 L1440_RS02325 -AQ193_RS01805 AQ193_RS01805 -AQ193_RS01805 CTB_RS02205 -AQ193_RS01805 CBP42_RS03605 -AQ193_RS01805 SOTONIA3_RS02190 -AQ193_RS01805 L2BUCH2_RS02155 -AQ193_RS01805 BKB92_RS02200 -AQ193_RS01805 CTO_RS02205 -AQ193_RS01805 E150_RS02185 -AQ193_RS01805 L2BLST_RS02155 -AQ193_RS01805 BBV13_RS02215 -AQ193_RS01805 BW688_RS03590 -AQ193_RS01805 FCS84708_RS02175 -AQ193_RS01805 BKB93_RS02200 -AQ193_RS01805 CBP44_RS03600 -AQ193_RS01805 AQ199_RS02875 -AQ193_RS01805 BBV16_RS02215 -AQ193_RS01805 G9768_RS02180 -AQ193_RS01805 L3404_RS02155 -AQ193_RS01805 BKC02_RS02190 -AQ193_RS01805 BKC01_RS02190 -AQ193_RS01805 AKW53_RS03680 -AQ193_RS01805 gnl|Prokka|PADJNBJD_00430 -AQ193_RS01805 NILJEPDF_00430 -AQ193_RS01805 CTRC943_RS02160 -AQ193_RS01805 AP288_RS00900 -AQ193_RS01805 LJHENM_02170 -AQ193_RS01805 JIEJKO_02165 -AQ193_RS01805 BKC03_RS02190 -AQ193_RS01805 CTJTET1_RS02190 -AQ193_RS01805 QSDFRQ_00430 -AQ193_RS01805 C15_RS0102225 -AQ193_RS01805 A5291_RS02205 -AQ193_RS01805 SOTONK1_RS02180 -AQ193_RS01805 DU10_RS02215 -AQ193_RS01805 KW39_RS02190 -AQ193_RS01805 IaCS19096_RS02175 -AQ193_RS01805 ECS88FINAL_RS0102220 -AQ193_RS01805 O169_RS02190 -AQ193_RS01805 AQ244_RS00930 -AQ193_RS01805 DU13_RS02210 -AQ193_RS01805 7618558 -AQ193_RS01805 CTL2C_RS03525 -AQ193_RS01805 BKB96_RS02190 -AQ193_RS01805 CBP48_RS03595 -AQ193_RS01805 119527 -AQ193_RS01805 L1224_RS02155 -AQ193_RS01805 KW36_RS02175 -AQ193_RS01805 AOT15_RS03175 -AQ193_RS01805 BKB95_RS02210 -AQ193_RS01805 BKB99_RS02190 -AQ193_RS01805 SW2_RS02180 -AQ193_RS01805 L1440_RS02155 -AQ193_RS01805 ECS102511_RS02180 -AQ193_RS01965 AQ193_RS01965 -AQ193_RS01965 CTB_RS02045 -AQ193_RS01965 CBP42_RS03440 -AQ193_RS01965 SOTONIA3_RS02030 -AQ193_RS01965 L2BUCH2_RS01995 -AQ193_RS01965 BKB92_RS02035 -AQ193_RS01965 CTO_RS02045 -AQ193_RS01965 E150_RS02025 -AQ193_RS01965 L2BLST_RS01995 -AQ193_RS01965 BW688_RS03425 -AQ193_RS01965 FCS84708_RS02015 -AQ193_RS01965 BBV13_RS02050 -AQ193_RS01965 BKB93_RS02035 -AQ193_RS01965 CBP44_RS03435 -AQ193_RS01965 AQ199_RS02715 -AQ193_RS01965 G9768_RS02020 -AQ193_RS01965 BBV16_RS02050 -AQ193_RS01965 L3404_RS01995 -AQ193_RS01965 BKC02_RS02025 -AQ193_RS01965 BKC01_RS02025 -AQ193_RS01965 AKW53_RS03520 -AQ193_RS01965 gnl|Prokka|PADJNBJD_00398 -AQ193_RS01965 NILJEPDF_00398 -AQ193_RS01965 CTRC943_RS02000 -AQ193_RS01965 AP288_RS01060 -AQ193_RS01965 LJHENM_02005 -AQ193_RS01965 JIEJKO_02000 -AQ193_RS01965 BKC03_RS02025 -AQ193_RS01965 CTJTET1_RS02030 -AQ193_RS01965 QSDFRQ_00398 -AQ193_RS01965 C15_RS0102065 -AQ193_RS01965 A5291_RS02045 -AQ193_RS01965 SOTONK1_RS02020 -AQ193_RS01965 DU10_RS02050 -AQ193_RS01965 KW39_RS02030 -AQ193_RS01965 IaCS19096_RS02015 -AQ193_RS01965 ECS88FINAL_RS0102060 -AQ193_RS01965 AQ244_RS01090 -AQ193_RS01965 O169_RS02030 -AQ193_RS01965 DU13_RS02045 -AQ193_RS01965 7618977 -AQ193_RS01965 CTL2C_RS03365 -AQ193_RS01965 CBP48_RS03430 -AQ193_RS01965 120333 -AQ193_RS01965 L1224_RS01995 -AQ193_RS01965 KW36_RS02015 -AQ193_RS01965 AOT15_RS03015 -AQ193_RS01965 BKB95_RS02045 -AQ193_RS01965 BKB96_RS02025 -AQ193_RS01965 SW2_RS02020 -AQ193_RS01965 BKB99_RS02025 -AQ193_RS01965 L1440_RS01995 -AQ193_RS01965 ECS102511_RS02020 -AQ193_RS02130 AQ193_RS02130 -AQ193_RS02130 CBP42_RS03270 -AQ193_RS02130 CTB_RS01880 -AQ193_RS02130 SOTONIA3_RS01865 -AQ193_RS02130 L2BUCH2_RS01830 -AQ193_RS02130 BKB92_RS01870 -AQ193_RS02130 CTO_RS01880 -AQ193_RS02130 E150_RS01860 -AQ193_RS02130 L2BLST_RS01830 -AQ193_RS02130 FCS84708_RS01850 -AQ193_RS02130 BW688_RS03260 -AQ193_RS02130 BKB93_RS01870 -AQ193_RS02130 CBP44_RS03265 -AQ193_RS02130 BBV13_RS01885 -AQ193_RS02130 AQ199_RS02550 -AQ193_RS02130 G9768_RS01855 -AQ193_RS02130 L3404_RS01830 -AQ193_RS02130 BBV16_RS01885 -AQ193_RS02130 BKC02_RS01860 -AQ193_RS02130 BKC01_RS01860 -AQ193_RS02130 AKW53_RS03355 -AQ193_RS02130 gnl|Prokka|PADJNBJD_00365 -AQ193_RS02130 NILJEPDF_00365 -AQ193_RS02130 CTRC943_RS01835 -AQ193_RS02130 AP288_RS01225 -AQ193_RS02130 LJHENM_01840 -AQ193_RS02130 JIEJKO_01835 -AQ193_RS02130 BKC03_RS01860 -AQ193_RS02130 CTJTET1_RS01865 -AQ193_RS02130 DU10_RS01880 -AQ193_RS02130 QSDFRQ_00365 -AQ193_RS02130 C15_RS0101895 -AQ193_RS02130 SOTONK1_RS01855 -AQ193_RS02130 A5291_RS01880 -AQ193_RS02130 KW39_RS01865 -AQ193_RS02130 IaCS19096_RS01850 -AQ193_RS02130 ECS88FINAL_RS0101885 -AQ193_RS02130 AQ244_RS01255 -AQ193_RS02130 DU13_RS01875 -AQ193_RS02130 119476 -AQ193_RS02130 O169_RS01865 -AQ193_RS02130 7618527 -AQ193_RS02130 CTL2C_RS03200 -AQ193_RS02130 BKB95_RS01875 -AQ193_RS02130 CBP48_RS03260 -AQ193_RS02130 L1224_RS01830 -AQ193_RS02130 KW36_RS01850 -AQ193_RS02130 AOT15_RS02850 -AQ193_RS02130 BKB96_RS01860 -AQ193_RS02130 SW2_RS01855 -AQ193_RS02130 BKB99_RS01860 -AQ193_RS02130 L1440_RS01830 -AQ193_RS02130 ECS102511_RS01855 -AQ193_RS02290 AQ193_RS02290 -AQ193_RS02290 BKB92_RS01710 -AQ193_RS02290 E150_RS01700 -AQ193_RS02290 FCS84708_RS04830 -AQ193_RS02290 BKB93_RS01710 -AQ193_RS02290 AQ199_RS02390 -AQ193_RS02290 AKW53_RS03195 -AQ193_RS02290 AP288_RS01385 -AQ193_RS02290 DU10_RS01720 -AQ193_RS02290 KW39_RS01705 -AQ193_RS02290 ECS88FINAL_RS0101725 -AQ193_RS02290 O169_RS04815 -AQ193_RS02290 DU13_RS01715 -AQ193_RS02290 SW2_RS01695 -AQ193_RS02290 ECS102511_RS01695 -AQ193_RS02460 AQ193_RS02460 -AQ193_RS02460 L1440_RS01510 -AQ193_RS02460 AQ244_RS03715 -AQ193_RS02460 CBP42_RS02925 -AQ193_RS02460 SOTONIA3_RS01545 -AQ193_RS02460 BKB92_RS01540 -AQ193_RS02460 CTB_RS01560 -AQ193_RS02460 E150_RS01530 -AQ193_RS02460 L2BUCH2_RS01515 -AQ193_RS02460 CTO_RS01555 -AQ193_RS02460 FCS84708_RS01525 -AQ193_RS02460 AP288_RS04595 -AQ193_RS02460 BKB93_RS01540 -AQ193_RS02460 CBP44_RS02930 -AQ193_RS02460 AQ199_RS02220 -AQ193_RS02460 L2BLST_RS01515 -AQ193_RS02460 BBV13_RS01565 -AQ193_RS02460 BW688_RS02935 -AQ193_RS02460 G9768_RS01535 -AQ193_RS02460 BKC02_RS01535 -AQ193_RS02460 AKW53_RS03025 -AQ193_RS02460 BBV16_RS01565 -AQ193_RS02460 L3404_RS01510 -AQ193_RS02460 BKC01_RS01540 -AQ193_RS02460 gnl|Prokka|PADJNBJD_00301 -AQ193_RS02460 NILJEPDF_00301 -AQ193_RS02460 LJHENM_01515 -AQ193_RS02460 BKC03_RS01535 -AQ193_RS02460 DU10_RS01550 -AQ193_RS02460 CTRC943_RS01515 -AQ193_RS02460 CTJTET1_RS01545 -AQ193_RS02460 KW39_RS01535 -AQ193_RS02460 JIEJKO_01515 -AQ193_RS02460 C15_RS0101580 -AQ193_RS02460 SOTONK1_RS01535 -AQ193_RS02460 ECS88FINAL_RS0101560 -AQ193_RS02460 120432 -AQ193_RS02460 QSDFRQ_00301 -AQ193_RS02460 IaCS19096_RS01530 -AQ193_RS02460 A5291_RS01560 -AQ193_RS02460 O169_RS01540 -AQ193_RS02460 DU13_RS01545 -AQ193_RS02460 SW2_RS01525 -AQ193_RS02460 BKB95_RS01550 -AQ193_RS02460 CBP48_RS02925 -AQ193_RS02460 7618922 -AQ193_RS02460 KW36_RS01530 -AQ193_RS02460 ECS102511_RS01525 -AQ193_RS02460 AOT15_RS02530 -AQ193_RS02460 BKB96_RS01535 -AQ193_RS02460 CTL2C_RS02880 -AQ193_RS02460 BKB99_RS01535 -AQ193_RS02460 L1224_RS01510 -AQ193_RS02620 AQ193_RS02620 -AQ193_RS02620 L1440_RS01350 -AQ193_RS02620 AQ244_RS03555 -AQ193_RS02620 CBP42_RS02765 -AQ193_RS02620 SOTONIA3_RS01385 -AQ193_RS02620 BKB92_RS01380 -AQ193_RS02620 CTB_RS01400 -AQ193_RS02620 E150_RS01370 -AQ193_RS02620 L2BUCH2_RS01355 -AQ193_RS02620 CTO_RS01395 -AQ193_RS02620 FCS84708_RS01365 -AQ193_RS02620 AP288_RS04435 -AQ193_RS02620 BKB93_RS01380 -AQ193_RS02620 CBP44_RS02770 -AQ193_RS02620 AQ199_RS02060 -AQ193_RS02620 L2BLST_RS01355 -AQ193_RS02620 BBV13_RS01405 -AQ193_RS02620 BW688_RS02770 -AQ193_RS02620 G9768_RS01375 -AQ193_RS02620 BKC02_RS01375 -AQ193_RS02620 BBV16_RS01405 -AQ193_RS02620 L3404_RS01350 -AQ193_RS02620 AKW53_RS02860 -AQ193_RS02620 BKC01_RS01380 -AQ193_RS02620 gnl|Prokka|PADJNBJD_00269 -AQ193_RS02620 DU10_RS01385 -AQ193_RS02620 NILJEPDF_00269 -AQ193_RS02620 LJHENM_01355 -AQ193_RS02620 BKC03_RS01375 -AQ193_RS02620 CTRC943_RS01355 -AQ193_RS02620 CTJTET1_RS01385 -AQ193_RS02620 KW39_RS01375 -AQ193_RS02620 JIEJKO_01355 -AQ193_RS02620 119420 -AQ193_RS02620 C15_RS0101410 -AQ193_RS02620 SOTONK1_RS01375 -AQ193_RS02620 ECS88FINAL_RS0101395 -AQ193_RS02620 QSDFRQ_00269 -AQ193_RS02620 IaCS19096_RS01370 -AQ193_RS02620 A5291_RS01400 -AQ193_RS02620 O169_RS01380 -AQ193_RS02620 DU13_RS01385 -AQ193_RS02620 7618491 -AQ193_RS02620 SW2_RS01365 -AQ193_RS02620 BKB95_RS01390 -AQ193_RS02620 CBP48_RS02765 -AQ193_RS02620 KW36_RS01370 -AQ193_RS02620 ECS102511_RS01365 -AQ193_RS02620 AOT15_RS02370 -AQ193_RS02620 BKB96_RS01375 -AQ193_RS02620 CTL2C_RS02720 -AQ193_RS02620 BKB99_RS01375 -AQ193_RS02620 L1224_RS01350 -AQ193_RS03500 AQ193_RS03500 -AQ193_RS03500 BKB96_RS00505 -AQ193_RS03500 L1224_RS00495 -AQ193_RS03500 BKB99_RS00505 -AQ193_RS03500 BKB92_RS00505 -AQ193_RS03500 CTO_RS00495 -AQ193_RS03500 L1440_RS00495 -AQ193_RS03500 SOTONIA3_RS00495 -AQ193_RS03500 E150_RS00495 -AQ193_RS03500 CBP44_RS01900 -AQ193_RS03500 120591 -AQ193_RS03500 L2BUCH2_RS00495 -AQ193_RS03500 BKB93_RS00505 -AQ193_RS03500 FCS84708_RS00495 -AQ193_RS03500 AP288_RS03565 -AQ193_RS03500 BBV13_RS00500 -AQ193_RS03500 AQ199_RS01190 -AQ193_RS03500 L2BLST_RS00495 -AQ193_RS03500 BW688_RS01895 -AQ193_RS03500 G9768_RS00495 -AQ193_RS03500 AOT15_RS00460 -AQ193_RS03500 BBV16_RS00500 -AQ193_RS03500 BKC02_RS00505 -AQ193_RS03500 gnl|Prokka|PADJNBJD_00097 -AQ193_RS03500 LJHENM_00485 -AQ193_RS03500 NILJEPDF_00097 -AQ193_RS03500 BKC01_RS00505 -AQ193_RS03500 A5291_RS00495 -AQ193_RS03500 JIEJKO_00490 -AQ193_RS03500 SOTONK1_RS00495 -AQ193_RS03500 L3404_RS00495 -AQ193_RS03500 AKW53_RS01985 -AQ193_RS03500 QSDFRQ_00097 -AQ193_RS03500 IaCS19096_RS00495 -AQ193_RS03500 BKC03_RS00505 -AQ193_RS03500 DU10_RS00505 -AQ193_RS03500 C15_RS0100505 -AQ193_RS03500 7618826 -AQ193_RS03500 CTRC943_RS00495 -AQ193_RS03500 CTJTET1_RS00495 -AQ193_RS03500 O169_RS00495 -AQ193_RS03500 DU13_RS00510 -AQ193_RS03500 ECS88FINAL_RS0100510 -AQ193_RS03500 KW39_RS00495 -AQ193_RS03500 KW36_RS00495 -AQ193_RS03500 CBP48_RS01895 -AQ193_RS03500 SW2_RS00495 -AQ193_RS03500 BKB95_RS00505 -AQ193_RS03500 ECS102511_RS00495 -AQ193_RS03500 CTB_RS00495 -AQ193_RS03500 CTL2C_RS01860 -AQ193_RS03500 AQ244_RS01495 -AQ193_RS03500 CBP42_RS01895 -AQ193_RS03855 AQ193_RS03855 -AQ193_RS03855 BKB99_RS00155 -AQ193_RS03855 CTO_RS00150 -AQ193_RS03855 SOTONIA3_RS00150 -AQ193_RS03855 L1440_RS00150 -AQ193_RS03855 BKB92_RS00155 -AQ193_RS03855 119228 -AQ193_RS03855 AQ244_RS01840 -AQ193_RS03855 CBP44_RS01550 -AQ193_RS03855 E150_RS00150 -AQ193_RS03855 L2BUCH2_RS00150 -AQ193_RS03855 BKB93_RS00155 -AQ193_RS03855 FCS84708_RS00150 -AQ193_RS03855 AP288_RS03220 -AQ193_RS03855 BBV13_RS00155 -AQ193_RS03855 G9768_RS00150 -AQ193_RS03855 AQ199_RS00845 -AQ193_RS03855 BW688_RS01545 -AQ193_RS03855 L2BLST_RS00150 -AQ193_RS03855 BKC02_RS00155 -AQ193_RS03855 BBV16_RS00155 -AQ193_RS03855 BKC01_RS00155 -AQ193_RS03855 gnl|Prokka|PADJNBJD_00031 -AQ193_RS03855 LJHENM_00155 -AQ193_RS03855 A5291_RS00150 -AQ193_RS03855 SOTONK1_RS00150 -AQ193_RS03855 JIEJKO_00150 -AQ193_RS03855 7618370 -AQ193_RS03855 NILJEPDF_00031 -AQ193_RS03855 L3404_RS00150 -AQ193_RS03855 AOT15_RS00805 -AQ193_RS03855 IaCS19096_RS00150 -AQ193_RS03855 AKW53_RS01640 -AQ193_RS03855 BKC03_RS00155 -AQ193_RS03855 C15_RS0100150 -AQ193_RS03855 QSDFRQ_00031 -AQ193_RS03855 CTJTET1_RS00150 -AQ193_RS03855 DU10_RS00155 -AQ193_RS03855 CTRC943_RS00150 -AQ193_RS03855 O169_RS00150 -AQ193_RS03855 CBP48_RS01545 -AQ193_RS03855 ECS88FINAL_RS0100155 -AQ193_RS03855 DU13_RS00155 -AQ193_RS03855 KW39_RS00150 -AQ193_RS03855 KW36_RS00150 -AQ193_RS03855 BKB95_RS00155 -AQ193_RS03855 SW2_RS00150 -AQ193_RS03855 ECS102511_RS00150 -AQ193_RS03855 CTB_RS00150 -AQ193_RS03855 CTL2C_RS01515 -AQ193_RS03855 CBP42_RS01545 -AQ193_RS03855 L1224_RS00150 -AQ193_RS03855 BKB96_RS00155 -AQ193_RS05025 AQ193_RS05025 -AQ193_RS05025 AP288_RS05050 -AQ193_RS05025 AQ244_RS05250 -AQ193_RS05025 AQ199_RS04990 -AQ199_RS00960 AQ199_RS00960 -AQ199_RS00960 LJHENM_00265 -AQ199_RS00960 AKW53_RS01755 -AQ199_RS00960 O169_RS00265 -AQ199_RS00960 ECS88FINAL_RS0100270 -AQ199_RS00960 AQ193_RS03730 -AQ199_RS00960 KW39_RS00265 -AQ199_RS00960 SW2_RS00265 -AQ199_RS00960 ECS102511_RS00265 -AQ199_RS00960 BKB92_RS00270 -AQ199_RS00960 E150_RS00265 -AQ199_RS00960 BKB93_RS00270 -AQ199_RS00960 FCS84708_RS00265 -AQ199_RS00960 AP288_RS03335 -AQ199_RS00960 BW688_RS01660 -AQ199_RS00960 L2BLST_RS00265 -AQ199_RS00960 7618798 -AQ199_RS00960 CTRC943_RS00265 -AQ199_RS00960 CBP48_RS01660 -AQ199_RS00960 CTL2C_RS01630 -AQ199_RS00960 CBP42_RS01660 -AQ199_RS00960 L1440_RS00265 -AQ199_RS00960 CBP44_RS01665 -AQ199_RS00960 L2BUCH2_RS00265 -AQ199_RS00960 BBV16_RS00270 -AQ199_RS00960 A5291_RS00265 -AQ199_RS00960 CTB_RS00265 -AQ199_RS00960 CTO_RS00265 -AQ199_RS00960 BBV13_RS00270 -AQ199_RS00960 gnl|Prokka|PADJNBJD_00052 -AQ199_RS00960 JIEJKO_00255 -AQ199_RS00960 BKC01_RS00270 -AQ199_RS00960 IaCS19096_RS00265 -AQ199_RS00960 120635 -AQ199_RS00960 AOT15_RS00690 -AQ199_RS00960 C15_RS0100265 -AQ199_RS00960 G9768_RS00265 -AQ199_RS00960 BKC02_RS00270 -AQ199_RS00960 NILJEPDF_00052 -AQ199_RS00960 SOTONK1_RS00265 -AQ199_RS00960 QSDFRQ_00052 -AQ199_RS00960 BKC03_RS00270 -AQ199_RS00960 CTJTET1_RS00265 -AQ199_RS00960 AQ244_RS01725 -AQ199_RS00960 BKB95_RS00270 -AQ199_RS00960 SOTONIA3_RS00265 -AQ199_RS00960 DU10_RS00270 -AQ199_RS00960 L1224_RS00265 -AQ199_RS00960 L3404_RS00265 -AQ199_RS00960 JIEJKO_00260 F -AQ199_RS01130 AQ199_RS01130 -AQ199_RS01130 BBV13_RS00440 -AQ199_RS01130 L2BLST_RS00435 -AQ199_RS01130 BW688_RS01835 -AQ199_RS01130 G9768_RS00435 -AQ199_RS01130 BKC02_RS00445 -AQ199_RS01130 gnl|Prokka|PADJNBJD_00085 -AQ199_RS01130 LJHENM_00425 -AQ199_RS01130 BBV16_RS00440 -AQ199_RS01130 NILJEPDF_00085 -AQ199_RS01130 A5291_RS00435 -AQ199_RS01130 JIEJKO_00430 -AQ199_RS01130 BKC01_RS00445 -AQ199_RS01130 SOTONK1_RS00435 -AQ199_RS01130 L3404_RS00435 -AQ199_RS01130 AKW53_RS01925 -AQ199_RS01130 QSDFRQ_00085 -AQ199_RS01130 IaCS19096_RS00435 -AQ199_RS01130 BKC03_RS00445 -AQ199_RS01130 DU10_RS00445 -AQ199_RS01130 C15_RS0100440 -AQ199_RS01130 7618400 -AQ199_RS01130 CTRC943_RS00435 -AQ199_RS01130 CTJTET1_RS00435 -AQ199_RS01130 O169_RS00435 -AQ199_RS01130 AQ244_RS01555 -AQ199_RS01130 DU13_RS00450 -AQ199_RS01130 ECS88FINAL_RS0100445 -AQ199_RS01130 KW36_RS00435 -AQ199_RS01130 AQ193_RS03560 -AQ199_RS01130 CBP48_RS01835 -AQ199_RS01130 KW39_RS00435 -AQ199_RS01130 SW2_RS00435 -AQ199_RS01130 BKB95_RS00445 -AQ199_RS01130 ECS102511_RS00435 -AQ199_RS01130 CTB_RS00435 -AQ199_RS01130 CTL2C_RS01800 -AQ199_RS01130 CBP42_RS01835 -AQ199_RS01130 BKB96_RS00445 -AQ199_RS01130 L1224_RS00435 -AQ199_RS01130 BKB99_RS00445 -AQ199_RS01130 BKB92_RS00445 -AQ199_RS01130 CTO_RS00435 -AQ199_RS01130 L1440_RS00435 -AQ199_RS01130 SOTONIA3_RS00435 -AQ199_RS01130 E150_RS00435 -AQ199_RS01130 CBP44_RS01840 -AQ199_RS01130 119275 -AQ199_RS01130 AOT15_RS00520 -AQ199_RS01130 L2BUCH2_RS00435 -AQ199_RS01130 BKB93_RS00445 -AQ199_RS01130 FCS84708_RS00435 -AQ199_RS01130 AP288_RS03505 -AQ199_RS01300 AQ199_RS01300 -AQ199_RS01300 L2BLST_RS00605 -AQ199_RS01300 BBV13_RS00615 -AQ199_RS01300 BW688_RS02005 -AQ199_RS01300 G9768_RS00605 -AQ199_RS01300 BKC02_RS00615 -AQ199_RS01300 BBV16_RS00615 -AQ199_RS01300 gnl|Prokka|PADJNBJD_00119 -AQ199_RS01300 LJHENM_00595 -AQ199_RS01300 AKW53_RS02100 -AQ199_RS01300 BKC01_RS00615 -AQ199_RS01300 NILJEPDF_00119 -AQ199_RS01300 L3404_RS00605 -AQ199_RS01300 A5291_RS00610 -AQ199_RS01300 SOTONK1_RS00605 -AQ199_RS01300 JIEJKO_00600 -AQ199_RS01300 QSDFRQ_00119 -AQ199_RS01300 IaCS19096_RS00605 -AQ199_RS01300 BKC03_RS00615 -AQ199_RS01300 C15_RS0100625 -AQ199_RS01300 CTRC943_RS00605 -AQ199_RS01300 CTJTET1_RS00605 -AQ199_RS01300 KW39_RS00605 -AQ199_RS01300 DU10_RS00615 -AQ199_RS01300 ECS88FINAL_RS0100625 -AQ199_RS01300 O169_RS00605 -AQ199_RS01300 AQ193_RS03390 -AQ199_RS01300 DU13_RS00620 -AQ199_RS01300 7618413 -AQ199_RS01300 KW36_RS00605 -AQ199_RS01300 CBP48_RS02005 -AQ199_RS01300 SW2_RS00605 -AQ199_RS01300 BKB95_RS00615 -AQ199_RS01300 ECS102511_RS00605 -AQ199_RS01300 CTL2C_RS01970 -AQ199_RS01300 CTB_RS00610 -AQ199_RS01300 L1224_RS00605 -AQ199_RS01300 AQ244_RS02780 -AQ199_RS01300 BKB96_RS00615 -AQ199_RS01300 CBP42_RS02005 -AQ199_RS01300 BKB99_RS00615 -AQ199_RS01300 L1440_RS00605 -AQ199_RS01300 BKB92_RS00615 -AQ199_RS01300 SOTONIA3_RS00605 -AQ199_RS01300 CTO_RS00610 -AQ199_RS01300 E150_RS00605 -AQ199_RS01300 AOT15_RS00350 -AQ199_RS01300 L2BUCH2_RS00605 -AQ199_RS01300 CBP44_RS02010 -AQ199_RS01300 FCS84708_RS00605 -AQ199_RS01300 AP288_RS03675 -AQ199_RS01300 BKB93_RS00615 -AQ199_RS01300 119295 -AQ199_RS01470 AQ199_RS01470 -AQ199_RS01470 BBV13_RS00785 -AQ199_RS01470 G9768_RS00775 -AQ199_RS01470 L2BLST_RS00775 -AQ199_RS01470 BW688_RS02175 -AQ199_RS01470 BBV16_RS00785 -AQ199_RS01470 BKC02_RS00785 -AQ199_RS01470 gnl|Prokka|PADJNBJD_00153 -AQ199_RS01470 LJHENM_00765 -AQ199_RS01470 AKW53_RS02270 -AQ199_RS01470 BKC01_RS00785 -AQ199_RS01470 NILJEPDF_00153 -AQ199_RS01470 A5291_RS00780 -AQ199_RS01470 L3404_RS00775 -AQ199_RS01470 SOTONK1_RS00775 -AQ199_RS01470 JIEJKO_00770 -AQ199_RS01470 QSDFRQ_00153 -AQ199_RS01470 CTJTET1_RS00775 -AQ199_RS01470 IaCS19096_RS00775 -AQ199_RS01470 BKC03_RS00785 -AQ199_RS01470 C15_RS0100800 -AQ199_RS01470 CTRC943_RS00775 -AQ199_RS01470 ECS88FINAL_RS0100800 -AQ199_RS01470 KW39_RS00775 -AQ199_RS01470 DU10_RS00785 -AQ199_RS01470 O169_RS00775 -AQ199_RS01470 AQ193_RS03220 -AQ199_RS01470 DU13_RS00790 -AQ199_RS01470 KW36_RS00775 -AQ199_RS01470 CBP48_RS02175 -AQ199_RS01470 SW2_RS00775 -AQ199_RS01470 BKB95_RS00785 -AQ199_RS01470 7618846 -AQ199_RS01470 ECS102511_RS00775 -AQ199_RS01470 CTL2C_RS02140 -AQ199_RS01470 CTB_RS00780 -AQ199_RS01470 L1224_RS00775 -AQ199_RS01470 AQ244_RS02950 -AQ199_RS01470 BKB96_RS00785 -AQ199_RS01470 CBP42_RS02175 -AQ199_RS01470 BKB99_RS00785 -AQ199_RS01470 CTO_RS00780 -AQ199_RS01470 L1440_RS00775 -AQ199_RS01470 BKB92_RS00785 -AQ199_RS01470 SOTONIA3_RS00775 -AQ199_RS01470 E150_RS00775 -AQ199_RS01470 AOT15_RS00180 -AQ199_RS01470 L2BUCH2_RS00775 -AQ199_RS01470 CBP44_RS02180 -AQ199_RS01470 FCS84708_RS00775 -AQ199_RS01470 AP288_RS03845 -AQ199_RS01470 BKB93_RS00785 -AQ199_RS01470 120559 -AQ199_RS01665 AQ199_RS01665 -AQ199_RS01665 L2BLST_RS00960 -AQ199_RS01665 BW688_RS02370 -AQ199_RS01665 BBV13_RS01005 -AQ199_RS01665 G9768_RS00980 -AQ199_RS01665 BKC02_RS00975 -AQ199_RS01665 L3404_RS00955 -AQ199_RS01665 AKW53_RS02465 -AQ199_RS01665 119361 -AQ199_RS01665 BBV16_RS01005 -AQ199_RS01665 BKC01_RS00975 -AQ199_RS01665 DU10_RS00985 -AQ199_RS01665 gnl|Prokka|PADJNBJD_00191 -AQ199_RS01665 BKC03_RS00975 -AQ199_RS01665 NILJEPDF_00191 -AQ199_RS01665 LJHENM_00960 -AQ199_RS01665 CTRC943_RS00960 -AQ199_RS01665 CTJTET1_RS00990 -AQ199_RS01665 C15_RS0101010 -AQ199_RS01665 SOTONK1_RS00975 -AQ199_RS01665 ECS88FINAL_RS0100995 -AQ199_RS01665 KW39_RS00980 -AQ199_RS01665 AQ193_RS03020 -AQ199_RS01665 JIEJKO_00960 -AQ199_RS01665 7618453 -AQ199_RS01665 A5291_RS01000 -AQ199_RS01665 IaCS19096_RS00975 -AQ199_RS01665 QSDFRQ_00191 -AQ199_RS01665 O169_RS00980 -AQ199_RS01665 DU13_RS00985 -AQ199_RS01665 SW2_RS00970 -AQ199_RS01665 BKB95_RS00990 -AQ199_RS01665 CBP48_RS02365 -AQ199_RS01665 KW36_RS00975 -AQ199_RS01665 ECS102511_RS00970 -AQ199_RS01665 BKB96_RS00975 -AQ199_RS01665 CTL2C_RS02325 -AQ199_RS01665 BKB99_RS00975 -AQ199_RS01665 L1224_RS00955 -AQ199_RS01665 L1440_RS00955 -AQ199_RS01665 AQ244_RS03155 -AQ199_RS01665 BKB92_RS00975 -AQ199_RS01665 CBP42_RS02365 -AQ199_RS01665 SOTONIA3_RS00990 -AQ199_RS01665 E150_RS00970 -AQ199_RS01665 CTB_RS01000 -AQ199_RS01665 L2BUCH2_RS00960 -AQ199_RS01665 CTO_RS01000 -AQ199_RS01665 FCS84708_RS00970 -AQ199_RS01665 AP288_RS04040 -AQ199_RS01665 BKB93_RS00975 -AQ199_RS01665 AOT15_RS01390 -AQ199_RS01665 CBP44_RS02370 -AQ199_RS01835 AQ199_RS01835 -AQ199_RS01835 L2BLST_RS01130 -AQ199_RS01835 BW688_RS02540 -AQ199_RS01835 BBV13_RS01175 -AQ199_RS01835 G9768_RS01150 -AQ199_RS01835 BKC02_RS01145 -AQ199_RS01835 L3404_RS01125 -AQ199_RS01835 AKW53_RS02635 -AQ199_RS01835 BBV16_RS01175 -AQ199_RS01835 BKC01_RS01145 -AQ199_RS01835 119388 -AQ199_RS01835 DU10_RS01155 -AQ199_RS01835 gnl|Prokka|PADJNBJD_00225 -AQ199_RS01835 BKC03_RS01145 -AQ199_RS01835 NILJEPDF_00225 -AQ199_RS01835 LJHENM_01130 -AQ199_RS01835 CTRC943_RS01130 -AQ199_RS01835 CTJTET1_RS01160 -AQ199_RS01835 C15_RS0101180 -AQ199_RS01835 SOTONK1_RS01145 -AQ199_RS01835 ECS88FINAL_RS0101165 -AQ199_RS01835 KW39_RS01150 -AQ199_RS01835 AQ193_RS02850 -AQ199_RS01835 JIEJKO_01130 -AQ199_RS01835 A5291_RS01170 -AQ199_RS01835 IaCS19096_RS01145 -AQ199_RS01835 7618470 -AQ199_RS01835 QSDFRQ_00225 -AQ199_RS01835 O169_RS01150 -AQ199_RS01835 DU13_RS01155 -AQ199_RS01835 SW2_RS01140 -AQ199_RS01835 BKB95_RS01160 -AQ199_RS01835 CBP48_RS02535 -AQ199_RS01835 KW36_RS01145 -AQ199_RS01835 ECS102511_RS01140 -AQ199_RS01835 BKB96_RS01145 -AQ199_RS01835 CTL2C_RS02495 -AQ199_RS01835 BKB99_RS01145 -AQ199_RS01835 L1224_RS01125 -AQ199_RS01835 L1440_RS01125 -AQ199_RS01835 AQ244_RS03325 -AQ199_RS01835 BKB92_RS01145 -AQ199_RS01835 CBP42_RS02535 -AQ199_RS01835 SOTONIA3_RS01160 -AQ199_RS01835 E150_RS01140 -AQ199_RS01835 CTB_RS01170 -AQ199_RS01835 L2BUCH2_RS01130 -AQ199_RS01835 CTO_RS01170 -AQ199_RS01835 FCS84708_RS01140 -AQ199_RS01835 AP288_RS04210 -AQ199_RS01835 BKB93_RS01145 -AQ199_RS01835 AOT15_RS01220 -AQ199_RS01835 CBP44_RS02540 -AQ199_RS02005 AQ199_RS02005 -AQ199_RS02005 L2BLST_RS01300 -AQ199_RS02005 BBV13_RS01345 -AQ199_RS02005 BW688_RS02710 -AQ199_RS02005 G9768_RS01320 -AQ199_RS02005 BKC02_RS01315 -AQ199_RS02005 BBV16_RS01345 -AQ199_RS02005 L3404_RS01295 -AQ199_RS02005 AKW53_RS02805 -AQ199_RS02005 BKC01_RS01315 -AQ199_RS02005 gnl|Prokka|PADJNBJD_00258 -AQ199_RS02005 DU10_RS01325 -AQ199_RS02005 NILJEPDF_00258 -AQ199_RS02005 LJHENM_01295 -AQ199_RS02005 BKC03_RS01315 -AQ199_RS02005 CTRC943_RS01300 -AQ199_RS02005 CTJTET1_RS01330 -AQ199_RS02005 KW39_RS01320 -AQ199_RS02005 JIEJKO_01295 -AQ199_RS02005 119413 -AQ199_RS02005 C15_RS0101350 -AQ199_RS02005 SOTONK1_RS01315 -AQ199_RS02005 ECS88FINAL_RS0101335 -AQ199_RS02005 AQ193_RS02680 -AQ199_RS02005 QSDFRQ_00258 -AQ199_RS02005 A5291_RS01340 -AQ199_RS02005 O169_RS01320 -AQ199_RS02005 IaCS19096_RS01315 -AQ199_RS02005 DU13_RS01325 -AQ199_RS02005 7618486 -AQ199_RS02005 SW2_RS01310 -AQ199_RS02005 BKB95_RS01330 -AQ199_RS02005 CBP48_RS02705 -AQ199_RS02005 KW36_RS01315 -AQ199_RS02005 ECS102511_RS01310 -AQ199_RS02005 BKB96_RS01315 -AQ199_RS02005 CTL2C_RS02665 -AQ199_RS02005 BKB99_RS01315 -AQ199_RS02005 L1224_RS01295 -AQ199_RS02005 L1440_RS01295 -AQ199_RS02005 AQ244_RS03495 -AQ199_RS02005 BKB92_RS01315 -AQ199_RS02005 CBP42_RS02705 -AQ199_RS02005 SOTONIA3_RS01330 -AQ199_RS02005 CTB_RS01340 -AQ199_RS02005 E150_RS01310 -AQ199_RS02005 L2BUCH2_RS01300 -AQ199_RS02005 CTO_RS01340 -AQ199_RS02005 FCS84708_RS01310 -AQ199_RS02005 AP288_RS04380 -AQ199_RS02005 BKB93_RS01315 -AQ199_RS02005 AOT15_RS01050 -AQ199_RS02005 CBP44_RS02710 -AQ199_RS02165 AQ199_RS02165 -AQ199_RS02165 L2BLST_RS01460 -AQ199_RS02165 BBV13_RS01510 -AQ199_RS02165 BW688_RS02880 -AQ199_RS02165 G9768_RS01480 -AQ199_RS02165 BKC02_RS01480 -AQ199_RS02165 AKW53_RS02970 -AQ199_RS02165 BBV16_RS01510 -AQ199_RS02165 L3404_RS01455 -AQ199_RS02165 BKC01_RS01485 -AQ199_RS02165 gnl|Prokka|PADJNBJD_00290 -AQ199_RS02165 DU10_RS01490 -AQ199_RS02165 NILJEPDF_00290 -AQ199_RS02165 LJHENM_01460 -AQ199_RS02165 BKC03_RS01480 -AQ199_RS02165 CTRC943_RS01460 -AQ199_RS02165 CTJTET1_RS01490 -AQ199_RS02165 KW39_RS01480 -AQ199_RS02165 AQ193_RS02515 -AQ199_RS02165 JIEJKO_01460 -AQ199_RS02165 C15_RS0101515 -AQ199_RS02165 SOTONK1_RS01480 -AQ199_RS02165 ECS88FINAL_RS0101500 -AQ199_RS02165 119437 -AQ199_RS02165 QSDFRQ_00290 -AQ199_RS02165 IaCS19096_RS01475 -AQ199_RS02165 A5291_RS01505 -AQ199_RS02165 O169_RS01485 -AQ199_RS02165 DU13_RS01490 -AQ199_RS02165 SW2_RS01470 -AQ199_RS02165 BKB95_RS01495 -AQ199_RS02165 CBP48_RS02870 -AQ199_RS02165 7618502 -AQ199_RS02165 KW36_RS01475 -AQ199_RS02165 ECS102511_RS01470 -AQ199_RS02165 AOT15_RS02475 -AQ199_RS02165 BKB96_RS01480 -AQ199_RS02165 CTL2C_RS02825 -AQ199_RS02165 BKB99_RS01480 -AQ199_RS02165 L1224_RS01455 -AQ199_RS02165 L1440_RS01455 -AQ199_RS02165 AQ244_RS03660 -AQ199_RS02165 CBP42_RS02870 -AQ199_RS02165 SOTONIA3_RS01490 -AQ199_RS02165 BKB92_RS01485 -AQ199_RS02165 CTB_RS01505 -AQ199_RS02165 E150_RS01475 -AQ199_RS02165 L2BUCH2_RS01460 -AQ199_RS02165 CTO_RS01500 -AQ199_RS02165 FCS84708_RS01470 -AQ199_RS02165 AP288_RS04540 -AQ199_RS02165 BKB93_RS01485 -AQ199_RS02165 CBP44_RS02875 -AQ199_RS02495 AQ199_RS02495 -AQ199_RS02495 G9768_RS01800 -AQ199_RS02495 L3404_RS01775 -AQ199_RS02495 AQ244_RS01310 -AQ199_RS02495 BBV16_RS01830 -AQ199_RS02495 BKC02_RS01805 -AQ199_RS02495 BKC01_RS01805 -AQ199_RS02495 AKW53_RS03300 -AQ199_RS02495 gnl|Prokka|PADJNBJD_00354 -AQ199_RS02495 NILJEPDF_00354 -AQ199_RS02495 CTRC943_RS01780 -AQ199_RS02495 LJHENM_01785 -AQ199_RS02495 JIEJKO_01780 -AQ199_RS02495 BKC03_RS01805 -AQ199_RS02495 CTJTET1_RS01810 -AQ199_RS02495 DU10_RS01825 -AQ199_RS02495 QSDFRQ_00354 -AQ199_RS02495 C15_RS0101840 -AQ199_RS02495 SOTONK1_RS01800 -AQ199_RS02495 A5291_RS01825 -AQ199_RS02495 KW39_RS01810 -AQ199_RS02495 IaCS19096_RS01795 -AQ199_RS02495 AQ193_RS02185 -AQ199_RS02495 119149 -AQ199_RS02495 ECS88FINAL_RS0101830 -AQ199_RS02495 O169_RS01810 -AQ199_RS02495 DU13_RS01820 -AQ199_RS02495 CTL2C_RS03145 -AQ199_RS02495 BKB95_RS01820 -AQ199_RS02495 CBP48_RS03205 -AQ199_RS02495 L1224_RS01775 -AQ199_RS02495 KW36_RS01795 -AQ199_RS02495 AOT15_RS02795 -AQ199_RS02495 BKB96_RS01805 -AQ199_RS02495 SW2_RS01800 -AQ199_RS02495 BKB99_RS01805 -AQ199_RS02495 L1440_RS01775 -AQ199_RS02495 ECS102511_RS01800 -AQ199_RS02495 CBP42_RS03215 -AQ199_RS02495 CTB_RS01825 -AQ199_RS02495 SOTONIA3_RS01810 -AQ199_RS02495 L2BUCH2_RS01775 -AQ199_RS02495 BKB92_RS01815 -AQ199_RS02495 CTO_RS01825 -AQ199_RS02495 E150_RS01805 -AQ199_RS02495 L2BLST_RS01775 -AQ199_RS02495 FCS84708_RS01795 -AQ199_RS02495 AP288_RS01280 -AQ199_RS02495 BW688_RS03205 -AQ199_RS02495 BKB93_RS01815 -AQ199_RS02495 CBP44_RS03210 -AQ199_RS02495 BBV13_RS01830 -AQ199_RS02495 7618956 F -AQ199_RS02660 AQ199_RS02660 -AQ199_RS02660 G9768_RS01965 -AQ199_RS02660 L3404_RS01940 -AQ199_RS02660 AQ244_RS01145 -AQ199_RS02660 BBV16_RS01995 -AQ199_RS02660 BKC02_RS01970 -AQ199_RS02660 BKC01_RS01970 -AQ199_RS02660 AKW53_RS03465 -AQ199_RS02660 gnl|Prokka|PADJNBJD_00387 -AQ199_RS02660 NILJEPDF_00387 -AQ199_RS02660 CTRC943_RS01945 -AQ199_RS02660 LJHENM_01950 -AQ199_RS02660 JIEJKO_01945 -AQ199_RS02660 BKC03_RS01970 -AQ199_RS02660 CTJTET1_RS01975 -AQ199_RS02660 QSDFRQ_00387 -AQ199_RS02660 C15_RS0102010 -AQ199_RS02660 SOTONK1_RS01965 -AQ199_RS02660 DU10_RS01995 -AQ199_RS02660 A5291_RS01990 -AQ199_RS02660 KW39_RS01975 -AQ199_RS02660 IaCS19096_RS01960 -AQ199_RS02660 AQ193_RS02020 -AQ199_RS02660 ECS88FINAL_RS0102000 -AQ199_RS02660 O169_RS01975 -AQ199_RS02660 DU13_RS01990 -AQ199_RS02660 7618536 -AQ199_RS02660 119491 -AQ199_RS02660 CTL2C_RS03310 -AQ199_RS02660 L1224_RS01940 -AQ199_RS02660 KW36_RS01960 -AQ199_RS02660 AOT15_RS02960 -AQ199_RS02660 BKB95_RS01990 -AQ199_RS02660 BKB96_RS01970 -AQ199_RS02660 CBP48_RS03375 -AQ199_RS02660 SW2_RS01965 -AQ199_RS02660 BKB99_RS01970 -AQ199_RS02660 L1440_RS01940 -AQ199_RS02660 ECS102511_RS01965 -AQ199_RS02660 CTB_RS01990 -AQ199_RS02660 SOTONIA3_RS01975 -AQ199_RS02660 L2BUCH2_RS01940 -AQ199_RS02660 BKB92_RS01980 -AQ199_RS02660 CBP42_RS03385 -AQ199_RS02660 CTO_RS01990 -AQ199_RS02660 E150_RS01970 -AQ199_RS02660 L2BLST_RS01940 -AQ199_RS02660 BW688_RS03370 -AQ199_RS02660 FCS84708_RS01960 -AQ199_RS02660 AP288_RS01115 -AQ199_RS02660 BKB93_RS01980 -AQ199_RS02660 BBV13_RS01995 -AQ199_RS02660 CBP44_RS03380 -AQ199_RS02820 AQ199_RS02820 -AQ199_RS02820 G9768_RS02125 -AQ199_RS02820 BBV16_RS02160 -AQ199_RS02820 L3404_RS02100 -AQ199_RS02820 AQ244_RS00985 -AQ199_RS02820 BKC02_RS02135 -AQ199_RS02820 BKC01_RS02135 -AQ199_RS02820 AKW53_RS03625 -AQ199_RS02820 gnl|Prokka|PADJNBJD_00419 -AQ199_RS02820 NILJEPDF_00419 -AQ199_RS02820 CTRC943_RS02105 -AQ199_RS02820 LJHENM_02115 -AQ199_RS02820 JIEJKO_02110 -AQ199_RS02820 BKC03_RS02135 -AQ199_RS02820 CTJTET1_RS02135 -AQ199_RS02820 QSDFRQ_00419 -AQ199_RS02820 C15_RS0102170 -AQ199_RS02820 A5291_RS02150 -AQ199_RS02820 SOTONK1_RS02125 -AQ199_RS02820 DU10_RS02160 -AQ199_RS02820 KW39_RS02135 -AQ199_RS02820 IaCS19096_RS02120 -AQ199_RS02820 AQ193_RS01860 -AQ199_RS02820 ECS88FINAL_RS0102165 -AQ199_RS02820 O169_RS02135 -AQ199_RS02820 DU13_RS02155 -AQ199_RS02820 7618987 -AQ199_RS02820 CTL2C_RS03470 -AQ199_RS02820 CBP48_RS03540 -AQ199_RS02820 120317 -AQ199_RS02820 L1224_RS02100 -AQ199_RS02820 KW36_RS02120 -AQ199_RS02820 AOT15_RS03120 -AQ199_RS02820 BKB95_RS02155 -AQ199_RS02820 BKB96_RS02135 -AQ199_RS02820 SW2_RS02125 -AQ199_RS02820 BKB99_RS02135 -AQ199_RS02820 L1440_RS02100 -AQ199_RS02820 ECS102511_RS02125 -AQ199_RS02820 CTB_RS02150 -AQ199_RS02820 CBP42_RS03550 -AQ199_RS02820 SOTONIA3_RS02135 -AQ199_RS02820 L2BUCH2_RS02100 -AQ199_RS02820 BKB92_RS02145 -AQ199_RS02820 CTO_RS02150 -AQ199_RS02820 E150_RS02130 -AQ199_RS02820 L2BLST_RS02100 -AQ199_RS02820 BW688_RS03535 -AQ199_RS02820 FCS84708_RS02120 -AQ199_RS02820 AP288_RS00955 -AQ199_RS02820 BBV13_RS02160 -AQ199_RS02820 BKB93_RS02145 -AQ199_RS02820 CBP44_RS03545 -AQ199_RS02985 AQ199_RS02985 -AQ199_RS02985 G9768_RS02290 -AQ199_RS02985 BBV16_RS02330 -AQ199_RS02985 L3404_RS02265 -AQ199_RS02985 BKC02_RS02305 -AQ199_RS02985 AQ244_RS00820 -AQ199_RS02985 BKC01_RS02305 -AQ199_RS02985 gnl|Prokka|PADJNBJD_00452 -AQ199_RS02985 AKW53_RS03790 -AQ199_RS02985 NILJEPDF_00452 -AQ199_RS02985 LJHENM_02280 -AQ199_RS02985 CTRC943_RS02270 -AQ199_RS02985 JIEJKO_02280 -AQ199_RS02985 BKC03_RS02305 -AQ199_RS02985 QSDFRQ_00452 -AQ199_RS02985 CTJTET1_RS02300 -AQ199_RS02985 C15_RS0102335 -AQ199_RS02985 SOTONK1_RS02290 -AQ199_RS02985 DU10_RS02330 -AQ199_RS02985 A5291_RS02320 -AQ199_RS02985 KW39_RS02300 -AQ199_RS02985 IaCS19096_RS02285 -AQ199_RS02985 AQ193_RS01695 -AQ199_RS02985 ECS88FINAL_RS0102335 -AQ199_RS02985 O169_RS02300 -AQ199_RS02985 DU13_RS02325 -AQ199_RS02985 7618998 -AQ199_RS02985 BKB96_RS02310 -AQ199_RS02985 BKB99_RS02305 -AQ199_RS02985 CBP48_RS03710 -AQ199_RS02985 120300 -AQ199_RS02985 CTL2C_RS03640 -AQ199_RS02985 KW36_RS02285 -AQ199_RS02985 AOT15_RS03285 -AQ199_RS02985 BKB95_RS02325 -AQ199_RS02985 L1224_RS02270 -AQ199_RS02985 SW2_RS02295 -AQ199_RS02985 ECS102511_RS02290 -AQ199_RS02985 L1440_RS02270 -AQ199_RS02985 CBP42_RS03720 -AQ199_RS02985 CTB_RS02320 -AQ199_RS02985 L2BUCH2_RS02265 -AQ199_RS02985 BKB92_RS02315 -AQ199_RS02985 SOTONIA3_RS02305 -AQ199_RS02985 CTO_RS02320 -AQ199_RS02985 E150_RS02295 -AQ199_RS02985 BW688_RS03705 -AQ199_RS02985 L2BLST_RS02270 -AQ199_RS02985 FCS84708_RS02285 -AQ199_RS02985 AP288_RS00790 -AQ199_RS02985 BBV13_RS02325 -AQ199_RS02985 CBP44_RS03715 -AQ199_RS02985 BKB93_RS02320 -AQ199_RS03150 AQ199_RS03150 -AQ199_RS03150 G9768_RS02455 -AQ199_RS03150 L3404_RS02430 -AQ199_RS03150 AQ244_RS00655 -AQ199_RS03150 BKC02_RS02475 -AQ199_RS03150 gnl|Prokka|PADJNBJD_00484 -AQ199_RS03150 BKC01_RS02475 -AQ199_RS03150 NILJEPDF_00484 -AQ199_RS03150 LJHENM_02440 -AQ199_RS03150 CTRC943_RS02435 -AQ199_RS03150 JIEJKO_02440 -AQ199_RS03150 QSDFRQ_00484 -AQ199_RS03150 SOTONK1_RS02455 -AQ199_RS03150 CTJTET1_RS02465 -AQ199_RS03150 BKC03_RS02475 -AQ199_RS03150 C15_RS0102515 -AQ199_RS03150 KW39_RS02465 -AQ199_RS03150 IaCS19096_RS02450 -AQ199_RS03150 AQ193_RS01530 -AQ199_RS03150 DU10_RS02495 -AQ199_RS03150 A5291_RS02490 -AQ199_RS03150 ECS88FINAL_RS0102510 -AQ199_RS03150 O169_RS02465 -AQ199_RS03150 7618586 -AQ199_RS03150 AOT15_RS03640 -AQ199_RS03150 DU13_RS02490 -AQ199_RS03150 BKB96_RS02480 -AQ199_RS03150 BKB99_RS02475 -AQ199_RS03150 CBP48_RS03875 -AQ199_RS03150 CTL2C_RS03805 -AQ199_RS03150 KW36_RS02450 -AQ199_RS03150 BKB95_RS02490 -AQ199_RS03150 L1224_RS02435 -AQ199_RS03150 SW2_RS02460 -AQ199_RS03150 ECS102511_RS02455 -AQ199_RS03150 119570 -AQ199_RS03150 L1440_RS02435 -AQ199_RS03150 CBP42_RS03885 -AQ199_RS03150 L2BUCH2_RS02435 -AQ199_RS03150 CTB_RS02490 -AQ199_RS03150 SOTONIA3_RS02470 -AQ199_RS03150 AKW53_RS04760 -AQ199_RS03150 BKB92_RS02480 -AQ199_RS03150 E150_RS02460 -AQ199_RS03150 CTO_RS02490 -AQ199_RS03150 BW688_RS03875 -AQ199_RS03150 BBV13_RS02495 -AQ199_RS03150 L2BLST_RS02435 -AQ199_RS03150 FCS84708_RS02450 -AQ199_RS03150 AP288_RS00625 -AQ199_RS03150 CBP44_RS03880 -AQ199_RS03150 BBV16_RS02505 -AQ199_RS03150 BKB93_RS02485 -AQ199_RS03335 AQ199_RS03335 -AQ199_RS03335 BKB93_RS02670 -AQ199_RS03335 BBV16_RS02690 -AQ199_RS03335 G9768_RS02640 -AQ199_RS03335 AQ244_RS00470 -AQ199_RS03335 L3404_RS02615 -AQ199_RS03335 BKC02_RS02660 -AQ199_RS03335 BKC01_RS02660 -AQ199_RS03335 gnl|Prokka|PADJNBJD_00521 -AQ199_RS03335 NILJEPDF_00521 -AQ199_RS03335 LJHENM_02620 -AQ199_RS03335 CTRC943_RS02620 -AQ199_RS03335 SOTONK1_RS02640 -AQ199_RS03335 CTJTET1_RS02650 -AQ199_RS03335 JIEJKO_02625 -AQ199_RS03335 BKC03_RS02660 -AQ199_RS03335 QSDFRQ_00521 -AQ199_RS03335 KW39_RS02650 -AQ199_RS03335 AQ193_RS01345 -AQ199_RS03335 C15_RS0102705 -AQ199_RS03335 ECS88FINAL_RS0102700 -AQ199_RS03335 IaCS19096_RS02635 -AQ199_RS03335 DU10_RS02680 -AQ199_RS03335 O169_RS02650 -AQ199_RS03335 AOT15_RS03455 -AQ199_RS03335 A5291_RS02675 -AQ199_RS03335 DU13_RS02675 -AQ199_RS03335 CBP48_RS04060 -AQ199_RS03335 CTL2C_RS03990 -AQ199_RS03335 KW36_RS02635 -AQ199_RS03335 BKB95_RS02675 -AQ199_RS03335 BKB96_RS02665 -AQ199_RS03335 BKB99_RS02660 -AQ199_RS03335 7619034 -AQ199_RS03335 SW2_RS02645 -AQ199_RS03335 L1224_RS02620 -AQ199_RS03335 ECS102511_RS02640 -AQ199_RS03335 L1440_RS02620 -AQ199_RS03335 CBP42_RS04070 -AQ199_RS03335 120240 -AQ199_RS03335 L2BUCH2_RS02620 -AQ199_RS03335 AKW53_RS04575 -AQ199_RS03335 SOTONIA3_RS02655 -AQ199_RS03335 BKB92_RS02665 -AQ199_RS03335 CTB_RS02675 -AQ199_RS03335 E150_RS02645 -AQ199_RS03335 BW688_RS04060 -AQ199_RS03335 CTO_RS02675 -AQ199_RS03335 FCS84708_RS02635 -AQ199_RS03335 AP288_RS00440 -AQ199_RS03335 L2BLST_RS02620 -AQ199_RS03335 BBV13_RS02680 -AQ199_RS03335 CBP44_RS04065 -AQ199_RS03665 AQ199_RS03665 -AQ199_RS03665 BBV16_RS03015 -AQ199_RS03665 BKB93_RS03005 -AQ199_RS03665 G9768_RS02965 -AQ199_RS03665 L3404_RS02935 -AQ199_RS03665 gnl|Prokka|PADJNBJD_00584 -AQ199_RS03665 AQ244_RS00145 -AQ199_RS03665 BKC02_RS02995 -AQ199_RS03665 NILJEPDF_00584 -AQ199_RS03665 AOT15_RS03765 -AQ199_RS03665 LJHENM_02940 -AQ199_RS03665 BKC01_RS02995 -AQ199_RS03665 CTRC943_RS02940 -AQ199_RS03665 QSDFRQ_00584 -AQ199_RS03665 JIEJKO_02945 -AQ199_RS03665 SOTONK1_RS02965 -AQ199_RS03665 CTJTET1_RS02975 -AQ199_RS03665 BKC03_RS02995 -AQ199_RS03665 C15_RS0103030 -AQ199_RS03665 KW39_RS02980 -AQ199_RS03665 IaCS19096_RS02960 -AQ199_RS03665 AQ193_RS01020 -AQ199_RS03665 ECS88FINAL_RS0103030 -AQ199_RS03665 DU10_RS03015 -AQ199_RS03665 A5291_RS03000 -AQ199_RS03665 O169_RS02975 -AQ199_RS03665 CTL2C_RS04310 -AQ199_RS03665 KW36_RS02960 -AQ199_RS03665 DU13_RS03010 -AQ199_RS03665 CBP48_RS04400 -AQ199_RS03665 L1224_RS02940 -AQ199_RS03665 BKB95_RS03010 -AQ199_RS03665 BKB96_RS03000 -AQ199_RS03665 BKB99_RS02995 -AQ199_RS03665 7618616 -AQ199_RS03665 AKW53_RS04195 -AQ199_RS03665 SW2_RS02970 -AQ199_RS03665 L1440_RS02940 -AQ199_RS03665 ECS102511_RS02965 -AQ199_RS03665 CBP42_RS04405 -AQ199_RS03665 L2BUCH2_RS02940 -AQ199_RS03665 119616 -AQ199_RS03665 SOTONIA3_RS02980 -AQ199_RS03665 CTB_RS03000 -AQ199_RS03665 BKB92_RS03000 -AQ199_RS03665 BW688_RS04395 -AQ199_RS03665 E150_RS02970 -AQ199_RS03665 CTO_RS03000 -AQ199_RS03665 L2BLST_RS02940 -AQ199_RS03665 CBP44_RS04400 -AQ199_RS03665 FCS84708_RS02965 -AQ199_RS03665 AP288_RS00115 -AQ199_RS03665 BBV13_RS03005 -AQ199_RS03830 AQ199_RS03830 -AQ199_RS03830 BBV16_RS03175 -AQ199_RS03830 BKB93_RS03165 -AQ199_RS03830 G9768_RS03130 -AQ199_RS03830 L3404_RS03100 -AQ199_RS03830 gnl|Prokka|PADJNBJD_00616 -AQ199_RS03830 NILJEPDF_00616 -AQ199_RS03830 LJHENM_03095 -AQ199_RS03830 BKC02_RS03160 -AQ199_RS03830 AOT15_RS03930 -AQ199_RS03830 AP288_RS01500 -AQ199_RS03830 AQ244_RS04785 -AQ199_RS03830 CTRC943_RS03105 -AQ199_RS03830 BKC01_RS03160 -AQ199_RS03830 QSDFRQ_00616 -AQ199_RS03830 JIEJKO_03105 -AQ199_RS03830 SOTONK1_RS03130 -AQ199_RS03830 CTJTET1_RS03145 -AQ199_RS03830 BKC03_RS03160 -AQ199_RS03830 KW39_RS03145 -AQ199_RS03830 AQ193_RS00855 -AQ199_RS03830 C15_RS0103195 -AQ199_RS03830 ECS88FINAL_RS0103195 -AQ199_RS03830 IaCS19096_RS03125 -AQ199_RS03830 DU10_RS03175 -AQ199_RS03830 A5291_RS03165 -AQ199_RS03830 O169_RS03140 -AQ199_RS03830 CTL2C_RS04475 -AQ199_RS03830 DU13_RS03170 -AQ199_RS03830 CBP48_RS04560 -AQ199_RS03830 L1224_RS03105 -AQ199_RS03830 KW36_RS03130 -AQ199_RS03830 BKB95_RS03170 -AQ199_RS03830 AKW53_RS04355 -AQ199_RS03830 BKB96_RS03165 -AQ199_RS03830 BKB99_RS03160 -AQ199_RS03830 7618635 -AQ199_RS03830 SW2_RS03135 -AQ199_RS03830 L1440_RS03105 -AQ199_RS03830 ECS102511_RS03130 -AQ199_RS03830 CBP42_RS04565 -AQ199_RS03830 L2BUCH2_RS03105 -AQ199_RS03830 CTB_RS03165 -AQ199_RS03830 SOTONIA3_RS03145 -AQ199_RS03830 BKB92_RS03160 -AQ199_RS03830 BW688_RS04555 -AQ199_RS03830 119646 -AQ199_RS03830 E150_RS03135 -AQ199_RS03830 CTO_RS03160 -AQ199_RS03830 L2BLST_RS03105 -AQ199_RS03830 CBP44_RS04560 -AQ199_RS03830 FCS84708_RS03130 -AQ199_RS03830 BBV13_RS03165 -AQ199_RS04005 AQ199_RS04005 -AQ199_RS04005 BBV16_RS03355 -AQ199_RS04005 BKB93_RS03340 -AQ199_RS04005 G9768_RS03305 -AQ199_RS04005 L3404_RS03275 -AQ199_RS04005 gnl|Prokka|PADJNBJD_00650 -AQ199_RS04005 AP288_RS01675 -AQ199_RS04005 BKC02_RS03335 -AQ199_RS04005 NILJEPDF_00651 -AQ199_RS04005 LJHENM_03270 -AQ199_RS04005 AOT15_RS04105 -AQ199_RS04005 CTRC943_RS03280 -AQ199_RS04005 JIEJKO_03275 -AQ199_RS04005 BKC01_RS03335 -AQ199_RS04005 QSDFRQ_00651 -AQ199_RS04005 KW39_RS03320 -AQ199_RS04005 AQ193_RS00680 -AQ199_RS04005 BKC03_RS03335 -AQ199_RS04005 CTJTET1_RS03320 -AQ199_RS04005 ECS88FINAL_RS0103370 -AQ199_RS04005 DU10_RS03350 -AQ199_RS04005 SOTONK1_RS03305 -AQ199_RS04005 O169_RS03315 -AQ199_RS04005 IaCS19096_RS03300 -AQ199_RS04005 C15_RS0103370 -AQ199_RS04005 A5291_RS03345 -AQ199_RS04005 AKW53_RS00055 -AQ199_RS04005 DU13_RS03345 -AQ199_RS04005 CTL2C_RS04650 -AQ199_RS04005 CBP48_RS04735 -AQ199_RS04005 7619115 -AQ199_RS04005 SW2_RS03310 -AQ199_RS04005 L1224_RS03280 -AQ199_RS04005 KW36_RS03305 -AQ199_RS04005 ECS102511_RS03305 -AQ199_RS04005 L1440_RS03280 -AQ199_RS04005 BKB95_RS03350 -AQ199_RS04005 BKB96_RS03345 -AQ199_RS04005 BKB99_RS03340 -AQ199_RS04005 CBP42_RS04740 -AQ199_RS04005 L2BUCH2_RS03280 -AQ199_RS04005 BKB92_RS03335 -AQ199_RS04005 CTB_RS03345 -AQ199_RS04005 E150_RS03310 -AQ199_RS04005 SOTONIA3_RS03325 -AQ199_RS04005 BW688_RS04730 -AQ199_RS04005 CTO_RS03340 -AQ199_RS04005 FCS84708_RS03305 -AQ199_RS04005 BBV13_RS03345 -AQ199_RS04005 L2BLST_RS03280 -AQ199_RS04005 CBP44_RS04735 -AQ199_RS04005 120111 -AQ199_RS04170 AQ199_RS04170 -AQ199_RS04170 BKB93_RS03510 -AQ199_RS04170 119694 -AQ199_RS04170 G9768_RS03470 -AQ199_RS04170 gnl|Prokka|PADJNBJD_00683 -AQ199_RS04170 L3404_RS03450 -AQ199_RS04170 AQ244_RS04440 -AQ199_RS04170 BKC02_RS03505 -AQ199_RS04170 NILJEPDF_00684 -AQ199_RS04170 LJHENM_03435 -AQ199_RS04170 AOT15_RS04270 -AQ199_RS04170 AP288_RS01840 -AQ199_RS04170 JIEJKO_03440 -AQ199_RS04170 BKC01_RS03505 -AQ199_RS04170 QSDFRQ_00684 -AQ199_RS04170 CTRC943_RS03455 -AQ199_RS04170 BKC03_RS03505 -AQ199_RS04170 CBP48_RS00075 -AQ199_RS04170 CTJTET1_RS03490 -AQ199_RS04170 KW39_RS03490 -AQ199_RS04170 AQ193_RS00515 -AQ199_RS04170 DU10_RS03520 -AQ199_RS04170 SOTONK1_RS03470 -AQ199_RS04170 ECS88FINAL_RS0103550 -AQ199_RS04170 IaCS19096_RS03465 -AQ199_RS04170 C15_RS0103545 -AQ199_RS04170 A5291_RS03515 -AQ199_RS04170 O169_RS03485 -AQ199_RS04170 DU13_RS03520 -AQ199_RS04170 KW36_RS03470 -AQ199_RS04170 AKW53_RS00220 -AQ199_RS04170 BKB95_RS03525 -AQ199_RS04170 CBP42_RS00075 -AQ199_RS04170 SW2_RS03480 -AQ199_RS04170 CTL2C_RS00075 -AQ199_RS04170 L1224_RS03455 -AQ199_RS04170 ECS102511_RS03470 -AQ199_RS04170 L1440_RS03455 -AQ199_RS04170 BKB96_RS03515 -AQ199_RS04170 BKB99_RS03510 -AQ199_RS04170 CBP44_RS00075 -AQ199_RS04170 L2BUCH2_RS03455 -AQ199_RS04170 BKB92_RS03505 -AQ199_RS04170 CTB_RS03510 -AQ199_RS04170 SOTONIA3_RS03490 -AQ199_RS04170 E150_RS03480 -AQ199_RS04170 CTO_RS03505 -AQ199_RS04170 BBV13_RS03510 -AQ199_RS04170 FCS84708_RS03470 -AQ199_RS04170 L2BLST_RS03455 -AQ199_RS04170 7618211 -AQ199_RS04170 BBV16_RS03520 -AQ199_RS04170 BW688_RS00075 -AQ199_RS04350 AQ199_RS04350 -AQ199_RS04350 BKB93_RS03690 -AQ199_RS04350 7618676 -AQ199_RS04350 G9768_RS03655 -AQ199_RS04350 gnl|Prokka|PADJNBJD_00719 -AQ199_RS04350 L3404_RS03630 -AQ199_RS04350 BKC02_RS03685 -AQ199_RS04350 NILJEPDF_00720 -AQ199_RS04350 LJHENM_03620 -AQ199_RS04350 AOT15_RS04455 -AQ199_RS04350 AP288_RS02020 -AQ199_RS04350 AQ244_RS04255 -AQ199_RS04350 JIEJKO_03625 -AQ199_RS04350 BKC01_RS03685 -AQ199_RS04350 QSDFRQ_00720 -AQ199_RS04350 CTRC943_RS03640 -AQ199_RS04350 BKC03_RS03685 -AQ199_RS04350 CBP48_RS00255 -AQ199_RS04350 CTJTET1_RS03675 -AQ199_RS04350 KW39_RS03670 -AQ199_RS04350 AQ193_RS00335 -AQ199_RS04350 DU10_RS03700 -AQ199_RS04350 SOTONK1_RS03655 -AQ199_RS04350 ECS88FINAL_RS0103750 -AQ199_RS04350 IaCS19096_RS03650 -AQ199_RS04350 C15_RS0103745 -AQ199_RS04350 A5291_RS03700 -AQ199_RS04350 O169_RS03665 -AQ199_RS04350 DU13_RS03700 -AQ199_RS04350 AKW53_RS00405 -AQ199_RS04350 KW36_RS03655 -AQ199_RS04350 BKB95_RS03705 -AQ199_RS04350 CBP42_RS00255 -AQ199_RS04350 SW2_RS03660 -AQ199_RS04350 CTL2C_RS00255 -AQ199_RS04350 L1224_RS03635 -AQ199_RS04350 ECS102511_RS03650 -AQ199_RS04350 L1440_RS03635 -AQ199_RS04350 BKB96_RS03695 -AQ199_RS04350 BKB99_RS03690 -AQ199_RS04350 CBP44_RS00255 -AQ199_RS04350 L2BUCH2_RS03635 -AQ199_RS04350 BKB92_RS03685 -AQ199_RS04350 CTB_RS03695 -AQ199_RS04350 SOTONIA3_RS03675 -AQ199_RS04350 E150_RS03660 -AQ199_RS04350 CTO_RS03690 -AQ199_RS04350 BBV13_RS03695 -AQ199_RS04350 FCS84708_RS03650 -AQ199_RS04350 L2BLST_RS03635 -AQ199_RS04350 BBV16_RS03705 -AQ199_RS04350 BW688_RS00255 -AQ199_RS04350 120066 -AQ199_RS04515 AQ199_RS04515 -AQ199_RS04515 BKB93_RS03860 -AQ199_RS04515 G9768_RS03820 -AQ199_RS04515 BKC02_RS03855 -AQ199_RS04515 AOT15_RS04620 -AQ199_RS04515 AP288_RS02190 -AQ199_RS04515 AQ244_RS04090 -AQ199_RS04515 BKC01_RS03860 -AQ199_RS04515 CTRC943_RS03805 -AQ199_RS04515 AKW53_RS00560 -AQ199_RS04515 BKC03_RS03855 -AQ199_RS04515 CTJTET1_RS03840 -AQ199_RS04515 KW39_RS03835 -AQ199_RS04515 DU10_RS03870 -AQ199_RS04515 A5291_RS03865 -AQ199_RS04515 SOTONK1_RS03820 -AQ199_RS04515 IaCS19096_RS03815 -AQ199_RS04515 AQ193_RS00170 -AQ199_RS04515 DU13_RS03870 -AQ199_RS04515 C15_RS0103925 -AQ199_RS04515 ECS88FINAL_RS0103925 -AQ199_RS04515 O169_RS03830 -AQ199_RS04515 BKB95_RS03875 -AQ199_RS04515 SW2_RS03825 -AQ199_RS04515 ECS102511_RS03815 -AQ199_RS04515 BKB96_RS03860 -AQ199_RS04515 BKB99_RS03855 -AQ199_RS04515 BKB92_RS03855 -AQ199_RS04515 CTB_RS03860 -AQ199_RS04515 SOTONIA3_RS03840 -AQ199_RS04515 E150_RS03825 -AQ199_RS04515 CTO_RS03855 -AQ199_RS04515 BBV13_RS03860 -AQ199_RS04515 FCS84708_RS03815 -AQ199_RS04515 BBV16_RS03870 -AQ199_RS04675 AQ199_RS04675 -AQ199_RS04675 BKB93_RS04020 -AQ199_RS04675 G9768_RS03980 -AQ199_RS04675 gnl|Prokka|PADJNBJD_00783 -AQ199_RS04675 L3404_RS03955 -AQ199_RS04675 NILJEPDF_00784 -AQ199_RS04675 BKC02_RS04015 -AQ199_RS04675 LJHENM_03945 -AQ199_RS04675 AOT15_RS04780 -AQ199_RS04675 AP288_RS02350 -AQ199_RS04675 JIEJKO_03945 -AQ199_RS04675 QSDFRQ_00784 -AQ199_RS04675 AQ244_RS03930 -AQ199_RS04675 BKC01_RS04020 -AQ199_RS04675 CTRC943_RS03965 -AQ199_RS04675 AKW53_RS00720 -AQ199_RS04675 BKC03_RS04015 -AQ199_RS04675 CBP48_RS00585 -AQ199_RS04675 CTJTET1_RS04000 -AQ199_RS04675 KW39_RS03995 -AQ199_RS04675 DU10_RS04030 -AQ199_RS04675 A5291_RS04025 -AQ199_RS04675 SOTONK1_RS03980 -AQ199_RS04675 IaCS19096_RS03975 -AQ199_RS04675 AQ193_RS00010 -AQ199_RS04675 DU13_RS04030 -AQ199_RS04675 C15_RS0104085 -AQ199_RS04675 ECS88FINAL_RS0104090 -AQ199_RS04675 O169_RS03990 -AQ199_RS04675 KW36_RS03980 -AQ199_RS04675 BKB95_RS04035 -AQ199_RS04675 CBP42_RS00585 -AQ199_RS04675 CTL2C_RS00580 -AQ199_RS04675 L1224_RS03960 -AQ199_RS04675 SW2_RS03985 -AQ199_RS04675 L1440_RS03955 -AQ199_RS04675 ECS102511_RS03975 -AQ199_RS04675 BKB96_RS04020 -AQ199_RS04675 BKB99_RS04015 -AQ199_RS04675 CBP44_RS00585 -AQ199_RS04675 L2BUCH2_RS03960 -AQ199_RS04675 BKB92_RS04015 -AQ199_RS04675 CTB_RS04020 -AQ199_RS04675 SOTONIA3_RS04000 -AQ199_RS04675 E150_RS03985 -AQ199_RS04675 CTO_RS04015 -AQ199_RS04675 BBV13_RS04020 -AQ199_RS04675 FCS84708_RS03975 -AQ199_RS04675 L2BLST_RS03960 -AQ199_RS04675 BBV16_RS04030 -AQ199_RS04675 7618709 -AQ199_RS04675 120014 -AQ199_RS04675 BW688_RS00585 -AQ199_RS04675 AQ244_RS03905 F -AQ199_RS05035 AQ199_RS05035 -AQ199_RS05035 AP288_RS05095 -AQ199_RS05035 AQ244_RS05295 -AQ199_RS05035 AQ193_RS04995 -AQ244_RS00130 AQ244_RS00130 -AQ244_RS00130 AQ199_RS03675 -AQ244_RS00130 BBV16_RS03025 -AQ244_RS00130 BKB93_RS03015 -AQ244_RS00130 G9768_RS02980 -AQ244_RS00130 L3404_RS02945 -AQ244_RS00130 gnl|Prokka|PADJNBJD_00587 -AQ244_RS00130 BKC02_RS03010 -AQ244_RS00130 NILJEPDF_00587 -AQ244_RS00130 LJHENM_02950 -AQ244_RS00130 AOT15_RS03780 -AQ244_RS00130 CTRC943_RS02950 -AQ244_RS00130 BKC01_RS03010 -AQ244_RS00130 AQ193_RS01010 -AQ244_RS00130 QSDFRQ_00587 -AQ244_RS00130 JIEJKO_02960 -AQ244_RS00130 SOTONK1_RS02980 -AQ244_RS00130 CTJTET1_RS02990 -AQ244_RS00130 BKC03_RS03010 -AQ244_RS00130 KW39_RS02990 -AQ244_RS00130 C15_RS0103045 -AQ244_RS00130 ECS88FINAL_RS0103040 -AQ244_RS00130 IaCS19096_RS02975 -AQ244_RS00130 DU10_RS03025 -AQ244_RS00130 A5291_RS03010 -AQ244_RS00130 O169_RS02985 -AQ244_RS00130 CTL2C_RS04320 -AQ244_RS00130 DU13_RS03020 -AQ244_RS00130 CBP48_RS04410 -AQ244_RS00130 L1224_RS02950 -AQ244_RS00130 KW36_RS02975 -AQ244_RS00130 BKB95_RS03020 -AQ244_RS00130 7618618 -AQ244_RS00130 AKW53_RS04205 -AQ244_RS00130 BKB96_RS03015 -AQ244_RS00130 BKB99_RS03010 -AQ244_RS00130 SW2_RS02980 -AQ244_RS00130 L1440_RS02950 -AQ244_RS00130 ECS102511_RS02975 -AQ244_RS00130 CBP42_RS04415 -AQ244_RS00130 L2BUCH2_RS02950 -AQ244_RS00130 119619 -AQ244_RS00130 CTB_RS03010 -AQ244_RS00130 SOTONIA3_RS02995 -AQ244_RS00130 AP288_RS00105 -AQ244_RS00130 BKB92_RS03010 -AQ244_RS00130 BW688_RS04405 -AQ244_RS00130 E150_RS02980 -AQ244_RS00130 CTO_RS03010 -AQ244_RS00130 L2BLST_RS02950 -AQ244_RS00130 CBP44_RS04410 -AQ244_RS00130 FCS84708_RS02975 -AQ244_RS00130 BBV13_RS03015 -AQ244_RS00975 AQ244_RS00975 -AQ244_RS00975 AQ199_RS02830 -AQ244_RS00975 G9768_RS02135 -AQ244_RS00975 L3404_RS02110 -AQ244_RS00975 BKC02_RS02145 -AQ244_RS00975 BKC01_RS02145 -AQ244_RS00975 AKW53_RS03635 -AQ244_RS00975 gnl|Prokka|PADJNBJD_00421 -AQ244_RS00975 NILJEPDF_00421 -AQ244_RS00975 CTRC943_RS02115 -AQ244_RS00975 AQ193_RS01850 -AQ244_RS00975 LJHENM_02125 -AQ244_RS00975 JIEJKO_02120 -AQ244_RS00975 BKC03_RS02145 -AQ244_RS00975 CTJTET1_RS02145 -AQ244_RS00975 QSDFRQ_00421 -AQ244_RS00975 C15_RS0102180 -AQ244_RS00975 A5291_RS02160 -AQ244_RS00975 SOTONK1_RS02135 -AQ244_RS00975 DU10_RS02170 -AQ244_RS00975 KW39_RS02145 -AQ244_RS00975 IaCS19096_RS02130 -AQ244_RS00975 ECS88FINAL_RS0102175 -AQ244_RS00975 O169_RS02145 -AQ244_RS00975 DU13_RS02165 -AQ244_RS00975 7618989 -AQ244_RS00975 CTL2C_RS03480 -AQ244_RS00975 CBP48_RS03550 -AQ244_RS00975 120314 -AQ244_RS00975 L1224_RS02110 -AQ244_RS00975 KW36_RS02130 -AQ244_RS00975 AOT15_RS03130 -AQ244_RS00975 BKB95_RS02165 -AQ244_RS00975 BKB96_RS02145 -AQ244_RS00975 SW2_RS02135 -AQ244_RS00975 BKB99_RS02145 -AQ244_RS00975 L1440_RS02110 -AQ244_RS00975 ECS102511_RS02135 -AQ244_RS00975 CTB_RS02160 -AQ244_RS00975 CBP42_RS03560 -AQ244_RS00975 SOTONIA3_RS02145 -AQ244_RS00975 L2BUCH2_RS02110 -AQ244_RS00975 BKB92_RS02155 -AQ244_RS00975 CTO_RS02160 -AQ244_RS00975 AP288_RS00945 -AQ244_RS00975 E150_RS02140 -AQ244_RS00975 L2BLST_RS02110 -AQ244_RS00975 BW688_RS03545 -AQ244_RS00975 FCS84708_RS02130 -AQ244_RS00975 BKB93_RS02155 -AQ244_RS00975 CBP44_RS03555 -AQ244_RS01135 AQ244_RS01135 -AQ244_RS01135 BBV13_RS02005 -AQ244_RS01135 CBP44_RS03390 -AQ244_RS01135 AQ199_RS02670 -AQ244_RS01135 G9768_RS01975 -AQ244_RS01135 L3404_RS01950 -AQ244_RS01135 BBV16_RS02005 -AQ244_RS01135 BKC02_RS01980 -AQ244_RS01135 BKC01_RS01980 -AQ244_RS01135 AKW53_RS03475 -AQ244_RS01135 gnl|Prokka|PADJNBJD_00389 -AQ244_RS01135 NILJEPDF_00389 -AQ244_RS01135 CTRC943_RS01955 -AQ244_RS01135 AQ193_RS02010 -AQ244_RS01135 LJHENM_01960 -AQ244_RS01135 JIEJKO_01955 -AQ244_RS01135 BKC03_RS01980 -AQ244_RS01135 CTJTET1_RS01985 -AQ244_RS01135 QSDFRQ_00389 -AQ244_RS01135 C15_RS0102020 -AQ244_RS01135 SOTONK1_RS01975 -AQ244_RS01135 DU10_RS02005 -AQ244_RS01135 A5291_RS02000 -AQ244_RS01135 KW39_RS01985 -AQ244_RS01135 IaCS19096_RS01970 -AQ244_RS01135 ECS88FINAL_RS0102010 -AQ244_RS01135 O169_RS01985 -AQ244_RS01135 DU13_RS02000 -AQ244_RS01135 7618538 -AQ244_RS01135 119494 -AQ244_RS01135 CTL2C_RS03320 -AQ244_RS01135 L1224_RS01950 -AQ244_RS01135 KW36_RS01970 -AQ244_RS01135 AOT15_RS02970 -AQ244_RS01135 BKB95_RS02000 -AQ244_RS01135 BKB96_RS01980 -AQ244_RS01135 CBP48_RS03385 -AQ244_RS01135 SW2_RS01975 -AQ244_RS01135 BKB99_RS01980 -AQ244_RS01135 L1440_RS01950 -AQ244_RS01135 ECS102511_RS01975 -AQ244_RS01135 CTB_RS02000 -AQ244_RS01135 SOTONIA3_RS01985 -AQ244_RS01135 L2BUCH2_RS01950 -AQ244_RS01135 BKB92_RS01990 -AQ244_RS01135 CBP42_RS03395 -AQ244_RS01135 AP288_RS01105 -AQ244_RS01135 CTO_RS02000 -AQ244_RS01135 E150_RS01980 -AQ244_RS01135 L2BLST_RS01950 -AQ244_RS01135 BW688_RS03380 -AQ244_RS01135 FCS84708_RS01970 -AQ244_RS01135 BKB93_RS01990 -AQ244_RS01300 AQ244_RS01300 -AQ244_RS01300 BBV13_RS01840 -AQ244_RS01300 AQ199_RS02505 -AQ244_RS01300 G9768_RS01810 -AQ244_RS01300 L3404_RS01785 -AQ244_RS01300 BBV16_RS01840 -AQ244_RS01300 BKC02_RS01815 -AQ244_RS01300 BKC01_RS01815 -AQ244_RS01300 AKW53_RS03310 -AQ244_RS01300 gnl|Prokka|PADJNBJD_00356 -AQ244_RS01300 NILJEPDF_00356 -AQ244_RS01300 CTRC943_RS01790 -AQ244_RS01300 AQ193_RS02175 -AQ244_RS01300 LJHENM_01795 -AQ244_RS01300 JIEJKO_01790 -AQ244_RS01300 BKC03_RS01815 -AQ244_RS01300 CTJTET1_RS01820 -AQ244_RS01300 DU10_RS01835 -AQ244_RS01300 QSDFRQ_00356 -AQ244_RS01300 C15_RS0101850 -AQ244_RS01300 SOTONK1_RS01810 -AQ244_RS01300 A5291_RS01835 -AQ244_RS01300 KW39_RS01820 -AQ244_RS01300 IaCS19096_RS01805 -AQ244_RS01300 120366 -AQ244_RS01300 ECS88FINAL_RS0101840 -AQ244_RS01300 DU13_RS01830 -AQ244_RS01300 O169_RS01820 -AQ244_RS01300 7618957 -AQ244_RS01300 CTL2C_RS03155 -AQ244_RS01300 BKB95_RS01830 -AQ244_RS01300 CBP48_RS03215 -AQ244_RS01300 L1224_RS01785 -AQ244_RS01300 KW36_RS01805 -AQ244_RS01300 AOT15_RS02805 -AQ244_RS01300 BKB96_RS01815 -AQ244_RS01300 SW2_RS01810 -AQ244_RS01300 BKB99_RS01815 -AQ244_RS01300 L1440_RS01785 -AQ244_RS01300 ECS102511_RS01810 -AQ244_RS01300 CBP42_RS03225 -AQ244_RS01300 CTB_RS01835 -AQ244_RS01300 SOTONIA3_RS01820 -AQ244_RS01300 L2BUCH2_RS01785 -AQ244_RS01300 BKB92_RS01825 -AQ244_RS01300 AP288_RS01270 -AQ244_RS01300 CTO_RS01835 -AQ244_RS01300 E150_RS01815 -AQ244_RS01300 L2BLST_RS01785 -AQ244_RS01300 FCS84708_RS01805 -AQ244_RS01300 BW688_RS03215 -AQ244_RS01300 BKB93_RS01825 -AQ244_RS01300 CBP44_RS03220 -AQ244_RS01830 AQ244_RS01830 -AQ244_RS01830 L1224_RS00160 -AQ244_RS01830 BKB96_RS00165 -AQ244_RS01830 BKB99_RS00165 -AQ244_RS01830 CTO_RS00160 -AQ244_RS01830 SOTONIA3_RS00160 -AQ244_RS01830 L1440_RS00160 -AQ244_RS01830 BKB92_RS00165 -AQ244_RS01830 119231 -AQ244_RS01830 CBP44_RS01560 -AQ244_RS01830 E150_RS00160 -AQ244_RS01830 L2BUCH2_RS00160 -AQ244_RS01830 BKB93_RS00165 -AQ244_RS01830 FCS84708_RS00160 -AQ244_RS01830 AP288_RS03230 -AQ244_RS01830 BBV13_RS00165 -AQ244_RS01830 G9768_RS00160 -AQ244_RS01830 AQ199_RS00855 -AQ244_RS01830 BW688_RS01555 -AQ244_RS01830 L2BLST_RS00160 -AQ244_RS01830 BKC02_RS00165 -AQ244_RS01830 AOT15_RS00795 -AQ244_RS01830 BBV16_RS00165 -AQ244_RS01830 BKC01_RS00165 -AQ244_RS01830 gnl|Prokka|PADJNBJD_00033 -AQ244_RS01830 LJHENM_00165 -AQ244_RS01830 A5291_RS00160 -AQ244_RS01830 SOTONK1_RS00160 -AQ244_RS01830 JIEJKO_00160 -AQ244_RS01830 7618372 -AQ244_RS01830 NILJEPDF_00033 -AQ244_RS01830 L3404_RS00160 -AQ244_RS01830 IaCS19096_RS00160 -AQ244_RS01830 AKW53_RS01650 -AQ244_RS01830 BKC03_RS00165 -AQ244_RS01830 C15_RS0100160 -AQ244_RS01830 QSDFRQ_00033 -AQ244_RS01830 CTJTET1_RS00160 -AQ244_RS01830 DU10_RS00165 -AQ244_RS01830 CTRC943_RS00160 -AQ244_RS01830 O169_RS00160 -AQ244_RS01830 CBP48_RS01555 -AQ244_RS01830 ECS88FINAL_RS0100165 -AQ244_RS01830 DU13_RS00165 -AQ244_RS01830 KW39_RS00160 -AQ244_RS01830 KW36_RS00160 -AQ244_RS01830 BKB95_RS00165 -AQ244_RS01830 SW2_RS00160 -AQ244_RS01830 ECS102511_RS00160 -AQ244_RS01830 AQ193_RS03845 -AQ244_RS01830 CTB_RS00160 -AQ244_RS01830 CTL2C_RS01525 -AQ244_RS01830 CBP42_RS01555 -AQ244_RS02155 AQ244_RS02155 -AQ244_RS02155 CTL2C_RS01195 -AQ244_RS02155 BKB95_RS04670 -AQ244_RS02155 CBP42_RS01225 -AQ244_RS02155 L1224_RS04575 -AQ244_RS02155 BKB96_RS04655 -AQ244_RS02155 L1440_RS04570 -AQ244_RS02155 BKB99_RS04650 -AQ244_RS02155 SW2_RS04605 -AQ244_RS02155 ECS102511_RS04600 -AQ244_RS02155 CBP44_RS01225 -AQ244_RS02155 CTB_RS04625 -AQ244_RS02155 L2BUCH2_RS04575 -AQ244_RS02155 SOTONIA3_RS04610 -AQ244_RS02155 CTO_RS04620 -AQ244_RS02155 AP288_RS02905 -AQ244_RS02155 BBV13_RS04640 -AQ244_RS02155 BKB92_RS04655 -AQ244_RS02155 BBV16_RS04645 -AQ244_RS02155 E150_RS04610 -AQ244_RS02155 gnl|Prokka|PADJNBJD_00902 -AQ244_RS02155 L2BLST_RS04575 -AQ244_RS02155 FCS84708_RS04595 -AQ244_RS02155 AQ199_RS00530 -AQ244_RS02155 NILJEPDF_00903 -AQ244_RS02155 BW688_RS01225 -AQ244_RS02155 119940 -AQ244_RS02155 JIEJKO_04540 -AQ244_RS02155 7618757 -AQ244_RS02155 QSDFRQ_00903 -AQ244_RS02155 G9768_RS04595 -AQ244_RS02155 LJHENM_04550 -AQ244_RS02155 L3404_RS04570 -AQ244_RS02155 BKB93_RS04660 -AQ244_RS02155 BKC02_RS04650 -AQ244_RS02155 AKW53_RS01320 -AQ244_RS02155 BKC01_RS04655 -AQ244_RS02155 CTRC943_RS04580 -AQ244_RS02155 AOT15_RS02175 -AQ244_RS02155 CTJTET1_RS04765 -AQ244_RS02155 KW39_RS04615 -AQ244_RS02155 BKC03_RS04650 -AQ244_RS02155 CBP48_RS01225 -AQ244_RS02155 A5291_RS04630 -AQ244_RS02155 SOTONK1_RS04595 -AQ244_RS02155 ECS88FINAL_RS0104705 -AQ244_RS02155 IaCS19096_RS04590 -AQ244_RS02155 C15_RS0104725 -AQ244_RS02155 AQ193_RS04170 -AQ244_RS02155 DU10_RS04670 -AQ244_RS02155 O169_RS04615 -AQ244_RS02155 KW36_RS04595 -AQ244_RS02155 DU13_RS04670 -AQ244_RS02325 AQ244_RS02325 -AQ244_RS02325 BKB95_RS04490 -AQ244_RS02325 CBP42_RS01045 -AQ244_RS02325 CTL2C_RS01025 -AQ244_RS02325 L1224_RS04405 -AQ244_RS02325 BKB96_RS04475 -AQ244_RS02325 L1440_RS04400 -AQ244_RS02325 BKB99_RS04470 -AQ244_RS02325 SW2_RS04435 -AQ244_RS02325 ECS102511_RS04430 -AQ244_RS02325 CBP44_RS01045 -AQ244_RS02325 CTB_RS04455 -AQ244_RS02325 L2BUCH2_RS04405 -AQ244_RS02325 SOTONIA3_RS04440 -AQ244_RS02325 CTO_RS04450 -AQ244_RS02325 BKB92_RS04475 -AQ244_RS02325 AP288_RS02735 -AQ244_RS02325 BBV13_RS04465 -AQ244_RS02325 E150_RS04440 -AQ244_RS02325 gnl|Prokka|PADJNBJD_00867 -AQ244_RS02325 L2BLST_RS04405 -AQ244_RS02325 BBV16_RS04470 -AQ244_RS02325 FCS84708_RS04425 -AQ244_RS02325 AQ199_RS00360 -AQ244_RS02325 NILJEPDF_00868 -AQ244_RS02325 BW688_RS01045 -AQ244_RS02325 7618745 -AQ244_RS02325 LJHENM_04370 -AQ244_RS02325 JIEJKO_04365 -AQ244_RS02325 QSDFRQ_00868 -AQ244_RS02325 G9768_RS04425 -AQ244_RS02325 L3404_RS04400 -AQ244_RS02325 BKB93_RS04480 -AQ244_RS02325 BKC02_RS04470 -AQ244_RS02325 AKW53_RS01150 -AQ244_RS02325 BKC01_RS04475 -AQ244_RS02325 CTRC943_RS04410 -AQ244_RS02325 AOT15_RS02005 -AQ244_RS02325 CTJTET1_RS04595 -AQ244_RS02325 KW39_RS04445 -AQ244_RS02325 BKC03_RS04470 -AQ244_RS02325 CBP48_RS01045 -AQ244_RS02325 A5291_RS04460 -AQ244_RS02325 SOTONK1_RS04425 -AQ244_RS02325 ECS88FINAL_RS0104520 -AQ244_RS02325 IaCS19096_RS04420 -AQ244_RS02325 C15_RS0104540 -AQ244_RS02325 DU10_RS04490 -AQ244_RS02325 O169_RS04445 -AQ244_RS02325 KW36_RS04425 -AQ244_RS02325 DU13_RS04490 -AQ244_RS02325 AQ193_RS04340 -AQ244_RS02490 AQ244_RS02490 -AQ244_RS02490 BKB95_RS04325 -AQ244_RS02490 CBP42_RS00875 -AQ244_RS02490 CTL2C_RS00865 -AQ244_RS02490 L1224_RS04245 -AQ244_RS02490 BKB96_RS04310 -AQ244_RS02490 L1440_RS04240 -AQ244_RS02490 BKB99_RS04305 -AQ244_RS02490 SW2_RS04275 -AQ244_RS02490 ECS102511_RS04265 -AQ244_RS02490 CBP44_RS00875 -AQ244_RS02490 CTB_RS04300 -AQ244_RS02490 L2BUCH2_RS04245 -AQ244_RS02490 SOTONIA3_RS04285 -AQ244_RS02490 BKB92_RS04305 -AQ244_RS02490 CTO_RS04295 -AQ244_RS02490 AP288_RS02570 -AQ244_RS02490 BBV13_RS04310 -AQ244_RS02490 E150_RS04275 -AQ244_RS02490 L2BLST_RS04245 -AQ244_RS02490 FCS84708_RS04265 -AQ244_RS02490 AQ199_RS00195 -AQ244_RS02490 BBV16_RS04315 -AQ244_RS02490 119826 -AQ244_RS02490 gnl|Prokka|PADJNBJD_00837 -AQ244_RS02490 BW688_RS00875 -AQ244_RS02490 7618297 -AQ244_RS02490 NILJEPDF_00838 -AQ244_RS02490 G9768_RS04270 -AQ244_RS02490 LJHENM_04215 -AQ244_RS02490 L3404_RS04240 -AQ244_RS02490 BKB93_RS04310 -AQ244_RS02490 JIEJKO_04215 -AQ244_RS02490 QSDFRQ_00838 -AQ244_RS02490 BKC02_RS04305 -AQ244_RS02490 AKW53_RS00985 -AQ244_RS02490 BKC01_RS04310 -AQ244_RS02490 CTRC943_RS04250 -AQ244_RS02490 AOT15_RS01850 -AQ244_RS02490 CTJTET1_RS04440 -AQ244_RS02490 BKC03_RS04305 -AQ244_RS02490 CBP48_RS00875 -AQ244_RS02490 A5291_RS04305 -AQ244_RS02490 KW39_RS04285 -AQ244_RS02490 SOTONK1_RS04270 -AQ244_RS02490 ECS88FINAL_RS0104360 -AQ244_RS02490 IaCS19096_RS04260 -AQ244_RS02490 DU10_RS04320 -AQ244_RS02490 C15_RS0104380 -AQ244_RS02490 AQ193_RS04505 -AQ244_RS02490 DU13_RS04320 -AQ244_RS02490 O169_RS04280 -AQ244_RS02490 KW36_RS04265 -AQ244_RS02670 AQ244_RS02670 -AQ244_RS02670 BKB95_RS04150 -AQ244_RS02670 CBP42_RS00700 -AQ244_RS02670 CTL2C_RS00695 -AQ244_RS02670 L1224_RS04075 -AQ244_RS02670 BKB96_RS04135 -AQ244_RS02670 SW2_RS04100 -AQ244_RS02670 L1440_RS04070 -AQ244_RS02670 ECS102511_RS04090 -AQ244_RS02670 BKB99_RS04130 -AQ244_RS02670 CBP44_RS00700 -AQ244_RS02670 CTB_RS04130 -AQ244_RS02670 L2BUCH2_RS04075 -AQ244_RS02670 BKB92_RS04130 -AQ244_RS02670 SOTONIA3_RS04115 -AQ244_RS02670 CTO_RS04125 -AQ244_RS02670 AP288_RS02395 -AQ244_RS02670 E150_RS04100 -AQ244_RS02670 BBV13_RS04135 -AQ244_RS02670 119995 -AQ244_RS02670 FCS84708_RS04090 -AQ244_RS02670 AQ199_RS00020 -AQ244_RS02670 7618721 -AQ244_RS02670 L2BLST_RS04075 -AQ244_RS02670 BBV16_RS04145 -AQ244_RS02670 BW688_RS00700 -AQ244_RS02670 gnl|Prokka|PADJNBJD_00804 -AQ244_RS02670 BKB93_RS04135 -AQ244_RS02670 NILJEPDF_00805 -AQ244_RS02670 G9768_RS04095 -AQ244_RS02670 L3404_RS04070 -AQ244_RS02670 LJHENM_04050 -AQ244_RS02670 JIEJKO_04050 -AQ244_RS02670 BKC02_RS04130 -AQ244_RS02670 QSDFRQ_00805 -AQ244_RS02670 AKW53_RS00810 -AQ244_RS02670 BKC01_RS04135 -AQ244_RS02670 CTRC943_RS04080 -AQ244_RS02670 AOT15_RS01680 -AQ244_RS02670 CTJTET1_RS04270 -AQ244_RS02670 KW39_RS04110 -AQ244_RS02670 BKC03_RS04130 -AQ244_RS02670 CBP48_RS00700 -AQ244_RS02670 A5291_RS04135 -AQ244_RS02670 ECS88FINAL_RS0104180 -AQ244_RS02670 DU10_RS04145 -AQ244_RS02670 SOTONK1_RS04095 -AQ244_RS02670 IaCS19096_RS04090 -AQ244_RS02670 DU13_RS04145 -AQ244_RS02670 C15_RS0104205 -AQ244_RS02670 O169_RS04105 -AQ244_RS02670 KW36_RS04095 -AQ244_RS02670 AQ193_RS04680 -AQ244_RS03375 AQ244_RS03375 -AQ244_RS03375 BKB92_RS01195 -AQ244_RS03375 CBP42_RS02585 -AQ244_RS03375 SOTONIA3_RS01210 -AQ244_RS03375 E150_RS01190 -AQ244_RS03375 CTB_RS01220 -AQ244_RS03375 L2BUCH2_RS01180 -AQ244_RS03375 AQ193_RS02800 -AQ244_RS03375 CTO_RS01220 -AQ244_RS03375 FCS84708_RS01190 -AQ244_RS03375 AP288_RS04260 -AQ244_RS03375 BKB93_RS01195 -AQ244_RS03375 CBP44_RS02590 -AQ244_RS03375 AQ199_RS01885 -AQ244_RS03375 L2BLST_RS01180 -AQ244_RS03375 BW688_RS02590 -AQ244_RS03375 BBV13_RS01225 -AQ244_RS03375 G9768_RS01200 -AQ244_RS03375 BKC02_RS01195 -AQ244_RS03375 L3404_RS01175 -AQ244_RS03375 AKW53_RS02685 -AQ244_RS03375 BBV16_RS01225 -AQ244_RS03375 BKC01_RS01195 -AQ244_RS03375 120487 -AQ244_RS03375 gnl|Prokka|PADJNBJD_00234 -AQ244_RS03375 DU10_RS01205 -AQ244_RS03375 NILJEPDF_00234 -AQ244_RS03375 LJHENM_01175 -AQ244_RS03375 BKC03_RS01195 -AQ244_RS03375 CTRC943_RS01180 -AQ244_RS03375 CTJTET1_RS01210 -AQ244_RS03375 JIEJKO_01175 -AQ244_RS03375 C15_RS0101230 -AQ244_RS03375 SOTONK1_RS01195 -AQ244_RS03375 ECS88FINAL_RS0101215 -AQ244_RS03375 QSDFRQ_00234 -AQ244_RS03375 A5291_RS01220 -AQ244_RS03375 IaCS19096_RS01195 -AQ244_RS03375 7618887 -AQ244_RS03375 O169_RS01200 -AQ244_RS03375 DU13_RS01205 -AQ244_RS03375 AOT15_RS01170 -AQ244_RS03375 SW2_RS01190 -AQ244_RS03375 BKB95_RS01210 -AQ244_RS03375 CBP48_RS02585 -AQ244_RS03375 KW36_RS01195 -AQ244_RS03375 ECS102511_RS01190 -AQ244_RS03375 BKB96_RS01195 -AQ244_RS03375 CTL2C_RS02545 -AQ244_RS03375 BKB99_RS01195 -AQ244_RS03375 L1224_RS01175 -AQ244_RS03375 L1440_RS01175 -AQ244_RS03535 AQ244_RS03535 -AQ244_RS03535 BKB92_RS01360 -AQ244_RS03535 CBP42_RS02750 -AQ244_RS03535 SOTONIA3_RS01370 -AQ244_RS03535 CTB_RS01380 -AQ244_RS03535 E150_RS01350 -AQ244_RS03535 L2BUCH2_RS01340 -AQ244_RS03535 AQ193_RS02640 -AQ244_RS03535 CTO_RS01380 -AQ244_RS03535 FCS84708_RS01350 -AQ244_RS03535 AP288_RS04420 -AQ244_RS03535 BKB93_RS01360 -AQ244_RS03535 CBP44_RS02755 -AQ244_RS03535 AQ199_RS02045 -AQ244_RS03535 L2BLST_RS01340 -AQ244_RS03535 BBV13_RS01390 -AQ244_RS03535 BW688_RS02755 -AQ244_RS03535 G9768_RS01360 -AQ244_RS03535 BKC02_RS01360 -AQ244_RS03535 BBV16_RS01390 -AQ244_RS03535 L3404_RS01335 -AQ244_RS03535 AKW53_RS02845 -AQ244_RS03535 BKC01_RS01360 -AQ244_RS03535 gnl|Prokka|PADJNBJD_00266 -AQ244_RS03535 DU10_RS01370 -AQ244_RS03535 NILJEPDF_00266 -AQ244_RS03535 LJHENM_01340 -AQ244_RS03535 BKC03_RS01360 -AQ244_RS03535 CTRC943_RS01340 -AQ244_RS03535 CTJTET1_RS01370 -AQ244_RS03535 KW39_RS01360 -AQ244_RS03535 JIEJKO_01340 -AQ244_RS03535 119419 -AQ244_RS03535 C15_RS0101390 -AQ244_RS03535 SOTONK1_RS01355 -AQ244_RS03535 ECS88FINAL_RS0101375 -AQ244_RS03535 QSDFRQ_00266 -AQ244_RS03535 A5291_RS01380 -AQ244_RS03535 O169_RS01360 -AQ244_RS03535 IaCS19096_RS01355 -AQ244_RS03535 DU13_RS01370 -AQ244_RS03535 AOT15_RS01010 -AQ244_RS03535 7618490 -AQ244_RS03535 SW2_RS01350 -AQ244_RS03535 BKB95_RS01375 -AQ244_RS03535 CBP48_RS02750 -AQ244_RS03535 KW36_RS01355 -AQ244_RS03535 ECS102511_RS01350 -AQ244_RS03535 BKB96_RS01360 -AQ244_RS03535 CTL2C_RS02705 -AQ244_RS03535 BKB99_RS01360 -AQ244_RS03535 L1224_RS01335 -AQ244_RS03535 L1440_RS01335 -AQ244_RS04060 AQ244_RS04060 -AQ244_RS04060 E150_RS03855 -AQ244_RS04060 CTO_RS03885 -AQ244_RS04060 BBV13_RS03890 -AQ244_RS04060 FCS84708_RS03845 -AQ244_RS04060 L2BLST_RS03830 -AQ244_RS04060 BBV16_RS03900 -AQ244_RS04060 120040 -AQ244_RS04060 BW688_RS00455 -AQ244_RS04060 AQ193_RS00140 -AQ244_RS04060 AQ199_RS04545 -AQ244_RS04060 BKB93_RS03890 -AQ244_RS04060 G9768_RS03850 -AQ244_RS04060 gnl|Prokka|PADJNBJD_00757 -AQ244_RS04060 L3404_RS03825 -AQ244_RS04060 NILJEPDF_00758 -AQ244_RS04060 BKC02_RS03885 -AQ244_RS04060 LJHENM_03815 -AQ244_RS04060 AOT15_RS04650 -AQ244_RS04060 AP288_RS02220 -AQ244_RS04060 JIEJKO_03815 -AQ244_RS04060 QSDFRQ_00758 -AQ244_RS04060 BKC01_RS03890 -AQ244_RS04060 CTRC943_RS03835 -AQ244_RS04060 AKW53_RS00590 -AQ244_RS04060 BKC03_RS03885 -AQ244_RS04060 CBP48_RS00455 -AQ244_RS04060 CTJTET1_RS03870 -AQ244_RS04060 KW39_RS03865 -AQ244_RS04060 DU10_RS03900 -AQ244_RS04060 A5291_RS03895 -AQ244_RS04060 SOTONK1_RS03850 -AQ244_RS04060 IaCS19096_RS03845 -AQ244_RS04060 DU13_RS03900 -AQ244_RS04060 C15_RS0103955 -AQ244_RS04060 ECS88FINAL_RS0103955 -AQ244_RS04060 O169_RS03860 -AQ244_RS04060 KW36_RS03850 -AQ244_RS04060 BKB95_RS03905 -AQ244_RS04060 CBP42_RS00455 -AQ244_RS04060 CTL2C_RS00450 -AQ244_RS04060 L1224_RS03830 -AQ244_RS04060 SW2_RS03855 -AQ244_RS04060 L1440_RS03825 -AQ244_RS04060 ECS102511_RS03845 -AQ244_RS04060 BKB96_RS03890 -AQ244_RS04060 BKB99_RS03885 -AQ244_RS04060 CBP44_RS00455 -AQ244_RS04060 L2BUCH2_RS03830 -AQ244_RS04060 BKB92_RS03885 -AQ244_RS04060 CTB_RS03890 -AQ244_RS04060 SOTONIA3_RS03870 -AQ244_RS04225 AQ244_RS04225 -AQ244_RS04225 E150_RS03690 -AQ244_RS04225 CTO_RS03720 -AQ244_RS04225 BBV13_RS03725 -AQ244_RS04225 FCS84708_RS03680 -AQ244_RS04225 BBV16_RS03735 -AQ244_RS04225 L2BLST_RS03665 -AQ244_RS04225 119735 -AQ244_RS04225 AQ193_RS00305 -AQ244_RS04225 BW688_RS00290 -AQ244_RS04225 7618238 -AQ244_RS04225 AQ199_RS04380 -AQ244_RS04225 BKB93_RS03725 -AQ244_RS04225 G9768_RS03685 -AQ244_RS04225 gnl|Prokka|PADJNBJD_00725 -AQ244_RS04225 L3404_RS03660 -AQ244_RS04225 BKC02_RS03720 -AQ244_RS04225 NILJEPDF_00726 -AQ244_RS04225 LJHENM_03655 -AQ244_RS04225 AOT15_RS04485 -AQ244_RS04225 JIEJKO_03655 -AQ244_RS04225 BKC01_RS03725 -AQ244_RS04225 QSDFRQ_00726 -AQ244_RS04225 CTRC943_RS03670 -AQ244_RS04225 BKC03_RS03720 -AQ244_RS04225 CTJTET1_RS03705 -AQ244_RS04225 KW39_RS03700 -AQ244_RS04225 DU10_RS03735 -AQ244_RS04225 CBP48_RS00290 -AQ244_RS04225 A5291_RS03730 -AQ244_RS04225 SOTONK1_RS03685 -AQ244_RS04225 IaCS19096_RS03680 -AQ244_RS04225 DU13_RS03735 -AQ244_RS04225 C15_RS0103780 -AQ244_RS04225 ECS88FINAL_RS0103780 -AQ244_RS04225 O169_RS03695 -AQ244_RS04225 KW36_RS03685 -AQ244_RS04225 BKB95_RS03740 -AQ244_RS04225 CBP42_RS00290 -AQ244_RS04225 SW2_RS03690 -AQ244_RS04225 CTL2C_RS00285 -AQ244_RS04225 L1224_RS03665 -AQ244_RS04225 ECS102511_RS03680 -AQ244_RS04225 BKB96_RS03725 -AQ244_RS04225 BKB99_RS03720 -AQ244_RS04225 L1440_RS03665 -AQ244_RS04225 CBP44_RS00290 -AQ244_RS04225 L2BUCH2_RS03665 -AQ244_RS04225 BKB92_RS03720 -AQ244_RS04225 CTB_RS03725 -AQ244_RS04225 SOTONIA3_RS03705 -AQ244_RS04225 AP288_RS02055 F -AQ244_RS04915 AQ244_RS04915 -AQ244_RS04915 A5291_RS04840 -AQ244_RS04915 SOTONK1_RS04810 -AQ244_RS04915 IaCS19096_RS04795 -AQ244_RS04915 AOT15_RS03395 -AQ244_RS04915 L1224_RS04790 -AQ244_RS04915 ECS102511_RS04800 -AQ244_RS04915 L2BUCH2_RS04790 -AQ244_RS04915 CTO_RS04805 -AQ244_RS04915 gnl|Prokka|PADJNBJD_00938 -AQ244_RS04915 SOTONIA3_RS04825 -AQ244_RS04915 BBV13_RS04835 -AQ244_RS04915 L2BLST_RS04790 -AQ244_RS04915 BBV16_RS04840 -AQ244_RS04915 FCS84708_RS04795 -AQ244_RS04915 AQ193_RS04780 -AQ244_RS04915 NILJEPDF_00942 -AQ244_RS04915 AQ199_RS04805 -AQ244_RS04915 L3404_RS04785 -AQ244_RS04915 QSDFRQ_00942 -AQ244_RS04915 AP288_RS04850 -BBV13_RS00110 BBV13_RS00110 -BBV13_RS00110 G9768_RS00105 -BBV13_RS00110 AQ199_RS00800 -BBV13_RS00110 BW688_RS01500 -BBV13_RS00110 L2BLST_RS00105 -BBV13_RS00110 BKC02_RS00110 -BBV13_RS00110 BBV16_RS00110 -BBV13_RS00110 BKC01_RS00110 -BBV13_RS00110 gnl|Prokka|PADJNBJD_00022 -BBV13_RS00110 LJHENM_00110 -BBV13_RS00110 A5291_RS00105 -BBV13_RS00110 SOTONK1_RS00105 -BBV13_RS00110 JIEJKO_00105 -BBV13_RS00110 7618787 -BBV13_RS00110 NILJEPDF_00022 -BBV13_RS00110 L3404_RS00105 -BBV13_RS00110 IaCS19096_RS00105 -BBV13_RS00110 AQ193_RS03900 -BBV13_RS00110 BKC03_RS00110 -BBV13_RS00110 C15_RS0100105 -BBV13_RS00110 AKW53_RS01590 -BBV13_RS00110 QSDFRQ_00022 -BBV13_RS00110 CTJTET1_RS00105 -BBV13_RS00110 AQ244_RS01885 -BBV13_RS00110 DU10_RS00110 -BBV13_RS00110 CTRC943_RS00105 -BBV13_RS00110 O169_RS00105 -BBV13_RS00110 CBP48_RS01500 -BBV13_RS00110 ECS88FINAL_RS0100110 -BBV13_RS00110 DU13_RS00110 -BBV13_RS00110 KW39_RS00105 -BBV13_RS00110 BKB95_RS00110 -BBV13_RS00110 KW36_RS00105 -BBV13_RS00110 SW2_RS00105 -BBV13_RS00110 ECS102511_RS00105 -BBV13_RS00110 CTB_RS00105 -BBV13_RS00110 CTL2C_RS01470 -BBV13_RS00110 CBP42_RS01500 -BBV13_RS00110 L1224_RS00105 -BBV13_RS00110 BKB96_RS00110 -BBV13_RS00110 BKB99_RS00110 -BBV13_RS00110 CTO_RS00105 -BBV13_RS00110 SOTONIA3_RS00105 -BBV13_RS00110 L1440_RS00105 -BBV13_RS00110 BKB92_RS00110 -BBV13_RS00110 120652 -BBV13_RS00110 AOT15_RS00850 -BBV13_RS00110 CBP44_RS01505 -BBV13_RS00110 E150_RS00105 -BBV13_RS00110 L2BUCH2_RS00105 -BBV13_RS00110 BKB93_RS00110 -BBV13_RS00110 FCS84708_RS00105 -BBV13_RS00110 AP288_RS03175 -BBV13_RS01160 BBV13_RS01160 -BBV13_RS01160 G9768_RS01135 -BBV13_RS01160 BKC02_RS01130 -BBV13_RS01160 AOT15_RS01235 -BBV13_RS01160 L3404_RS01110 -BBV13_RS01160 AKW53_RS02620 -BBV13_RS01160 BBV16_RS01160 -BBV13_RS01160 BKC01_RS01130 -BBV13_RS01160 119383 -BBV13_RS01160 DU10_RS01140 -BBV13_RS01160 gnl|Prokka|PADJNBJD_00222 -BBV13_RS01160 BKC03_RS01130 -BBV13_RS01160 NILJEPDF_00222 -BBV13_RS01160 LJHENM_01115 -BBV13_RS01160 CTRC943_RS01115 -BBV13_RS01160 CTJTET1_RS01145 -BBV13_RS01160 C15_RS0101165 -BBV13_RS01160 SOTONK1_RS01130 -BBV13_RS01160 ECS88FINAL_RS0101150 -BBV13_RS01160 KW39_RS01135 -BBV13_RS01160 JIEJKO_01115 -BBV13_RS01160 A5291_RS01155 -BBV13_RS01160 IaCS19096_RS01130 -BBV13_RS01160 7618467 -BBV13_RS01160 QSDFRQ_00222 -BBV13_RS01160 O169_RS01135 -BBV13_RS01160 DU13_RS01140 -BBV13_RS01160 SW2_RS01125 -BBV13_RS01160 BKB95_RS01145 -BBV13_RS01160 CBP48_RS02520 -BBV13_RS01160 KW36_RS01130 -BBV13_RS01160 ECS102511_RS01125 -BBV13_RS01160 AQ193_RS02865 -BBV13_RS01160 BKB96_RS01130 -BBV13_RS01160 CTL2C_RS02480 -BBV13_RS01160 BKB99_RS01130 -BBV13_RS01160 L1224_RS01110 -BBV13_RS01160 L1440_RS01110 -BBV13_RS01160 AQ244_RS03310 -BBV13_RS01160 BKB92_RS01130 -BBV13_RS01160 CBP42_RS02520 -BBV13_RS01160 SOTONIA3_RS01145 -BBV13_RS01160 E150_RS01125 -BBV13_RS01160 CTB_RS01155 -BBV13_RS01160 L2BUCH2_RS01115 -BBV13_RS01160 CTO_RS01155 -BBV13_RS01160 FCS84708_RS01125 -BBV13_RS01160 AP288_RS04195 -BBV13_RS01160 BKB93_RS01130 -BBV13_RS01160 CBP44_RS02525 -BBV13_RS01160 AQ199_RS01820 -BBV13_RS01160 L2BLST_RS01115 -BBV13_RS01160 BW688_RS02525 -BBV13_RS01665 BBV13_RS01665 -BBV13_RS01665 G9768_RS01635 -BBV13_RS01665 BKC02_RS01635 -BBV13_RS01665 L3404_RS01610 -BBV13_RS01665 AKW53_RS03125 -BBV13_RS01665 BBV16_RS01665 -BBV13_RS01665 BKC01_RS01640 -BBV13_RS01665 gnl|Prokka|PADJNBJD_00321 -BBV13_RS01665 NILJEPDF_00321 -BBV13_RS01665 LJHENM_01615 -BBV13_RS01665 CTRC943_RS01615 -BBV13_RS01665 BKC03_RS01635 -BBV13_RS01665 DU10_RS01650 -BBV13_RS01665 CTJTET1_RS01645 -BBV13_RS01665 KW39_RS01635 -BBV13_RS01665 JIEJKO_01615 -BBV13_RS01665 C15_RS0101675 -BBV13_RS01665 SOTONK1_RS01635 -BBV13_RS01665 ECS88FINAL_RS0101655 -BBV13_RS01665 QSDFRQ_00321 -BBV13_RS01665 IaCS19096_RS01630 -BBV13_RS01665 AQ193_RS02360 -BBV13_RS01665 120399 -BBV13_RS01665 A5291_RS01660 -BBV13_RS01665 O169_RS01640 -BBV13_RS01665 DU13_RS01645 -BBV13_RS01665 CBP48_RS03025 -BBV13_RS01665 7618937 -BBV13_RS01665 SW2_RS01625 -BBV13_RS01665 BKB95_RS01650 -BBV13_RS01665 CTL2C_RS02980 -BBV13_RS01665 KW36_RS01630 -BBV13_RS01665 ECS102511_RS01625 -BBV13_RS01665 AOT15_RS02630 -BBV13_RS01665 BKB96_RS01635 -BBV13_RS01665 L1224_RS01610 -BBV13_RS01665 BKB99_RS01635 -BBV13_RS01665 L1440_RS01610 -BBV13_RS01665 CBP42_RS03025 -BBV13_RS01665 AQ244_RS03815 -BBV13_RS01665 SOTONIA3_RS01645 -BBV13_RS01665 BKB92_RS01640 -BBV13_RS01665 CTB_RS01660 -BBV13_RS01665 E150_RS01630 -BBV13_RS01665 L2BUCH2_RS01615 -BBV13_RS01665 CTO_RS01655 -BBV13_RS01665 FCS84708_RS01625 -BBV13_RS01665 AP288_RS04695 -BBV13_RS01665 CBP44_RS03030 -BBV13_RS01665 BKB93_RS01640 -BBV13_RS01665 L2BLST_RS01615 -BBV13_RS01665 AQ199_RS02320 -BBV13_RS01665 BW688_RS03035 -BBV13_RS02515 BBV13_RS02515 -BBV13_RS02515 L2BLST_RS02455 -BBV13_RS02515 FCS84708_RS02470 -BBV13_RS02515 CBP44_RS03900 -BBV13_RS02515 BBV16_RS02525 -BBV13_RS02515 BKB93_RS02505 -BBV13_RS02515 AQ199_RS03170 -BBV13_RS02515 G9768_RS02475 -BBV13_RS02515 L3404_RS02450 -BBV13_RS02515 AQ193_RS01510 -BBV13_RS02515 BKC02_RS02495 -BBV13_RS02515 gnl|Prokka|PADJNBJD_00488 -BBV13_RS02515 BKC01_RS02495 -BBV13_RS02515 NILJEPDF_00488 -BBV13_RS02515 AOT15_RS03620 -BBV13_RS02515 LJHENM_02460 -BBV13_RS02515 CTRC943_RS02455 -BBV13_RS02515 JIEJKO_02460 -BBV13_RS02515 QSDFRQ_00488 -BBV13_RS02515 SOTONK1_RS02475 -BBV13_RS02515 CTJTET1_RS02485 -BBV13_RS02515 BKC03_RS02495 -BBV13_RS02515 C15_RS0102535 -BBV13_RS02515 KW39_RS02485 -BBV13_RS02515 IaCS19096_RS02470 -BBV13_RS02515 DU10_RS02515 -BBV13_RS02515 A5291_RS02510 -BBV13_RS02515 ECS88FINAL_RS0102530 -BBV13_RS02515 O169_RS02485 -BBV13_RS02515 7619018 -BBV13_RS02515 DU13_RS02510 -BBV13_RS02515 BKB96_RS02500 -BBV13_RS02515 BKB99_RS02495 -BBV13_RS02515 CBP48_RS03895 -BBV13_RS02515 CTL2C_RS03825 -BBV13_RS02515 KW36_RS02470 -BBV13_RS02515 AKW53_RS04740 -BBV13_RS02515 BKB95_RS02510 -BBV13_RS02515 L1224_RS02455 -BBV13_RS02515 SW2_RS02480 -BBV13_RS02515 ECS102511_RS02475 -BBV13_RS02515 120267 -BBV13_RS02515 L1440_RS02455 -BBV13_RS02515 AP288_RS00605 -BBV13_RS02515 CBP42_RS03905 -BBV13_RS02515 L2BUCH2_RS02455 -BBV13_RS02515 CTB_RS02510 -BBV13_RS02515 SOTONIA3_RS02490 -BBV13_RS02515 BKB92_RS02500 -BBV13_RS02515 E150_RS02480 -BBV13_RS02515 CTO_RS02510 -BBV13_RS02515 AQ244_RS00635 -BBV13_RS02515 BW688_RS03895 -BBV16_RS00080 BBV16_RS00080 -BBV16_RS00080 BKC01_RS00080 -BBV16_RS00080 7618785 -BBV16_RS00080 gnl|Prokka|PADJNBJD_00016 -BBV16_RS00080 LJHENM_00080 -BBV16_RS00080 A5291_RS00080 -BBV16_RS00080 SOTONK1_RS00080 -BBV16_RS00080 JIEJKO_00075 -BBV16_RS00080 NILJEPDF_00016 -BBV16_RS00080 L3404_RS00080 -BBV16_RS00080 IaCS19096_RS00080 -BBV16_RS00080 BKC03_RS00080 -BBV16_RS00080 C15_RS0100080 -BBV16_RS00080 AKW53_RS01565 -BBV16_RS00080 QSDFRQ_00016 -BBV16_RS00080 CTJTET1_RS00080 -BBV16_RS00080 DU10_RS00080 -BBV16_RS00080 CTRC943_RS00080 -BBV16_RS00080 O169_RS00080 -BBV16_RS00080 CBP48_RS01470 -BBV16_RS00080 ECS88FINAL_RS0100085 -BBV16_RS00080 DU13_RS00080 -BBV16_RS00080 KW39_RS00080 -BBV16_RS00080 BKB95_RS00080 -BBV16_RS00080 KW36_RS00080 -BBV16_RS00080 SW2_RS00080 -BBV16_RS00080 ECS102511_RS00080 -BBV16_RS00080 AQ193_RS03925 -BBV16_RS00080 CTB_RS00080 -BBV16_RS00080 CTL2C_RS01445 -BBV16_RS00080 CBP42_RS01470 -BBV16_RS00080 AQ244_RS01910 -BBV16_RS00080 L1224_RS00080 -BBV16_RS00080 BKB96_RS00080 -BBV16_RS00080 BKB99_RS00080 -BBV16_RS00080 CTO_RS00080 -BBV16_RS00080 SOTONIA3_RS00080 -BBV16_RS00080 L1440_RS00080 -BBV16_RS00080 BKB92_RS00080 -BBV16_RS00080 120655 -BBV16_RS00080 CBP44_RS01475 -BBV16_RS00080 E150_RS00080 -BBV16_RS00080 L2BUCH2_RS00080 -BBV16_RS00080 BKB93_RS00080 -BBV16_RS00080 FCS84708_RS00080 -BBV16_RS00080 AP288_RS03150 -BBV16_RS00080 BBV13_RS00080 -BBV16_RS00080 G9768_RS00080 -BBV16_RS00080 AQ199_RS00775 -BBV16_RS00080 BW688_RS01470 -BBV16_RS00080 L2BLST_RS00080 -BBV16_RS00080 BKC02_RS00080 -BBV16_RS00080 AOT15_RS00875 -BBV16_RS00250 BBV16_RS00250 -BBV16_RS00250 gnl|Prokka|PADJNBJD_00048 -BBV16_RS00250 AOT15_RS00710 -BBV16_RS00250 JIEJKO_00235 -BBV16_RS00250 NILJEPDF_00048 -BBV16_RS00250 LJHENM_00245 -BBV16_RS00250 BKC01_RS00250 -BBV16_RS00250 A5291_RS00245 -BBV16_RS00250 SOTONK1_RS00245 -BBV16_RS00250 QSDFRQ_00048 -BBV16_RS00250 IaCS19096_RS00245 -BBV16_RS00250 BKC03_RS00250 -BBV16_RS00250 C15_RS0100245 -BBV16_RS00250 DU10_RS00250 -BBV16_RS00250 CTJTET1_RS00245 -BBV16_RS00250 O169_RS00245 -BBV16_RS00250 ECS88FINAL_RS0100250 -BBV16_RS00250 DU13_RS00250 -BBV16_RS00250 KW39_RS00245 -BBV16_RS00250 KW36_RS00245 -BBV16_RS00250 BKB95_RS00250 -BBV16_RS00250 SW2_RS00245 -BBV16_RS00250 ECS102511_RS00245 -BBV16_RS00250 CTB_RS00245 -BBV16_RS00250 AQ244_RS01745 -BBV16_RS00250 BKB96_RS00250 -BBV16_RS00250 BKB99_RS00250 -BBV16_RS00250 BKB92_RS00250 -BBV16_RS00250 CTO_RS00245 -BBV16_RS00250 SOTONIA3_RS00245 -BBV16_RS00250 119244 -BBV16_RS00250 E150_RS00245 -BBV16_RS00250 BKB93_RS00250 -BBV16_RS00250 FCS84708_RS00245 -BBV16_RS00250 AP288_RS03315 -BBV16_RS00250 BBV13_RS00250 -BBV16_RS00250 AQ199_RS00940 -BBV16_RS00250 G9768_RS00245 -BBV16_RS00250 BKC02_RS00250 -BBV16_RS00250 L3404_RS00245 -BBV16_RS00250 7618380 -BBV16_RS00250 CTRC943_RS00245 -BBV16_RS00250 CBP48_RS01640 -BBV16_RS00250 CBP42_RS01640 -BBV16_RS00250 L1224_RS00245 -BBV16_RS00250 L1440_RS00245 -BBV16_RS00250 CBP44_RS01645 -BBV16_RS00250 L2BUCH2_RS00245 -BBV16_RS00250 BW688_RS01640 -BBV16_RS00250 L2BLST_RS00245 -BBV16_RS00420 BBV16_RS00420 -BBV16_RS00420 gnl|Prokka|PADJNBJD_00082 -BBV16_RS00420 NILJEPDF_00082 -BBV16_RS00420 A5291_RS00415 -BBV16_RS00420 BKC01_RS00425 -BBV16_RS00420 SOTONK1_RS00415 -BBV16_RS00420 L3404_RS00415 -BBV16_RS00420 JIEJKO_00415 -BBV16_RS00420 AKW53_RS01905 -BBV16_RS00420 QSDFRQ_00082 -BBV16_RS00420 IaCS19096_RS00415 -BBV16_RS00420 BKC03_RS00425 -BBV16_RS00420 C15_RS0100425 -BBV16_RS00420 DU10_RS00425 -BBV16_RS00420 7618815 -BBV16_RS00420 CTRC943_RS00415 -BBV16_RS00420 CTJTET1_RS00415 -BBV16_RS00420 O169_RS00415 -BBV16_RS00420 KW36_RS00415 -BBV16_RS00420 DU13_RS00430 -BBV16_RS00420 CBP48_RS01815 -BBV16_RS00420 ECS88FINAL_RS0100430 -BBV16_RS00420 KW39_RS00415 -BBV16_RS00420 BKB95_RS00425 -BBV16_RS00420 SW2_RS00415 -BBV16_RS00420 ECS102511_RS00415 -BBV16_RS00420 CTB_RS00415 -BBV16_RS00420 CTL2C_RS01780 -BBV16_RS00420 AQ193_RS03580 -BBV16_RS00420 AQ244_RS01575 -BBV16_RS00420 CBP42_RS01815 -BBV16_RS00420 BKB96_RS00425 -BBV16_RS00420 L1224_RS00415 -BBV16_RS00420 BKB99_RS00425 -BBV16_RS00420 CTO_RS00415 -BBV16_RS00420 L1440_RS00415 -BBV16_RS00420 BKB92_RS00425 -BBV16_RS00420 SOTONIA3_RS00415 -BBV16_RS00420 CBP44_RS01820 -BBV16_RS00420 120608 -BBV16_RS00420 E150_RS00415 -BBV16_RS00420 L2BUCH2_RS00415 -BBV16_RS00420 BKB93_RS00425 -BBV16_RS00420 FCS84708_RS00415 -BBV16_RS00420 AP288_RS03485 -BBV16_RS00420 BBV13_RS00420 -BBV16_RS00420 AQ199_RS01110 -BBV16_RS00420 BW688_RS01815 -BBV16_RS00420 G9768_RS00415 -BBV16_RS00420 L2BLST_RS00415 -BBV16_RS00420 AOT15_RS00540 -BBV16_RS00420 BKC02_RS00425 -BBV16_RS00590 BBV16_RS00590 -BBV16_RS00590 gnl|Prokka|PADJNBJD_00114 -BBV16_RS00590 LJHENM_00570 -BBV16_RS00590 AKW53_RS02075 -BBV16_RS00590 BKC01_RS00590 -BBV16_RS00590 NILJEPDF_00114 -BBV16_RS00590 A5291_RS00585 -BBV16_RS00590 SOTONK1_RS00580 -BBV16_RS00590 L3404_RS00580 -BBV16_RS00590 JIEJKO_00575 -BBV16_RS00590 QSDFRQ_00114 -BBV16_RS00590 IaCS19096_RS00580 -BBV16_RS00590 BKC03_RS00590 -BBV16_RS00590 C15_RS0100595 -BBV16_RS00590 CTJTET1_RS00580 -BBV16_RS00590 KW39_RS00580 -BBV16_RS00590 DU10_RS00590 -BBV16_RS00590 CTRC943_RS00580 -BBV16_RS00590 ECS88FINAL_RS0100595 -BBV16_RS00590 O169_RS00580 -BBV16_RS00590 DU13_RS00595 -BBV16_RS00590 7618836 -BBV16_RS00590 KW36_RS00580 -BBV16_RS00590 CBP48_RS01980 -BBV16_RS00590 SW2_RS00580 -BBV16_RS00590 BKB95_RS00590 -BBV16_RS00590 ECS102511_RS00580 -BBV16_RS00590 CTL2C_RS01945 -BBV16_RS00590 CTB_RS00585 -BBV16_RS00590 AQ244_RS02755 -BBV16_RS00590 BKB96_RS00590 -BBV16_RS00590 CBP42_RS01980 -BBV16_RS00590 L1224_RS00580 -BBV16_RS00590 AQ193_RS03415 -BBV16_RS00590 BKB99_RS00590 -BBV16_RS00590 BKB92_RS00590 -BBV16_RS00590 SOTONIA3_RS00580 -BBV16_RS00590 L1440_RS00580 -BBV16_RS00590 CTO_RS00585 -BBV16_RS00590 E150_RS00580 -BBV16_RS00590 CBP44_RS01985 -BBV16_RS00590 120575 -BBV16_RS00590 L2BUCH2_RS00580 -BBV16_RS00590 FCS84708_RS00580 -BBV16_RS00590 AP288_RS03650 -BBV16_RS00590 BKB93_RS00590 -BBV16_RS00590 AQ199_RS01275 -BBV16_RS00590 BBV13_RS00590 -BBV16_RS00590 G9768_RS00580 -BBV16_RS00590 L2BLST_RS00580 -BBV16_RS00590 BW688_RS01980 -BBV16_RS00590 AOT15_RS00375 -BBV16_RS00590 BKC02_RS00590 -BBV16_RS00765 BBV16_RS00765 -BBV16_RS00765 BKC02_RS00765 -BBV16_RS00765 gnl|Prokka|PADJNBJD_00149 -BBV16_RS00765 LJHENM_00745 -BBV16_RS00765 AKW53_RS02250 -BBV16_RS00765 BKC01_RS00765 -BBV16_RS00765 NILJEPDF_00149 -BBV16_RS00765 A5291_RS00760 -BBV16_RS00765 L3404_RS00755 -BBV16_RS00765 SOTONK1_RS00755 -BBV16_RS00765 JIEJKO_00750 -BBV16_RS00765 QSDFRQ_00149 -BBV16_RS00765 CTJTET1_RS00755 -BBV16_RS00765 IaCS19096_RS00755 -BBV16_RS00765 BKC03_RS00765 -BBV16_RS00765 C15_RS0100780 -BBV16_RS00765 CTRC943_RS00755 -BBV16_RS00765 ECS88FINAL_RS0100780 -BBV16_RS00765 KW39_RS00755 -BBV16_RS00765 DU10_RS00765 -BBV16_RS00765 O169_RS00755 -BBV16_RS00765 DU13_RS00770 -BBV16_RS00765 KW36_RS00755 -BBV16_RS00765 CBP48_RS02155 -BBV16_RS00765 SW2_RS00755 -BBV16_RS00765 BKB95_RS00765 -BBV16_RS00765 7618435 -BBV16_RS00765 ECS102511_RS00755 -BBV16_RS00765 CTL2C_RS02120 -BBV16_RS00765 CTB_RS00760 -BBV16_RS00765 AQ193_RS03240 -BBV16_RS00765 L1224_RS00755 -BBV16_RS00765 AQ244_RS02930 -BBV16_RS00765 BKB96_RS00765 -BBV16_RS00765 CBP42_RS02155 -BBV16_RS00765 BKB99_RS00765 -BBV16_RS00765 CTO_RS00760 -BBV16_RS00765 L1440_RS00755 -BBV16_RS00765 BKB92_RS00765 -BBV16_RS00765 SOTONIA3_RS00755 -BBV16_RS00765 E150_RS00755 -BBV16_RS00765 L2BUCH2_RS00755 -BBV16_RS00765 CBP44_RS02160 -BBV16_RS00765 FCS84708_RS00755 -BBV16_RS00765 AP288_RS03825 -BBV16_RS00765 BKB93_RS00765 -BBV16_RS00765 119329 -BBV16_RS00765 AQ199_RS01450 -BBV16_RS00765 BBV13_RS00765 -BBV16_RS00765 G9768_RS00755 -BBV16_RS00765 L2BLST_RS00755 -BBV16_RS00765 BW688_RS02155 -BBV16_RS00765 AOT15_RS00200 -BBV16_RS00960 BBV16_RS00960 -BBV16_RS00960 BKC01_RS00930 -BBV16_RS00960 BKC03_RS00930 -BBV16_RS00960 CTRC943_RS00915 -BBV16_RS00960 CTJTET1_RS00945 -BBV16_RS00960 C15_RS0100965 -BBV16_RS00960 SOTONK1_RS00930 -BBV16_RS00960 KW39_RS00935 -BBV16_RS00960 7618858 -BBV16_RS00960 A5291_RS00955 -BBV16_RS00960 IaCS19096_RS00930 -BBV16_RS00960 AOT15_RS01435 -BBV16_RS00960 O169_RS00935 -BBV16_RS00960 DU13_RS00940 -BBV16_RS00960 BKB95_RS00945 -BBV16_RS00960 CBP48_RS02320 -BBV16_RS00960 KW36_RS00930 -BBV16_RS00960 BKB96_RS00930 -BBV16_RS00960 CTL2C_RS02280 -BBV16_RS00960 BKB99_RS00930 -BBV16_RS00960 L1224_RS00910 -BBV16_RS00960 L1440_RS00910 -BBV16_RS00960 AQ244_RS03110 -BBV16_RS00960 CBP42_RS02320 -BBV16_RS00960 SOTONIA3_RS00945 -BBV16_RS00960 CTB_RS00955 -BBV16_RS00960 L2BUCH2_RS00915 -BBV16_RS00960 CTO_RS00955 -BBV16_RS00960 CBP44_RS02325 -BBV16_RS00960 AQ199_RS01620 -BBV16_RS00960 L2BLST_RS00915 -BBV16_RS00960 BW688_RS02325 -BBV16_RS00960 BBV13_RS00960 -BBV16_RS00960 G9768_RS00935 -BBV16_RS00960 BKC02_RS00930 -BBV16_RS00960 L3404_RS00910 -BBV16_RS00960 120533 -BBV16_RS01140 BBV16_RS01140 -BBV16_RS01140 BKC01_RS01110 -BBV16_RS01140 120505 -BBV16_RS01140 DU10_RS01120 -BBV16_RS01140 gnl|Prokka|PADJNBJD_00218 -BBV16_RS01140 BKC03_RS01110 -BBV16_RS01140 NILJEPDF_00218 -BBV16_RS01140 LJHENM_01095 -BBV16_RS01140 CTRC943_RS01095 -BBV16_RS01140 CTJTET1_RS01125 -BBV16_RS01140 C15_RS0101145 -BBV16_RS01140 SOTONK1_RS01110 -BBV16_RS01140 ECS88FINAL_RS0101130 -BBV16_RS01140 KW39_RS01115 -BBV16_RS01140 JIEJKO_01095 -BBV16_RS01140 A5291_RS01135 -BBV16_RS01140 IaCS19096_RS01110 -BBV16_RS01140 AOT15_RS01255 -BBV16_RS01140 7618876 -BBV16_RS01140 QSDFRQ_00218 -BBV16_RS01140 O169_RS01115 -BBV16_RS01140 DU13_RS01120 -BBV16_RS01140 SW2_RS01105 -BBV16_RS01140 BKB95_RS01125 -BBV16_RS01140 CBP48_RS02500 -BBV16_RS01140 KW36_RS01110 -BBV16_RS01140 ECS102511_RS01105 -BBV16_RS01140 BKB96_RS01110 -BBV16_RS01140 CTL2C_RS02460 -BBV16_RS01140 BKB99_RS01110 -BBV16_RS01140 L1224_RS01090 -BBV16_RS01140 L1440_RS01090 -BBV16_RS01140 AQ244_RS03290 -BBV16_RS01140 BKB92_RS01110 -BBV16_RS01140 CBP42_RS02500 -BBV16_RS01140 SOTONIA3_RS01125 -BBV16_RS01140 E150_RS01105 -BBV16_RS01140 AQ193_RS02885 -BBV16_RS01140 CTB_RS01135 -BBV16_RS01140 L2BUCH2_RS01095 -BBV16_RS01140 CTO_RS01135 -BBV16_RS01140 FCS84708_RS01105 -BBV16_RS01140 AP288_RS04175 -BBV16_RS01140 BKB93_RS01110 -BBV16_RS01140 CBP44_RS02505 -BBV16_RS01140 AQ199_RS01800 -BBV16_RS01140 L2BLST_RS01095 -BBV16_RS01140 BW688_RS02505 -BBV16_RS01140 BBV13_RS01140 -BBV16_RS01140 G9768_RS01115 -BBV16_RS01140 BKC02_RS01110 -BBV16_RS01140 L3404_RS01090 -BBV16_RS01140 AKW53_RS02600 -BBV16_RS01985 BBV16_RS01985 -BBV16_RS01985 L3404_RS01930 -BBV16_RS01985 BKC02_RS01960 -BBV16_RS01985 BKC01_RS01960 -BBV16_RS01985 AKW53_RS03455 -BBV16_RS01985 gnl|Prokka|PADJNBJD_00385 -BBV16_RS01985 AQ244_RS01155 -BBV16_RS01985 NILJEPDF_00385 -BBV16_RS01985 CTRC943_RS01935 -BBV16_RS01985 LJHENM_01940 -BBV16_RS01985 JIEJKO_01935 -BBV16_RS01985 BKC03_RS01960 -BBV16_RS01985 CTJTET1_RS01965 -BBV16_RS01985 QSDFRQ_00385 -BBV16_RS01985 C15_RS0102000 -BBV16_RS01985 SOTONK1_RS01955 -BBV16_RS01985 DU10_RS01985 -BBV16_RS01985 A5291_RS01980 -BBV16_RS01985 KW39_RS01965 -BBV16_RS01985 IaCS19096_RS01950 -BBV16_RS01985 ECS88FINAL_RS0101990 -BBV16_RS01985 O169_RS01965 -BBV16_RS01985 DU13_RS01980 -BBV16_RS01985 7618534 -BBV16_RS01985 119488 -BBV16_RS01985 CTL2C_RS03300 -BBV16_RS01985 AQ193_RS02030 -BBV16_RS01985 L1224_RS01930 -BBV16_RS01985 KW36_RS01950 -BBV16_RS01985 AOT15_RS02950 -BBV16_RS01985 BKB95_RS01980 -BBV16_RS01985 BKB96_RS01960 -BBV16_RS01985 CBP48_RS03365 -BBV16_RS01985 SW2_RS01955 -BBV16_RS01985 BKB99_RS01960 -BBV16_RS01985 L1440_RS01930 -BBV16_RS01985 ECS102511_RS01955 -BBV16_RS01985 CTB_RS01980 -BBV16_RS01985 SOTONIA3_RS01965 -BBV16_RS01985 L2BUCH2_RS01930 -BBV16_RS01985 BKB92_RS01970 -BBV16_RS01985 CBP42_RS03375 -BBV16_RS01985 CTO_RS01980 -BBV16_RS01985 E150_RS01960 -BBV16_RS01985 L2BLST_RS01930 -BBV16_RS01985 BW688_RS03360 -BBV16_RS01985 FCS84708_RS01950 -BBV16_RS01985 BKB93_RS01970 -BBV16_RS01985 BBV13_RS01985 -BBV16_RS01985 CBP44_RS03370 -BBV16_RS01985 AQ199_RS02650 -BBV16_RS01985 G9768_RS01955 -BBV16_RS01985 AP288_RS01125 -BBV16_RS02510 BBV16_RS02510 -BBV16_RS02510 BKB93_RS02490 -BBV16_RS02510 AQ199_RS03155 -BBV16_RS02510 G9768_RS02460 -BBV16_RS02510 AQ244_RS00650 -BBV16_RS02510 L3404_RS02435 -BBV16_RS02510 BKC02_RS02480 -BBV16_RS02510 gnl|Prokka|PADJNBJD_00485 -BBV16_RS02510 BKC01_RS02480 -BBV16_RS02510 NILJEPDF_00485 -BBV16_RS02510 LJHENM_02445 -BBV16_RS02510 CTRC943_RS02440 -BBV16_RS02510 JIEJKO_02445 -BBV16_RS02510 QSDFRQ_00485 -BBV16_RS02510 SOTONK1_RS02460 -BBV16_RS02510 CTJTET1_RS02470 -BBV16_RS02510 AQ193_RS01525 -BBV16_RS02510 BKC03_RS02480 -BBV16_RS02510 C15_RS0102520 -BBV16_RS02510 KW39_RS02470 -BBV16_RS02510 IaCS19096_RS02455 -BBV16_RS02510 DU10_RS02500 -BBV16_RS02510 A5291_RS02495 -BBV16_RS02510 ECS88FINAL_RS0102515 -BBV16_RS02510 AOT15_RS03635 -BBV16_RS02510 O169_RS02470 -BBV16_RS02510 7618587 -BBV16_RS02510 DU13_RS02495 -BBV16_RS02510 BKB96_RS02485 -BBV16_RS02510 BKB99_RS02480 -BBV16_RS02510 CBP48_RS03880 -BBV16_RS02510 CTL2C_RS03810 -BBV16_RS02510 KW36_RS02455 -BBV16_RS02510 BKB95_RS02495 -BBV16_RS02510 L1224_RS02440 -BBV16_RS02510 SW2_RS02465 -BBV16_RS02510 ECS102511_RS02460 -BBV16_RS02510 119571 -BBV16_RS02510 L1440_RS02440 -BBV16_RS02510 AKW53_RS04755 -BBV16_RS02510 CBP42_RS03890 -BBV16_RS02510 L2BUCH2_RS02440 -BBV16_RS02510 CTB_RS02495 -BBV16_RS02510 SOTONIA3_RS02475 -BBV16_RS02510 BKB92_RS02485 -BBV16_RS02510 E150_RS02465 -BBV16_RS02510 CTO_RS02495 -BBV16_RS02510 AP288_RS00620 -BBV16_RS02510 BW688_RS03880 -BBV16_RS02510 BBV13_RS02500 -BBV16_RS02510 L2BLST_RS02440 -BBV16_RS02510 FCS84708_RS02455 -BBV16_RS02510 CBP44_RS03885 -BBV16_RS02685 BBV16_RS02685 -BBV16_RS02685 G9768_RS02635 -BBV16_RS02685 L3404_RS02610 -BBV16_RS02685 AQ244_RS00475 -BBV16_RS02685 BKC02_RS02655 -BBV16_RS02685 BKC01_RS02655 -BBV16_RS02685 gnl|Prokka|PADJNBJD_00520 -BBV16_RS02685 NILJEPDF_00520 -BBV16_RS02685 LJHENM_02615 -BBV16_RS02685 CTRC943_RS02615 -BBV16_RS02685 SOTONK1_RS02635 -BBV16_RS02685 CTJTET1_RS02645 -BBV16_RS02685 JIEJKO_02620 -BBV16_RS02685 BKC03_RS02655 -BBV16_RS02685 QSDFRQ_00520 -BBV16_RS02685 KW39_RS02645 -BBV16_RS02685 C15_RS0102700 -BBV16_RS02685 ECS88FINAL_RS0102695 -BBV16_RS02685 IaCS19096_RS02630 -BBV16_RS02685 DU10_RS02675 -BBV16_RS02685 O169_RS02645 -BBV16_RS02685 AQ193_RS01350 -BBV16_RS02685 A5291_RS02670 -BBV16_RS02685 AOT15_RS03460 -BBV16_RS02685 DU13_RS02670 -BBV16_RS02685 CBP48_RS04055 -BBV16_RS02685 CTL2C_RS03985 -BBV16_RS02685 KW36_RS02630 -BBV16_RS02685 BKB95_RS02670 -BBV16_RS02685 BKB96_RS02660 -BBV16_RS02685 BKB99_RS02655 -BBV16_RS02685 7619033 -BBV16_RS02685 SW2_RS02640 -BBV16_RS02685 L1224_RS02615 -BBV16_RS02685 ECS102511_RS02635 -BBV16_RS02685 L1440_RS02615 -BBV16_RS02685 CBP42_RS04065 -BBV16_RS02685 120242 -BBV16_RS02685 L2BUCH2_RS02615 -BBV16_RS02685 SOTONIA3_RS02650 -BBV16_RS02685 BKB92_RS02660 -BBV16_RS02685 CTB_RS02670 -BBV16_RS02685 AKW53_RS04580 -BBV16_RS02685 E150_RS02640 -BBV16_RS02685 BW688_RS04055 -BBV16_RS02685 CTO_RS02670 -BBV16_RS02685 FCS84708_RS02630 -BBV16_RS02685 L2BLST_RS02615 -BBV16_RS02685 BBV13_RS02675 -BBV16_RS02685 CBP44_RS04060 -BBV16_RS02685 AP288_RS00445 -BBV16_RS02685 AQ199_RS03330 -BBV16_RS02685 BKB93_RS02665 -BBV16_RS02850 BBV16_RS02850 -BBV16_RS02850 G9768_RS02800 -BBV16_RS02850 L3404_RS02775 -BBV16_RS02850 AQ244_RS00310 -BBV16_RS02850 BKC02_RS02825 -BBV16_RS02850 gnl|Prokka|PADJNBJD_00552 -BBV16_RS02850 NILJEPDF_00552 -BBV16_RS02850 BKC01_RS02825 -BBV16_RS02850 LJHENM_02780 -BBV16_RS02850 CTRC943_RS02780 -BBV16_RS02850 AOT15_RS01600 -BBV16_RS02850 QSDFRQ_00552 -BBV16_RS02850 JIEJKO_02785 -BBV16_RS02850 SOTONK1_RS02800 -BBV16_RS02850 CTJTET1_RS02810 -BBV16_RS02850 BKC03_RS02825 -BBV16_RS02850 KW39_RS02810 -BBV16_RS02850 C15_RS0102870 -BBV16_RS02850 ECS88FINAL_RS0102865 -BBV16_RS02850 IaCS19096_RS02795 -BBV16_RS02850 DU10_RS02845 -BBV16_RS02850 O169_RS02810 -BBV16_RS02850 AQ193_RS01185 -BBV16_RS02850 A5291_RS02835 -BBV16_RS02850 DU13_RS02840 -BBV16_RS02850 CBP48_RS04225 -BBV16_RS02850 7619063 -BBV16_RS02850 CTL2C_RS04150 -BBV16_RS02850 KW36_RS02795 -BBV16_RS02850 AKW53_RS04025 -BBV16_RS02850 BKB95_RS02840 -BBV16_RS02850 BKB96_RS02830 -BBV16_RS02850 BKB99_RS02825 -BBV16_RS02850 SW2_RS02805 -BBV16_RS02850 L1224_RS02780 -BBV16_RS02850 ECS102511_RS02800 -BBV16_RS02850 L1440_RS02780 -BBV16_RS02850 120195 -BBV16_RS02850 CBP42_RS04235 -BBV16_RS02850 L2BUCH2_RS02780 -BBV16_RS02850 SOTONIA3_RS02815 -BBV16_RS02850 BKB92_RS02830 -BBV16_RS02850 CTB_RS02835 -BBV16_RS02850 E150_RS02805 -BBV16_RS02850 BW688_RS04225 -BBV16_RS02850 CTO_RS02835 -BBV16_RS02850 FCS84708_RS02795 -BBV16_RS02850 L2BLST_RS02780 -BBV16_RS02850 BBV13_RS02840 -BBV16_RS02850 CBP44_RS04230 -BBV16_RS02850 AP288_RS00280 -BBV16_RS02850 AQ199_RS03495 -BBV16_RS02850 BKB93_RS02835 -BBV16_RS03525 BBV16_RS03525 -BBV16_RS03525 BW688_RS00080 -BBV16_RS03525 AQ199_RS04175 -BBV16_RS03525 BKB93_RS03515 -BBV16_RS03525 119695 -BBV16_RS03525 G9768_RS03475 -BBV16_RS03525 AQ244_RS04435 -BBV16_RS03525 gnl|Prokka|PADJNBJD_00684 -BBV16_RS03525 L3404_RS03455 -BBV16_RS03525 BKC02_RS03510 -BBV16_RS03525 NILJEPDF_00685 -BBV16_RS03525 LJHENM_03440 -BBV16_RS03525 AOT15_RS04275 -BBV16_RS03525 AP288_RS01845 -BBV16_RS03525 JIEJKO_03445 -BBV16_RS03525 BKC01_RS03510 -BBV16_RS03525 QSDFRQ_00685 -BBV16_RS03525 CTRC943_RS03460 -BBV16_RS03525 AQ193_RS00510 -BBV16_RS03525 BKC03_RS03510 -BBV16_RS03525 CBP48_RS00080 -BBV16_RS03525 CTJTET1_RS03495 -BBV16_RS03525 KW39_RS03495 -BBV16_RS03525 DU10_RS03525 -BBV16_RS03525 SOTONK1_RS03475 -BBV16_RS03525 ECS88FINAL_RS0103555 -BBV16_RS03525 IaCS19096_RS03470 -BBV16_RS03525 C15_RS0103550 -BBV16_RS03525 A5291_RS03520 -BBV16_RS03525 O169_RS03490 -BBV16_RS03525 DU13_RS03525 -BBV16_RS03525 KW36_RS03475 -BBV16_RS03525 AKW53_RS00225 -BBV16_RS03525 BKB95_RS03530 -BBV16_RS03525 CBP42_RS00080 -BBV16_RS03525 SW2_RS03485 -BBV16_RS03525 CTL2C_RS00080 -BBV16_RS03525 L1224_RS03460 -BBV16_RS03525 ECS102511_RS03475 -BBV16_RS03525 L1440_RS03460 -BBV16_RS03525 BKB96_RS03520 -BBV16_RS03525 BKB99_RS03515 -BBV16_RS03525 CBP44_RS00080 -BBV16_RS03525 L2BUCH2_RS03460 -BBV16_RS03525 BKB92_RS03510 -BBV16_RS03525 CTB_RS03515 -BBV16_RS03525 SOTONIA3_RS03495 -BBV16_RS03525 E150_RS03485 -BBV16_RS03525 CTO_RS03510 -BBV16_RS03525 BBV13_RS03515 -BBV16_RS03525 FCS84708_RS03475 -BBV16_RS03525 L2BLST_RS03460 -BBV16_RS03525 7618212 -JIEJKO_02745 JIEJKO_02745 -JIEJKO_02745 SOTONK1_RS02760 -JIEJKO_02745 CTJTET1_RS02770 -JIEJKO_02745 BKC03_RS02785 -JIEJKO_02745 KW39_RS02770 -JIEJKO_02745 C15_RS0102830 -JIEJKO_02745 ECS88FINAL_RS0102825 -JIEJKO_02745 IaCS19096_RS02755 -JIEJKO_02745 DU10_RS02805 -JIEJKO_02745 O169_RS02770 -JIEJKO_02745 A5291_RS02795 -JIEJKO_02745 AP288_RS00320 -JIEJKO_02745 DU13_RS02800 -JIEJKO_02745 CBP48_RS04185 -JIEJKO_02745 7619055 -JIEJKO_02745 CTL2C_RS04110 -JIEJKO_02745 KW36_RS02755 -JIEJKO_02745 AKW53_RS03985 -JIEJKO_02745 BKB95_RS02800 -JIEJKO_02745 BKB96_RS02790 -JIEJKO_02745 BKB99_RS02785 -JIEJKO_02745 SW2_RS02765 -JIEJKO_02745 L1224_RS02740 -JIEJKO_02745 ECS102511_RS02760 -JIEJKO_02745 L1440_RS02740 -JIEJKO_02745 AQ244_RS00350 -JIEJKO_02745 120208 -JIEJKO_02745 CBP42_RS04195 -JIEJKO_02745 L2BUCH2_RS02740 -JIEJKO_02745 SOTONIA3_RS02775 -JIEJKO_02745 BKB92_RS02790 -JIEJKO_02745 CTB_RS02795 -JIEJKO_02745 E150_RS02765 -JIEJKO_02745 BW688_RS04185 -JIEJKO_02745 CTO_RS02795 -JIEJKO_02745 FCS84708_RS02755 -JIEJKO_02745 AQ193_RS01225 -JIEJKO_02745 L2BLST_RS02740 -JIEJKO_02745 BBV13_RS02800 -JIEJKO_02745 CBP44_RS04190 -JIEJKO_02745 AQ199_RS03455 -JIEJKO_02745 BKB93_RS02795 -JIEJKO_02745 BBV16_RS02810 -JIEJKO_02745 G9768_RS02760 -JIEJKO_02745 L3404_RS02735 -JIEJKO_02745 BKC02_RS02785 -JIEJKO_02745 gnl|Prokka|PADJNBJD_00544 -JIEJKO_02745 NILJEPDF_00544 -JIEJKO_02745 BKC01_RS02785 -JIEJKO_02745 LJHENM_02740 -JIEJKO_02745 CTRC943_RS02740 -JIEJKO_02745 AOT15_RS01560 -JIEJKO_02745 QSDFRQ_00544 -JIEJKO_02910 JIEJKO_02910 -JIEJKO_02910 SOTONK1_RS02925 -JIEJKO_02910 CTJTET1_RS02935 -JIEJKO_02910 BKC03_RS02955 -JIEJKO_02910 C15_RS0102995 -JIEJKO_02910 KW39_RS02940 -JIEJKO_02910 IaCS19096_RS02920 -JIEJKO_02910 ECS88FINAL_RS0102995 -JIEJKO_02910 DU10_RS02975 -JIEJKO_02910 A5291_RS02960 -JIEJKO_02910 O169_RS02935 -JIEJKO_02910 AP288_RS00155 -JIEJKO_02910 DU13_RS02970 -JIEJKO_02910 CBP48_RS04355 -JIEJKO_02910 CTL2C_RS04275 -JIEJKO_02910 KW36_RS02920 -JIEJKO_02910 BKB95_RS02970 -JIEJKO_02910 BKB96_RS02960 -JIEJKO_02910 BKB99_RS02955 -JIEJKO_02910 L1224_RS02905 -JIEJKO_02910 AKW53_RS04155 -JIEJKO_02910 7618611 -JIEJKO_02910 SW2_RS02930 -JIEJKO_02910 ECS102511_RS02925 -JIEJKO_02910 L1440_RS02905 -JIEJKO_02910 AQ244_RS00185 -JIEJKO_02910 CBP42_RS04365 -JIEJKO_02910 L2BUCH2_RS02905 -JIEJKO_02910 119609 -JIEJKO_02910 SOTONIA3_RS02940 -JIEJKO_02910 CTB_RS02960 -JIEJKO_02910 BKB92_RS02960 -JIEJKO_02910 E150_RS02930 -JIEJKO_02910 AQ193_RS01060 -JIEJKO_02910 BW688_RS04355 -JIEJKO_02910 CTO_RS02960 -JIEJKO_02910 L2BLST_RS02905 -JIEJKO_02910 FCS84708_RS02925 -JIEJKO_02910 BBV13_RS02965 -JIEJKO_02910 CBP44_RS04360 -JIEJKO_02910 AQ199_RS03625 -JIEJKO_02910 BBV16_RS02975 -JIEJKO_02910 BKB93_RS02965 -JIEJKO_02910 G9768_RS02925 -JIEJKO_02910 L3404_RS02900 -JIEJKO_02910 BKC02_RS02955 -JIEJKO_02910 gnl|Prokka|PADJNBJD_00577 -JIEJKO_02910 AOT15_RS03725 -JIEJKO_02910 NILJEPDF_00577 -JIEJKO_02910 BKC01_RS02955 -JIEJKO_02910 LJHENM_02905 -JIEJKO_02910 CTRC943_RS02905 -JIEJKO_02910 QSDFRQ_00577 -JIEJKO_03070 JIEJKO_03070 -JIEJKO_03070 SOTONK1_RS03095 -JIEJKO_03070 CTJTET1_RS03105 -JIEJKO_03070 BKC03_RS03125 -JIEJKO_03070 KW39_RS03105 -JIEJKO_03070 C15_RS0103160 -JIEJKO_03070 ECS88FINAL_RS0103160 -JIEJKO_03070 IaCS19096_RS03090 -JIEJKO_03070 DU10_RS03140 -JIEJKO_03070 A5291_RS03125 -JIEJKO_03070 O169_RS03100 -JIEJKO_03070 CTL2C_RS04435 -JIEJKO_03070 DU13_RS03135 -JIEJKO_03070 CBP48_RS04525 -JIEJKO_03070 L1224_RS03065 -JIEJKO_03070 KW36_RS03090 -JIEJKO_03070 AQ244_RS00015 -JIEJKO_03070 BKB95_RS03135 -JIEJKO_03070 AKW53_RS04320 -JIEJKO_03070 BKB96_RS03130 -JIEJKO_03070 BKB99_RS03125 -JIEJKO_03070 7618629 -JIEJKO_03070 SW2_RS03095 -JIEJKO_03070 L1440_RS03065 -JIEJKO_03070 ECS102511_RS03090 -JIEJKO_03070 CBP42_RS04530 -JIEJKO_03070 L2BUCH2_RS03065 -JIEJKO_03070 CTB_RS03125 -JIEJKO_03070 SOTONIA3_RS03110 -JIEJKO_03070 AQ193_RS00895 -JIEJKO_03070 BKB92_RS03125 -JIEJKO_03070 BW688_RS04520 -JIEJKO_03070 119636 -JIEJKO_03070 E150_RS03095 -JIEJKO_03070 CTO_RS03125 -JIEJKO_03070 L2BLST_RS03065 -JIEJKO_03070 CBP44_RS04525 -JIEJKO_03070 FCS84708_RS03090 -JIEJKO_03070 BBV13_RS03130 -JIEJKO_03070 AQ199_RS03790 -JIEJKO_03070 BBV16_RS03140 -JIEJKO_03070 BKB93_RS03130 -JIEJKO_03070 G9768_RS03095 -JIEJKO_03070 L3404_RS03060 -JIEJKO_03070 gnl|Prokka|PADJNBJD_00609 -JIEJKO_03070 NILJEPDF_00609 -JIEJKO_03070 LJHENM_03060 -JIEJKO_03070 BKC02_RS03125 -JIEJKO_03070 AOT15_RS03895 -JIEJKO_03070 AP288_RS01460 -JIEJKO_03070 CTRC943_RS03065 -JIEJKO_03070 BKC01_RS03125 -JIEJKO_03070 QSDFRQ_00609 -JIEJKO_03405 JIEJKO_03405 -JIEJKO_03405 BKC01_RS03470 -JIEJKO_03405 QSDFRQ_00677 -JIEJKO_03405 CTRC943_RS03420 -JIEJKO_03405 BKC03_RS03470 -JIEJKO_03405 CBP48_RS00040 -JIEJKO_03405 CTJTET1_RS03455 -JIEJKO_03405 KW39_RS03455 -JIEJKO_03405 DU10_RS03485 -JIEJKO_03405 SOTONK1_RS03435 -JIEJKO_03405 ECS88FINAL_RS0103515 -JIEJKO_03405 IaCS19096_RS03430 -JIEJKO_03405 C15_RS0103510 -JIEJKO_03405 A5291_RS03480 -JIEJKO_03405 O169_RS03450 -JIEJKO_03405 DU13_RS03485 -JIEJKO_03405 KW36_RS03435 -JIEJKO_03405 AKW53_RS00185 -JIEJKO_03405 BKB95_RS03490 -JIEJKO_03405 CBP42_RS00040 -JIEJKO_03405 SW2_RS03445 -JIEJKO_03405 CTL2C_RS00040 -JIEJKO_03405 L1224_RS03420 -JIEJKO_03405 ECS102511_RS03435 -JIEJKO_03405 AQ244_RS04475 -JIEJKO_03405 L1440_RS03420 -JIEJKO_03405 BKB96_RS03480 -JIEJKO_03405 BKB99_RS03475 -JIEJKO_03405 CBP44_RS00040 -JIEJKO_03405 L2BUCH2_RS03420 -JIEJKO_03405 BKB92_RS03470 -JIEJKO_03405 CTB_RS03475 -JIEJKO_03405 AQ193_RS00550 -JIEJKO_03405 SOTONIA3_RS03455 -JIEJKO_03405 E150_RS03445 -JIEJKO_03405 CTO_RS03470 -JIEJKO_03405 BBV13_RS03475 -JIEJKO_03405 FCS84708_RS03435 -JIEJKO_03405 L2BLST_RS03420 -JIEJKO_03405 7618662 -JIEJKO_03405 BBV16_RS03485 -JIEJKO_03405 BW688_RS00040 -JIEJKO_03405 AQ199_RS04135 -JIEJKO_03405 BKB93_RS03475 -JIEJKO_03405 120088 -JIEJKO_03405 G9768_RS03435 -JIEJKO_03405 gnl|Prokka|PADJNBJD_00676 -JIEJKO_03405 L3404_RS03415 -JIEJKO_03405 BKC02_RS03470 -JIEJKO_03405 NILJEPDF_00677 -JIEJKO_03405 LJHENM_03400 -JIEJKO_03405 AOT15_RS04235 -JIEJKO_03405 AP288_RS01805 -JIEJKO_03570 JIEJKO_03570 -JIEJKO_03570 BKC01_RS03635 -JIEJKO_03570 QSDFRQ_00710 -JIEJKO_03570 CTRC943_RS03590 -JIEJKO_03570 BKC03_RS03635 -JIEJKO_03570 CBP48_RS00205 -JIEJKO_03570 CTJTET1_RS03625 -JIEJKO_03570 KW39_RS03620 -JIEJKO_03570 DU10_RS03650 -JIEJKO_03570 SOTONK1_RS03605 -JIEJKO_03570 ECS88FINAL_RS0103695 -JIEJKO_03570 IaCS19096_RS03600 -JIEJKO_03570 C15_RS0103685 -JIEJKO_03570 A5291_RS03650 -JIEJKO_03570 O169_RS03615 -JIEJKO_03570 DU13_RS03650 -JIEJKO_03570 KW36_RS03605 -JIEJKO_03570 AKW53_RS00350 -JIEJKO_03570 BKB95_RS03655 -JIEJKO_03570 CBP42_RS00205 -JIEJKO_03570 SW2_RS03610 -JIEJKO_03570 CTL2C_RS00205 -JIEJKO_03570 L1224_RS03585 -JIEJKO_03570 ECS102511_RS03600 -JIEJKO_03570 AQ244_RS04305 -JIEJKO_03570 L1440_RS03585 -JIEJKO_03570 BKB96_RS03645 -JIEJKO_03570 BKB99_RS03640 -JIEJKO_03570 CBP44_RS00205 -JIEJKO_03570 L2BUCH2_RS03585 -JIEJKO_03570 BKB92_RS03635 -JIEJKO_03570 CTB_RS03645 -JIEJKO_03570 AQ193_RS00385 -JIEJKO_03570 SOTONIA3_RS03625 -JIEJKO_03570 E150_RS03610 -JIEJKO_03570 CTO_RS03640 -JIEJKO_03570 BBV13_RS03645 -JIEJKO_03570 FCS84708_RS03600 -JIEJKO_03570 L2BLST_RS03585 -JIEJKO_03570 BBV16_RS03655 -JIEJKO_03570 BW688_RS00205 -JIEJKO_03570 AQ199_RS04300 -JIEJKO_03570 BKB93_RS03640 -JIEJKO_03570 7618232 -JIEJKO_03570 119726 -JIEJKO_03570 G9768_RS03605 -JIEJKO_03570 gnl|Prokka|PADJNBJD_00709 -JIEJKO_03570 L3404_RS03580 -JIEJKO_03570 BKC02_RS03635 -JIEJKO_03570 NILJEPDF_00710 -JIEJKO_03570 LJHENM_03565 -JIEJKO_03570 AOT15_RS04405 -JIEJKO_03570 AP288_RS01970 -JIEJKO_03755 JIEJKO_03755 -JIEJKO_03755 BKC01_RS03825 -JIEJKO_03755 QSDFRQ_00746 -JIEJKO_03755 CTRC943_RS03770 -JIEJKO_03755 AKW53_RS00525 -JIEJKO_03755 BKC03_RS03820 -JIEJKO_03755 CTJTET1_RS03805 -JIEJKO_03755 KW39_RS03800 -JIEJKO_03755 DU10_RS03835 -JIEJKO_03755 CBP48_RS00390 -JIEJKO_03755 A5291_RS03830 -JIEJKO_03755 SOTONK1_RS03785 -JIEJKO_03755 IaCS19096_RS03780 -JIEJKO_03755 DU13_RS03835 -JIEJKO_03755 C15_RS0103890 -JIEJKO_03755 ECS88FINAL_RS0103890 -JIEJKO_03755 O169_RS03795 -JIEJKO_03755 KW36_RS03785 -JIEJKO_03755 BKB95_RS03840 -JIEJKO_03755 CBP42_RS00390 -JIEJKO_03755 SW2_RS03790 -JIEJKO_03755 CTL2C_RS00385 -JIEJKO_03755 L1224_RS03765 -JIEJKO_03755 ECS102511_RS03780 -JIEJKO_03755 AQ244_RS04125 -JIEJKO_03755 BKB96_RS03825 -JIEJKO_03755 BKB99_RS03820 -JIEJKO_03755 L1440_RS03765 -JIEJKO_03755 AQ193_RS00205 -JIEJKO_03755 CBP44_RS00390 -JIEJKO_03755 L2BUCH2_RS03765 -JIEJKO_03755 BKB92_RS03820 -JIEJKO_03755 CTB_RS03825 -JIEJKO_03755 SOTONIA3_RS03805 -JIEJKO_03755 E150_RS03790 -JIEJKO_03755 CTO_RS03820 -JIEJKO_03755 BBV13_RS03825 -JIEJKO_03755 FCS84708_RS03780 -JIEJKO_03755 BBV16_RS03835 -JIEJKO_03755 L2BLST_RS03765 -JIEJKO_03755 7618686 -JIEJKO_03755 120051 -JIEJKO_03755 BW688_RS00390 -JIEJKO_03755 AQ199_RS04480 -JIEJKO_03755 BKB93_RS03825 -JIEJKO_03755 G9768_RS03785 -JIEJKO_03755 gnl|Prokka|PADJNBJD_00745 -JIEJKO_03755 L3404_RS03760 -JIEJKO_03755 BKC02_RS03820 -JIEJKO_03755 NILJEPDF_00746 -JIEJKO_03755 LJHENM_03755 -JIEJKO_03755 AOT15_RS04585 -JIEJKO_03755 AP288_RS02155 -JIEJKO_04120 JIEJKO_04120 -JIEJKO_04120 BKC02_RS04200 -JIEJKO_04120 QSDFRQ_00819 -JIEJKO_04120 AKW53_RS00880 -JIEJKO_04120 BKC01_RS04205 -JIEJKO_04120 CTRC943_RS04150 -JIEJKO_04120 AOT15_RS01750 -JIEJKO_04120 CTJTET1_RS04340 -JIEJKO_04120 KW39_RS04180 -JIEJKO_04120 BKC03_RS04200 -JIEJKO_04120 CBP48_RS00770 -JIEJKO_04120 A5291_RS04205 -JIEJKO_04120 ECS88FINAL_RS0104250 -JIEJKO_04120 DU10_RS04215 -JIEJKO_04120 SOTONK1_RS04165 -JIEJKO_04120 IaCS19096_RS04160 -JIEJKO_04120 DU13_RS04215 -JIEJKO_04120 C15_RS0104275 -JIEJKO_04120 O169_RS04175 -JIEJKO_04120 KW36_RS04165 -JIEJKO_04120 BKB95_RS04220 -JIEJKO_04120 CBP42_RS00770 -JIEJKO_04120 CTL2C_RS00765 -JIEJKO_04120 L1224_RS04145 -JIEJKO_04120 BKB96_RS04205 -JIEJKO_04120 SW2_RS04170 -JIEJKO_04120 L1440_RS04140 -JIEJKO_04120 ECS102511_RS04160 -JIEJKO_04120 BKB99_RS04200 -JIEJKO_04120 AQ193_RS04610 -JIEJKO_04120 AQ244_RS02600 -JIEJKO_04120 CBP44_RS00770 -JIEJKO_04120 CTB_RS04200 -JIEJKO_04120 L2BUCH2_RS04145 -JIEJKO_04120 BKB92_RS04200 -JIEJKO_04120 SOTONIA3_RS04185 -JIEJKO_04120 CTO_RS04195 -JIEJKO_04120 AP288_RS02465 -JIEJKO_04120 E150_RS04170 -JIEJKO_04120 BBV13_RS04205 -JIEJKO_04120 119808 -JIEJKO_04120 FCS84708_RS04160 -JIEJKO_04120 AQ199_RS00090 -JIEJKO_04120 7618285 -JIEJKO_04120 L2BLST_RS04145 -JIEJKO_04120 BBV16_RS04215 -JIEJKO_04120 BW688_RS00770 -JIEJKO_04120 gnl|Prokka|PADJNBJD_00818 -JIEJKO_04120 BKB93_RS04205 -JIEJKO_04120 NILJEPDF_00819 -JIEJKO_04120 G9768_RS04165 -JIEJKO_04120 L3404_RS04140 -JIEJKO_04120 LJHENM_04120 -JIEJKO_04615 JIEJKO_04615 -JIEJKO_04615 QSDFRQ_00918 -JIEJKO_04615 LJHENM_04625 -JIEJKO_04615 L3404_RS04655 -JIEJKO_04615 7618768 -JIEJKO_04615 G9768_RS04680 -JIEJKO_04615 BKB93_RS04740 -JIEJKO_04615 BKC02_RS04730 -JIEJKO_04615 CTRC943_RS04665 -JIEJKO_04615 AKW53_RS01405 -JIEJKO_04615 BKC01_RS04735 -JIEJKO_04615 AOT15_RS02260 -JIEJKO_04615 CTJTET1_RS04850 -JIEJKO_04615 CBP48_RS01310 -JIEJKO_04615 KW39_RS04700 -JIEJKO_04615 BKC03_RS04730 -JIEJKO_04615 SOTONK1_RS04680 -JIEJKO_04615 A5291_RS04710 -JIEJKO_04615 ECS88FINAL_RS0104780 -JIEJKO_04615 IaCS19096_RS04675 -JIEJKO_04615 C15_RS0104800 -JIEJKO_04615 AQ193_RS04085 -JIEJKO_04615 DU10_RS04750 -JIEJKO_04615 O169_RS04700 -JIEJKO_04615 KW36_RS04680 -JIEJKO_04615 DU13_RS04750 -JIEJKO_04615 CTL2C_RS01280 -JIEJKO_04615 AQ244_RS02070 -JIEJKO_04615 CBP42_RS01310 -JIEJKO_04615 L1224_RS04660 -JIEJKO_04615 BKB95_RS04750 -JIEJKO_04615 L1440_RS04655 -JIEJKO_04615 BKB96_RS04735 -JIEJKO_04615 BKB99_RS04730 -JIEJKO_04615 SW2_RS04690 -JIEJKO_04615 ECS102511_RS04685 -JIEJKO_04615 CBP44_RS01310 -JIEJKO_04615 L2BUCH2_RS04660 -JIEJKO_04615 CTB_RS04705 -JIEJKO_04615 SOTONIA3_RS04695 -JIEJKO_04615 AP288_RS02990 -JIEJKO_04615 BKB92_RS04735 -JIEJKO_04615 gnl|Prokka|PADJNBJD_00917 -JIEJKO_04615 CTO_RS04700 -JIEJKO_04615 L2BLST_RS04660 -JIEJKO_04615 BBV13_RS04720 -JIEJKO_04615 E150_RS04695 -JIEJKO_04615 BBV16_RS04725 -JIEJKO_04615 NILJEPDF_00918 -JIEJKO_04615 FCS84708_RS04680 -JIEJKO_04615 AQ199_RS00615 -JIEJKO_04615 BW688_RS01310 -JIEJKO_04615 119925 -BW688_RS00260 BW688_RS00260 -BW688_RS00260 120065 -BW688_RS00260 AQ199_RS04355 -BW688_RS00260 BKB93_RS03695 -BW688_RS00260 7618677 -BW688_RS00260 G9768_RS03660 -BW688_RS00260 gnl|Prokka|PADJNBJD_00720 -BW688_RS00260 L3404_RS03635 -BW688_RS00260 AQ244_RS04250 -BW688_RS00260 BKC02_RS03690 -BW688_RS00260 NILJEPDF_00721 -BW688_RS00260 LJHENM_03625 -BW688_RS00260 AOT15_RS04460 -BW688_RS00260 AP288_RS02025 -BW688_RS00260 JIEJKO_03630 -BW688_RS00260 BKC01_RS03690 -BW688_RS00260 QSDFRQ_00721 -BW688_RS00260 CTRC943_RS03645 -BW688_RS00260 AQ193_RS00330 -BW688_RS00260 BKC03_RS03690 -BW688_RS00260 CBP48_RS00260 -BW688_RS00260 CTJTET1_RS03680 -BW688_RS00260 KW39_RS03675 -BW688_RS00260 DU10_RS03705 -BW688_RS00260 SOTONK1_RS03660 -BW688_RS00260 ECS88FINAL_RS0103755 -BW688_RS00260 IaCS19096_RS03655 -BW688_RS00260 C15_RS0103750 -BW688_RS00260 A5291_RS03705 -BW688_RS00260 O169_RS03670 -BW688_RS00260 DU13_RS03705 -BW688_RS00260 KW36_RS03660 -BW688_RS00260 BKB95_RS03710 -BW688_RS00260 CBP42_RS00260 -BW688_RS00260 SW2_RS03665 -BW688_RS00260 CTL2C_RS00260 -BW688_RS00260 L1224_RS03640 -BW688_RS00260 ECS102511_RS03655 -BW688_RS00260 L1440_RS03640 -BW688_RS00260 BKB96_RS03700 -BW688_RS00260 BKB99_RS03695 -BW688_RS00260 CBP44_RS00260 -BW688_RS00260 L2BUCH2_RS03640 -BW688_RS00260 BKB92_RS03690 -BW688_RS00260 CTB_RS03700 -BW688_RS00260 SOTONIA3_RS03680 -BW688_RS00260 E150_RS03665 -BW688_RS00260 CTO_RS03695 -BW688_RS00260 BBV13_RS03700 -BW688_RS00260 FCS84708_RS03655 -BW688_RS00260 L2BLST_RS03640 -BW688_RS00260 BBV16_RS03710 -BW688_RS00435 BW688_RS00435 -BW688_RS00435 AQ199_RS04525 -BW688_RS00435 BKB93_RS03870 -BW688_RS00435 G9768_RS03830 -BW688_RS00435 gnl|Prokka|PADJNBJD_00753 -BW688_RS00435 L3404_RS03805 -BW688_RS00435 AQ244_RS04080 -BW688_RS00435 NILJEPDF_00754 -BW688_RS00435 BKC02_RS03865 -BW688_RS00435 LJHENM_03795 -BW688_RS00435 AOT15_RS04630 -BW688_RS00435 AP288_RS02200 -BW688_RS00435 JIEJKO_03795 -BW688_RS00435 QSDFRQ_00754 -BW688_RS00435 BKC01_RS03870 -BW688_RS00435 CTRC943_RS03815 -BW688_RS00435 AQ193_RS00160 -BW688_RS00435 AKW53_RS00570 -BW688_RS00435 BKC03_RS03865 -BW688_RS00435 CBP48_RS00435 -BW688_RS00435 CTJTET1_RS03850 -BW688_RS00435 KW39_RS03845 -BW688_RS00435 DU10_RS03880 -BW688_RS00435 A5291_RS03875 -BW688_RS00435 SOTONK1_RS03830 -BW688_RS00435 IaCS19096_RS03825 -BW688_RS00435 DU13_RS03880 -BW688_RS00435 C15_RS0103935 -BW688_RS00435 ECS88FINAL_RS0103935 -BW688_RS00435 O169_RS03840 -BW688_RS00435 KW36_RS03830 -BW688_RS00435 BKB95_RS03885 -BW688_RS00435 CBP42_RS00435 -BW688_RS00435 CTL2C_RS00430 -BW688_RS00435 L1224_RS03810 -BW688_RS00435 SW2_RS03835 -BW688_RS00435 L1440_RS03805 -BW688_RS00435 ECS102511_RS03825 -BW688_RS00435 BKB96_RS03870 -BW688_RS00435 BKB99_RS03865 -BW688_RS00435 CBP44_RS00435 -BW688_RS00435 L2BUCH2_RS03810 -BW688_RS00435 BKB92_RS03865 -BW688_RS00435 CTB_RS03870 -BW688_RS00435 SOTONIA3_RS03850 -BW688_RS00435 E150_RS03835 -BW688_RS00435 CTO_RS03865 -BW688_RS00435 BBV13_RS03870 -BW688_RS00435 FCS84708_RS03825 -BW688_RS00435 L2BLST_RS03810 -BW688_RS00435 BBV16_RS03880 -BW688_RS00435 7618255 -BW688_RS00435 119761 -BW688_RS00615 BW688_RS00615 -BW688_RS00615 AQ244_RS03875 -BW688_RS00615 gnl|Prokka|PADJNBJD_00788 -BW688_RS00615 AQ199_RS04705 -BW688_RS00615 BKB93_RS04050 -BW688_RS00615 G9768_RS04010 -BW688_RS00615 L3404_RS03985 -BW688_RS00615 AQ193_RS04700 -BW688_RS00615 NILJEPDF_00789 -BW688_RS00615 LJHENM_03970 -BW688_RS00615 BKC02_RS04045 -BW688_RS00615 JIEJKO_03970 -BW688_RS00615 QSDFRQ_00789 -BW688_RS00615 BKC01_RS04050 -BW688_RS00615 CTRC943_RS03995 -BW688_RS00615 CTJTET1_RS04185 -BW688_RS00615 AKW53_RS00745 -BW688_RS00615 BKC03_RS04045 -BW688_RS00615 CBP48_RS00615 -BW688_RS00615 CTJTET1_RS04030 -BW688_RS00615 KW39_RS04025 -BW688_RS00615 DU10_RS04060 -BW688_RS00615 A5291_RS04055 -BW688_RS00615 SOTONK1_RS04010 -BW688_RS00615 ECS88FINAL_RS0104110 -BW688_RS00615 IaCS19096_RS04005 -BW688_RS00615 DU13_RS04060 -BW688_RS00615 C15_RS0104115 -BW688_RS00615 O169_RS04020 -BW688_RS00615 KW36_RS04010 -BW688_RS00615 AOT15_RS02315 -BW688_RS00615 BKB95_RS04065 -BW688_RS00615 CBP42_RS00615 -BW688_RS00615 CTL2C_RS00610 -BW688_RS00615 L1224_RS03990 -BW688_RS00615 SW2_RS04015 -BW688_RS00615 L1440_RS03985 -BW688_RS00615 ECS102511_RS04005 -BW688_RS00615 BKB96_RS04050 -BW688_RS00615 BKB99_RS04045 -BW688_RS00615 CBP44_RS00615 -BW688_RS00615 L2BUCH2_RS03990 -BW688_RS00615 CTB_RS04050 -BW688_RS00615 BKB92_RS04045 -BW688_RS00615 SOTONIA3_RS04030 -BW688_RS00615 E150_RS04015 -BW688_RS00615 CTO_RS04045 -BW688_RS00615 BBV13_RS04050 -BW688_RS00615 FCS84708_RS04005 -BW688_RS00615 120011 -BW688_RS00615 L2BLST_RS03990 -BW688_RS00615 AP288_RS04715 -BW688_RS00615 BBV16_RS04060 -BW688_RS00615 7618711 -BW688_RS00795 BW688_RS00795 -BW688_RS00795 gnl|Prokka|PADJNBJD_00823 -BW688_RS00795 BKB93_RS04230 -BW688_RS00795 NILJEPDF_00824 -BW688_RS00795 G9768_RS04190 -BW688_RS00795 L3404_RS04165 -BW688_RS00795 LJHENM_04145 -BW688_RS00795 JIEJKO_04145 -BW688_RS00795 BKC02_RS04225 -BW688_RS00795 QSDFRQ_00824 -BW688_RS00795 AKW53_RS00905 -BW688_RS00795 BKC01_RS04230 -BW688_RS00795 CTRC943_RS04175 -BW688_RS00795 AOT15_RS01775 -BW688_RS00795 CTJTET1_RS04365 -BW688_RS00795 KW39_RS04205 -BW688_RS00795 BKC03_RS04225 -BW688_RS00795 CBP48_RS00795 -BW688_RS00795 A5291_RS04230 -BW688_RS00795 ECS88FINAL_RS0104275 -BW688_RS00795 DU10_RS04240 -BW688_RS00795 SOTONK1_RS04190 -BW688_RS00795 IaCS19096_RS04185 -BW688_RS00795 AQ193_RS04585 -BW688_RS00795 DU13_RS04240 -BW688_RS00795 C15_RS0104300 -BW688_RS00795 O169_RS04200 -BW688_RS00795 AQ244_RS02575 -BW688_RS00795 KW36_RS04190 -BW688_RS00795 BKB95_RS04245 -BW688_RS00795 CBP42_RS00795 -BW688_RS00795 CTL2C_RS00790 -BW688_RS00795 L1224_RS04170 -BW688_RS00795 BKB96_RS04230 -BW688_RS00795 SW2_RS04195 -BW688_RS00795 L1440_RS04165 -BW688_RS00795 ECS102511_RS04185 -BW688_RS00795 BKB99_RS04225 -BW688_RS00795 CBP44_RS00795 -BW688_RS00795 CTB_RS04225 -BW688_RS00795 L2BUCH2_RS04170 -BW688_RS00795 BKB92_RS04225 -BW688_RS00795 SOTONIA3_RS04210 -BW688_RS00795 CTO_RS04220 -BW688_RS00795 AP288_RS02490 -BW688_RS00795 E150_RS04195 -BW688_RS00795 BBV13_RS04230 -BW688_RS00795 119814 -BW688_RS00795 FCS84708_RS04185 -BW688_RS00795 AQ199_RS00115 -BW688_RS00795 7618289 -BW688_RS00795 L2BLST_RS04170 -BW688_RS00795 BBV16_RS04240 -BW688_RS01145 BW688_RS01145 -BW688_RS01145 119949 -BW688_RS01145 7618751 -BW688_RS01145 JIEJKO_04460 -BW688_RS01145 QSDFRQ_00887 -BW688_RS01145 G9768_RS04515 -BW688_RS01145 LJHENM_04470 -BW688_RS01145 L3404_RS04490 -BW688_RS01145 BKB93_RS04580 -BW688_RS01145 BKC02_RS04570 -BW688_RS01145 AKW53_RS01240 -BW688_RS01145 BKC01_RS04575 -BW688_RS01145 CTRC943_RS04500 -BW688_RS01145 AOT15_RS02095 -BW688_RS01145 CTJTET1_RS04685 -BW688_RS01145 KW39_RS04535 -BW688_RS01145 BKC03_RS04570 -BW688_RS01145 CBP48_RS01145 -BW688_RS01145 A5291_RS04550 -BW688_RS01145 AQ193_RS04250 -BW688_RS01145 SOTONK1_RS04515 -BW688_RS01145 ECS88FINAL_RS0104620 -BW688_RS01145 IaCS19096_RS04510 -BW688_RS01145 C15_RS0104640 -BW688_RS01145 DU10_RS04590 -BW688_RS01145 O169_RS04535 -BW688_RS01145 KW36_RS04515 -BW688_RS01145 AQ244_RS02235 -BW688_RS01145 DU13_RS04590 -BW688_RS01145 BKB95_RS04590 -BW688_RS01145 CBP42_RS01145 -BW688_RS01145 CTL2C_RS01115 -BW688_RS01145 L1224_RS04495 -BW688_RS01145 BKB96_RS04575 -BW688_RS01145 L1440_RS04490 -BW688_RS01145 BKB99_RS04570 -BW688_RS01145 SW2_RS04525 -BW688_RS01145 ECS102511_RS04520 -BW688_RS01145 CBP44_RS01145 -BW688_RS01145 CTB_RS04545 -BW688_RS01145 L2BUCH2_RS04495 -BW688_RS01145 SOTONIA3_RS04530 -BW688_RS01145 CTO_RS04540 -BW688_RS01145 BBV13_RS04560 -BW688_RS01145 BKB92_RS04575 -BW688_RS01145 AP288_RS02825 -BW688_RS01145 BBV16_RS04565 -BW688_RS01145 E150_RS04530 -BW688_RS01145 gnl|Prokka|PADJNBJD_00886 -BW688_RS01145 L2BLST_RS04495 -BW688_RS01145 FCS84708_RS04515 -BW688_RS01145 AQ199_RS00450 -BW688_RS01145 NILJEPDF_00887 -BW688_RS03725 BW688_RS03725 -BW688_RS03725 L2BLST_RS02290 -BW688_RS03725 FCS84708_RS02305 -BW688_RS03725 BBV13_RS02345 -BW688_RS03725 CBP44_RS03735 -BW688_RS03725 BKB93_RS02340 -BW688_RS03725 AQ199_RS03005 -BW688_RS03725 G9768_RS02310 -BW688_RS03725 BBV16_RS02350 -BW688_RS03725 L3404_RS02285 -BW688_RS03725 BKC02_RS02325 -BW688_RS03725 AQ193_RS01675 -BW688_RS03725 BKC01_RS02325 -BW688_RS03725 gnl|Prokka|PADJNBJD_00456 -BW688_RS03725 AKW53_RS03810 -BW688_RS03725 NILJEPDF_00456 -BW688_RS03725 LJHENM_02300 -BW688_RS03725 CTRC943_RS02290 -BW688_RS03725 JIEJKO_02300 -BW688_RS03725 BKC03_RS02325 -BW688_RS03725 QSDFRQ_00456 -BW688_RS03725 CTJTET1_RS02320 -BW688_RS03725 C15_RS0102360 -BW688_RS03725 SOTONK1_RS02310 -BW688_RS03725 DU10_RS02350 -BW688_RS03725 A5291_RS02340 -BW688_RS03725 KW39_RS02320 -BW688_RS03725 IaCS19096_RS02305 -BW688_RS03725 ECS88FINAL_RS0102360 -BW688_RS03725 O169_RS02320 -BW688_RS03725 DU13_RS02345 -BW688_RS03725 7618575 -BW688_RS03725 BKB96_RS02330 -BW688_RS03725 BKB99_RS02325 -BW688_RS03725 CBP48_RS03730 -BW688_RS03725 119553 -BW688_RS03725 CTL2C_RS03660 -BW688_RS03725 KW36_RS02305 -BW688_RS03725 AOT15_RS03305 -BW688_RS03725 BKB95_RS02345 -BW688_RS03725 L1224_RS02290 -BW688_RS03725 SW2_RS02315 -BW688_RS03725 ECS102511_RS02310 -BW688_RS03725 L1440_RS02290 -BW688_RS03725 AP288_RS00770 -BW688_RS03725 CBP42_RS03740 -BW688_RS03725 CTB_RS02340 -BW688_RS03725 L2BUCH2_RS02285 -BW688_RS03725 BKB92_RS02335 -BW688_RS03725 SOTONIA3_RS02325 -BW688_RS03725 CTO_RS02340 -BW688_RS03725 E150_RS02315 -BW688_RS03725 AQ244_RS00800 -BW688_RS04080 BW688_RS04080 -BW688_RS04080 CTO_RS02695 -BW688_RS04080 FCS84708_RS02655 -BW688_RS04080 L2BLST_RS02640 -BW688_RS04080 BBV13_RS02700 -BW688_RS04080 CBP44_RS04085 -BW688_RS04080 AQ199_RS03355 -BW688_RS04080 BKB93_RS02690 -BW688_RS04080 BBV16_RS02710 -BW688_RS04080 G9768_RS02660 -BW688_RS04080 AQ193_RS01325 -BW688_RS04080 L3404_RS02635 -BW688_RS04080 BKC02_RS02680 -BW688_RS04080 AOT15_RS03435 -BW688_RS04080 BKC01_RS02680 -BW688_RS04080 gnl|Prokka|PADJNBJD_00525 -BW688_RS04080 NILJEPDF_00525 -BW688_RS04080 LJHENM_02640 -BW688_RS04080 CTRC943_RS02640 -BW688_RS04080 SOTONK1_RS02660 -BW688_RS04080 CTJTET1_RS02670 -BW688_RS04080 JIEJKO_02645 -BW688_RS04080 BKC03_RS02680 -BW688_RS04080 QSDFRQ_00525 -BW688_RS04080 KW39_RS02670 -BW688_RS04080 C15_RS0102730 -BW688_RS04080 ECS88FINAL_RS0102725 -BW688_RS04080 IaCS19096_RS02655 -BW688_RS04080 DU10_RS02700 -BW688_RS04080 O169_RS02670 -BW688_RS04080 A5291_RS02695 -BW688_RS04080 DU13_RS02695 -BW688_RS04080 AKW53_RS04555 -BW688_RS04080 CBP48_RS04080 -BW688_RS04080 CTL2C_RS04010 -BW688_RS04080 KW36_RS02655 -BW688_RS04080 BKB95_RS02695 -BW688_RS04080 BKB96_RS02685 -BW688_RS04080 BKB99_RS02680 -BW688_RS04080 7619038 -BW688_RS04080 SW2_RS02665 -BW688_RS04080 L1224_RS02640 -BW688_RS04080 ECS102511_RS02660 -BW688_RS04080 L1440_RS02640 -BW688_RS04080 AP288_RS00420 -BW688_RS04080 CBP42_RS04090 -BW688_RS04080 120234 -BW688_RS04080 L2BUCH2_RS02640 -BW688_RS04080 SOTONIA3_RS02675 -BW688_RS04080 BKB92_RS02685 -BW688_RS04080 CTB_RS02695 -BW688_RS04080 AQ244_RS00450 -BW688_RS04080 E150_RS02665 -BW688_RS04250 BW688_RS04250 -BW688_RS04250 CTO_RS02860 -BW688_RS04250 FCS84708_RS02820 -BW688_RS04250 L2BLST_RS02805 -BW688_RS04250 BBV13_RS02865 -BW688_RS04250 CBP44_RS04255 -BW688_RS04250 AQ199_RS03520 -BW688_RS04250 BKB93_RS02860 -BW688_RS04250 BBV16_RS02875 -BW688_RS04250 G9768_RS02825 -BW688_RS04250 AQ193_RS01160 -BW688_RS04250 L3404_RS02800 -BW688_RS04250 BKC02_RS02850 -BW688_RS04250 gnl|Prokka|PADJNBJD_00557 -BW688_RS04250 NILJEPDF_00557 -BW688_RS04250 BKC01_RS02850 -BW688_RS04250 LJHENM_02805 -BW688_RS04250 CTRC943_RS02805 -BW688_RS04250 AOT15_RS01625 -BW688_RS04250 QSDFRQ_00557 -BW688_RS04250 JIEJKO_02810 -BW688_RS04250 SOTONK1_RS02825 -BW688_RS04250 CTJTET1_RS02835 -BW688_RS04250 BKC03_RS02850 -BW688_RS04250 KW39_RS02835 -BW688_RS04250 C15_RS0102895 -BW688_RS04250 ECS88FINAL_RS0102890 -BW688_RS04250 IaCS19096_RS02820 -BW688_RS04250 DU10_RS02870 -BW688_RS04250 O169_RS02835 -BW688_RS04250 A5291_RS02860 -BW688_RS04250 DU13_RS02865 -BW688_RS04250 CBP48_RS04250 -BW688_RS04250 7619068 -BW688_RS04250 CTL2C_RS04175 -BW688_RS04250 KW36_RS02820 -BW688_RS04250 AKW53_RS04050 -BW688_RS04250 BKB95_RS02865 -BW688_RS04250 BKB96_RS02855 -BW688_RS04250 BKB99_RS02850 -BW688_RS04250 SW2_RS02830 -BW688_RS04250 L1224_RS02805 -BW688_RS04250 ECS102511_RS02825 -BW688_RS04250 L1440_RS02805 -BW688_RS04250 AP288_RS00255 -BW688_RS04250 120188 -BW688_RS04250 CBP42_RS04260 -BW688_RS04250 L2BUCH2_RS02805 -BW688_RS04250 SOTONIA3_RS02840 -BW688_RS04250 BKB92_RS02855 -BW688_RS04250 CTB_RS02860 -BW688_RS04250 AQ244_RS00285 -BW688_RS04250 E150_RS02830 -BW688_RS04425 BW688_RS04425 -BW688_RS04425 E150_RS03000 -BW688_RS04425 CTO_RS03030 -BW688_RS04425 L2BLST_RS02970 -BW688_RS04425 CBP44_RS04430 -BW688_RS04425 FCS84708_RS02995 -BW688_RS04425 BBV13_RS03035 -BW688_RS04425 AQ193_RS00990 -BW688_RS04425 AQ199_RS03695 -BW688_RS04425 BBV16_RS03045 -BW688_RS04425 BKB93_RS03035 -BW688_RS04425 G9768_RS03000 -BW688_RS04425 L3404_RS02965 -BW688_RS04425 gnl|Prokka|PADJNBJD_00591 -BW688_RS04425 BKC02_RS03030 -BW688_RS04425 NILJEPDF_00591 -BW688_RS04425 LJHENM_02970 -BW688_RS04425 AOT15_RS03800 -BW688_RS04425 CTRC943_RS02970 -BW688_RS04425 BKC01_RS03030 -BW688_RS04425 QSDFRQ_00591 -BW688_RS04425 JIEJKO_02980 -BW688_RS04425 SOTONK1_RS03000 -BW688_RS04425 CTJTET1_RS03010 -BW688_RS04425 BKC03_RS03030 -BW688_RS04425 KW39_RS03010 -BW688_RS04425 C15_RS0103065 -BW688_RS04425 ECS88FINAL_RS0103060 -BW688_RS04425 IaCS19096_RS02995 -BW688_RS04425 DU10_RS03045 -BW688_RS04425 A5291_RS03030 -BW688_RS04425 O169_RS03005 -BW688_RS04425 CTL2C_RS04340 -BW688_RS04425 DU13_RS03040 -BW688_RS04425 CBP48_RS04430 -BW688_RS04425 L1224_RS02970 -BW688_RS04425 KW36_RS02995 -BW688_RS04425 BKB95_RS03040 -BW688_RS04425 AKW53_RS04225 -BW688_RS04425 AP288_RS00085 -BW688_RS04425 BKB96_RS03035 -BW688_RS04425 BKB99_RS03030 -BW688_RS04425 7618622 -BW688_RS04425 SW2_RS03000 -BW688_RS04425 L1440_RS02970 -BW688_RS04425 ECS102511_RS02995 -BW688_RS04425 CBP42_RS04435 -BW688_RS04425 L2BUCH2_RS02970 -BW688_RS04425 AQ244_RS00110 -BW688_RS04425 CTB_RS03030 -BW688_RS04425 SOTONIA3_RS03015 -BW688_RS04425 BKB92_RS03030 -BW688_RS04425 119626 -BW688_RS04585 BW688_RS04585 -BW688_RS04585 119655 -BW688_RS04585 E150_RS03165 -BW688_RS04585 CTO_RS03190 -BW688_RS04585 L2BLST_RS03135 -BW688_RS04585 CBP44_RS04590 -BW688_RS04585 FCS84708_RS03160 -BW688_RS04585 BBV13_RS03195 -BW688_RS04585 AQ193_RS00825 -BW688_RS04585 AQ199_RS03860 -BW688_RS04585 BBV16_RS03205 -BW688_RS04585 BKB93_RS03195 -BW688_RS04585 G9768_RS03160 -BW688_RS04585 L3404_RS03130 -BW688_RS04585 gnl|Prokka|PADJNBJD_00622 -BW688_RS04585 NILJEPDF_00622 -BW688_RS04585 LJHENM_03125 -BW688_RS04585 BKC02_RS03190 -BW688_RS04585 AOT15_RS03960 -BW688_RS04585 AP288_RS01530 -BW688_RS04585 CTRC943_RS03135 -BW688_RS04585 BKC01_RS03190 -BW688_RS04585 QSDFRQ_00622 -BW688_RS04585 JIEJKO_03135 -BW688_RS04585 SOTONK1_RS03160 -BW688_RS04585 CTJTET1_RS03175 -BW688_RS04585 BKC03_RS03190 -BW688_RS04585 KW39_RS03175 -BW688_RS04585 C15_RS0103225 -BW688_RS04585 ECS88FINAL_RS0103225 -BW688_RS04585 IaCS19096_RS03155 -BW688_RS04585 DU10_RS03205 -BW688_RS04585 A5291_RS03195 -BW688_RS04585 O169_RS03170 -BW688_RS04585 CTL2C_RS04505 -BW688_RS04585 DU13_RS03200 -BW688_RS04585 CBP48_RS04590 -BW688_RS04585 L1224_RS03135 -BW688_RS04585 KW36_RS03160 -BW688_RS04585 BKB95_RS03200 -BW688_RS04585 AKW53_RS04385 -BW688_RS04585 BKB96_RS03195 -BW688_RS04585 BKB99_RS03190 -BW688_RS04585 7618641 -BW688_RS04585 SW2_RS03165 -BW688_RS04585 L1440_RS03135 -BW688_RS04585 ECS102511_RS03160 -BW688_RS04585 CBP42_RS04595 -BW688_RS04585 L2BUCH2_RS03135 -BW688_RS04585 CTB_RS03195 -BW688_RS04585 SOTONIA3_RS03175 -BW688_RS04585 AQ244_RS04755 -BW688_RS04585 BKB92_RS03190 -BW688_RS04750 BW688_RS04750 -BW688_RS04750 FCS84708_RS03325 -BW688_RS04750 L2BLST_RS03305 -BW688_RS04750 CBP44_RS04755 -BW688_RS04750 AQ199_RS04025 -BW688_RS04750 BKB93_RS03360 -BW688_RS04750 L3404_RS03300 -BW688_RS04750 AQ193_RS00660 -BW688_RS04750 AP288_RS01695 -BW688_RS04750 LJHENM_03290 -BW688_RS04750 CTRC943_RS03305 -BW688_RS04750 KW39_RS03345 -BW688_RS04750 ECS88FINAL_RS0103390 -BW688_RS04750 O169_RS03340 -BW688_RS04750 AKW53_RS00075 -BW688_RS04750 CTL2C_RS04675 -BW688_RS04750 CBP48_RS04755 -BW688_RS04750 SW2_RS03335 -BW688_RS04750 L1224_RS03305 -BW688_RS04750 ECS102511_RS03325 -BW688_RS04750 7619117 -BW688_RS04750 L1440_RS03305 -BW688_RS04750 CBP42_RS04760 -BW688_RS04750 L2BUCH2_RS03305 -BW688_RS04750 BKB92_RS03355 -BW688_RS04750 E150_RS03335 -BW688_RS04750 CTO_RS03360 -BW688_RS04750 BBV13_RS03365 -BW688_RS04750 120108 -BW688_RS04750 BBV16_RS03375 -BW688_RS04750 G9768_RS03325 -BW688_RS04750 gnl|Prokka|PADJNBJD_00654 -BW688_RS04750 BKC02_RS03355 -BW688_RS04750 NILJEPDF_00655 -BW688_RS04750 AOT15_RS04125 -BW688_RS04750 JIEJKO_03295 -BW688_RS04750 BKC01_RS03355 -BW688_RS04750 QSDFRQ_00655 -BW688_RS04750 BKC03_RS03355 -BW688_RS04750 CTJTET1_RS03345 -BW688_RS04750 SOTONK1_RS03325 -BW688_RS04750 IaCS19096_RS03320 -BW688_RS04750 C15_RS0103390 -BW688_RS04750 A5291_RS03370 -BW688_RS04750 KW36_RS03325 -BW688_RS04750 BKB96_RS03365 -BW688_RS04750 BKB99_RS03360 -BW688_RS04750 CTB_RS03365 -BW688_RS04750 SOTONIA3_RS03345 -BW688_RS04750 AQ244_RS04585 -BKC02_RS00260 BKC02_RS00260 -BKC02_RS00260 BBV16_RS00260 -BKC02_RS00260 gnl|Prokka|PADJNBJD_00050 -BKC02_RS00260 JIEJKO_00245 -BKC02_RS00260 NILJEPDF_00050 -BKC02_RS00260 LJHENM_00255 -BKC02_RS00260 BKC01_RS00260 -BKC02_RS00260 A5291_RS00255 -BKC02_RS00260 SOTONK1_RS00255 -BKC02_RS00260 L3404_RS00255 -BKC02_RS00260 7618382 -BKC02_RS00260 AKW53_RS01745 -BKC02_RS00260 QSDFRQ_00050 -BKC02_RS00260 IaCS19096_RS00255 -BKC02_RS00260 BKC03_RS00260 -BKC02_RS00260 C15_RS0100255 -BKC02_RS00260 DU10_RS00260 -BKC02_RS00260 CTRC943_RS00255 -BKC02_RS00260 CTJTET1_RS00255 -BKC02_RS00260 O169_RS00255 -BKC02_RS00260 CBP48_RS01650 -BKC02_RS00260 ECS88FINAL_RS0100260 -BKC02_RS00260 DU13_RS00260 -BKC02_RS00260 KW39_RS00255 -BKC02_RS00260 BKB95_RS00260 -BKC02_RS00260 SW2_RS00255 -BKC02_RS00260 AQ193_RS03740 -BKC02_RS00260 AQ244_RS01735 -BKC02_RS00260 ECS102511_RS00255 -BKC02_RS00260 CTL2C_RS01620 -BKC02_RS00260 CBP42_RS01650 -BKC02_RS00260 CTB_RS00255 -BKC02_RS00260 L1224_RS00255 -BKC02_RS00260 BKB96_RS00260 -BKC02_RS00260 L1440_RS00255 -BKC02_RS00260 BKB99_RS00260 -BKC02_RS00260 BKB92_RS00260 -BKC02_RS00260 CTO_RS00255 -BKC02_RS00260 SOTONIA3_RS00255 -BKC02_RS00260 119247 -BKC02_RS00260 CBP44_RS01655 -BKC02_RS00260 E150_RS00255 -BKC02_RS00260 L2BUCH2_RS00255 -BKC02_RS00260 BKB93_RS00260 -BKC02_RS00260 FCS84708_RS00255 -BKC02_RS00260 AP288_RS03325 -BKC02_RS00260 BBV13_RS00260 -BKC02_RS00260 AOT15_RS00700 -BKC02_RS00260 AQ199_RS00950 -BKC02_RS00260 BW688_RS01650 -BKC02_RS00260 G9768_RS00255 -BKC02_RS00260 L2BLST_RS00255 -BKC02_RS00430 BKC02_RS00430 -BKC02_RS00430 BBV16_RS00425 -BKC02_RS00430 gnl|Prokka|PADJNBJD_00083 -BKC02_RS00430 LJHENM_00415 -BKC02_RS00430 NILJEPDF_00083 -BKC02_RS00430 A5291_RS00420 -BKC02_RS00430 BKC01_RS00430 -BKC02_RS00430 SOTONK1_RS00420 -BKC02_RS00430 L3404_RS00420 -BKC02_RS00430 JIEJKO_00420 -BKC02_RS00430 AKW53_RS01910 -BKC02_RS00430 QSDFRQ_00083 -BKC02_RS00430 IaCS19096_RS00420 -BKC02_RS00430 BKC03_RS00430 -BKC02_RS00430 C15_RS0100430 -BKC02_RS00430 DU10_RS00430 -BKC02_RS00430 7618397 -BKC02_RS00430 CTRC943_RS00420 -BKC02_RS00430 CTJTET1_RS00420 -BKC02_RS00430 O169_RS00420 -BKC02_RS00430 KW36_RS00420 -BKC02_RS00430 DU13_RS00435 -BKC02_RS00430 CBP48_RS01820 -BKC02_RS00430 ECS88FINAL_RS0100435 -BKC02_RS00430 KW39_RS00420 -BKC02_RS00430 BKB95_RS00430 -BKC02_RS00430 SW2_RS00420 -BKC02_RS00430 AQ193_RS03575 -BKC02_RS00430 AQ244_RS01570 -BKC02_RS00430 ECS102511_RS00420 -BKC02_RS00430 CTB_RS00420 -BKC02_RS00430 CTL2C_RS01785 -BKC02_RS00430 CBP42_RS01820 -BKC02_RS00430 BKB96_RS00430 -BKC02_RS00430 L1224_RS00420 -BKC02_RS00430 BKB99_RS00430 -BKC02_RS00430 CTO_RS00420 -BKC02_RS00430 L1440_RS00420 -BKC02_RS00430 BKB92_RS00430 -BKC02_RS00430 SOTONIA3_RS00420 -BKC02_RS00430 CBP44_RS01825 -BKC02_RS00430 119270 -BKC02_RS00430 E150_RS00420 -BKC02_RS00430 L2BUCH2_RS00420 -BKC02_RS00430 BKB93_RS00430 -BKC02_RS00430 FCS84708_RS00420 -BKC02_RS00430 AP288_RS03490 -BKC02_RS00430 BBV13_RS00425 -BKC02_RS00430 AOT15_RS00535 -BKC02_RS00430 AQ199_RS01115 -BKC02_RS00430 BW688_RS01820 -BKC02_RS00430 G9768_RS00420 -BKC02_RS00430 L2BLST_RS00420 -BKC02_RS00595 BKC02_RS00595 -BKC02_RS00595 BBV16_RS00595 -BKC02_RS00595 gnl|Prokka|PADJNBJD_00115 -BKC02_RS00595 LJHENM_00575 -BKC02_RS00595 AKW53_RS02080 -BKC02_RS00595 BKC01_RS00595 -BKC02_RS00595 NILJEPDF_00115 -BKC02_RS00595 A5291_RS00590 -BKC02_RS00595 SOTONK1_RS00585 -BKC02_RS00595 L3404_RS00585 -BKC02_RS00595 JIEJKO_00580 -BKC02_RS00595 QSDFRQ_00115 -BKC02_RS00595 IaCS19096_RS00585 -BKC02_RS00595 BKC03_RS00595 -BKC02_RS00595 C15_RS0100605 -BKC02_RS00595 CTJTET1_RS00585 -BKC02_RS00595 KW39_RS00585 -BKC02_RS00595 DU10_RS00595 -BKC02_RS00595 CTRC943_RS00585 -BKC02_RS00595 ECS88FINAL_RS0100605 -BKC02_RS00595 O169_RS00585 -BKC02_RS00595 DU13_RS00600 -BKC02_RS00595 7618409 -BKC02_RS00595 KW36_RS00585 -BKC02_RS00595 CBP48_RS01985 -BKC02_RS00595 SW2_RS00585 -BKC02_RS00595 BKB95_RS00595 -BKC02_RS00595 ECS102511_RS00585 -BKC02_RS00595 CTL2C_RS01950 -BKC02_RS00595 AQ193_RS03410 -BKC02_RS00595 CTB_RS00590 -BKC02_RS00595 AQ244_RS02760 -BKC02_RS00595 BKB96_RS00595 -BKC02_RS00595 CBP42_RS01985 -BKC02_RS00595 L1224_RS00585 -BKC02_RS00595 BKB99_RS00595 -BKC02_RS00595 BKB92_RS00595 -BKC02_RS00595 SOTONIA3_RS00585 -BKC02_RS00595 L1440_RS00585 -BKC02_RS00595 CTO_RS00590 -BKC02_RS00595 E150_RS00585 -BKC02_RS00595 CBP44_RS01990 -BKC02_RS00595 L2BUCH2_RS00585 -BKC02_RS00595 FCS84708_RS00585 -BKC02_RS00595 AP288_RS03655 -BKC02_RS00595 BKB93_RS00595 -BKC02_RS00595 119289 -BKC02_RS00595 AQ199_RS01280 -BKC02_RS00595 BBV13_RS00595 -BKC02_RS00595 G9768_RS00585 -BKC02_RS00595 L2BLST_RS00585 -BKC02_RS00595 AOT15_RS00370 -BKC02_RS00595 BW688_RS01985 -BKC02_RS03485 BKC02_RS03485 -BKC02_RS03485 NILJEPDF_00680 -BKC02_RS03485 LJHENM_03415 -BKC02_RS03485 AOT15_RS04250 -BKC02_RS03485 AP288_RS01820 -BKC02_RS03485 JIEJKO_03420 -BKC02_RS03485 BKC01_RS03485 -BKC02_RS03485 QSDFRQ_00680 -BKC02_RS03485 CTRC943_RS03435 -BKC02_RS03485 BKC03_RS03485 -BKC02_RS03485 CBP48_RS00055 -BKC02_RS03485 CTJTET1_RS03470 -BKC02_RS03485 KW39_RS03470 -BKC02_RS03485 DU10_RS03500 -BKC02_RS03485 SOTONK1_RS03450 -BKC02_RS03485 ECS88FINAL_RS0103530 -BKC02_RS03485 IaCS19096_RS03445 -BKC02_RS03485 AQ244_RS04460 -BKC02_RS03485 C15_RS0103525 -BKC02_RS03485 A5291_RS03495 -BKC02_RS03485 O169_RS03465 -BKC02_RS03485 DU13_RS03500 -BKC02_RS03485 KW36_RS03450 -BKC02_RS03485 AKW53_RS00200 -BKC02_RS03485 BKB95_RS03505 -BKC02_RS03485 CBP42_RS00055 -BKC02_RS03485 SW2_RS03460 -BKC02_RS03485 CTL2C_RS00055 -BKC02_RS03485 L1224_RS03435 -BKC02_RS03485 ECS102511_RS03450 -BKC02_RS03485 L1440_RS03435 -BKC02_RS03485 AQ193_RS00535 -BKC02_RS03485 BKB96_RS03495 -BKC02_RS03485 BKB99_RS03490 -BKC02_RS03485 CBP44_RS00055 -BKC02_RS03485 L2BUCH2_RS03435 -BKC02_RS03485 BKB92_RS03485 -BKC02_RS03485 CTB_RS03490 -BKC02_RS03485 SOTONIA3_RS03470 -BKC02_RS03485 E150_RS03460 -BKC02_RS03485 CTO_RS03485 -BKC02_RS03485 BBV13_RS03490 -BKC02_RS03485 FCS84708_RS03450 -BKC02_RS03485 L2BLST_RS03435 -BKC02_RS03485 7618664 -BKC02_RS03485 BBV16_RS03500 -BKC02_RS03485 BW688_RS00055 -BKC02_RS03485 AQ199_RS04150 -BKC02_RS03485 BKB93_RS03490 -BKC02_RS03485 120085 -BKC02_RS03485 G9768_RS03450 -BKC02_RS03485 gnl|Prokka|PADJNBJD_00679 -BKC02_RS03485 L3404_RS03430 -BKC02_RS03650 BKC02_RS03650 -BKC02_RS03650 NILJEPDF_00713 -BKC02_RS03650 LJHENM_03580 -BKC02_RS03650 AOT15_RS04420 -BKC02_RS03650 AP288_RS01985 -BKC02_RS03650 JIEJKO_03585 -BKC02_RS03650 BKC01_RS03650 -BKC02_RS03650 QSDFRQ_00713 -BKC02_RS03650 CTRC943_RS03605 -BKC02_RS03650 BKC03_RS03650 -BKC02_RS03650 CBP48_RS00220 -BKC02_RS03650 CTJTET1_RS03640 -BKC02_RS03650 KW39_RS03635 -BKC02_RS03650 DU10_RS03665 -BKC02_RS03650 SOTONK1_RS03620 -BKC02_RS03650 ECS88FINAL_RS0103710 -BKC02_RS03650 IaCS19096_RS03615 -BKC02_RS03650 C15_RS0103700 -BKC02_RS03650 A5291_RS03665 -BKC02_RS03650 O169_RS03630 -BKC02_RS03650 DU13_RS03665 -BKC02_RS03650 KW36_RS03620 -BKC02_RS03650 BKB95_RS03670 -BKC02_RS03650 CBP42_RS00220 -BKC02_RS03650 SW2_RS03625 -BKC02_RS03650 CTL2C_RS00220 -BKC02_RS03650 L1224_RS03600 -BKC02_RS03650 ECS102511_RS03615 -BKC02_RS03650 L1440_RS03600 -BKC02_RS03650 AQ193_RS00370 -BKC02_RS03650 BKB96_RS03660 -BKC02_RS03650 BKB99_RS03655 -BKC02_RS03650 CBP44_RS00220 -BKC02_RS03650 L2BUCH2_RS03600 -BKC02_RS03650 BKB92_RS03650 -BKC02_RS03650 CTB_RS03660 -BKC02_RS03650 SOTONIA3_RS03640 -BKC02_RS03650 E150_RS03625 -BKC02_RS03650 CTO_RS03655 -BKC02_RS03650 BBV13_RS03660 -BKC02_RS03650 FCS84708_RS03615 -BKC02_RS03650 L2BLST_RS03600 -BKC02_RS03650 BBV16_RS03670 -BKC02_RS03650 BW688_RS00220 -BKC02_RS03650 AQ199_RS04315 -BKC02_RS03650 BKB93_RS03655 -BKC02_RS03650 7618235 -BKC02_RS03650 119731 -BKC02_RS03650 G9768_RS03620 -BKC02_RS03650 gnl|Prokka|PADJNBJD_00712 -BKC02_RS03650 L3404_RS03595 -BKC02_RS03650 AKW53_RS00370 F -BKC02_RS03835 BKC02_RS03835 -BKC02_RS03835 NILJEPDF_00749 -BKC02_RS03835 LJHENM_03770 -BKC02_RS03835 AOT15_RS04600 -BKC02_RS03835 AP288_RS02170 -BKC02_RS03835 JIEJKO_03770 -BKC02_RS03835 BKC01_RS03840 -BKC02_RS03835 QSDFRQ_00749 -BKC02_RS03835 CTRC943_RS03785 -BKC02_RS03835 AKW53_RS00540 -BKC02_RS03835 BKC03_RS03835 -BKC02_RS03835 CTJTET1_RS03820 -BKC02_RS03835 KW39_RS03815 -BKC02_RS03835 DU10_RS03850 -BKC02_RS03835 CBP48_RS00405 -BKC02_RS03835 A5291_RS03845 -BKC02_RS03835 SOTONK1_RS03800 -BKC02_RS03835 IaCS19096_RS03795 -BKC02_RS03835 DU13_RS03850 -BKC02_RS03835 C15_RS0103905 -BKC02_RS03835 ECS88FINAL_RS0103905 -BKC02_RS03835 O169_RS03810 -BKC02_RS03835 AQ244_RS04110 -BKC02_RS03835 KW36_RS03800 -BKC02_RS03835 BKB95_RS03855 -BKC02_RS03835 AQ193_RS00190 -BKC02_RS03835 CBP42_RS00405 -BKC02_RS03835 SW2_RS03805 -BKC02_RS03835 CTL2C_RS00400 -BKC02_RS03835 L1224_RS03780 -BKC02_RS03835 ECS102511_RS03795 -BKC02_RS03835 BKB96_RS03840 -BKC02_RS03835 BKB99_RS03835 -BKC02_RS03835 L1440_RS03780 -BKC02_RS03835 CBP44_RS00405 -BKC02_RS03835 L2BUCH2_RS03780 -BKC02_RS03835 BKB92_RS03835 -BKC02_RS03835 CTB_RS03840 -BKC02_RS03835 SOTONIA3_RS03820 -BKC02_RS03835 E150_RS03805 -BKC02_RS03835 CTO_RS03835 -BKC02_RS03835 BBV13_RS03840 -BKC02_RS03835 FCS84708_RS03795 -BKC02_RS03835 BBV16_RS03850 -BKC02_RS03835 L2BLST_RS03780 -BKC02_RS03835 7618689 -BKC02_RS03835 120046 -BKC02_RS03835 BW688_RS00405 -BKC02_RS03835 AQ199_RS04495 -BKC02_RS03835 BKB93_RS03840 -BKC02_RS03835 G9768_RS03800 -BKC02_RS03835 gnl|Prokka|PADJNBJD_00748 -BKC02_RS03835 L3404_RS03775 -BKC02_RS04000 BKC02_RS04000 -BKC02_RS04000 LJHENM_03930 -BKC02_RS04000 AOT15_RS04765 -BKC02_RS04000 AP288_RS02335 -BKC02_RS04000 JIEJKO_03930 -BKC02_RS04000 QSDFRQ_00781 -BKC02_RS04000 BKC01_RS04005 -BKC02_RS04000 CTRC943_RS03950 -BKC02_RS04000 AKW53_RS00705 -BKC02_RS04000 BKC03_RS04000 -BKC02_RS04000 CBP48_RS00570 -BKC02_RS04000 CTJTET1_RS03985 -BKC02_RS04000 KW39_RS03980 -BKC02_RS04000 DU10_RS04015 -BKC02_RS04000 A5291_RS04010 -BKC02_RS04000 SOTONK1_RS03965 -BKC02_RS04000 IaCS19096_RS03960 -BKC02_RS04000 DU13_RS04015 -BKC02_RS04000 C15_RS0104070 -BKC02_RS04000 ECS88FINAL_RS0104075 -BKC02_RS04000 O169_RS03975 -BKC02_RS04000 AQ244_RS03945 -BKC02_RS04000 KW36_RS03965 -BKC02_RS04000 BKB95_RS04020 -BKC02_RS04000 CBP42_RS00570 -BKC02_RS04000 CTL2C_RS00565 -BKC02_RS04000 L1224_RS03945 -BKC02_RS04000 AQ193_RS00025 -BKC02_RS04000 SW2_RS03970 -BKC02_RS04000 L1440_RS03940 -BKC02_RS04000 ECS102511_RS03960 -BKC02_RS04000 BKB96_RS04005 -BKC02_RS04000 BKB99_RS04000 -BKC02_RS04000 CBP44_RS00570 -BKC02_RS04000 L2BUCH2_RS03945 -BKC02_RS04000 BKB92_RS04000 -BKC02_RS04000 CTB_RS04005 -BKC02_RS04000 SOTONIA3_RS03985 -BKC02_RS04000 E150_RS03970 -BKC02_RS04000 CTO_RS04000 -BKC02_RS04000 BBV13_RS04005 -BKC02_RS04000 FCS84708_RS03960 -BKC02_RS04000 L2BLST_RS03945 -BKC02_RS04000 BBV16_RS04015 -BKC02_RS04000 7618267 -BKC02_RS04000 119780 -BKC02_RS04000 BW688_RS00570 -BKC02_RS04000 AQ199_RS04660 -BKC02_RS04000 BKB93_RS04005 -BKC02_RS04000 G9768_RS03965 -BKC02_RS04000 gnl|Prokka|PADJNBJD_00780 -BKC02_RS04000 L3404_RS03940 -BKC02_RS04000 NILJEPDF_00781 -BKC02_RS04365 BKC02_RS04365 -BKC02_RS04365 CTRC943_RS04310 -BKC02_RS04365 AKW53_RS01045 -BKC02_RS04365 BKC01_RS04370 -BKC02_RS04365 AOT15_RS01910 -BKC02_RS04365 CTJTET1_RS04500 -BKC02_RS04365 CBP48_RS00935 -BKC02_RS04365 BKC03_RS04365 -BKC02_RS04365 A5291_RS04365 -BKC02_RS04365 KW39_RS04345 -BKC02_RS04365 SOTONK1_RS04330 -BKC02_RS04365 ECS88FINAL_RS0104420 -BKC02_RS04365 IaCS19096_RS04325 -BKC02_RS04365 DU10_RS04380 -BKC02_RS04365 C15_RS0104440 -BKC02_RS04365 DU13_RS04380 -BKC02_RS04365 O169_RS04340 -BKC02_RS04365 KW36_RS04330 -BKC02_RS04365 CBP42_RS00935 -BKC02_RS04365 CTL2C_RS00925 -BKC02_RS04365 L1224_RS04305 -BKC02_RS04365 BKB95_RS04385 -BKC02_RS04365 L1440_RS04300 -BKC02_RS04365 BKB96_RS04370 -BKC02_RS04365 BKB99_RS04365 -BKC02_RS04365 SW2_RS04335 -BKC02_RS04365 ECS102511_RS04325 -BKC02_RS04365 AQ193_RS04445 -BKC02_RS04365 CBP44_RS00935 -BKC02_RS04365 L2BUCH2_RS04305 -BKC02_RS04365 AQ244_RS02420 -BKC02_RS04365 CTB_RS04360 -BKC02_RS04365 SOTONIA3_RS04345 -BKC02_RS04365 BKB92_RS04365 -BKC02_RS04365 CTO_RS04355 -BKC02_RS04365 L2BLST_RS04305 -BKC02_RS04365 AP288_RS02630 -BKC02_RS04365 BBV13_RS04370 -BKC02_RS04365 E150_RS04335 -BKC02_RS04365 gnl|Prokka|PADJNBJD_00848 -BKC02_RS04365 FCS84708_RS04325 -BKC02_RS04365 AQ199_RS00255 -BKC02_RS04365 BBV16_RS04375 -BKC02_RS04365 BW688_RS00935 -BKC02_RS04365 7618304 -BKC02_RS04365 119837 -BKC02_RS04365 NILJEPDF_00849 -BKC02_RS04365 LJHENM_04270 -BKC02_RS04365 L3404_RS04300 -BKC02_RS04365 G9768_RS04330 -BKC02_RS04365 JIEJKO_04270 -BKC02_RS04365 BKB93_RS04370 -BKC02_RS04365 QSDFRQ_00849 -BKC02_RS04535 BKC02_RS04535 -BKC02_RS04535 AKW53_RS01215 -BKC02_RS04535 BKC01_RS04540 -BKC02_RS04535 CTRC943_RS04475 -BKC02_RS04535 AOT15_RS02070 -BKC02_RS04535 CTJTET1_RS04660 -BKC02_RS04535 KW39_RS04510 -BKC02_RS04535 BKC03_RS04535 -BKC02_RS04535 CBP48_RS01110 -BKC02_RS04535 A5291_RS04525 -BKC02_RS04535 SOTONK1_RS04490 -BKC02_RS04535 ECS88FINAL_RS0104590 -BKC02_RS04535 IaCS19096_RS04485 -BKC02_RS04535 C15_RS0104610 -BKC02_RS04535 DU10_RS04555 -BKC02_RS04535 O169_RS04510 -BKC02_RS04535 KW36_RS04490 -BKC02_RS04535 DU13_RS04555 -BKC02_RS04535 BKB95_RS04555 -BKC02_RS04535 CBP42_RS01110 -BKC02_RS04535 CTL2C_RS01090 -BKC02_RS04535 L1224_RS04470 -BKC02_RS04535 BKB96_RS04540 -BKC02_RS04535 L1440_RS04465 -BKC02_RS04535 BKB99_RS04535 -BKC02_RS04535 SW2_RS04500 -BKC02_RS04535 ECS102511_RS04495 -BKC02_RS04535 AQ193_RS04275 -BKC02_RS04535 AQ244_RS02260 -BKC02_RS04535 CBP44_RS01110 -BKC02_RS04535 CTB_RS04520 -BKC02_RS04535 L2BUCH2_RS04470 -BKC02_RS04535 SOTONIA3_RS04505 -BKC02_RS04535 CTO_RS04515 -BKC02_RS04535 BBV13_RS04530 -BKC02_RS04535 BKB92_RS04540 -BKC02_RS04535 AP288_RS02800 -BKC02_RS04535 BBV16_RS04535 -BKC02_RS04535 E150_RS04505 -BKC02_RS04535 L2BLST_RS04470 -BKC02_RS04535 gnl|Prokka|PADJNBJD_00881 -BKC02_RS04535 FCS84708_RS04490 -BKC02_RS04535 AQ199_RS00425 -BKC02_RS04535 BW688_RS01110 -BKC02_RS04535 119952 -BKC02_RS04535 NILJEPDF_00882 -BKC02_RS04535 7618749 -BKC02_RS04535 G9768_RS04490 -BKC02_RS04535 LJHENM_04440 -BKC02_RS04535 L3404_RS04465 -BKC02_RS04535 JIEJKO_04435 -BKC02_RS04535 QSDFRQ_00882 -BKC02_RS04535 BKB93_RS04545 -BKC02_RS04710 BKC02_RS04710 -BKC02_RS04710 CTRC943_RS04645 -BKC02_RS04710 AKW53_RS01385 -BKC02_RS04710 BKC01_RS04715 -BKC02_RS04710 AOT15_RS02240 -BKC02_RS04710 CTJTET1_RS04830 -BKC02_RS04710 CBP48_RS01290 -BKC02_RS04710 KW39_RS04680 -BKC02_RS04710 BKC03_RS04710 -BKC02_RS04710 SOTONK1_RS04660 -BKC02_RS04710 ECS88FINAL_RS01000000105020 -BKC02_RS04710 IaCS19096_RS04655 -BKC02_RS04710 C15_RS01000000104980 -BKC02_RS04710 DU10_RS04730 -BKC02_RS04710 O169_RS04680 -BKC02_RS04710 KW36_RS04660 -BKC02_RS04710 DU13_RS04730 -BKC02_RS04710 CTL2C_RS01260 -BKC02_RS04710 CBP42_RS01290 -BKC02_RS04710 L1224_RS04640 -BKC02_RS04710 BKB95_RS04730 -BKC02_RS04710 L1440_RS04635 -BKC02_RS04710 BKB96_RS04715 -BKC02_RS04710 BKB99_RS04710 -BKC02_RS04710 SW2_RS04670 -BKC02_RS04710 ECS102511_RS04665 -BKC02_RS04710 AQ193_RS04105 -BKC02_RS04710 CBP44_RS01290 -BKC02_RS04710 L2BUCH2_RS04640 -BKC02_RS04710 AQ244_RS02090 -BKC02_RS04710 SOTONIA3_RS04675 -BKC02_RS04710 AP288_RS02970 -BKC02_RS04710 BKB92_RS04715 -BKC02_RS04710 L2BLST_RS04640 -BKC02_RS04710 E150_RS04675 -BKC02_RS04710 FCS84708_RS04660 -BKC02_RS04710 AQ199_RS00595 -BKC02_RS04710 BW688_RS01290 -BKC02_RS04710 L3404_RS04635 -BKC02_RS04710 7618767 -BKC02_RS04710 G9768_RS04660 -BKC02_RS04710 BKB93_RS04720 -BKC03_RS02265 BKC03_RS02265 -BKC03_RS02265 LJHENM_02245 -BKC03_RS02265 JIEJKO_02240 -BKC03_RS02265 CTJTET1_RS02265 -BKC03_RS02265 QSDFRQ_00445 -BKC03_RS02265 C15_RS0102300 -BKC03_RS02265 SOTONK1_RS02255 -BKC03_RS02265 DU10_RS02290 -BKC03_RS02265 A5291_RS02285 -BKC03_RS02265 KW39_RS02265 -BKC03_RS02265 IaCS19096_RS02250 -BKC03_RS02265 ECS88FINAL_RS0102300 -BKC03_RS02265 O169_RS02265 -BKC03_RS02265 AP288_RS00825 -BKC03_RS02265 DU13_RS02285 -BKC03_RS02265 7618568 -BKC03_RS02265 BKB96_RS02270 -BKC03_RS02265 BKB99_RS02265 -BKC03_RS02265 CBP48_RS03670 -BKC03_RS02265 CTL2C_RS03605 -BKC03_RS02265 KW36_RS02250 -BKC03_RS02265 AOT15_RS03250 -BKC03_RS02265 BKB95_RS02285 -BKC03_RS02265 119542 -BKC03_RS02265 L1224_RS02235 -BKC03_RS02265 SW2_RS02260 -BKC03_RS02265 ECS102511_RS02255 -BKC03_RS02265 L1440_RS02235 -BKC03_RS02265 AQ244_RS00855 -BKC03_RS02265 CBP42_RS03680 -BKC03_RS02265 CTB_RS02285 -BKC03_RS02265 L2BUCH2_RS02230 -BKC03_RS02265 BKB92_RS02275 -BKC03_RS02265 SOTONIA3_RS02270 -BKC03_RS02265 CTO_RS02285 -BKC03_RS02265 E150_RS02260 -BKC03_RS02265 AQ193_RS01730 -BKC03_RS02265 BW688_RS03665 -BKC03_RS02265 L2BLST_RS02235 -BKC03_RS02265 FCS84708_RS02250 -BKC03_RS02265 BBV13_RS02290 -BKC03_RS02265 CBP44_RS03675 -BKC03_RS02265 BKB93_RS02280 -BKC03_RS02265 AQ199_RS02950 -BKC03_RS02265 G9768_RS02255 -BKC03_RS02265 BBV16_RS02295 -BKC03_RS02265 L3404_RS02230 -BKC03_RS02265 BKC02_RS02265 -BKC03_RS02265 BKC01_RS02265 -BKC03_RS02265 AKW53_RS03755 -BKC03_RS02265 gnl|Prokka|PADJNBJD_00445 -BKC03_RS02265 NILJEPDF_00445 -BKC03_RS02265 CTRC943_RS02235 -BKC03_RS02430 BKC03_RS02430 -BKC03_RS02430 CTJTET1_RS02420 -BKC03_RS02430 AOT15_RS00035 -BKC03_RS02430 C15_RS0102470 -BKC03_RS02430 SOTONK1_RS02410 -BKC03_RS02430 DU10_RS02450 -BKC03_RS02430 KW39_RS02420 -BKC03_RS02430 IaCS19096_RS02405 -BKC03_RS02430 A5291_RS02445 -BKC03_RS02430 ECS88FINAL_RS0102465 -BKC03_RS02430 7618581 -BKC03_RS02430 O169_RS02420 -BKC03_RS02430 AP288_RS00670 -BKC03_RS02430 DU13_RS02445 -BKC03_RS02430 CBP48_RS03830 -BKC03_RS02430 BKB95_RS02445 -BKC03_RS02430 BKB96_RS02435 -BKC03_RS02430 BKB99_RS02430 -BKC03_RS02430 CTL2C_RS03760 -BKC03_RS02430 KW36_RS02405 -BKC03_RS02430 119562 -BKC03_RS02430 L1224_RS02390 -BKC03_RS02430 SW2_RS02415 -BKC03_RS02430 ECS102511_RS02410 -BKC03_RS02430 L1440_RS02390 -BKC03_RS02430 AQ244_RS00700 -BKC03_RS02430 CBP42_RS03840 -BKC03_RS02430 L2BUCH2_RS02385 -BKC03_RS02430 BKB92_RS02435 -BKC03_RS02430 CTB_RS02445 -BKC03_RS02430 SOTONIA3_RS02425 -BKC03_RS02430 E150_RS02415 -BKC03_RS02430 CTO_RS02445 -BKC03_RS02430 AQ193_RS01575 -BKC03_RS02430 BBV13_RS02450 -BKC03_RS02430 BW688_RS03830 -BKC03_RS02430 CBP44_RS03835 -BKC03_RS02430 L2BLST_RS02390 -BKC03_RS02430 FCS84708_RS02405 -BKC03_RS02430 BKB93_RS02440 -BKC03_RS02430 BBV16_RS02455 -BKC03_RS02430 AQ199_RS03105 -BKC03_RS02430 G9768_RS02410 -BKC03_RS02430 L3404_RS02385 -BKC03_RS02430 BKC02_RS02430 -BKC03_RS02430 gnl|Prokka|PADJNBJD_00475 -BKC03_RS02430 AKW53_RS03910 -BKC03_RS02430 BKC01_RS02430 -BKC03_RS02430 NILJEPDF_00475 -BKC03_RS02430 LJHENM_02395 -BKC03_RS02430 CTRC943_RS02390 -BKC03_RS02430 JIEJKO_02395 -BKC03_RS02430 QSDFRQ_00475 -BKC03_RS03280 BKC03_RS03280 -BKC03_RS03280 KW39_RS03265 -BKC03_RS03280 CTJTET1_RS03265 -BKC03_RS03280 ECS88FINAL_RS0103315 -BKC03_RS03280 DU10_RS03295 -BKC03_RS03280 SOTONK1_RS03250 -BKC03_RS03280 O169_RS03260 -BKC03_RS03280 IaCS19096_RS03245 -BKC03_RS03280 C15_RS0103315 -BKC03_RS03280 A5291_RS03290 -BKC03_RS03280 DU13_RS03290 -BKC03_RS03280 CTL2C_RS04595 -BKC03_RS03280 AKW53_RS04475 -BKC03_RS03280 CBP48_RS04680 -BKC03_RS03280 7619107 -BKC03_RS03280 SW2_RS03255 -BKC03_RS03280 L1224_RS03225 -BKC03_RS03280 KW36_RS03250 -BKC03_RS03280 ECS102511_RS03250 -BKC03_RS03280 L1440_RS03225 -BKC03_RS03280 BKB95_RS03295 -BKC03_RS03280 BKB96_RS03290 -BKC03_RS03280 BKB99_RS03285 -BKC03_RS03280 CBP42_RS04685 -BKC03_RS03280 L2BUCH2_RS03225 -BKC03_RS03280 AQ244_RS04665 -BKC03_RS03280 BKB92_RS03280 -BKC03_RS03280 CTB_RS03290 -BKC03_RS03280 E150_RS03255 -BKC03_RS03280 SOTONIA3_RS03270 -BKC03_RS03280 BW688_RS04675 -BKC03_RS03280 CTO_RS03285 -BKC03_RS03280 FCS84708_RS03250 -BKC03_RS03280 BBV13_RS03290 -BKC03_RS03280 L2BLST_RS03225 -BKC03_RS03280 CBP44_RS04680 -BKC03_RS03280 120124 -BKC03_RS03280 AQ199_RS03950 -BKC03_RS03280 BBV16_RS03300 -BKC03_RS03280 BKB93_RS03285 -BKC03_RS03280 AQ193_RS00735 -BKC03_RS03280 G9768_RS03250 -BKC03_RS03280 L3404_RS03220 -BKC03_RS03280 gnl|Prokka|PADJNBJD_00639 -BKC03_RS03280 AP288_RS01620 -BKC03_RS03280 BKC02_RS03280 -BKC03_RS03280 NILJEPDF_00640 -BKC03_RS03280 LJHENM_03215 -BKC03_RS03280 AOT15_RS04050 -BKC03_RS03280 CTRC943_RS03225 -BKC03_RS03280 JIEJKO_03220 -BKC03_RS03280 BKC01_RS03280 -BKC03_RS03280 QSDFRQ_00640 -BKC03_RS03450 BKC03_RS03450 -BKC03_RS03450 CBP48_RS00020 -BKC03_RS03450 CTJTET1_RS03435 -BKC03_RS03450 KW39_RS03435 -BKC03_RS03450 DU10_RS03465 -BKC03_RS03450 SOTONK1_RS03415 -BKC03_RS03450 ECS88FINAL_RS0103495 -BKC03_RS03450 IaCS19096_RS03410 -BKC03_RS03450 C15_RS0103490 -BKC03_RS03450 A5291_RS03460 -BKC03_RS03450 O169_RS03430 -BKC03_RS03450 DU13_RS03465 -BKC03_RS03450 AKW53_RS00165 -BKC03_RS03450 KW36_RS03415 -BKC03_RS03450 BKB95_RS03470 -BKC03_RS03450 CBP42_RS00020 -BKC03_RS03450 SW2_RS03425 -BKC03_RS03450 CTL2C_RS00020 -BKC03_RS03450 L1224_RS03400 -BKC03_RS03450 ECS102511_RS03415 -BKC03_RS03450 L1440_RS03400 -BKC03_RS03450 BKB96_RS03460 -BKC03_RS03450 BKB99_RS03455 -BKC03_RS03450 CBP44_RS00020 -BKC03_RS03450 L2BUCH2_RS03400 -BKC03_RS03450 AQ244_RS04495 -BKC03_RS03450 BKB92_RS03450 -BKC03_RS03450 CTB_RS03455 -BKC03_RS03450 SOTONIA3_RS03435 -BKC03_RS03450 E150_RS03425 -BKC03_RS03450 CTO_RS03450 -BKC03_RS03450 BBV13_RS03455 -BKC03_RS03450 FCS84708_RS03415 -BKC03_RS03450 L2BLST_RS03400 -BKC03_RS03450 7618206 -BKC03_RS03450 AQ193_RS00570 -BKC03_RS03450 BBV16_RS03465 -BKC03_RS03450 BW688_RS00020 -BKC03_RS03450 119684 -BKC03_RS03450 AQ199_RS04115 -BKC03_RS03450 BKB93_RS03455 -BKC03_RS03450 G9768_RS03415 -BKC03_RS03450 gnl|Prokka|PADJNBJD_00672 -BKC03_RS03450 L3404_RS03395 -BKC03_RS03450 BKC02_RS03450 -BKC03_RS03450 NILJEPDF_00673 -BKC03_RS03450 LJHENM_03380 -BKC03_RS03450 AOT15_RS04215 -BKC03_RS03450 AP288_RS01785 -BKC03_RS03450 JIEJKO_03385 -BKC03_RS03450 BKC01_RS03450 -BKC03_RS03450 QSDFRQ_00673 -BKC03_RS03450 CTRC943_RS03400 -BKC03_RS03620 BKC03_RS03620 -BKC03_RS03620 CBP48_RS00190 -BKC03_RS03620 CTJTET1_RS03610 -BKC03_RS03620 KW39_RS03605 -BKC03_RS03620 DU10_RS03635 -BKC03_RS03620 SOTONK1_RS03590 -BKC03_RS03620 ECS88FINAL_RS0103680 -BKC03_RS03620 IaCS19096_RS03585 -BKC03_RS03620 C15_RS0103670 -BKC03_RS03620 A5291_RS03635 -BKC03_RS03620 O169_RS03600 -BKC03_RS03620 DU13_RS03635 -BKC03_RS03620 KW36_RS03590 -BKC03_RS03620 AKW53_RS00335 -BKC03_RS03620 BKB95_RS03640 -BKC03_RS03620 CBP42_RS00190 -BKC03_RS03620 SW2_RS03595 -BKC03_RS03620 CTL2C_RS00190 -BKC03_RS03620 L1224_RS03570 -BKC03_RS03620 ECS102511_RS03585 -BKC03_RS03620 L1440_RS03570 -BKC03_RS03620 BKB96_RS03630 -BKC03_RS03620 BKB99_RS03625 -BKC03_RS03620 CBP44_RS00190 -BKC03_RS03620 L2BUCH2_RS03570 -BKC03_RS03620 AQ244_RS04320 -BKC03_RS03620 BKB92_RS03620 -BKC03_RS03620 CTB_RS03630 -BKC03_RS03620 SOTONIA3_RS03610 -BKC03_RS03620 E150_RS03595 -BKC03_RS03620 CTO_RS03625 -BKC03_RS03620 BBV13_RS03630 -BKC03_RS03620 FCS84708_RS03585 -BKC03_RS03620 L2BLST_RS03570 -BKC03_RS03620 AQ193_RS00400 -BKC03_RS03620 BBV16_RS03640 -BKC03_RS03620 BW688_RS00190 -BKC03_RS03620 AQ199_RS04285 -BKC03_RS03620 BKB93_RS03625 -BKC03_RS03620 7618229 -BKC03_RS03620 119721 -BKC03_RS03620 G9768_RS03590 -BKC03_RS03620 gnl|Prokka|PADJNBJD_00706 -BKC03_RS03620 L3404_RS03565 -BKC03_RS03620 BKC02_RS03620 -BKC03_RS03620 NILJEPDF_00707 -BKC03_RS03620 LJHENM_03550 -BKC03_RS03620 AOT15_RS04390 -BKC03_RS03620 AP288_RS01955 -BKC03_RS03620 JIEJKO_03555 -BKC03_RS03620 BKC01_RS03620 -BKC03_RS03620 QSDFRQ_00707 -BKC03_RS03620 CTRC943_RS03575 -BKC03_RS03970 BKC03_RS03970 -BKC03_RS03970 CBP48_RS00540 -BKC03_RS03970 CTJTET1_RS03955 -BKC03_RS03970 KW39_RS03950 -BKC03_RS03970 DU10_RS03985 -BKC03_RS03970 A5291_RS03980 -BKC03_RS03970 SOTONK1_RS03935 -BKC03_RS03970 IaCS19096_RS03930 -BKC03_RS03970 DU13_RS03985 -BKC03_RS03970 C15_RS0104040 -BKC03_RS03970 ECS88FINAL_RS0104045 -BKC03_RS03970 O169_RS03945 -BKC03_RS03970 KW36_RS03935 -BKC03_RS03970 BKB95_RS03990 -BKC03_RS03970 CBP42_RS00540 -BKC03_RS03970 CTL2C_RS00535 -BKC03_RS03970 L1224_RS03915 -BKC03_RS03970 SW2_RS03940 -BKC03_RS03970 L1440_RS03910 -BKC03_RS03970 ECS102511_RS03930 -BKC03_RS03970 BKB96_RS03975 -BKC03_RS03970 BKB99_RS03970 -BKC03_RS03970 CBP44_RS00540 -BKC03_RS03970 L2BUCH2_RS03915 -BKC03_RS03970 AQ244_RS03975 -BKC03_RS03970 BKB92_RS03970 -BKC03_RS03970 CTB_RS03975 -BKC03_RS03970 SOTONIA3_RS03955 -BKC03_RS03970 E150_RS03940 -BKC03_RS03970 CTO_RS03970 -BKC03_RS03970 BBV13_RS03975 -BKC03_RS03970 FCS84708_RS03930 -BKC03_RS03970 L2BLST_RS03915 -BKC03_RS03970 AQ193_RS00055 -BKC03_RS03970 BBV16_RS03985 -BKC03_RS03970 7618262 -BKC03_RS03970 119772 -BKC03_RS03970 BW688_RS00540 -BKC03_RS03970 AQ199_RS04630 -BKC03_RS03970 BKB93_RS03975 -BKC03_RS03970 G9768_RS03935 -BKC03_RS03970 gnl|Prokka|PADJNBJD_00774 -BKC03_RS03970 L3404_RS03910 -BKC03_RS03970 NILJEPDF_00775 -BKC03_RS03970 BKC02_RS03970 -BKC03_RS03970 LJHENM_03900 -BKC03_RS03970 AOT15_RS04735 -BKC03_RS03970 AP288_RS02305 -BKC03_RS03970 JIEJKO_03900 -BKC03_RS03970 QSDFRQ_00775 -BKC03_RS03970 BKC01_RS03975 -BKC03_RS03970 CTRC943_RS03920 -BKC03_RS03970 AKW53_RS00675 -BKC03_RS04335 BKC03_RS04335 -BKC03_RS04335 CBP48_RS00905 -BKC03_RS04335 A5291_RS04335 -BKC03_RS04335 KW39_RS04315 -BKC03_RS04335 SOTONK1_RS04300 -BKC03_RS04335 ECS88FINAL_RS0104390 -BKC03_RS04335 IaCS19096_RS04290 -BKC03_RS04335 DU10_RS04350 -BKC03_RS04335 C15_RS0104410 -BKC03_RS04335 DU13_RS04350 -BKC03_RS04335 O169_RS04310 -BKC03_RS04335 KW36_RS04295 -BKC03_RS04335 BKB95_RS04355 -BKC03_RS04335 CBP42_RS00905 -BKC03_RS04335 CTL2C_RS00895 -BKC03_RS04335 L1224_RS04275 -BKC03_RS04335 BKB96_RS04340 -BKC03_RS04335 L1440_RS04270 -BKC03_RS04335 BKB99_RS04335 -BKC03_RS04335 SW2_RS04305 -BKC03_RS04335 ECS102511_RS04295 -BKC03_RS04335 CBP44_RS00905 -BKC03_RS04335 CTB_RS04330 -BKC03_RS04335 L2BUCH2_RS04275 -BKC03_RS04335 SOTONIA3_RS04315 -BKC03_RS04335 BKB92_RS04335 -BKC03_RS04335 CTO_RS04325 -BKC03_RS04335 AP288_RS02600 -BKC03_RS04335 BBV13_RS04340 -BKC03_RS04335 E150_RS04305 -BKC03_RS04335 L2BLST_RS04275 -BKC03_RS04335 FCS84708_RS04295 -BKC03_RS04335 AQ199_RS00225 -BKC03_RS04335 BBV16_RS04345 -BKC03_RS04335 119969 -BKC03_RS04335 gnl|Prokka|PADJNBJD_00843 -BKC03_RS04335 BW688_RS00905 -BKC03_RS04335 7618738 -BKC03_RS04335 NILJEPDF_00844 -BKC03_RS04335 AQ193_RS04475 -BKC03_RS04335 G9768_RS04300 -BKC03_RS04335 LJHENM_04245 -BKC03_RS04335 L3404_RS04270 -BKC03_RS04335 BKB93_RS04340 -BKC03_RS04335 JIEJKO_04245 -BKC03_RS04335 QSDFRQ_00844 -BKC03_RS04335 AQ244_RS02460 -BKC03_RS04335 BKC02_RS04335 -BKC03_RS04335 AKW53_RS01015 -BKC03_RS04335 BKC01_RS04340 -BKC03_RS04335 CTRC943_RS04280 -BKC03_RS04335 AOT15_RS01880 -BKC03_RS04335 CTJTET1_RS04470 -BKB95_RS00895 BKB95_RS00895 -BKB95_RS00895 KW36_RS00880 -BKB95_RS00895 BKB96_RS00880 -BKB95_RS00895 SW2_RS00880 -BKB95_RS00895 BKB99_RS00880 -BKB95_RS00895 ECS102511_RS00880 -BKB95_RS00895 CBP48_RS02280 -BKB95_RS00895 CTL2C_RS02240 -BKB95_RS00895 L1224_RS00870 -BKB95_RS00895 AQ244_RS03060 -BKB95_RS00895 SOTONIA3_RS00895 -BKB95_RS00895 L1440_RS00870 -BKB95_RS00895 AOT15_RS00075 -BKB95_RS00895 BKB92_RS00885 -BKB95_RS00895 CBP42_RS02280 -BKB95_RS00895 CTB_RS00905 -BKB95_RS00895 E150_RS00880 -BKB95_RS00895 CTO_RS00905 -BKB95_RS00895 L2BUCH2_RS00875 -BKB95_RS00895 FCS84708_RS00880 -BKB95_RS00895 AP288_RS03950 -BKB95_RS00895 BKB93_RS00885 -BKB95_RS00895 AQ199_RS01575 -BKB95_RS00895 CBP44_RS02285 -BKB95_RS00895 G9768_RS00885 -BKB95_RS00895 L2BLST_RS00875 -BKB95_RS00895 BW688_RS02280 -BKB95_RS00895 BKC02_RS00880 -BKB95_RS00895 BBV13_RS00910 -BKB95_RS00895 119349 -BKB95_RS00895 BKC01_RS00880 -BKB95_RS00895 AKW53_RS02375 -BKB95_RS00895 L3404_RS00870 -BKB95_RS00895 BBV16_RS00910 -BKB95_RS00895 gnl|Prokka|PADJNBJD_00172 -BKB95_RS00895 BKC03_RS00880 -BKB95_RS00895 NILJEPDF_00172 -BKB95_RS00895 LJHENM_00865 -BKB95_RS00895 CTJTET1_RS00895 -BKB95_RS00895 DU10_RS00895 -BKB95_RS00895 C15_RS0100915 -BKB95_RS00895 SOTONK1_RS00880 -BKB95_RS00895 AQ193_RS03110 -BKB95_RS00895 JIEJKO_00865 -BKB95_RS00895 KW39_RS00885 -BKB95_RS00895 IaCS19096_RS00880 -BKB95_RS00895 QSDFRQ_00172 -BKB95_RS00895 CTRC943_RS00875 -BKB95_RS00895 ECS88FINAL_RS0100900 -BKB95_RS00895 O169_RS00885 -BKB95_RS00895 DU13_RS00890 -BKB95_RS00895 7618445 -BKB95_RS00895 A5291_RS00905 -BKB95_RS01740 BKB95_RS01740 -BKB95_RS01740 CTL2C_RS03070 -BKB95_RS01740 KW36_RS01720 -BKB95_RS01740 AOT15_RS02720 -BKB95_RS01740 BKB96_RS01725 -BKB95_RS01740 CBP48_RS03125 -BKB95_RS01740 SW2_RS01725 -BKB95_RS01740 L1224_RS01700 -BKB95_RS01740 BKB99_RS01725 -BKB95_RS01740 ECS102511_RS01725 -BKB95_RS01740 L1440_RS01700 -BKB95_RS01740 CTB_RS01750 -BKB95_RS01740 SOTONIA3_RS01735 -BKB95_RS01740 BKB92_RS01735 -BKB95_RS01740 CBP42_RS03125 -BKB95_RS01740 L2BUCH2_RS01700 -BKB95_RS01740 CTO_RS01750 -BKB95_RS01740 E150_RS01730 -BKB95_RS01740 AP288_RS01355 -BKB95_RS01740 L2BLST_RS01700 -BKB95_RS01740 FCS84708_RS01720 -BKB95_RS01740 BKB93_RS01735 -BKB95_RS01740 BBV13_RS01755 -BKB95_RS01740 BW688_RS03125 -BKB95_RS01740 CBP44_RS03130 -BKB95_RS01740 AQ199_RS02420 -BKB95_RS01740 AQ244_RS01385 -BKB95_RS01740 G9768_RS01725 -BKB95_RS01740 BBV16_RS01755 -BKB95_RS01740 BKC02_RS01725 -BKB95_RS01740 L3404_RS01700 -BKB95_RS01740 BKC01_RS01725 -BKB95_RS01740 AKW53_RS03225 -BKB95_RS01740 gnl|Prokka|PADJNBJD_00339 -BKB95_RS01740 NILJEPDF_00339 -BKB95_RS01740 CTRC943_RS01705 -BKB95_RS01740 BKC03_RS01725 -BKB95_RS01740 LJHENM_01710 -BKB95_RS01740 CTJTET1_RS01735 -BKB95_RS01740 AQ193_RS02260 -BKB95_RS01740 JIEJKO_01705 -BKB95_RS01740 DU10_RS01745 -BKB95_RS01740 C15_RS0101765 -BKB95_RS01740 SOTONK1_RS01725 -BKB95_RS01740 QSDFRQ_00339 -BKB95_RS01740 A5291_RS01750 -BKB95_RS01740 KW39_RS01735 -BKB95_RS01740 IaCS19096_RS01720 -BKB95_RS01740 ECS88FINAL_RS0101755 -BKB95_RS01740 120374 -BKB95_RS01740 O169_RS01735 -BKB95_RS01740 DU13_RS01740 -BKB95_RS01740 7618951 -BKB95_RS03605 BKB95_RS03605 -BKB95_RS03605 CBP42_RS00155 -BKB95_RS03605 SW2_RS03560 -BKB95_RS03605 CTL2C_RS00155 -BKB95_RS03605 L1224_RS03535 -BKB95_RS03605 ECS102511_RS03550 -BKB95_RS03605 L1440_RS03535 -BKB95_RS03605 BKB96_RS03595 -BKB95_RS03605 BKB99_RS03590 -BKB95_RS03605 CBP44_RS00155 -BKB95_RS03605 L2BUCH2_RS03535 -BKB95_RS03605 BKB92_RS03585 -BKB95_RS03605 CTB_RS03595 -BKB95_RS03605 SOTONIA3_RS03575 -BKB95_RS03605 E150_RS03560 -BKB95_RS03605 CTO_RS03590 -BKB95_RS03605 BBV13_RS03595 -BKB95_RS03605 FCS84708_RS03550 -BKB95_RS03605 L2BLST_RS03535 -BKB95_RS03605 BBV16_RS03605 -BKB95_RS03605 BW688_RS00155 -BKB95_RS03605 AQ199_RS04250 -BKB95_RS03605 BKB93_RS03590 -BKB95_RS03605 7618670 -BKB95_RS03605 120076 -BKB95_RS03605 G9768_RS03555 -BKB95_RS03605 gnl|Prokka|PADJNBJD_00699 -BKB95_RS03605 L3404_RS03530 -BKB95_RS03605 BKC02_RS03585 -BKB95_RS03605 NILJEPDF_00700 -BKB95_RS03605 LJHENM_03515 -BKB95_RS03605 AOT15_RS04355 -BKB95_RS03605 AP288_RS01920 -BKB95_RS03605 AQ244_RS04355 -BKB95_RS03605 JIEJKO_03520 -BKB95_RS03605 BKC01_RS03585 -BKB95_RS03605 QSDFRQ_00700 -BKB95_RS03605 CTRC943_RS03540 -BKB95_RS03605 BKC03_RS03585 -BKB95_RS03605 CBP48_RS00155 -BKB95_RS03605 CTJTET1_RS03575 -BKB95_RS03605 KW39_RS03570 -BKB95_RS03605 DU10_RS03600 -BKB95_RS03605 SOTONK1_RS03555 -BKB95_RS03605 ECS88FINAL_RS0103640 -BKB95_RS03605 IaCS19096_RS03550 -BKB95_RS03605 C15_RS0103630 -BKB95_RS03605 A5291_RS03600 -BKB95_RS03605 O169_RS03565 -BKB95_RS03605 AQ193_RS00435 -BKB95_RS03605 DU13_RS03600 -BKB95_RS03605 KW36_RS03555 -BKB95_RS03605 AKW53_RS00300 -BKB95_RS03790 BKB95_RS03790 -BKB95_RS03790 CBP42_RS00340 -BKB95_RS03790 SW2_RS03740 -BKB95_RS03790 CTL2C_RS00335 -BKB95_RS03790 L1224_RS03715 -BKB95_RS03790 ECS102511_RS03730 -BKB95_RS03790 BKB96_RS03775 -BKB95_RS03790 BKB99_RS03770 -BKB95_RS03790 L1440_RS03715 -BKB95_RS03790 CBP44_RS00340 -BKB95_RS03790 L2BUCH2_RS03715 -BKB95_RS03790 BKB92_RS03770 -BKB95_RS03790 CTB_RS03775 -BKB95_RS03790 SOTONIA3_RS03755 -BKB95_RS03790 E150_RS03740 -BKB95_RS03790 CTO_RS03770 -BKB95_RS03790 BBV13_RS03775 -BKB95_RS03790 FCS84708_RS03730 -BKB95_RS03790 BBV16_RS03785 -BKB95_RS03790 L2BLST_RS03715 -BKB95_RS03790 119748 -BKB95_RS03790 BW688_RS00340 -BKB95_RS03790 7618246 -BKB95_RS03790 AQ199_RS04430 -BKB95_RS03790 BKB93_RS03775 -BKB95_RS03790 G9768_RS03735 -BKB95_RS03790 gnl|Prokka|PADJNBJD_00735 -BKB95_RS03790 L3404_RS03710 -BKB95_RS03790 BKC02_RS03770 -BKB95_RS03790 NILJEPDF_00736 -BKB95_RS03790 LJHENM_03705 -BKB95_RS03790 AOT15_RS04535 -BKB95_RS03790 AP288_RS02105 -BKB95_RS03790 AQ244_RS04175 -BKB95_RS03790 JIEJKO_03705 -BKB95_RS03790 BKC01_RS03775 -BKB95_RS03790 QSDFRQ_00736 -BKB95_RS03790 CTRC943_RS03720 -BKB95_RS03790 AKW53_RS00475 -BKB95_RS03790 BKC03_RS03770 -BKB95_RS03790 CTJTET1_RS03755 -BKB95_RS03790 KW39_RS03750 -BKB95_RS03790 DU10_RS03785 -BKB95_RS03790 CBP48_RS00340 -BKB95_RS03790 A5291_RS03780 -BKB95_RS03790 SOTONK1_RS03735 -BKB95_RS03790 IaCS19096_RS03730 -BKB95_RS03790 AQ193_RS00255 -BKB95_RS03790 DU13_RS03785 -BKB95_RS03790 C15_RS0103840 -BKB95_RS03790 ECS88FINAL_RS0103840 -BKB95_RS03790 O169_RS03745 -BKB95_RS03790 KW36_RS03735 -BKB95_RS03955 BKB95_RS03955 -BKB95_RS03955 CBP42_RS00505 -BKB95_RS03955 CTL2C_RS00500 -BKB95_RS03955 L1224_RS03880 -BKB95_RS03955 SW2_RS03905 -BKB95_RS03955 L1440_RS03875 -BKB95_RS03955 ECS102511_RS03895 -BKB95_RS03955 BKB96_RS03940 -BKB95_RS03955 BKB99_RS03935 -BKB95_RS03955 CBP44_RS00505 -BKB95_RS03955 L2BUCH2_RS03880 -BKB95_RS03955 BKB92_RS03935 -BKB95_RS03955 CTB_RS03940 -BKB95_RS03955 SOTONIA3_RS03920 -BKB95_RS03955 E150_RS03905 -BKB95_RS03955 CTO_RS03935 -BKB95_RS03955 BBV13_RS03940 -BKB95_RS03955 FCS84708_RS03895 -BKB95_RS03955 L2BLST_RS03880 -BKB95_RS03955 BBV16_RS03950 -BKB95_RS03955 7618259 -BKB95_RS03955 119768 -BKB95_RS03955 BW688_RS00505 -BKB95_RS03955 AQ199_RS04595 -BKB95_RS03955 BKB93_RS03940 -BKB95_RS03955 G9768_RS03900 -BKB95_RS03955 gnl|Prokka|PADJNBJD_00767 -BKB95_RS03955 L3404_RS03875 -BKB95_RS03955 NILJEPDF_00768 -BKB95_RS03955 BKC02_RS03935 -BKB95_RS03955 LJHENM_03865 -BKB95_RS03955 AOT15_RS04700 -BKB95_RS03955 AP288_RS02270 -BKB95_RS03955 JIEJKO_03865 -BKB95_RS03955 QSDFRQ_00768 -BKB95_RS03955 AQ244_RS04010 -BKB95_RS03955 BKC01_RS03940 -BKB95_RS03955 CTRC943_RS03885 -BKB95_RS03955 AKW53_RS00640 -BKB95_RS03955 BKC03_RS03935 -BKB95_RS03955 CBP48_RS00505 -BKB95_RS03955 CTJTET1_RS03920 -BKB95_RS03955 KW39_RS03915 -BKB95_RS03955 DU10_RS03950 -BKB95_RS03955 A5291_RS03945 -BKB95_RS03955 SOTONK1_RS03900 -BKB95_RS03955 IaCS19096_RS03895 -BKB95_RS03955 AQ193_RS00090 -BKB95_RS03955 DU13_RS03950 -BKB95_RS03955 C15_RS0104005 -BKB95_RS03955 ECS88FINAL_RS0104010 -BKB95_RS03955 O169_RS03910 -BKB95_RS03955 KW36_RS03900 -BKB95_RS04320 BKB95_RS04320 -BKB95_RS04320 CBP42_RS00870 -BKB95_RS04320 CTL2C_RS00860 -BKB95_RS04320 L1224_RS04240 -BKB95_RS04320 AQ244_RS02495 -BKB95_RS04320 BKB96_RS04305 -BKB95_RS04320 L1440_RS04235 -BKB95_RS04320 BKB99_RS04300 -BKB95_RS04320 SW2_RS04270 -BKB95_RS04320 ECS102511_RS04260 -BKB95_RS04320 CBP44_RS00870 -BKB95_RS04320 CTB_RS04295 -BKB95_RS04320 L2BUCH2_RS04240 -BKB95_RS04320 SOTONIA3_RS04280 -BKB95_RS04320 BKB92_RS04300 -BKB95_RS04320 CTO_RS04290 -BKB95_RS04320 AP288_RS02565 -BKB95_RS04320 BBV13_RS04305 -BKB95_RS04320 E150_RS04270 -BKB95_RS04320 L2BLST_RS04240 -BKB95_RS04320 119975 -BKB95_RS04320 FCS84708_RS04260 -BKB95_RS04320 AQ199_RS00190 -BKB95_RS04320 BBV16_RS04310 -BKB95_RS04320 7618734 -BKB95_RS04320 BW688_RS00870 -BKB95_RS04320 G9768_RS04265 -BKB95_RS04320 L3404_RS04235 -BKB95_RS04320 BKB93_RS04305 -BKB95_RS04320 BKC02_RS04300 -BKB95_RS04320 AKW53_RS00980 -BKB95_RS04320 BKC01_RS04305 -BKB95_RS04320 CTRC943_RS04245 -BKB95_RS04320 AOT15_RS01845 -BKB95_RS04320 CTJTET1_RS04435 -BKB95_RS04320 BKC03_RS04300 -BKB95_RS04320 CBP48_RS00870 -BKB95_RS04320 A5291_RS04300 -BKB95_RS04320 KW39_RS04280 -BKB95_RS04320 SOTONK1_RS04265 -BKB95_RS04320 ECS88FINAL_RS01000000104995 -BKB95_RS04320 IaCS19096_RS04255 -BKB95_RS04320 DU10_RS04315 -BKB95_RS04320 C15_RS01000000104970 -BKB95_RS04320 DU13_RS04315 -BKB95_RS04320 O169_RS04275 -BKB95_RS04320 KW36_RS04260 -BKB95_RS04320 AQ193_RS04510 -BKB95_RS04830 BKB95_RS04830 -BKB95_RS04830 AQ244_RS01995 -BKB95_RS04830 BKB96_RS04815 -BKB95_RS04830 BKB99_RS04810 -BKB95_RS04830 SW2_RS04765 -BKB95_RS04830 SOTONIA3_RS04770 -BKB95_RS04830 AP288_RS03065 -BKB95_RS04830 gnl|Prokka|PADJNBJD_00933 -BKB95_RS04830 E150_RS04770 -BKB95_RS04830 NILJEPDF_00934 -BKB95_RS04830 AQ199_RS00690 -BKB95_RS04830 JIEJKO_04695 -BKB95_RS04830 119910 -BKB95_RS04830 QSDFRQ_00934 -BKB95_RS04830 AOT15_RS00960 -BKB95_RS04830 G9768_RS04755 -BKB95_RS04830 BKC02_RS04810 -BKB95_RS04830 AKW53_RS01480 -BKB95_RS04830 BKC01_RS04815 -BKB95_RS04830 CTJTET1_RS04925 -BKB95_RS04830 BKC03_RS04810 -BKB95_RS04830 SOTONK1_RS04755 -BKB95_RS04830 IaCS19096_RS04750 -BKB95_RS04830 C15_RS0104880 -BKB95_RS04830 KW36_RS04755 -BKB95_RS04830 AQ193_RS04010 -BKB96_RS00340 BKB96_RS00340 -BKB96_RS00340 L1224_RS00335 -BKB96_RS00340 BKB99_RS00340 -BKB96_RS00340 CTO_RS00335 -BKB96_RS00340 L1440_RS00335 -BKB96_RS00340 BKB92_RS00340 -BKB96_RS00340 SOTONIA3_RS00335 -BKB96_RS00340 CBP44_RS01735 -BKB96_RS00340 119258 -BKB96_RS00340 E150_RS00335 -BKB96_RS00340 L2BUCH2_RS00335 -BKB96_RS00340 BKB93_RS00340 -BKB96_RS00340 FCS84708_RS00335 -BKB96_RS00340 AP288_RS03405 -BKB96_RS00340 BBV13_RS00340 -BKB96_RS00340 AQ199_RS01030 -BKB96_RS00340 BW688_RS01730 -BKB96_RS00340 G9768_RS00335 -BKB96_RS00340 L2BLST_RS00335 -BKB96_RS00340 AOT15_RS00620 -BKB96_RS00340 BKC02_RS00340 -BKB96_RS00340 BBV16_RS00340 -BKB96_RS00340 gnl|Prokka|PADJNBJD_00066 -BKB96_RS00340 NILJEPDF_00066 -BKB96_RS00340 LJHENM_00335 -BKB96_RS00340 A5291_RS00335 -BKB96_RS00340 BKC01_RS00340 -BKB96_RS00340 SOTONK1_RS00335 -BKB96_RS00340 L3404_RS00335 -BKB96_RS00340 JIEJKO_00335 -BKB96_RS00340 AKW53_RS01825 -BKB96_RS00340 QSDFRQ_00066 -BKB96_RS00340 IaCS19096_RS00335 -BKB96_RS00340 BKC03_RS00340 -BKB96_RS00340 C15_RS0100340 -BKB96_RS00340 DU10_RS00340 -BKB96_RS00340 7618389 -BKB96_RS00340 CTRC943_RS00335 -BKB96_RS00340 CTJTET1_RS00335 -BKB96_RS00340 O169_RS00335 -BKB96_RS00340 KW36_RS00335 -BKB96_RS00340 DU13_RS00345 -BKB96_RS00340 CBP48_RS01730 -BKB96_RS00340 ECS88FINAL_RS0100350 -BKB96_RS00340 KW39_RS00335 -BKB96_RS00340 BKB95_RS00340 -BKB96_RS00340 SW2_RS00335 -BKB96_RS00340 ECS102511_RS00335 -BKB96_RS00340 CTB_RS00335 -BKB96_RS00340 CTL2C_RS01700 -BKB96_RS00340 AQ193_RS03660 -BKB96_RS00340 AQ244_RS01655 -BKB96_RS00340 CBP42_RS01730 -BKB96_RS02230 BKB96_RS02230 -BKB96_RS02230 BKB99_RS02225 -BKB96_RS02230 CBP48_RS03630 -BKB96_RS02230 CTL2C_RS03565 -BKB96_RS02230 KW36_RS02210 -BKB96_RS02230 AOT15_RS03210 -BKB96_RS02230 BKB95_RS02245 -BKB96_RS02230 119536 -BKB96_RS02230 L1224_RS02195 -BKB96_RS02230 SW2_RS02220 -BKB96_RS02230 ECS102511_RS02215 -BKB96_RS02230 L1440_RS02195 -BKB96_RS02230 CBP42_RS03640 -BKB96_RS02230 CTB_RS02245 -BKB96_RS02230 L2BUCH2_RS02190 -BKB96_RS02230 BKB92_RS02235 -BKB96_RS02230 SOTONIA3_RS02230 -BKB96_RS02230 CTO_RS02245 -BKB96_RS02230 E150_RS02220 -BKB96_RS02230 AP288_RS00865 -BKB96_RS02230 BW688_RS03625 -BKB96_RS02230 L2BLST_RS02195 -BKB96_RS02230 FCS84708_RS02210 -BKB96_RS02230 BBV13_RS02250 -BKB96_RS02230 CBP44_RS03635 -BKB96_RS02230 BKB93_RS02240 -BKB96_RS02230 AQ199_RS02910 -BKB96_RS02230 G9768_RS02215 -BKB96_RS02230 AQ244_RS00895 -BKB96_RS02230 BBV16_RS02255 -BKB96_RS02230 L3404_RS02190 -BKB96_RS02230 BKC02_RS02225 -BKB96_RS02230 BKC01_RS02225 -BKB96_RS02230 AKW53_RS03715 -BKB96_RS02230 gnl|Prokka|PADJNBJD_00437 -BKB96_RS02230 NILJEPDF_00437 -BKB96_RS02230 CTRC943_RS02195 -BKB96_RS02230 LJHENM_02205 -BKB96_RS02230 JIEJKO_02200 -BKB96_RS02230 BKC03_RS02225 -BKB96_RS02230 CTJTET1_RS02225 -BKB96_RS02230 AQ193_RS01770 -BKB96_RS02230 QSDFRQ_00437 -BKB96_RS02230 C15_RS0102260 -BKB96_RS02230 SOTONK1_RS02215 -BKB96_RS02230 DU10_RS02250 -BKB96_RS02230 A5291_RS02245 -BKB96_RS02230 KW39_RS02225 -BKB96_RS02230 IaCS19096_RS02210 -BKB96_RS02230 ECS88FINAL_RS0102260 -BKB96_RS02230 O169_RS02225 -BKB96_RS02230 DU13_RS02245 -BKB96_RS02230 7618564 -BKB96_RS02395 BKB96_RS02395 -BKB96_RS02395 BKB99_RS02390 -BKB96_RS02395 CBP48_RS03795 -BKB96_RS02395 120281 -BKB96_RS02395 CTL2C_RS03725 -BKB96_RS02395 KW36_RS02370 -BKB96_RS02395 AOT15_RS03370 -BKB96_RS02395 BKB95_RS02410 -BKB96_RS02395 L1224_RS02355 -BKB96_RS02395 SW2_RS02380 -BKB96_RS02395 ECS102511_RS02375 -BKB96_RS02395 L1440_RS02355 -BKB96_RS02395 CBP42_RS03805 -BKB96_RS02395 CTB_RS02405 -BKB96_RS02395 L2BUCH2_RS02350 -BKB96_RS02395 BKB92_RS02400 -BKB96_RS02395 SOTONIA3_RS02390 -BKB96_RS02395 CTO_RS02405 -BKB96_RS02395 E150_RS02380 -BKB96_RS02395 AP288_RS00705 -BKB96_RS02395 BW688_RS03790 -BKB96_RS02395 L2BLST_RS02355 -BKB96_RS02395 FCS84708_RS02370 -BKB96_RS02395 BBV13_RS02410 -BKB96_RS02395 CBP44_RS03800 -BKB96_RS02395 BKB93_RS02405 -BKB96_RS02395 AQ199_RS03070 -BKB96_RS02395 G9768_RS02375 -BKB96_RS02395 AQ244_RS00735 -BKB96_RS02395 BBV16_RS02415 -BKB96_RS02395 L3404_RS02350 -BKB96_RS02395 BKC02_RS02390 -BKB96_RS02395 AKW53_RS03875 -BKB96_RS02395 BKC01_RS02390 -BKB96_RS02395 gnl|Prokka|PADJNBJD_00469 -BKB96_RS02395 NILJEPDF_00469 -BKB96_RS02395 LJHENM_02365 -BKB96_RS02395 CTRC943_RS02355 -BKB96_RS02395 JIEJKO_02365 -BKB96_RS02395 BKC03_RS02390 -BKB96_RS02395 QSDFRQ_00469 -BKB96_RS02395 CTJTET1_RS02385 -BKB96_RS02395 AQ193_RS01610 -BKB96_RS02395 C15_RS0102425 -BKB96_RS02395 SOTONK1_RS02375 -BKB96_RS02395 DU10_RS02415 -BKB96_RS02395 A5291_RS02405 -BKB96_RS02395 KW39_RS02385 -BKB96_RS02395 IaCS19096_RS02370 -BKB96_RS02395 ECS88FINAL_RS0102425 -BKB96_RS02395 O169_RS02385 -BKB96_RS02395 DU13_RS02410 -BKB96_RS02395 7619010 -BKB96_RS03240 BKB96_RS03240 -BKB96_RS03240 BKB99_RS03235 -BKB96_RS03240 CBP42_RS04635 -BKB96_RS03240 L2BUCH2_RS03175 -BKB96_RS03240 BKB92_RS03230 -BKB96_RS03240 CTB_RS03240 -BKB96_RS03240 E150_RS03205 -BKB96_RS03240 SOTONIA3_RS03220 -BKB96_RS03240 BW688_RS04625 -BKB96_RS03240 CTO_RS03235 -BKB96_RS03240 FCS84708_RS03200 -BKB96_RS03240 L2BLST_RS03175 -BKB96_RS03240 BBV13_RS03240 -BKB96_RS03240 CBP44_RS04630 -BKB96_RS03240 119656 -BKB96_RS03240 AQ199_RS03900 -BKB96_RS03240 BKB93_RS03235 -BKB96_RS03240 BBV16_RS03250 -BKB96_RS03240 G9768_RS03200 -BKB96_RS03240 L3404_RS03170 -BKB96_RS03240 gnl|Prokka|PADJNBJD_00629 -BKB96_RS03240 AP288_RS01570 -BKB96_RS03240 BKC02_RS03230 -BKB96_RS03240 NILJEPDF_00630 -BKB96_RS03240 LJHENM_03165 -BKB96_RS03240 AOT15_RS04000 -BKB96_RS03240 CTRC943_RS03175 -BKB96_RS03240 JIEJKO_03170 -BKB96_RS03240 BKC01_RS03230 -BKB96_RS03240 QSDFRQ_00630 -BKB96_RS03240 AQ244_RS04715 -BKB96_RS03240 KW39_RS03215 -BKB96_RS03240 BKC03_RS03230 -BKB96_RS03240 CTJTET1_RS03215 -BKB96_RS03240 ECS88FINAL_RS0103265 -BKB96_RS03240 DU10_RS03245 -BKB96_RS03240 SOTONK1_RS03200 -BKB96_RS03240 O169_RS03210 -BKB96_RS03240 IaCS19096_RS03195 -BKB96_RS03240 C15_RS0103265 -BKB96_RS03240 A5291_RS03240 -BKB96_RS03240 DU13_RS03240 -BKB96_RS03240 CTL2C_RS04545 -BKB96_RS03240 AKW53_RS04425 -BKB96_RS03240 CBP48_RS04630 -BKB96_RS03240 7618642 -BKB96_RS03240 SW2_RS03205 -BKB96_RS03240 L1224_RS03175 -BKB96_RS03240 KW36_RS03200 -BKB96_RS03240 ECS102511_RS03200 -BKB96_RS03240 L1440_RS03175 -BKB96_RS03240 AQ193_RS00785 -BKB96_RS03240 BKB95_RS03245 -BKB99_RS00665 BKB99_RS00665 -BKB99_RS00665 L1440_RS00655 -BKB99_RS00665 BKB92_RS00665 -BKB99_RS00665 CTO_RS00660 -BKB99_RS00665 SOTONIA3_RS00655 -BKB99_RS00665 AQ193_RS03340 -BKB99_RS00665 E150_RS00655 -BKB99_RS00665 L2BUCH2_RS00655 -BKB99_RS00665 CBP44_RS02060 -BKB99_RS00665 FCS84708_RS00655 -BKB99_RS00665 AP288_RS03725 -BKB99_RS00665 BKB93_RS00665 -BKB99_RS00665 120571 -BKB99_RS00665 AQ199_RS01350 -BKB99_RS00665 BBV13_RS00665 -BKB99_RS00665 G9768_RS00655 -BKB99_RS00665 L2BLST_RS00655 -BKB99_RS00665 BW688_RS02055 -BKB99_RS00665 BBV16_RS00665 -BKB99_RS00665 BKC02_RS00665 -BKB99_RS00665 gnl|Prokka|PADJNBJD_00129 -BKB99_RS00665 LJHENM_00645 -BKB99_RS00665 AKW53_RS02150 -BKB99_RS00665 AOT15_RS00300 -BKB99_RS00665 BKC01_RS00665 -BKB99_RS00665 NILJEPDF_00129 -BKB99_RS00665 A5291_RS00660 -BKB99_RS00665 L3404_RS00655 -BKB99_RS00665 SOTONK1_RS00655 -BKB99_RS00665 JIEJKO_00650 -BKB99_RS00665 QSDFRQ_00129 -BKB99_RS00665 IaCS19096_RS00655 -BKB99_RS00665 BKC03_RS00665 -BKB99_RS00665 C15_RS0100680 -BKB99_RS00665 CTRC943_RS00655 -BKB99_RS00665 CTJTET1_RS00655 -BKB99_RS00665 KW39_RS00655 -BKB99_RS00665 DU10_RS00665 -BKB99_RS00665 ECS88FINAL_RS0100680 -BKB99_RS00665 O169_RS00655 -BKB99_RS00665 DU13_RS00670 -BKB99_RS00665 7618839 -BKB99_RS00665 KW36_RS00655 -BKB99_RS00665 CBP48_RS02055 -BKB99_RS00665 SW2_RS00655 -BKB99_RS00665 BKB95_RS00665 -BKB99_RS00665 ECS102511_RS00655 -BKB99_RS00665 CTL2C_RS02020 -BKB99_RS00665 CTB_RS00660 -BKB99_RS00665 L1224_RS00655 -BKB99_RS00665 AQ244_RS02830 -BKB99_RS00665 BKB96_RS00665 -BKB99_RS00665 CBP42_RS02055 -BKB99_RS01715 BKB99_RS01715 -BKB99_RS01715 L1224_RS01690 F -BKB99_RS01715 SW2_RS01715 F -BKB99_RS01715 ECS102511_RS01715 F -BKB99_RS01715 L1440_RS01690 F -BKB99_RS01715 CBP42_RS03115 F -BKB99_RS01715 L2BUCH2_RS01695 F -BKB99_RS01715 E150_RS01720 F -BKB99_RS01715 FCS84708_RS01710 F -BKB99_RS01715 L2BLST_RS01695 F -BKB99_RS01715 BW688_RS03115 F -BKB99_RS01715 CBP44_RS03120 F -BKB99_RS01715 AP288_RS01365 F -BKB99_RS01715 AQ199_RS02410 F -BKB99_RS01715 L3404_RS01690 F -BKB99_RS01715 AKW53_RS03215 F -BKB99_RS01715 LJHENM_01700 F -BKB99_RS01715 KW39_RS01725 F -BKB99_RS01715 ECS88FINAL_RS0101745 F -BKB99_RS01715 AQ193_RS02270 F -BKB99_RS01715 O169_RS01725 F -BKB99_RS01715 CTL2C_RS03060 F -BKB99_RS01715 CBP48_RS03115 F -BKB99_RS01715 ECS102511_RS01710 F -BKB99_RS01715 E150_RS01715 F -BKB99_RS01715 FCS84708_RS01705 F -BKB99_RS01715 AQ199_RS02405 F -BKB99_RS01715 AP288_RS01370 F -BKB99_RS01715 AKW53_RS03210 F -BKB99_RS01715 LJHENM_01695 F -BKB99_RS01715 KW39_RS01720 F -BKB99_RS01715 ECS88FINAL_RS0101740 F -BKB99_RS01715 O169_RS01720 F -BKB99_RS01715 AQ193_RS02275 F -BKB99_RS01715 SW2_RS01710 F -BKB99_RS01715 SOTONIA3_RS01725 -BKB99_RS01715 BKC02_RS01715 -BKB99_RS01715 gnl|Prokka|PADJNBJD_00337 -BKB99_RS01715 NILJEPDF_00337 -BKB99_RS01715 BKC03_RS01715 -BKB99_RS01715 JIEJKO_01695 -BKB99_RS01715 DU10_RS01735 -BKB99_RS01715 SOTONK1_RS01715 -BKB99_RS01715 QSDFRQ_00337 -BKB99_RS01715 IaCS19096_RS01710 -BKB99_RS01715 120377 -BKB99_RS01715 DU13_RS01730 -BKB99_RS01715 BKB95_RS01730 -BKB99_RS01715 KW36_RS01710 -BKB99_RS01715 AOT15_RS02710 -BKB99_RS01715 BKB96_RS01715 -BKB99_RS01715 BBV13_RS01745 -BKB99_RS01715 CTB_RS01740 -BKB99_RS01715 CTO_RS01740 -BKB99_RS01715 G9768_RS01715 -BKB99_RS01715 BBV16_RS01745 -BKB99_RS01715 CTRC943_RS01695 -BKB99_RS01715 CTJTET1_RS01725 -BKB99_RS01715 C15_RS0101755 -BKB99_RS01715 A5291_RS01740 -BKB99_RS01715 CBP42_RS03105 F -BKB99_RS01715 CBP44_RS03110 F -BKB99_RS01715 CBP48_RS03105 F -BKB99_RS01715 CBP42_RS03110 F -BKB99_RS01715 CBP44_RS03115 F -BKB99_RS01715 CBP48_RS03110 F -BKB99_RS01715 AQ244_RS05155 F -BKB92_RS00835 BKB92_RS00835 -BKB92_RS00835 CTO_RS00830 -BKB92_RS00835 SOTONIA3_RS00830 -BKB92_RS00835 CBP42_RS02235 -BKB92_RS00835 E150_RS00825 -BKB92_RS00835 AQ193_RS03170 -BKB92_RS00835 FCS84708_RS00825 -BKB92_RS00835 AP288_RS03895 -BKB92_RS00835 BKB93_RS00835 -BKB92_RS00835 CBP44_RS02240 -BKB92_RS00835 AQ199_RS01520 -BKB92_RS00835 BBV13_RS00835 -BKB92_RS00835 G9768_RS00830 -BKB92_RS00835 120547 -BKB92_RS00835 BKC02_RS00835 -BKB92_RS00835 BBV16_RS00835 -BKB92_RS00835 AKW53_RS02320 -BKB92_RS00835 BKC01_RS00835 -BKB92_RS00835 gnl|Prokka|PADJNBJD_00163 -BKB92_RS00835 AOT15_RS00130 -BKB92_RS00835 NILJEPDF_00163 -BKB92_RS00835 LJHENM_00820 -BKB92_RS00835 A5291_RS00830 -BKB92_RS00835 SOTONK1_RS00825 -BKB92_RS00835 JIEJKO_00820 -BKB92_RS00835 CTJTET1_RS00830 -BKB92_RS00835 BKC03_RS00835 -BKB92_RS00835 QSDFRQ_00163 -BKB92_RS00835 C15_RS0100855 -BKB92_RS00835 ECS88FINAL_RS0100850 -BKB92_RS00835 IaCS19096_RS00825 -BKB92_RS00835 O169_RS00825 -BKB92_RS00835 DU10_RS00840 -BKB92_RS00835 DU13_RS00840 -BKB92_RS00835 KW36_RS00825 -BKB92_RS00835 BKB95_RS00840 -BKB92_RS00835 SW2_RS00825 -BKB92_RS00835 ECS102511_RS00825 -BKB92_RS00835 CBP48_RS02235 -BKB92_RS00835 BKB96_RS00835 -BKB92_RS00835 BKB99_RS00835 -BKB92_RS00835 CTB_RS00830 -BKB92_RS00835 AQ244_RS03000 -BKB92_RS03895 BKB92_RS03895 -BKB92_RS03895 CTB_RS03900 -BKB92_RS03895 SOTONIA3_RS03880 -BKB92_RS03895 E150_RS03865 -BKB92_RS03895 CTO_RS03895 -BKB92_RS03895 AQ193_RS00130 -BKB92_RS03895 BBV13_RS03900 -BKB92_RS03895 FCS84708_RS03855 -BKB92_RS03895 7618694 -BKB92_RS03895 L2BLST_RS03840 -BKB92_RS03895 BBV16_RS03910 -BKB92_RS03895 120037 -BKB92_RS03895 BW688_RS00465 -BKB92_RS03895 AQ199_RS04555 -BKB92_RS03895 BKB93_RS03900 -BKB92_RS03895 G9768_RS03860 -BKB92_RS03895 gnl|Prokka|PADJNBJD_00759 -BKB92_RS03895 L3404_RS03835 -BKB92_RS03895 NILJEPDF_00760 -BKB92_RS03895 BKC02_RS03895 -BKB92_RS03895 LJHENM_03825 -BKB92_RS03895 AOT15_RS04660 -BKB92_RS03895 AP288_RS02230 -BKB92_RS03895 JIEJKO_03825 -BKB92_RS03895 QSDFRQ_00760 -BKB92_RS03895 BKC01_RS03900 -BKB92_RS03895 CTRC943_RS03845 -BKB92_RS03895 AKW53_RS00600 -BKB92_RS03895 BKC03_RS03895 -BKB92_RS03895 CBP48_RS00465 -BKB92_RS03895 CTJTET1_RS03880 -BKB92_RS03895 KW39_RS03875 -BKB92_RS03895 DU10_RS03910 -BKB92_RS03895 A5291_RS03905 -BKB92_RS03895 SOTONK1_RS03860 -BKB92_RS03895 IaCS19096_RS03855 -BKB92_RS03895 DU13_RS03910 -BKB92_RS03895 C15_RS0103965 -BKB92_RS03895 ECS88FINAL_RS0103965 -BKB92_RS03895 O169_RS03870 -BKB92_RS03895 KW36_RS03860 -BKB92_RS03895 BKB95_RS03915 -BKB92_RS03895 CBP42_RS00465 -BKB92_RS03895 CTL2C_RS00460 -BKB92_RS03895 L1224_RS03840 -BKB92_RS03895 SW2_RS03865 -BKB92_RS03895 L1440_RS03835 -BKB92_RS03895 ECS102511_RS03855 -BKB92_RS03895 BKB96_RS03900 -BKB92_RS03895 BKB99_RS03895 -BKB92_RS03895 AQ244_RS04050 -BKB92_RS03895 CBP44_RS00465 -BKB92_RS03895 L2BUCH2_RS03840 -BKB93_RS00120 BKB93_RS00120 -BKB93_RS00120 FCS84708_RS00115 -BKB93_RS00120 AP288_RS03185 -BKB93_RS00120 BBV13_RS00120 -BKB93_RS00120 G9768_RS00115 -BKB93_RS00120 AQ199_RS00810 -BKB93_RS00120 BW688_RS01510 -BKB93_RS00120 L2BLST_RS00115 -BKB93_RS00120 BKC02_RS00120 -BKB93_RS00120 AQ193_RS03890 -BKB93_RS00120 BBV16_RS00120 -BKB93_RS00120 BKC01_RS00120 -BKB93_RS00120 gnl|Prokka|PADJNBJD_00024 -BKB93_RS00120 LJHENM_00120 -BKB93_RS00120 A5291_RS00115 -BKB93_RS00120 SOTONK1_RS00115 -BKB93_RS00120 AQ244_RS01875 -BKB93_RS00120 JIEJKO_00115 -BKB93_RS00120 7618363 -BKB93_RS00120 NILJEPDF_00024 -BKB93_RS00120 L3404_RS00115 -BKB93_RS00120 IaCS19096_RS00115 -BKB93_RS00120 BKC03_RS00120 -BKB93_RS00120 C15_RS0100115 -BKB93_RS00120 AKW53_RS01600 -BKB93_RS00120 QSDFRQ_00024 -BKB93_RS00120 CTJTET1_RS00115 -BKB93_RS00120 DU10_RS00120 -BKB93_RS00120 CTRC943_RS00115 -BKB93_RS00120 O169_RS00115 -BKB93_RS00120 CBP48_RS01510 -BKB93_RS00120 ECS88FINAL_RS0100120 -BKB93_RS00120 DU13_RS00120 -BKB93_RS00120 KW39_RS00115 -BKB93_RS00120 KW36_RS00115 -BKB93_RS00120 BKB95_RS00120 -BKB93_RS00120 SW2_RS00115 -BKB93_RS00120 ECS102511_RS00115 -BKB93_RS00120 CTB_RS00115 -BKB93_RS00120 CTL2C_RS01480 -BKB93_RS00120 CBP42_RS01510 -BKB93_RS00120 L1224_RS00115 -BKB93_RS00120 AOT15_RS00840 -BKB93_RS00120 BKB96_RS00120 -BKB93_RS00120 BKB99_RS00120 -BKB93_RS00120 CTO_RS00115 -BKB93_RS00120 SOTONIA3_RS00115 -BKB93_RS00120 L1440_RS00115 -BKB93_RS00120 BKB92_RS00120 -BKB93_RS00120 119217 -BKB93_RS00120 CBP44_RS01515 -BKB93_RS00120 E150_RS00115 -BKB93_RS00120 L2BUCH2_RS00115 -BKB93_RS01490 BKB93_RS01490 -BKB93_RS01490 CBP44_RS02880 -BKB93_RS01490 AQ199_RS02170 -BKB93_RS01490 L2BLST_RS01465 -BKB93_RS01490 BBV13_RS01515 -BKB93_RS01490 BW688_RS02885 -BKB93_RS01490 G9768_RS01485 -BKB93_RS01490 BKC02_RS01485 -BKB93_RS01490 AKW53_RS02975 -BKB93_RS01490 BBV16_RS01515 -BKB93_RS01490 L3404_RS01460 -BKB93_RS01490 BKC01_RS01490 -BKB93_RS01490 gnl|Prokka|PADJNBJD_00291 -BKB93_RS01490 AQ193_RS02510 -BKB93_RS01490 DU10_RS01495 -BKB93_RS01490 NILJEPDF_00291 -BKB93_RS01490 LJHENM_01465 -BKB93_RS01490 BKC03_RS01485 -BKB93_RS01490 CTRC943_RS01465 -BKB93_RS01490 CTJTET1_RS01495 -BKB93_RS01490 KW39_RS01485 -BKB93_RS01490 JIEJKO_01465 -BKB93_RS01490 C15_RS0101520 -BKB93_RS01490 SOTONK1_RS01485 -BKB93_RS01490 ECS88FINAL_RS0101505 -BKB93_RS01490 120445 -BKB93_RS01490 QSDFRQ_00291 -BKB93_RS01490 IaCS19096_RS01480 -BKB93_RS01490 A5291_RS01510 -BKB93_RS01490 O169_RS01490 -BKB93_RS01490 DU13_RS01495 -BKB93_RS01490 SW2_RS01475 -BKB93_RS01490 BKB95_RS01500 -BKB93_RS01490 CBP48_RS02875 -BKB93_RS01490 7618914 -BKB93_RS01490 KW36_RS01480 -BKB93_RS01490 ECS102511_RS01475 -BKB93_RS01490 AOT15_RS02480 -BKB93_RS01490 BKB96_RS01485 -BKB93_RS01490 CTL2C_RS02830 -BKB93_RS01490 BKB99_RS01485 -BKB93_RS01490 L1224_RS01460 -BKB93_RS01490 L1440_RS01460 -BKB93_RS01490 AQ244_RS03665 -BKB93_RS01490 CBP42_RS02875 -BKB93_RS01490 SOTONIA3_RS01495 -BKB93_RS01490 BKB92_RS01490 -BKB93_RS01490 CTB_RS01510 -BKB93_RS01490 E150_RS01480 -BKB93_RS01490 L2BUCH2_RS01465 -BKB93_RS01490 CTO_RS01505 -BKB93_RS01490 FCS84708_RS01475 -BKB93_RS01490 AP288_RS04545 -BKB93_RS01650 BKB93_RS01650 -BKB93_RS01650 L2BLST_RS01625 -BKB93_RS01650 AQ199_RS02330 -BKB93_RS01650 BW688_RS03045 -BKB93_RS01650 BBV13_RS01675 -BKB93_RS01650 G9768_RS01645 -BKB93_RS01650 BKC02_RS01645 -BKB93_RS01650 L3404_RS01620 -BKB93_RS01650 AKW53_RS03135 -BKB93_RS01650 BBV16_RS01675 -BKB93_RS01650 BKC01_RS01650 -BKB93_RS01650 gnl|Prokka|PADJNBJD_00323 -BKB93_RS01650 AQ193_RS02350 -BKB93_RS01650 NILJEPDF_00323 -BKB93_RS01650 LJHENM_01625 -BKB93_RS01650 CTRC943_RS01625 -BKB93_RS01650 BKC03_RS01645 -BKB93_RS01650 DU10_RS01660 -BKB93_RS01650 CTJTET1_RS01655 -BKB93_RS01650 KW39_RS01645 -BKB93_RS01650 JIEJKO_01625 -BKB93_RS01650 C15_RS0101685 -BKB93_RS01650 SOTONK1_RS01645 -BKB93_RS01650 ECS88FINAL_RS0101665 -BKB93_RS01650 QSDFRQ_00323 -BKB93_RS01650 IaCS19096_RS01640 -BKB93_RS01650 120395 -BKB93_RS01650 A5291_RS01670 -BKB93_RS01650 O169_RS01650 -BKB93_RS01650 DU13_RS01655 -BKB93_RS01650 CBP48_RS03035 -BKB93_RS01650 7618939 -BKB93_RS01650 SW2_RS01635 -BKB93_RS01650 BKB95_RS01660 -BKB93_RS01650 CTL2C_RS02990 -BKB93_RS01650 KW36_RS01640 -BKB93_RS01650 ECS102511_RS01635 -BKB93_RS01650 AOT15_RS02640 -BKB93_RS01650 BKB96_RS01645 -BKB93_RS01650 L1224_RS01620 -BKB93_RS01650 BKB99_RS01645 -BKB93_RS01650 L1440_RS01620 -BKB93_RS01650 CBP42_RS03035 -BKB93_RS01650 SOTONIA3_RS01655 -BKB93_RS01650 BKB92_RS01650 -BKB93_RS01650 CTB_RS01670 -BKB93_RS01650 E150_RS01640 -BKB93_RS01650 L2BUCH2_RS01625 -BKB93_RS01650 CTO_RS01665 -BKB93_RS01650 FCS84708_RS01635 -BKB93_RS01650 CBP44_RS03040 -BKB93_RS02330 BKB93_RS02330 -BKB93_RS02330 AQ244_RS00810 -BKB93_RS02330 AQ199_RS02995 -BKB93_RS02330 G9768_RS02300 -BKB93_RS02330 BBV16_RS02340 -BKB93_RS02330 L3404_RS02275 -BKB93_RS02330 BKC02_RS02315 -BKB93_RS02330 BKC01_RS02315 -BKB93_RS02330 gnl|Prokka|PADJNBJD_00454 -BKB93_RS02330 AKW53_RS03800 -BKB93_RS02330 NILJEPDF_00454 -BKB93_RS02330 LJHENM_02290 -BKB93_RS02330 CTRC943_RS02280 -BKB93_RS02330 AQ193_RS01685 -BKB93_RS02330 JIEJKO_02290 -BKB93_RS02330 BKC03_RS02315 -BKB93_RS02330 QSDFRQ_00454 -BKB93_RS02330 CTJTET1_RS02310 -BKB93_RS02330 C15_RS0102345 -BKB93_RS02330 SOTONK1_RS02300 -BKB93_RS02330 DU10_RS02340 -BKB93_RS02330 A5291_RS02330 -BKB93_RS02330 KW39_RS02310 -BKB93_RS02330 IaCS19096_RS02295 -BKB93_RS02330 ECS88FINAL_RS0102345 -BKB93_RS02330 O169_RS02310 -BKB93_RS02330 DU13_RS02335 -BKB93_RS02330 7619000 -BKB93_RS02330 BKB96_RS02320 -BKB93_RS02330 BKB99_RS02315 -BKB93_RS02330 CBP48_RS03720 -BKB93_RS02330 120297 -BKB93_RS02330 CTL2C_RS03650 -BKB93_RS02330 KW36_RS02295 -BKB93_RS02330 AOT15_RS03295 -BKB93_RS02330 BKB95_RS02335 -BKB93_RS02330 L1224_RS02280 -BKB93_RS02330 SW2_RS02305 -BKB93_RS02330 ECS102511_RS02300 -BKB93_RS02330 L1440_RS02280 -BKB93_RS02330 CBP42_RS03730 -BKB93_RS02330 CTB_RS02330 -BKB93_RS02330 L2BUCH2_RS02275 -BKB93_RS02330 BKB92_RS02325 -BKB93_RS02330 SOTONIA3_RS02315 -BKB93_RS02330 AP288_RS00780 -BKB93_RS02330 CTO_RS02330 -BKB93_RS02330 E150_RS02305 -BKB93_RS02330 BW688_RS03715 -BKB93_RS02330 L2BLST_RS02280 -BKB93_RS02330 FCS84708_RS02295 -BKB93_RS02330 BBV13_RS02335 -BKB93_RS02330 CBP44_RS03725 -BKB93_RS04220 BKB93_RS04220 -BKB93_RS04220 NILJEPDF_00822 -BKB93_RS04220 G9768_RS04180 -BKB93_RS04220 L3404_RS04155 -BKB93_RS04220 LJHENM_04135 -BKB93_RS04220 JIEJKO_04135 -BKB93_RS04220 BKC02_RS04215 -BKB93_RS04220 QSDFRQ_00822 -BKB93_RS04220 AKW53_RS00895 -BKB93_RS04220 BKC01_RS04220 -BKB93_RS04220 CTRC943_RS04165 -BKB93_RS04220 AOT15_RS01765 -BKB93_RS04220 CTJTET1_RS04355 -BKB93_RS04220 KW39_RS04195 -BKB93_RS04220 BKC03_RS04215 -BKB93_RS04220 CBP48_RS00785 -BKB93_RS04220 A5291_RS04220 -BKB93_RS04220 ECS88FINAL_RS0104265 -BKB93_RS04220 DU10_RS04230 -BKB93_RS04220 SOTONK1_RS04180 -BKB93_RS04220 IaCS19096_RS04175 -BKB93_RS04220 DU13_RS04230 -BKB93_RS04220 C15_RS0104290 -BKB93_RS04220 O169_RS04190 -BKB93_RS04220 KW36_RS04180 -BKB93_RS04220 AQ193_RS04595 -BKB93_RS04220 AQ244_RS02585 -BKB93_RS04220 BKB95_RS04235 -BKB93_RS04220 CBP42_RS00785 -BKB93_RS04220 CTL2C_RS00780 -BKB93_RS04220 L1224_RS04160 -BKB93_RS04220 BKB96_RS04220 -BKB93_RS04220 SW2_RS04185 -BKB93_RS04220 L1440_RS04155 -BKB93_RS04220 ECS102511_RS04175 -BKB93_RS04220 BKB99_RS04215 -BKB93_RS04220 CBP44_RS00785 -BKB93_RS04220 CTB_RS04215 -BKB93_RS04220 L2BUCH2_RS04160 -BKB93_RS04220 BKB92_RS04215 -BKB93_RS04220 SOTONIA3_RS04200 -BKB93_RS04220 CTO_RS04210 -BKB93_RS04220 AP288_RS02480 -BKB93_RS04220 E150_RS04185 -BKB93_RS04220 BBV13_RS04220 -BKB93_RS04220 119811 -BKB93_RS04220 FCS84708_RS04175 -BKB93_RS04220 AQ199_RS00105 -BKB93_RS04220 7618287 -BKB93_RS04220 L2BLST_RS04160 -BKB93_RS04220 BBV16_RS04230 -BKB93_RS04220 BW688_RS00785 -BKB93_RS04220 gnl|Prokka|PADJNBJD_00821 -BKB93_RS04385 BKB93_RS04385 -BKB93_RS04385 AKW53_RS01060 -BKB93_RS04385 ECS88FINAL_RS01000000105005 -BKB93_RS04385 DU10_RS04395 -BKB93_RS04385 DU13_RS04395 -BKB93_RS04385 O169_RS04355 -BKB93_RS04385 AQ193_RS04430 -BKB93_RS04385 SW2_RS04860 -BKB93_RS04385 ECS102511_RS04340 -BKB93_RS04385 BKB92_RS04380 -BKB93_RS04385 AP288_RS02645 -BKB93_RS04385 E150_RS04350 -BKB93_RS04385 FCS84708_RS04865 -BKB93_RS04385 AQ199_RS00270 -BKB93_RS04555 BKB93_RS04555 -BKB93_RS04555 BKC02_RS04545 -BKB93_RS04555 AKW53_RS01220 -BKB93_RS04555 BKC01_RS04550 -BKB93_RS04555 CTRC943_RS04480 -BKB93_RS04555 AOT15_RS02075 -BKB93_RS04555 CTJTET1_RS04665 -BKB93_RS04555 KW39_RS04515 -BKB93_RS04555 BKC03_RS04545 -BKB93_RS04555 CBP48_RS01120 -BKB93_RS04555 A5291_RS04530 -BKB93_RS04555 SOTONK1_RS04495 -BKB93_RS04555 ECS88FINAL_RS0104595 -BKB93_RS04555 IaCS19096_RS04490 -BKB93_RS04555 C15_RS0104615 -BKB93_RS04555 DU10_RS04565 -BKB93_RS04555 O169_RS04515 -BKB93_RS04555 KW36_RS04495 -BKB93_RS04555 DU13_RS04565 -BKB93_RS04555 BKB95_RS04565 -BKB93_RS04555 CBP42_RS01120 -BKB93_RS04555 CTL2C_RS01095 -BKB93_RS04555 L1224_RS04475 -BKB93_RS04555 BKB96_RS04550 -BKB93_RS04555 L1440_RS04470 -BKB93_RS04555 AQ193_RS04270 -BKB93_RS04555 BKB99_RS04545 -BKB93_RS04555 SW2_RS04505 -BKB93_RS04555 ECS102511_RS04500 -BKB93_RS04555 CBP44_RS01120 -BKB93_RS04555 CTB_RS04525 -BKB93_RS04555 L2BUCH2_RS04475 -BKB93_RS04555 SOTONIA3_RS04510 -BKB93_RS04555 CTO_RS04520 -BKB93_RS04555 BBV13_RS04535 -BKB93_RS04555 BKB92_RS04550 -BKB93_RS04555 AP288_RS02805 -BKB93_RS04555 BBV16_RS04540 -BKB93_RS04555 E150_RS04510 -BKB93_RS04555 L2BLST_RS04475 -BKB93_RS04555 gnl|Prokka|PADJNBJD_00882 -BKB93_RS04555 FCS84708_RS04495 -BKB93_RS04555 AQ199_RS00430 -BKB93_RS04555 BW688_RS01120 -BKB93_RS04555 119871 -BKB93_RS04555 NILJEPDF_00883 -BKB93_RS04555 7618327 -BKB93_RS04555 G9768_RS04495 -BKB93_RS04555 LJHENM_04445 -BKB93_RS04555 L3404_RS04470 -BKB93_RS04555 JIEJKO_04440 -BKB93_RS04555 QSDFRQ_00883 -BKB93_RS04725 BKB93_RS04725 -BKB93_RS04725 BKC02_RS04715 -BKB93_RS04725 CTRC943_RS04650 -BKB93_RS04725 AKW53_RS01390 -BKB93_RS04725 BKC01_RS04720 -BKB93_RS04725 AOT15_RS02245 -BKB93_RS04725 CTJTET1_RS04835 -BKB93_RS04725 CBP48_RS01295 -BKB93_RS04725 KW39_RS04685 -BKB93_RS04725 BKC03_RS04715 -BKB93_RS04725 SOTONK1_RS04665 -BKB93_RS04725 A5291_RS04695 -BKB93_RS04725 ECS88FINAL_RS0104765 -BKB93_RS04725 IaCS19096_RS04660 -BKB93_RS04725 C15_RS0104785 -BKB93_RS04725 DU10_RS04735 -BKB93_RS04725 O169_RS04685 -BKB93_RS04725 KW36_RS04665 -BKB93_RS04725 DU13_RS04735 -BKB93_RS04725 CTL2C_RS01265 -BKB93_RS04725 CBP42_RS01295 -BKB93_RS04725 L1224_RS04645 -BKB93_RS04725 BKB95_RS04735 -BKB93_RS04725 L1440_RS04640 -BKB93_RS04725 BKB96_RS04720 -BKB93_RS04725 AQ193_RS04100 -BKB93_RS04725 BKB99_RS04715 -BKB93_RS04725 SW2_RS04675 -BKB93_RS04725 ECS102511_RS04670 -BKB93_RS04725 AQ244_RS02085 -BKB93_RS04725 CBP44_RS01295 -BKB93_RS04725 L2BUCH2_RS04645 -BKB93_RS04725 CTB_RS04690 -BKB93_RS04725 SOTONIA3_RS04680 -BKB93_RS04725 AP288_RS02975 -BKB93_RS04725 BKB92_RS04720 -BKB93_RS04725 gnl|Prokka|PADJNBJD_00914 -BKB93_RS04725 CTO_RS04685 -BKB93_RS04725 L2BLST_RS04645 -BKB93_RS04725 BBV13_RS04705 -BKB93_RS04725 E150_RS04680 -BKB93_RS04725 BBV16_RS04710 -BKB93_RS04725 NILJEPDF_00915 -BKB93_RS04725 FCS84708_RS04665 -BKB93_RS04725 AQ199_RS00600 -BKB93_RS04725 BW688_RS01295 -BKB93_RS04725 119898 -BKB93_RS04725 JIEJKO_04600 -BKB93_RS04725 QSDFRQ_00915 -BKB93_RS04725 LJHENM_04610 -BKB93_RS04725 L3404_RS04640 -BKB93_RS04725 7618343 -BKB93_RS04725 G9768_RS04665 -BKC01_RS01280 BKC01_RS01280 -BKC01_RS01280 gnl|Prokka|PADJNBJD_00251 -BKC01_RS01280 DU10_RS01290 -BKC01_RS01280 NILJEPDF_00251 -BKC01_RS01280 LJHENM_01260 -BKC01_RS01280 BKC03_RS01280 -BKC01_RS01280 CTRC943_RS01265 -BKC01_RS01280 CTJTET1_RS01295 -BKC01_RS01280 KW39_RS01285 -BKC01_RS01280 JIEJKO_01260 -BKC01_RS01280 119405 -BKC01_RS01280 C15_RS0101315 -BKC01_RS01280 SOTONK1_RS01280 -BKC01_RS01280 ECS88FINAL_RS0101300 -BKC01_RS01280 QSDFRQ_00251 -BKC01_RS01280 A5291_RS01305 -BKC01_RS01280 IaCS19096_RS01280 -BKC01_RS01280 AOT15_RS01085 -BKC01_RS01280 O169_RS01285 -BKC01_RS01280 DU13_RS01290 -BKC01_RS01280 7618481 -BKC01_RS01280 SW2_RS01275 -BKC01_RS01280 BKB95_RS01295 -BKC01_RS01280 CBP48_RS02670 -BKC01_RS01280 KW36_RS01280 -BKC01_RS01280 ECS102511_RS01275 -BKC01_RS01280 BKB96_RS01280 -BKC01_RS01280 CTL2C_RS02630 -BKC01_RS01280 BKB99_RS01280 -BKC01_RS01280 L1224_RS01260 -BKC01_RS01280 L1440_RS01260 -BKC01_RS01280 AQ244_RS03460 -BKC01_RS01280 BKB92_RS01280 -BKC01_RS01280 CBP42_RS02670 -BKC01_RS01280 SOTONIA3_RS01295 -BKC01_RS01280 CTB_RS01305 -BKC01_RS01280 E150_RS01275 -BKC01_RS01280 AQ193_RS02715 -BKC01_RS01280 L2BUCH2_RS01265 -BKC01_RS01280 CTO_RS01305 -BKC01_RS01280 FCS84708_RS01275 -BKC01_RS01280 AP288_RS04345 -BKC01_RS01280 BKB93_RS01280 -BKC01_RS01280 CBP44_RS02675 -BKC01_RS01280 AQ199_RS01970 -BKC01_RS01280 L2BLST_RS01265 -BKC01_RS01280 BW688_RS02675 -BKC01_RS01280 BBV13_RS01310 -BKC01_RS01280 G9768_RS01285 -BKC01_RS01280 BKC02_RS01280 -BKC01_RS01280 L3404_RS01260 -BKC01_RS01280 AKW53_RS02770 -BKC01_RS01280 BBV16_RS01310 -BKC01_RS01445 BKC01_RS01445 -BKC01_RS01445 gnl|Prokka|PADJNBJD_00282 -BKC01_RS01445 DU10_RS01450 -BKC01_RS01445 NILJEPDF_00282 -BKC01_RS01445 LJHENM_01420 -BKC01_RS01445 BKC03_RS01440 -BKC01_RS01445 CTRC943_RS01420 -BKC01_RS01445 CTJTET1_RS01450 -BKC01_RS01445 KW39_RS01440 -BKC01_RS01445 JIEJKO_01420 -BKC01_RS01445 119427 -BKC01_RS01445 C15_RS0101475 -BKC01_RS01445 SOTONK1_RS01440 -BKC01_RS01445 ECS88FINAL_RS0101460 -BKC01_RS01445 QSDFRQ_00282 -BKC01_RS01445 IaCS19096_RS01435 -BKC01_RS01445 A5291_RS01465 -BKC01_RS01445 O169_RS01445 -BKC01_RS01445 DU13_RS01450 -BKC01_RS01445 7618495 -BKC01_RS01445 SW2_RS01430 -BKC01_RS01445 BKB95_RS01455 -BKC01_RS01445 CBP48_RS02830 -BKC01_RS01445 KW36_RS01435 -BKC01_RS01445 ECS102511_RS01430 -BKC01_RS01445 AOT15_RS02435 -BKC01_RS01445 BKB96_RS01440 -BKC01_RS01445 CTL2C_RS02785 -BKC01_RS01445 BKB99_RS01440 -BKC01_RS01445 L1224_RS01415 -BKC01_RS01445 L1440_RS01415 -BKC01_RS01445 AQ244_RS03620 -BKC01_RS01445 CBP42_RS02830 -BKC01_RS01445 SOTONIA3_RS01450 -BKC01_RS01445 BKB92_RS01445 -BKC01_RS01445 CTB_RS01465 -BKC01_RS01445 E150_RS01435 -BKC01_RS01445 AQ193_RS02555 -BKC01_RS01445 L2BUCH2_RS01420 -BKC01_RS01445 CTO_RS01460 -BKC01_RS01445 FCS84708_RS01430 -BKC01_RS01445 AP288_RS04500 -BKC01_RS01445 BKB93_RS01445 -BKC01_RS01445 CBP44_RS02835 -BKC01_RS01445 AQ199_RS02125 -BKC01_RS01445 L2BLST_RS01420 -BKC01_RS01445 BBV13_RS01470 -BKC01_RS01445 BW688_RS02840 -BKC01_RS01445 G9768_RS01440 -BKC01_RS01445 BKC02_RS01440 -BKC01_RS01445 AKW53_RS02930 -BKC01_RS01445 BBV16_RS01470 -BKC01_RS01445 L3404_RS01415 -BKC01_RS01605 BKC01_RS01605 -BKC01_RS01605 gnl|Prokka|PADJNBJD_00314 -BKC01_RS01605 NILJEPDF_00314 -BKC01_RS01605 LJHENM_01580 -BKC01_RS01605 CTRC943_RS01580 -BKC01_RS01605 BKC03_RS01600 -BKC01_RS01605 DU10_RS01615 -BKC01_RS01605 CTJTET1_RS01610 -BKC01_RS01605 KW39_RS01600 -BKC01_RS01605 JIEJKO_01580 -BKC01_RS01605 C15_RS0101640 -BKC01_RS01605 SOTONK1_RS01600 -BKC01_RS01605 ECS88FINAL_RS0101620 -BKC01_RS01605 120418 -BKC01_RS01605 QSDFRQ_00314 -BKC01_RS01605 IaCS19096_RS01595 -BKC01_RS01605 A5291_RS01625 -BKC01_RS01605 O169_RS01605 -BKC01_RS01605 DU13_RS01610 -BKC01_RS01605 CBP48_RS02990 -BKC01_RS01605 7618931 -BKC01_RS01605 SW2_RS01590 -BKC01_RS01605 BKB95_RS01615 -BKC01_RS01605 CTL2C_RS02945 -BKC01_RS01605 KW36_RS01595 -BKC01_RS01605 ECS102511_RS01590 -BKC01_RS01605 AOT15_RS02595 -BKC01_RS01605 BKB96_RS01600 -BKC01_RS01605 L1224_RS01575 -BKC01_RS01605 BKB99_RS01600 -BKC01_RS01605 L1440_RS01575 -BKC01_RS01605 CBP42_RS02990 -BKC01_RS01605 AQ244_RS03780 -BKC01_RS01605 SOTONIA3_RS01610 -BKC01_RS01605 BKB92_RS01605 -BKC01_RS01605 CTB_RS01625 -BKC01_RS01605 E150_RS01595 -BKC01_RS01605 L2BUCH2_RS01580 -BKC01_RS01605 AQ193_RS02395 -BKC01_RS01605 CTO_RS01620 -BKC01_RS01605 FCS84708_RS01590 -BKC01_RS01605 AP288_RS04660 -BKC01_RS01605 CBP44_RS02995 -BKC01_RS01605 BKB93_RS01605 -BKC01_RS01605 L2BLST_RS01580 -BKC01_RS01605 AQ199_RS02285 -BKC01_RS01605 BW688_RS03000 -BKC01_RS01605 BBV13_RS01630 -BKC01_RS01605 G9768_RS01600 -BKC01_RS01605 BKC02_RS01600 -BKC01_RS01605 L3404_RS01575 -BKC01_RS01605 AKW53_RS03090 -BKC01_RS01605 BBV16_RS01630 -BKC01_RS01785 BKC01_RS01785 -BKC01_RS01785 AKW53_RS03280 -BKC01_RS01785 AP288_RS01300 -BKC01_RS01785 gnl|Prokka|PADJNBJD_00350 -BKC01_RS01785 NILJEPDF_00350 -BKC01_RS01785 CTRC943_RS01760 -BKC01_RS01785 LJHENM_01765 -BKC01_RS01785 JIEJKO_01760 -BKC01_RS01785 BKC03_RS01785 -BKC01_RS01785 CTJTET1_RS01790 -BKC01_RS01785 DU10_RS01805 -BKC01_RS01785 QSDFRQ_00350 -BKC01_RS01785 C15_RS0101820 -BKC01_RS01785 SOTONK1_RS01780 -BKC01_RS01785 AQ244_RS01330 -BKC01_RS01785 A5291_RS01805 -BKC01_RS01785 KW39_RS01790 -BKC01_RS01785 IaCS19096_RS01775 -BKC01_RS01785 119465 -BKC01_RS01785 ECS88FINAL_RS0101810 -BKC01_RS01785 O169_RS01790 -BKC01_RS01785 DU13_RS01800 -BKC01_RS01785 7618520 -BKC01_RS01785 CTL2C_RS03125 -BKC01_RS01785 BKB95_RS01800 -BKC01_RS01785 CBP48_RS03185 -BKC01_RS01785 L1224_RS01755 -BKC01_RS01785 KW36_RS01775 -BKC01_RS01785 AOT15_RS02775 -BKC01_RS01785 BKB96_RS01785 -BKC01_RS01785 SW2_RS01780 -BKC01_RS01785 BKB99_RS01785 -BKC01_RS01785 L1440_RS01755 -BKC01_RS01785 ECS102511_RS01780 -BKC01_RS01785 AQ193_RS02205 -BKC01_RS01785 CBP42_RS03195 -BKC01_RS01785 CTB_RS01805 -BKC01_RS01785 SOTONIA3_RS01790 -BKC01_RS01785 L2BUCH2_RS01755 -BKC01_RS01785 BKB92_RS01795 -BKC01_RS01785 CTO_RS01805 -BKC01_RS01785 E150_RS01785 -BKC01_RS01785 L2BLST_RS01755 -BKC01_RS01785 FCS84708_RS01775 -BKC01_RS01785 BW688_RS03185 -BKC01_RS01785 BKB93_RS01795 -BKC01_RS01785 CBP44_RS03190 -BKC01_RS01785 BBV13_RS01810 -BKC01_RS01785 AQ199_RS02475 -BKC01_RS01785 G9768_RS01780 -BKC01_RS01785 L3404_RS01755 -BKC01_RS01785 BBV16_RS01810 -BKC01_RS01785 BKC02_RS01785 -BKC01_RS01950 BKC01_RS01950 -BKC01_RS01950 AKW53_RS03445 -BKC01_RS01950 AP288_RS01135 -BKC01_RS01950 gnl|Prokka|PADJNBJD_00383 -BKC01_RS01950 NILJEPDF_00383 -BKC01_RS01950 CTRC943_RS01925 -BKC01_RS01950 LJHENM_01930 -BKC01_RS01950 JIEJKO_01925 -BKC01_RS01950 BKC03_RS01950 -BKC01_RS01950 CTJTET1_RS01955 -BKC01_RS01950 QSDFRQ_00383 -BKC01_RS01950 C15_RS0101990 -BKC01_RS01950 SOTONK1_RS01945 -BKC01_RS01950 AQ244_RS01165 -BKC01_RS01950 DU10_RS01975 -BKC01_RS01950 A5291_RS01970 -BKC01_RS01950 KW39_RS01955 -BKC01_RS01950 IaCS19096_RS01940 -BKC01_RS01950 ECS88FINAL_RS0101980 -BKC01_RS01950 O169_RS01955 -BKC01_RS01950 DU13_RS01970 -BKC01_RS01950 7618972 -BKC01_RS01950 120341 -BKC01_RS01950 CTL2C_RS03290 -BKC01_RS01950 L1224_RS01920 -BKC01_RS01950 KW36_RS01940 -BKC01_RS01950 AOT15_RS02940 -BKC01_RS01950 BKB95_RS01970 -BKC01_RS01950 BKB96_RS01950 -BKC01_RS01950 CBP48_RS03355 -BKC01_RS01950 SW2_RS01945 -BKC01_RS01950 BKB99_RS01950 -BKC01_RS01950 L1440_RS01920 -BKC01_RS01950 ECS102511_RS01945 -BKC01_RS01950 AQ193_RS02040 -BKC01_RS01950 CTB_RS01970 -BKC01_RS01950 SOTONIA3_RS01955 -BKC01_RS01950 L2BUCH2_RS01920 -BKC01_RS01950 BKB92_RS01960 -BKC01_RS01950 CBP42_RS03365 -BKC01_RS01950 CTO_RS01970 -BKC01_RS01950 E150_RS01950 -BKC01_RS01950 L2BLST_RS01920 -BKC01_RS01950 BW688_RS03350 -BKC01_RS01950 FCS84708_RS01940 -BKC01_RS01950 BKB93_RS01960 -BKC01_RS01950 BBV13_RS01975 -BKC01_RS01950 CBP44_RS03360 -BKC01_RS01950 AQ199_RS02640 -BKC01_RS01950 G9768_RS01945 -BKC01_RS01950 L3404_RS01920 -BKC01_RS01950 BBV16_RS01975 -BKC01_RS01950 BKC02_RS01950 -BKC01_RS02110 BKC01_RS02110 -BKC01_RS02110 AKW53_RS03605 -BKC01_RS02110 AP288_RS00975 -BKC01_RS02110 gnl|Prokka|PADJNBJD_00415 -BKC01_RS02110 NILJEPDF_00415 -BKC01_RS02110 CTRC943_RS02085 -BKC01_RS02110 LJHENM_02090 -BKC01_RS02110 JIEJKO_02085 -BKC01_RS02110 BKC03_RS02110 -BKC01_RS02110 CTJTET1_RS02115 -BKC01_RS02110 QSDFRQ_00415 -BKC01_RS02110 C15_RS0102150 -BKC01_RS02110 A5291_RS02130 -BKC01_RS02110 SOTONK1_RS02105 -BKC01_RS02110 AQ244_RS01005 -BKC01_RS02110 DU10_RS02135 -BKC01_RS02110 KW39_RS02115 -BKC01_RS02110 IaCS19096_RS02100 -BKC01_RS02110 ECS88FINAL_RS0102145 -BKC01_RS02110 O169_RS02115 -BKC01_RS02110 DU13_RS02130 -BKC01_RS02110 7618550 -BKC01_RS02110 CTL2C_RS03450 -BKC01_RS02110 CBP48_RS03515 -BKC01_RS02110 119514 -BKC01_RS02110 L1224_RS02080 -BKC01_RS02110 KW36_RS02100 -BKC01_RS02110 AOT15_RS03100 -BKC01_RS02110 BKB95_RS02130 -BKC01_RS02110 BKB96_RS02110 -BKC01_RS02110 SW2_RS02105 -BKC01_RS02110 BKB99_RS02110 -BKC01_RS02110 L1440_RS02080 -BKC01_RS02110 ECS102511_RS02105 -BKC01_RS02110 AQ193_RS01880 -BKC01_RS02110 CTB_RS02130 -BKC01_RS02110 CBP42_RS03525 -BKC01_RS02110 SOTONIA3_RS02115 -BKC01_RS02110 L2BUCH2_RS02080 -BKC01_RS02110 BKB92_RS02120 -BKC01_RS02110 CTO_RS02130 -BKC01_RS02110 E150_RS02110 -BKC01_RS02110 L2BLST_RS02080 -BKC01_RS02110 BW688_RS03510 -BKC01_RS02110 FCS84708_RS02100 -BKC01_RS02110 BBV13_RS02135 -BKC01_RS02110 BKB93_RS02120 -BKC01_RS02110 CBP44_RS03520 -BKC01_RS02110 AQ199_RS02800 -BKC01_RS02110 G9768_RS02105 -BKC01_RS02110 BBV16_RS02135 -BKC01_RS02110 L3404_RS02080 -BKC01_RS02110 BKC02_RS02110 -BKC01_RS02285 BKC01_RS02285 -BKC01_RS02285 AKW53_RS04855 -BKC01_RS02285 AP288_RS04945 -BKC01_RS02285 CTRC943_RS04800 -BKC01_RS02285 JIEJKO_02260 -BKC01_RS02285 BKC03_RS02285 -BKC01_RS02285 CTJTET1_RS04995 -BKC01_RS02285 C15_RS1000000105030 -BKC01_RS02285 SOTONK1_RS04860 -BKC01_RS02285 DU10_RS02310 -BKC01_RS02285 A5291_RS04910 -BKC01_RS02285 KW39_RS04840 -BKC01_RS02285 IaCS19096_RS04840 -BKC01_RS02285 AQ244_RS05145 -BKC01_RS02285 ECS88FINAL_RS1000000105060 -BKC01_RS02285 O169_RS04825 -BKC01_RS02285 DU13_RS02305 -BKC01_RS02285 BKB96_RS02290 -BKC01_RS02285 BKB99_RS02285 -BKC01_RS02285 CBP48_RS03690 -BKC01_RS02285 CTL2C_RS04830 -BKC01_RS02285 KW36_RS04810 -BKC01_RS02285 AOT15_RS04900 -BKC01_RS02285 BKB95_RS02305 -BKC01_RS02285 L1224_RS04855 -BKC01_RS02285 SW2_RS04825 -BKC01_RS02285 ECS102511_RS04840 -BKC01_RS02285 L1440_RS04795 -BKC01_RS02285 AQ193_RS04910 -BKC01_RS02285 CBP42_RS03700 -BKC01_RS02285 CTB_RS04850 -BKC01_RS02285 L2BUCH2_RS04850 -BKC01_RS02285 BKB92_RS02295 -BKC01_RS02285 SOTONIA3_RS04890 -BKC01_RS02285 CTO_RS04885 -BKC01_RS02285 E150_RS04830 -BKC01_RS02285 BW688_RS03685 -BKC01_RS02285 L2BLST_RS04855 -BKC01_RS02285 FCS84708_RS04840 -BKC01_RS02285 BBV13_RS04875 -BKC01_RS02285 CBP44_RS03695 -BKC01_RS02285 BKB93_RS02300 -BKC01_RS02285 AQ199_RS04940 -BKC01_RS02285 G9768_RS04825 -BKC01_RS02285 BBV16_RS04880 -BKC01_RS02285 L3404_RS04850 -BKC01_RS02285 BKC02_RS02285 -BKC01_RS02800 BKC01_RS02800 -BKC01_RS02800 LJHENM_02755 -BKC01_RS02800 CTRC943_RS02755 -BKC01_RS02800 AOT15_RS01575 -BKC01_RS02800 QSDFRQ_00547 -BKC01_RS02800 AP288_RS00305 -BKC01_RS02800 JIEJKO_02760 -BKC01_RS02800 SOTONK1_RS02775 -BKC01_RS02800 CTJTET1_RS02785 -BKC01_RS02800 BKC03_RS02800 -BKC01_RS02800 KW39_RS02785 -BKC01_RS02800 C15_RS0102845 -BKC01_RS02800 ECS88FINAL_RS0102840 -BKC01_RS02800 IaCS19096_RS02770 -BKC01_RS02800 DU10_RS02820 -BKC01_RS02800 O169_RS02785 -BKC01_RS02800 A5291_RS02810 -BKC01_RS02800 AQ244_RS00335 -BKC01_RS02800 DU13_RS02815 -BKC01_RS02800 CBP48_RS04200 -BKC01_RS02800 7619058 -BKC01_RS02800 CTL2C_RS04125 -BKC01_RS02800 KW36_RS02770 -BKC01_RS02800 AKW53_RS04000 -BKC01_RS02800 BKB95_RS02815 -BKC01_RS02800 BKB96_RS02805 -BKC01_RS02800 BKB99_RS02800 -BKC01_RS02800 SW2_RS02780 -BKC01_RS02800 L1224_RS02755 -BKC01_RS02800 ECS102511_RS02775 -BKC01_RS02800 L1440_RS02755 -BKC01_RS02800 120203 -BKC01_RS02800 AQ193_RS01210 -BKC01_RS02800 CBP42_RS04210 -BKC01_RS02800 L2BUCH2_RS02755 -BKC01_RS02800 SOTONIA3_RS02790 -BKC01_RS02800 BKB92_RS02805 -BKC01_RS02800 CTB_RS02810 -BKC01_RS02800 E150_RS02780 -BKC01_RS02800 BW688_RS04200 -BKC01_RS02800 CTO_RS02810 -BKC01_RS02800 FCS84708_RS02770 -BKC01_RS02800 L2BLST_RS02755 -BKC01_RS02800 BBV13_RS02815 -BKC01_RS02800 CBP44_RS04205 -BKC01_RS02800 AQ199_RS03470 -BKC01_RS02800 BKB93_RS02810 -BKC01_RS02800 BBV16_RS02825 -BKC01_RS02800 G9768_RS02775 -BKC01_RS02800 L3404_RS02750 -BKC01_RS02800 BKC02_RS02800 -BKC01_RS02800 gnl|Prokka|PADJNBJD_00547 -BKC01_RS02800 NILJEPDF_00547 -BKC01_RS02970 BKC01_RS02970 -BKC01_RS02970 LJHENM_02920 -BKC01_RS02970 CTRC943_RS02920 -BKC01_RS02970 AP288_RS00140 -BKC01_RS02970 QSDFRQ_00580 -BKC01_RS02970 JIEJKO_02925 -BKC01_RS02970 SOTONK1_RS02940 -BKC01_RS02970 CTJTET1_RS02950 -BKC01_RS02970 BKC03_RS02970 -BKC01_RS02970 C15_RS0103010 -BKC01_RS02970 KW39_RS02955 -BKC01_RS02970 IaCS19096_RS02935 -BKC01_RS02970 ECS88FINAL_RS0103010 -BKC01_RS02970 DU10_RS02990 -BKC01_RS02970 A5291_RS02975 -BKC01_RS02970 O169_RS02950 -BKC01_RS02970 AQ244_RS00170 -BKC01_RS02970 DU13_RS02985 -BKC01_RS02970 CBP48_RS04370 -BKC01_RS02970 CTL2C_RS04290 -BKC01_RS02970 KW36_RS02935 -BKC01_RS02970 BKB95_RS02985 -BKC01_RS02970 BKB96_RS02975 -BKC01_RS02970 BKB99_RS02970 -BKC01_RS02970 L1224_RS02920 -BKC01_RS02970 AKW53_RS04170 -BKC01_RS02970 7618613 -BKC01_RS02970 SW2_RS02945 -BKC01_RS02970 ECS102511_RS02940 -BKC01_RS02970 L1440_RS02920 -BKC01_RS02970 AQ193_RS01045 -BKC01_RS02970 CBP42_RS04380 -BKC01_RS02970 L2BUCH2_RS02920 -BKC01_RS02970 119612 -BKC01_RS02970 SOTONIA3_RS02955 -BKC01_RS02970 CTB_RS02975 -BKC01_RS02970 BKB92_RS02975 -BKC01_RS02970 E150_RS02945 -BKC01_RS02970 BW688_RS04370 -BKC01_RS02970 CTO_RS02975 -BKC01_RS02970 L2BLST_RS02920 -BKC01_RS02970 FCS84708_RS02940 -BKC01_RS02970 BBV13_RS02980 -BKC01_RS02970 CBP44_RS04375 -BKC01_RS02970 AQ199_RS03640 -BKC01_RS02970 BBV16_RS02990 -BKC01_RS02970 BKB93_RS02980 -BKC01_RS02970 G9768_RS02940 -BKC01_RS02970 L3404_RS02915 -BKC01_RS02970 BKC02_RS02970 -BKC01_RS02970 gnl|Prokka|PADJNBJD_00580 -BKC01_RS02970 AOT15_RS03740 -BKC01_RS02970 NILJEPDF_00580 -BKC01_RS04190 BKC01_RS04190 -BKC01_RS04190 CTRC943_RS04135 -BKC01_RS04190 AOT15_RS01735 -BKC01_RS04190 CTJTET1_RS04325 -BKC01_RS04190 KW39_RS04165 -BKC01_RS04190 BKC03_RS04185 -BKC01_RS04190 CBP48_RS00755 -BKC01_RS04190 A5291_RS04190 -BKC01_RS04190 ECS88FINAL_RS0104235 -BKC01_RS04190 DU10_RS04200 -BKC01_RS04190 SOTONK1_RS04150 -BKC01_RS04190 IaCS19096_RS04145 -BKC01_RS04190 DU13_RS04200 -BKC01_RS04190 C15_RS0104260 -BKC01_RS04190 O169_RS04160 -BKC01_RS04190 KW36_RS04150 -BKC01_RS04190 BKB95_RS04205 -BKC01_RS04190 CBP42_RS00755 -BKC01_RS04190 CTL2C_RS00750 -BKC01_RS04190 L1224_RS04130 -BKC01_RS04190 BKB96_RS04190 -BKC01_RS04190 SW2_RS04155 -BKC01_RS04190 L1440_RS04125 -BKC01_RS04190 ECS102511_RS04145 -BKC01_RS04190 BKB99_RS04185 -BKC01_RS04190 CBP44_RS00755 -BKC01_RS04190 CTB_RS04185 -BKC01_RS04190 L2BUCH2_RS04130 -BKC01_RS04190 BKB92_RS04185 -BKC01_RS04190 SOTONIA3_RS04170 -BKC01_RS04190 CTO_RS04180 -BKC01_RS04190 AP288_RS02450 -BKC01_RS04190 E150_RS04155 -BKC01_RS04190 AQ193_RS04625 -BKC01_RS04190 BBV13_RS04190 -BKC01_RS04190 119989 -BKC01_RS04190 FCS84708_RS04145 -BKC01_RS04190 AQ199_RS00075 -BKC01_RS04190 AQ244_RS02615 -BKC01_RS04190 7618725 -BKC01_RS04190 L2BLST_RS04130 -BKC01_RS04190 BBV16_RS04200 -BKC01_RS04190 BW688_RS00755 -BKC01_RS04190 gnl|Prokka|PADJNBJD_00815 -BKC01_RS04190 BKB93_RS04190 -BKC01_RS04190 NILJEPDF_00816 -BKC01_RS04190 G9768_RS04150 -BKC01_RS04190 L3404_RS04125 -BKC01_RS04190 LJHENM_04105 -BKC01_RS04190 JIEJKO_04105 -BKC01_RS04190 BKC02_RS04185 -BKC01_RS04190 QSDFRQ_00816 -BKC01_RS04190 AKW53_RS00865 -DU10_RS00930 DU10_RS00930 -DU10_RS00930 gnl|Prokka|PADJNBJD_00180 -DU10_RS00930 BKC03_RS00920 -DU10_RS00930 NILJEPDF_00180 -DU10_RS00930 LJHENM_00905 -DU10_RS00930 CTRC943_RS00905 -DU10_RS00930 CTJTET1_RS00935 -DU10_RS00930 C15_RS0100955 -DU10_RS00930 SOTONK1_RS00920 -DU10_RS00930 ECS88FINAL_RS0100940 -DU10_RS00930 KW39_RS00925 -DU10_RS00930 JIEJKO_00905 -DU10_RS00930 7618857 -DU10_RS00930 A5291_RS00945 -DU10_RS00930 IaCS19096_RS00920 -DU10_RS00930 QSDFRQ_00180 -DU10_RS00930 O169_RS00925 -DU10_RS00930 DU13_RS00930 -DU10_RS00930 SW2_RS00915 -DU10_RS00930 AOT15_RS01445 -DU10_RS00930 BKB95_RS00935 -DU10_RS00930 CBP48_RS02310 -DU10_RS00930 KW36_RS00920 -DU10_RS00930 ECS102511_RS00915 -DU10_RS00930 BKB96_RS00920 -DU10_RS00930 CTL2C_RS02270 -DU10_RS00930 BKB99_RS00920 -DU10_RS00930 L1224_RS00900 -DU10_RS00930 L1440_RS00900 -DU10_RS00930 AQ244_RS03100 -DU10_RS00930 BKB92_RS00920 -DU10_RS00930 CBP42_RS02310 -DU10_RS00930 SOTONIA3_RS00935 -DU10_RS00930 E150_RS00915 -DU10_RS00930 CTB_RS00945 -DU10_RS00930 L2BUCH2_RS00905 -DU10_RS00930 CTO_RS00945 -DU10_RS00930 FCS84708_RS00915 -DU10_RS00930 AP288_RS03985 -DU10_RS00930 AQ193_RS03075 -DU10_RS00930 BKB93_RS00920 -DU10_RS00930 CBP44_RS02315 -DU10_RS00930 AQ199_RS01610 -DU10_RS00930 L2BLST_RS00905 -DU10_RS00930 BW688_RS02315 -DU10_RS00930 BBV13_RS00950 -DU10_RS00930 G9768_RS00925 -DU10_RS00930 BKC02_RS00920 -DU10_RS00930 L3404_RS00900 -DU10_RS00930 AKW53_RS02410 -DU10_RS00930 120534 -DU10_RS00930 BBV16_RS00950 -DU10_RS00930 BKC01_RS00920 -DU10_RS01110 DU10_RS01110 -DU10_RS01110 gnl|Prokka|PADJNBJD_00216 -DU10_RS01110 BKC03_RS01100 -DU10_RS01110 NILJEPDF_00216 -DU10_RS01110 LJHENM_01085 -DU10_RS01110 CTRC943_RS01085 -DU10_RS01110 CTJTET1_RS01115 -DU10_RS01110 C15_RS0101135 -DU10_RS01110 SOTONK1_RS01100 -DU10_RS01110 ECS88FINAL_RS0101120 -DU10_RS01110 KW39_RS01105 -DU10_RS01110 JIEJKO_01085 -DU10_RS01110 A5291_RS01125 -DU10_RS01110 IaCS19096_RS01100 -DU10_RS01110 7618875 -DU10_RS01110 QSDFRQ_00216 -DU10_RS01110 O169_RS01105 -DU10_RS01110 DU13_RS01110 -DU10_RS01110 SW2_RS01095 -DU10_RS01110 AOT15_RS01265 -DU10_RS01110 BKB95_RS01115 -DU10_RS01110 CBP48_RS02490 -DU10_RS01110 KW36_RS01100 -DU10_RS01110 ECS102511_RS01095 -DU10_RS01110 BKB96_RS01100 -DU10_RS01110 CTL2C_RS02450 -DU10_RS01110 BKB99_RS01100 -DU10_RS01110 L1224_RS01080 -DU10_RS01110 L1440_RS01080 -DU10_RS01110 AQ244_RS03280 -DU10_RS01110 BKB92_RS01100 -DU10_RS01110 CBP42_RS02490 -DU10_RS01110 SOTONIA3_RS01115 -DU10_RS01110 E150_RS01095 -DU10_RS01110 CTB_RS01125 -DU10_RS01110 L2BUCH2_RS01085 -DU10_RS01110 CTO_RS01125 -DU10_RS01110 FCS84708_RS01095 -DU10_RS01110 AP288_RS04165 -DU10_RS01110 AQ193_RS02895 -DU10_RS01110 BKB93_RS01100 -DU10_RS01110 CBP44_RS02495 -DU10_RS01110 AQ199_RS01790 -DU10_RS01110 L2BLST_RS01085 -DU10_RS01110 BW688_RS02495 -DU10_RS01110 BBV13_RS01130 -DU10_RS01110 G9768_RS01105 -DU10_RS01110 BKC02_RS01100 -DU10_RS01110 L3404_RS01080 -DU10_RS01110 AKW53_RS02590 -DU10_RS01110 BBV16_RS01130 -DU10_RS01110 BKC01_RS01100 -DU10_RS01110 120506 -DU13_RS02600 DU13_RS02600 -DU13_RS02600 7619022 -DU13_RS02600 CBP48_RS03985 -DU13_RS02600 CTL2C_RS03915 -DU13_RS02600 KW36_RS02560 -DU13_RS02600 BKB96_RS02590 -DU13_RS02600 BKB99_RS02585 -DU13_RS02600 SW2_RS02570 -DU13_RS02600 L1224_RS02545 -DU13_RS02600 ECS102511_RS02565 -DU13_RS02600 BKB95_RS02600 -DU13_RS02600 L1440_RS02545 -DU13_RS02600 120261 -DU13_RS02600 AKW53_RS04650 -DU13_RS02600 CBP42_RS03995 -DU13_RS02600 L2BUCH2_RS02545 -DU13_RS02600 BKB92_RS02590 -DU13_RS02600 CTB_RS02600 -DU13_RS02600 SOTONIA3_RS02580 -DU13_RS02600 E150_RS02570 -DU13_RS02600 AP288_RS00515 -DU13_RS02600 BW688_RS03985 -DU13_RS02600 CTO_RS02600 -DU13_RS02600 FCS84708_RS02560 -DU13_RS02600 L2BLST_RS02545 -DU13_RS02600 BBV13_RS02605 -DU13_RS02600 CBP44_RS03990 -DU13_RS02600 AQ199_RS03260 -DU13_RS02600 AQ244_RS00545 -DU13_RS02600 BKB93_RS02595 -DU13_RS02600 BBV16_RS02615 -DU13_RS02600 G9768_RS02565 -DU13_RS02600 L3404_RS02540 -DU13_RS02600 BKC02_RS02585 -DU13_RS02600 gnl|Prokka|PADJNBJD_00505 -DU13_RS02600 BKC01_RS02585 -DU13_RS02600 NILJEPDF_00505 -DU13_RS02600 LJHENM_02540 -DU13_RS02600 CTRC943_RS02545 -DU13_RS02600 AQ193_RS01420 -DU13_RS02600 JIEJKO_02545 -DU13_RS02600 QSDFRQ_00505 -DU13_RS02600 SOTONK1_RS02565 -DU13_RS02600 BKC03_RS02585 -DU13_RS02600 CTJTET1_RS02575 -DU13_RS02600 KW39_RS02575 -DU13_RS02600 AOT15_RS03530 -DU13_RS02600 ECS88FINAL_RS0102615 -DU13_RS02600 IaCS19096_RS02560 -DU13_RS02600 DU10_RS02605 -DU13_RS02600 C15_RS0102620 -DU13_RS02600 O169_RS02575 -DU13_RS02600 A5291_RS02600 -DU13_RS02770 DU13_RS02770 -DU13_RS02770 CBP48_RS04155 -DU13_RS02770 7619049 -DU13_RS02770 CTL2C_RS04080 -DU13_RS02770 KW36_RS02725 -DU13_RS02770 BKB95_RS02770 -DU13_RS02770 BKB96_RS02760 -DU13_RS02770 BKB99_RS02755 -DU13_RS02770 SW2_RS02735 -DU13_RS02770 L1224_RS02710 -DU13_RS02770 ECS102511_RS02730 -DU13_RS02770 L1440_RS02710 -DU13_RS02770 AKW53_RS04485 -DU13_RS02770 120217 -DU13_RS02770 CBP42_RS04165 -DU13_RS02770 L2BUCH2_RS02710 -DU13_RS02770 SOTONIA3_RS02745 -DU13_RS02770 BKB92_RS02760 -DU13_RS02770 CTB_RS02765 -DU13_RS02770 E150_RS02735 -DU13_RS02770 AP288_RS00350 -DU13_RS02770 BW688_RS04155 -DU13_RS02770 CTO_RS02765 -DU13_RS02770 FCS84708_RS02725 -DU13_RS02770 L2BLST_RS02710 -DU13_RS02770 BBV13_RS02770 -DU13_RS02770 CBP44_RS04160 -DU13_RS02770 AQ199_RS03425 -DU13_RS02770 AQ244_RS00380 -DU13_RS02770 BKB93_RS02765 -DU13_RS02770 BBV16_RS02780 -DU13_RS02770 G9768_RS02730 -DU13_RS02770 L3404_RS02705 -DU13_RS02770 BKC02_RS02755 -DU13_RS02770 gnl|Prokka|PADJNBJD_00538 -DU13_RS02770 NILJEPDF_00538 -DU13_RS02770 BKC01_RS02755 -DU13_RS02770 LJHENM_02710 -DU13_RS02770 CTRC943_RS02710 -DU13_RS02770 AOT15_RS01530 -DU13_RS02770 QSDFRQ_00538 -DU13_RS02770 AQ193_RS01255 -DU13_RS02770 JIEJKO_02715 -DU13_RS02770 SOTONK1_RS02730 -DU13_RS02770 CTJTET1_RS02740 -DU13_RS02770 BKC03_RS02755 -DU13_RS02770 KW39_RS02740 -DU13_RS02770 C15_RS0102800 -DU13_RS02770 ECS88FINAL_RS0102795 -DU13_RS02770 IaCS19096_RS02725 -DU13_RS02770 DU10_RS02775 -DU13_RS02770 O169_RS02740 -DU13_RS02770 A5291_RS02765 -DU13_RS02935 DU13_RS02935 -DU13_RS02935 CBP48_RS04320 -DU13_RS02935 CTL2C_RS04245 -DU13_RS02935 KW36_RS02890 -DU13_RS02935 AKW53_RS04120 -DU13_RS02935 BKB95_RS02935 -DU13_RS02935 BKB96_RS02925 -DU13_RS02935 BKB99_RS02920 -DU13_RS02935 7618609 -DU13_RS02935 SW2_RS02900 -DU13_RS02935 L1224_RS02875 -DU13_RS02935 ECS102511_RS02895 -DU13_RS02935 L1440_RS02875 -DU13_RS02935 CBP42_RS04330 -DU13_RS02935 119606 -DU13_RS02935 L2BUCH2_RS02875 -DU13_RS02935 SOTONIA3_RS02910 -DU13_RS02935 BKB92_RS02925 -DU13_RS02935 CTB_RS02930 -DU13_RS02935 E150_RS02900 -DU13_RS02935 AP288_RS00185 -DU13_RS02935 BW688_RS04320 -DU13_RS02935 CTO_RS02930 -DU13_RS02935 FCS84708_RS02890 -DU13_RS02935 L2BLST_RS02875 -DU13_RS02935 BBV13_RS02935 -DU13_RS02935 CBP44_RS04325 -DU13_RS02935 AQ199_RS03590 -DU13_RS02935 AQ244_RS00215 -DU13_RS02935 BKB93_RS02930 -DU13_RS02935 BBV16_RS02945 -DU13_RS02935 G9768_RS02895 -DU13_RS02935 L3404_RS02870 -DU13_RS02935 BKC02_RS02920 -DU13_RS02935 gnl|Prokka|PADJNBJD_00571 -DU13_RS02935 AOT15_RS03695 -DU13_RS02935 NILJEPDF_00571 -DU13_RS02935 BKC01_RS02920 -DU13_RS02935 LJHENM_02875 -DU13_RS02935 CTRC943_RS02875 -DU13_RS02935 QSDFRQ_00571 -DU13_RS02935 AQ193_RS01090 -DU13_RS02935 JIEJKO_02880 -DU13_RS02935 SOTONK1_RS02895 -DU13_RS02935 CTJTET1_RS02905 -DU13_RS02935 BKC03_RS02920 -DU13_RS02935 KW39_RS02905 -DU13_RS02935 C15_RS0102965 -DU13_RS02935 ECS88FINAL_RS0102960 -DU13_RS02935 IaCS19096_RS02890 -DU13_RS02935 DU10_RS02940 -DU13_RS02935 O169_RS02905 -DU13_RS02935 A5291_RS02930 -DU13_RS03265 DU13_RS03265 -DU13_RS03265 CTL2C_RS04570 -DU13_RS03265 AKW53_RS04450 -DU13_RS03265 CBP48_RS04655 -DU13_RS03265 7618647 -DU13_RS03265 SW2_RS03230 -DU13_RS03265 L1224_RS03200 -DU13_RS03265 KW36_RS03225 -DU13_RS03265 ECS102511_RS03225 -DU13_RS03265 L1440_RS03200 -DU13_RS03265 BKB95_RS03270 -DU13_RS03265 BKB96_RS03265 -DU13_RS03265 BKB99_RS03260 -DU13_RS03265 CBP42_RS04660 -DU13_RS03265 L2BUCH2_RS03200 -DU13_RS03265 BKB92_RS03255 -DU13_RS03265 CTB_RS03265 -DU13_RS03265 E150_RS03230 -DU13_RS03265 SOTONIA3_RS03245 -DU13_RS03265 BW688_RS04650 -DU13_RS03265 CTO_RS03260 -DU13_RS03265 FCS84708_RS03225 -DU13_RS03265 L2BLST_RS03200 -DU13_RS03265 BBV13_RS03265 -DU13_RS03265 CBP44_RS04655 -DU13_RS03265 119664 -DU13_RS03265 AQ199_RS03925 -DU13_RS03265 AQ244_RS04690 -DU13_RS03265 BKB93_RS03260 -DU13_RS03265 BBV16_RS03275 -DU13_RS03265 G9768_RS03225 -DU13_RS03265 L3404_RS03195 -DU13_RS03265 gnl|Prokka|PADJNBJD_00634 -DU13_RS03265 AP288_RS01595 -DU13_RS03265 BKC02_RS03255 -DU13_RS03265 NILJEPDF_00635 -DU13_RS03265 LJHENM_03190 -DU13_RS03265 AOT15_RS04025 -DU13_RS03265 CTRC943_RS03200 -DU13_RS03265 JIEJKO_03195 -DU13_RS03265 BKC01_RS03255 -DU13_RS03265 QSDFRQ_00635 -DU13_RS03265 AQ193_RS00760 -DU13_RS03265 KW39_RS03240 -DU13_RS03265 BKC03_RS03255 -DU13_RS03265 CTJTET1_RS03240 -DU13_RS03265 ECS88FINAL_RS0103290 -DU13_RS03265 DU10_RS03270 -DU13_RS03265 SOTONK1_RS03225 -DU13_RS03265 O169_RS03235 -DU13_RS03265 IaCS19096_RS03220 -DU13_RS03265 C15_RS0103290 -DU13_RS03265 A5291_RS03265 -CBP48_RS03980 CBP48_RS03980 -CBP48_RS03980 CTL2C_RS03910 -CBP48_RS03980 KW36_RS02555 -CBP48_RS03980 BKB96_RS02585 -CBP48_RS03980 BKB99_RS02580 -CBP48_RS03980 SW2_RS02565 -CBP48_RS03980 L1224_RS02540 -CBP48_RS03980 ECS102511_RS02560 -CBP48_RS03980 BKB95_RS02595 -CBP48_RS03980 L1440_RS02540 -CBP48_RS03980 119595 -CBP48_RS03980 CBP42_RS03990 -CBP48_RS03980 L2BUCH2_RS02540 -CBP48_RS03980 AKW53_RS04655 -CBP48_RS03980 BKB92_RS02585 -CBP48_RS03980 CTB_RS02595 -CBP48_RS03980 SOTONIA3_RS02575 -CBP48_RS03980 E150_RS02565 -CBP48_RS03980 BW688_RS03980 -CBP48_RS03980 CTO_RS02595 -CBP48_RS03980 FCS84708_RS02555 -CBP48_RS03980 AP288_RS00520 -CBP48_RS03980 L2BLST_RS02540 -CBP48_RS03980 BBV13_RS02600 -CBP48_RS03980 CBP44_RS03985 -CBP48_RS03980 AQ199_RS03255 -CBP48_RS03980 BKB93_RS02590 -CBP48_RS03980 BBV16_RS02610 -CBP48_RS03980 AQ244_RS00550 -CBP48_RS03980 G9768_RS02560 -CBP48_RS03980 L3404_RS02535 -CBP48_RS03980 BKC02_RS02580 -CBP48_RS03980 gnl|Prokka|PADJNBJD_00504 -CBP48_RS03980 NILJEPDF_00504 -CBP48_RS03980 LJHENM_02535 -CBP48_RS03980 CTRC943_RS02540 -CBP48_RS03980 JIEJKO_02540 -CBP48_RS03980 QSDFRQ_00504 -CBP48_RS03980 SOTONK1_RS02560 -CBP48_RS03980 BKC03_RS02580 -CBP48_RS03980 CTJTET1_RS02570 -CBP48_RS03980 KW39_RS02570 -CBP48_RS03980 AQ193_RS01425 -CBP48_RS03980 ECS88FINAL_RS0102610 -CBP48_RS03980 IaCS19096_RS02555 -CBP48_RS03980 DU10_RS02600 -CBP48_RS03980 C15_RS0102615 -CBP48_RS03980 O169_RS02570 -CBP48_RS03980 AOT15_RS03535 -CBP48_RS03980 A5291_RS02595 -CBP48_RS03980 DU13_RS02595 -CBP48_RS03980 7618602 -CBP48_RS04150 CBP48_RS04150 -CBP48_RS04150 7619048 -CBP48_RS04150 CTL2C_RS04075 -CBP48_RS04150 KW36_RS02720 -CBP48_RS04150 BKB95_RS02765 -CBP48_RS04150 BKB96_RS02755 -CBP48_RS04150 BKB99_RS02750 -CBP48_RS04150 SW2_RS02730 -CBP48_RS04150 L1224_RS02705 -CBP48_RS04150 ECS102511_RS02725 -CBP48_RS04150 L1440_RS02705 -CBP48_RS04150 120219 -CBP48_RS04150 CBP42_RS04160 -CBP48_RS04150 L2BUCH2_RS02705 -CBP48_RS04150 AKW53_RS04490 -CBP48_RS04150 SOTONIA3_RS02740 -CBP48_RS04150 BKB92_RS02755 -CBP48_RS04150 CTB_RS02760 -CBP48_RS04150 E150_RS02730 -CBP48_RS04150 BW688_RS04150 -CBP48_RS04150 CTO_RS02760 -CBP48_RS04150 FCS84708_RS02720 -CBP48_RS04150 AP288_RS00355 -CBP48_RS04150 L2BLST_RS02705 -CBP48_RS04150 BBV13_RS02765 -CBP48_RS04150 CBP44_RS04155 -CBP48_RS04150 AQ199_RS03420 -CBP48_RS04150 BKB93_RS02760 -CBP48_RS04150 BBV16_RS02775 -CBP48_RS04150 G9768_RS02725 -CBP48_RS04150 AQ244_RS00385 -CBP48_RS04150 L3404_RS02700 -CBP48_RS04150 BKC02_RS02750 -CBP48_RS04150 gnl|Prokka|PADJNBJD_00537 -CBP48_RS04150 NILJEPDF_00537 -CBP48_RS04150 BKC01_RS02750 -CBP48_RS04150 LJHENM_02705 -CBP48_RS04150 CTRC943_RS02705 -CBP48_RS04150 AOT15_RS01525 -CBP48_RS04150 QSDFRQ_00537 -CBP48_RS04150 JIEJKO_02710 -CBP48_RS04150 SOTONK1_RS02725 -CBP48_RS04150 CTJTET1_RS02735 -CBP48_RS04150 BKC03_RS02750 -CBP48_RS04150 KW39_RS02735 -CBP48_RS04150 AQ193_RS01260 -CBP48_RS04150 C15_RS0102795 -CBP48_RS04150 ECS88FINAL_RS0102790 -CBP48_RS04150 IaCS19096_RS02720 -CBP48_RS04150 DU10_RS02770 -CBP48_RS04150 O169_RS02735 -CBP48_RS04150 A5291_RS02760 -CBP48_RS04150 DU13_RS02765 -CBP48_RS04310 CBP48_RS04310 -CBP48_RS04310 CTL2C_RS04235 -CBP48_RS04310 KW36_RS02880 -CBP48_RS04310 AKW53_RS04110 -CBP48_RS04310 BKB95_RS02925 -CBP48_RS04310 BKB96_RS02915 -CBP48_RS04310 BKB99_RS02910 -CBP48_RS04310 7619080 -CBP48_RS04310 SW2_RS02890 -CBP48_RS04310 L1224_RS02865 -CBP48_RS04310 ECS102511_RS02885 -CBP48_RS04310 L1440_RS02865 -CBP48_RS04310 CBP42_RS04320 -CBP48_RS04310 120169 -CBP48_RS04310 L2BUCH2_RS02865 -CBP48_RS04310 SOTONIA3_RS02900 -CBP48_RS04310 BKB92_RS02915 -CBP48_RS04310 CTB_RS02920 -CBP48_RS04310 E150_RS02890 -CBP48_RS04310 BW688_RS04310 -CBP48_RS04310 CTO_RS02920 -CBP48_RS04310 FCS84708_RS02880 -CBP48_RS04310 AP288_RS00195 -CBP48_RS04310 L2BLST_RS02865 -CBP48_RS04310 BBV13_RS02925 -CBP48_RS04310 CBP44_RS04315 -CBP48_RS04310 AQ199_RS03580 -CBP48_RS04310 BKB93_RS02920 -CBP48_RS04310 BBV16_RS02935 -CBP48_RS04310 G9768_RS02885 -CBP48_RS04310 AQ244_RS00225 -CBP48_RS04310 L3404_RS02860 -CBP48_RS04310 BKC02_RS02910 -CBP48_RS04310 gnl|Prokka|PADJNBJD_00569 -CBP48_RS04310 AOT15_RS03685 -CBP48_RS04310 NILJEPDF_00569 -CBP48_RS04310 BKC01_RS02910 -CBP48_RS04310 LJHENM_02865 -CBP48_RS04310 CTRC943_RS02865 -CBP48_RS04310 QSDFRQ_00569 -CBP48_RS04310 JIEJKO_02870 -CBP48_RS04310 SOTONK1_RS02885 -CBP48_RS04310 CTJTET1_RS02895 -CBP48_RS04310 BKC03_RS02910 -CBP48_RS04310 KW39_RS02895 -CBP48_RS04310 AQ193_RS01100 -CBP48_RS04310 C15_RS0102955 -CBP48_RS04310 ECS88FINAL_RS0102950 -CBP48_RS04310 IaCS19096_RS02880 -CBP48_RS04310 DU10_RS02930 -CBP48_RS04310 O169_RS02895 -CBP48_RS04310 A5291_RS02920 -CBP48_RS04310 DU13_RS02925 -CBP42_RS02910 CBP42_RS02910 -CBP42_RS02910 L2BUCH2_RS01500 -CBP42_RS02910 CBP44_RS02915 -CBP42_RS02910 L2BLST_RS01500 -CBP42_RS02910 BW688_RS02920 -CBP42_RS02910 L3404_RS01495 -CBP42_RS02910 BKC01_RS01525 -CBP42_RS02910 DU10_RS01535 -CBP42_RS02910 CTRC943_RS01500 -CBP42_RS02910 CTJTET1_RS01530 -CBP42_RS02910 C15_RS0101565 -CBP42_RS02910 SOTONK1_RS01520 -CBP42_RS02910 DU13_RS01530 -CBP42_RS02910 CBP48_RS02910 -CBP42_RS02910 7618919 -CBP42_RS02910 CTL2C_RS02865 -CBP42_RS02910 L1224_RS01495 -CBP42_RS02910 L1440_RS01495 -CBP42_RS02910 SOTONIA3_RS01530 -CBP42_RS02910 AQ244_RS03700 -CBP42_RS02910 BKB95_RS01535 -CBP42_RS02910 BKB96_RS01520 -CBP42_RS02910 BKB99_RS01520 -CBP42_RS02910 BKB92_RS01525 -CBP42_RS02910 E150_RS01515 -CBP42_RS02910 AQ193_RS02475 -CBP42_RS02910 FCS84708_RS01510 -CBP42_RS02910 AP288_RS04580 -CBP42_RS02910 BKB93_RS01525 -CBP42_RS02910 AQ199_RS02205 -CBP42_RS02910 AKW53_RS03010 -CBP42_RS02910 LJHENM_01500 -CBP42_RS02910 KW39_RS01520 -CBP42_RS02910 ECS88FINAL_RS0101545 -CBP42_RS02910 O169_RS01525 -CBP42_RS02910 SW2_RS01510 -CBP42_RS02910 ECS102511_RS01510 -CBP42_RS02910 G9768_RS01520 -CBP42_RS02910 CTB_RS01545 -CBP42_RS02910 BKC02_RS01520 -CBP42_RS02910 gnl|Prokka|PADJNBJD_00298 -CBP42_RS02910 NILJEPDF_00298 -CBP42_RS02910 BKC03_RS01520 -CBP42_RS02910 JIEJKO_01500 -CBP42_RS02910 120437 -CBP42_RS02910 QSDFRQ_00298 -CBP42_RS02910 IaCS19096_RS01515 -CBP42_RS02910 AOT15_RS02515 -CBP42_RS02910 BBV16_RS01550 -CBP42_RS02910 BBV13_RS01550 -CBP42_RS02910 A5291_RS01545 -CBP42_RS02910 CTO_RS01540 -CBP42_RS02910 KW36_RS01515 -CBP42_RS03080 CBP42_RS03080 -CBP42_RS03080 SOTONIA3_RS01700 -CBP42_RS03080 AQ193_RS02305 -CBP42_RS03080 BKB92_RS01695 -CBP42_RS03080 CTB_RS01715 -CBP42_RS03080 E150_RS01685 -CBP42_RS03080 L2BUCH2_RS01670 -CBP42_RS03080 CTO_RS01710 -CBP42_RS03080 FCS84708_RS01680 -CBP42_RS03080 CBP44_RS03085 -CBP42_RS03080 BKB93_RS01695 -CBP42_RS03080 L2BLST_RS01670 -CBP42_RS03080 AQ199_RS02375 -CBP42_RS03080 BW688_RS03090 -CBP42_RS03080 BBV13_RS01720 -CBP42_RS03080 G9768_RS01690 -CBP42_RS03080 BKC02_RS01690 -CBP42_RS03080 L3404_RS01665 -CBP42_RS03080 AKW53_RS03180 -CBP42_RS03080 BBV16_RS01720 -CBP42_RS03080 BKC01_RS01695 -CBP42_RS03080 gnl|Prokka|PADJNBJD_00332 -CBP42_RS03080 NILJEPDF_00332 -CBP42_RS03080 LJHENM_01670 -CBP42_RS03080 CTRC943_RS01670 -CBP42_RS03080 BKC03_RS01690 -CBP42_RS03080 DU10_RS01705 -CBP42_RS03080 CTJTET1_RS01700 -CBP42_RS03080 KW39_RS01690 -CBP42_RS03080 AP288_RS01400 -CBP42_RS03080 JIEJKO_01670 -CBP42_RS03080 C15_RS0101730 -CBP42_RS03080 SOTONK1_RS01690 -CBP42_RS03080 ECS88FINAL_RS0101710 -CBP42_RS03080 QSDFRQ_00332 -CBP42_RS03080 IaCS19096_RS01685 -CBP42_RS03080 A5291_RS01715 -CBP42_RS03080 O169_RS01695 -CBP42_RS03080 AQ244_RS01430 -CBP42_RS03080 DU13_RS01700 -CBP42_RS03080 120381 -CBP42_RS03080 CBP48_RS03080 -CBP42_RS03080 SW2_RS01680 -CBP42_RS03080 BKB95_RS01705 -CBP42_RS03080 7618948 -CBP42_RS03080 CTL2C_RS03035 -CBP42_RS03080 KW36_RS01685 -CBP42_RS03080 ECS102511_RS01680 -CBP42_RS03080 AOT15_RS02685 -CBP42_RS03080 BKB96_RS01690 -CBP42_RS03080 L1224_RS01665 -CBP42_RS03080 BKB99_RS01690 -CBP42_RS03080 L1440_RS01665 -CBP42_RS03770 CBP42_RS03770 -CBP42_RS03770 CTB_RS02370 -CBP42_RS03770 L2BUCH2_RS02315 -CBP42_RS03770 AQ193_RS01645 -CBP42_RS03770 BKB92_RS02365 -CBP42_RS03770 SOTONIA3_RS02355 -CBP42_RS03770 CTO_RS02370 -CBP42_RS03770 E150_RS02345 -CBP42_RS03770 BW688_RS03755 -CBP42_RS03770 L2BLST_RS02320 -CBP42_RS03770 FCS84708_RS02335 -CBP42_RS03770 BBV13_RS02375 -CBP42_RS03770 CBP44_RS03765 -CBP42_RS03770 BKB93_RS02370 -CBP42_RS03770 AQ199_RS03035 -CBP42_RS03770 G9768_RS02340 -CBP42_RS03770 BBV16_RS02380 -CBP42_RS03770 L3404_RS02315 -CBP42_RS03770 BKC02_RS02355 -CBP42_RS03770 BKC01_RS02355 -CBP42_RS03770 gnl|Prokka|PADJNBJD_00462 -CBP42_RS03770 AKW53_RS03840 -CBP42_RS03770 NILJEPDF_00462 -CBP42_RS03770 LJHENM_02330 -CBP42_RS03770 CTRC943_RS02320 -CBP42_RS03770 JIEJKO_02330 -CBP42_RS03770 BKC03_RS02355 -CBP42_RS03770 QSDFRQ_00462 -CBP42_RS03770 CTJTET1_RS02350 -CBP42_RS03770 AP288_RS00740 -CBP42_RS03770 C15_RS0102390 -CBP42_RS03770 SOTONK1_RS02340 -CBP42_RS03770 DU10_RS02380 -CBP42_RS03770 A5291_RS02370 -CBP42_RS03770 KW39_RS02350 -CBP42_RS03770 IaCS19096_RS02335 -CBP42_RS03770 ECS88FINAL_RS0102390 -CBP42_RS03770 O169_RS02350 -CBP42_RS03770 DU13_RS02375 -CBP42_RS03770 7619006 -CBP42_RS03770 AQ244_RS00770 -CBP42_RS03770 BKB96_RS02360 -CBP42_RS03770 BKB99_RS02355 -CBP42_RS03770 CBP48_RS03760 -CBP42_RS03770 120287 -CBP42_RS03770 CTL2C_RS03690 -CBP42_RS03770 KW36_RS02335 -CBP42_RS03770 AOT15_RS03335 -CBP42_RS03770 BKB95_RS02375 -CBP42_RS03770 L1224_RS02320 -CBP42_RS03770 SW2_RS02345 -CBP42_RS03770 ECS102511_RS02340 -CBP42_RS03770 L1440_RS02320 -CBP42_RS04120 CBP42_RS04120 -CBP42_RS04120 L2BUCH2_RS02665 -CBP42_RS04120 SOTONIA3_RS02700 -CBP42_RS04120 AQ193_RS01300 -CBP42_RS04120 BKB92_RS02715 -CBP42_RS04120 CTB_RS02720 -CBP42_RS04120 E150_RS02690 -CBP42_RS04120 BW688_RS04110 -CBP42_RS04120 CTO_RS02720 -CBP42_RS04120 FCS84708_RS02680 -CBP42_RS04120 L2BLST_RS02665 -CBP42_RS04120 BBV13_RS02725 -CBP42_RS04120 CBP44_RS04115 -CBP42_RS04120 AQ199_RS03380 -CBP42_RS04120 BKB93_RS02720 -CBP42_RS04120 BBV16_RS02735 -CBP42_RS04120 G9768_RS02685 -CBP42_RS04120 L3404_RS02660 -CBP42_RS04120 BKC02_RS02710 -CBP42_RS04120 gnl|Prokka|PADJNBJD_00529 -CBP42_RS04120 NILJEPDF_00529 -CBP42_RS04120 AKW53_RS04530 -CBP42_RS04120 BKC01_RS02710 -CBP42_RS04120 LJHENM_02665 -CBP42_RS04120 CTRC943_RS02665 -CBP42_RS04120 AOT15_RS01485 -CBP42_RS04120 QSDFRQ_00529 -CBP42_RS04120 JIEJKO_02670 -CBP42_RS04120 SOTONK1_RS02685 -CBP42_RS04120 CTJTET1_RS02695 -CBP42_RS04120 BKC03_RS02710 -CBP42_RS04120 KW39_RS02695 -CBP42_RS04120 AP288_RS00395 -CBP42_RS04120 C15_RS0102755 -CBP42_RS04120 ECS88FINAL_RS0102750 -CBP42_RS04120 IaCS19096_RS02680 -CBP42_RS04120 DU10_RS02730 -CBP42_RS04120 O169_RS02695 -CBP42_RS04120 A5291_RS02720 -CBP42_RS04120 DU13_RS02725 -CBP42_RS04120 AQ244_RS00425 -CBP42_RS04120 CBP48_RS04110 -CBP42_RS04120 7618607 -CBP42_RS04120 CTL2C_RS04035 -CBP42_RS04120 KW36_RS02680 -CBP42_RS04120 BKB95_RS02725 -CBP42_RS04120 BKB96_RS02715 -CBP42_RS04120 BKB99_RS02710 -CBP42_RS04120 SW2_RS02690 -CBP42_RS04120 L1224_RS02665 -CBP42_RS04120 ECS102511_RS02685 -CBP42_RS04120 L1440_RS02665 -CBP42_RS04120 119603 -CBP42_RS04285 CBP42_RS04285 -CBP42_RS04285 120180 -CBP42_RS04285 L2BUCH2_RS02830 -CBP42_RS04285 SOTONIA3_RS02865 -CBP42_RS04285 AQ193_RS01135 -CBP42_RS04285 BKB92_RS02880 -CBP42_RS04285 CTB_RS02885 -CBP42_RS04285 E150_RS02855 -CBP42_RS04285 BW688_RS04275 -CBP42_RS04285 CTO_RS02885 -CBP42_RS04285 FCS84708_RS02845 -CBP42_RS04285 L2BLST_RS02830 -CBP42_RS04285 BBV13_RS02890 -CBP42_RS04285 CBP44_RS04280 -CBP42_RS04285 AQ199_RS03545 -CBP42_RS04285 BKB93_RS02885 -CBP42_RS04285 BBV16_RS02900 -CBP42_RS04285 G9768_RS02850 -CBP42_RS04285 L3404_RS02825 -CBP42_RS04285 BKC02_RS02875 -CBP42_RS04285 gnl|Prokka|PADJNBJD_00562 -CBP42_RS04285 NILJEPDF_00562 -CBP42_RS04285 BKC01_RS02875 -CBP42_RS04285 LJHENM_02830 -CBP42_RS04285 CTRC943_RS02830 -CBP42_RS04285 AOT15_RS01650 -CBP42_RS04285 QSDFRQ_00562 -CBP42_RS04285 JIEJKO_02835 -CBP42_RS04285 SOTONK1_RS02850 -CBP42_RS04285 CTJTET1_RS02860 -CBP42_RS04285 BKC03_RS02875 -CBP42_RS04285 KW39_RS02860 -CBP42_RS04285 AP288_RS00230 -CBP42_RS04285 C15_RS0102920 -CBP42_RS04285 ECS88FINAL_RS0102915 -CBP42_RS04285 IaCS19096_RS02845 -CBP42_RS04285 DU10_RS02895 -CBP42_RS04285 O169_RS02860 -CBP42_RS04285 A5291_RS02885 -CBP42_RS04285 DU13_RS02890 -CBP42_RS04285 AQ244_RS00260 -CBP42_RS04285 CBP48_RS04275 -CBP42_RS04285 CTL2C_RS04200 -CBP42_RS04285 KW36_RS02845 -CBP42_RS04285 AKW53_RS04075 -CBP42_RS04285 BKB95_RS02890 -CBP42_RS04285 BKB96_RS02880 -CBP42_RS04285 BKB99_RS02875 -CBP42_RS04285 7619073 -CBP42_RS04285 SW2_RS02855 -CBP42_RS04285 L1224_RS02830 -CBP42_RS04285 ECS102511_RS02850 -CBP42_RS04285 L1440_RS02830 -CBP42_RS04620 CBP42_RS04620 -CBP42_RS04620 L2BUCH2_RS03160 -CBP42_RS04620 BW688_RS04610 -CBP42_RS04620 L2BLST_RS03160 -CBP42_RS04620 CBP44_RS04615 -CBP42_RS04620 CTRC943_RS03160 -CBP42_RS04620 CTL2C_RS04530 -CBP42_RS04620 CBP48_RS04615 -CBP42_RS04620 L1224_RS03160 -CBP42_RS04785 CBP42_RS04785 -CBP42_RS04785 L2BUCH2_RS03330 -CBP42_RS04785 BW688_RS04775 -CBP42_RS04785 L2BLST_RS03330 -CBP42_RS04785 CBP44_RS04780 -CBP42_RS04785 L3404_RS03325 -CBP42_RS04785 CTRC943_RS03330 -CBP42_RS04785 CTL2C_RS04700 -CBP42_RS04785 CBP48_RS04780 -CBP42_RS04785 L1224_RS03330 -CBP42_RS04785 L1440_RS03330 -CBP44_RS00120 CBP44_RS00120 -CBP44_RS00120 L2BUCH2_RS03500 -CBP44_RS00120 BKB92_RS03550 -CBP44_RS00120 CTB_RS03560 -CBP44_RS00120 AQ193_RS00470 -CBP44_RS00120 SOTONIA3_RS03540 -CBP44_RS00120 E150_RS03525 -CBP44_RS00120 CTO_RS03555 -CBP44_RS00120 BBV13_RS03560 -CBP44_RS00120 FCS84708_RS03515 -CBP44_RS00120 L2BLST_RS03500 -CBP44_RS00120 BBV16_RS03570 -CBP44_RS00120 BW688_RS00120 -CBP44_RS00120 7618668 -CBP44_RS00120 AQ199_RS04215 -CBP44_RS00120 BKB93_RS03555 -CBP44_RS00120 120079 -CBP44_RS00120 G9768_RS03520 -CBP44_RS00120 gnl|Prokka|PADJNBJD_00692 -CBP44_RS00120 L3404_RS03495 -CBP44_RS00120 BKC02_RS03550 -CBP44_RS00120 NILJEPDF_00693 -CBP44_RS00120 LJHENM_03480 -CBP44_RS00120 AOT15_RS04320 -CBP44_RS00120 AP288_RS01885 -CBP44_RS00120 JIEJKO_03485 -CBP44_RS00120 BKC01_RS03550 -CBP44_RS00120 QSDFRQ_00693 -CBP44_RS00120 CTRC943_RS03505 -CBP44_RS00120 BKC03_RS03550 -CBP44_RS00120 CBP48_RS00120 -CBP44_RS00120 CTJTET1_RS03540 -CBP44_RS00120 KW39_RS03535 -CBP44_RS00120 DU10_RS03565 -CBP44_RS00120 SOTONK1_RS03520 -CBP44_RS00120 ECS88FINAL_RS0103605 -CBP44_RS00120 IaCS19096_RS03515 -CBP44_RS00120 C15_RS0103595 -CBP44_RS00120 A5291_RS03565 -CBP44_RS00120 O169_RS03530 -CBP44_RS00120 DU13_RS03565 -CBP44_RS00120 KW36_RS03520 -CBP44_RS00120 AKW53_RS00265 -CBP44_RS00120 BKB95_RS03570 -CBP44_RS00120 CBP42_RS00120 -CBP44_RS00120 SW2_RS03525 -CBP44_RS00120 CTL2C_RS00120 -CBP44_RS00120 L1224_RS03500 -CBP44_RS00120 ECS102511_RS03515 -CBP44_RS00120 AQ244_RS04390 -CBP44_RS00120 L1440_RS03500 -CBP44_RS00120 BKB96_RS03560 -CBP44_RS00120 BKB99_RS03555 -CBP44_RS00305 CBP44_RS00305 -CBP44_RS00305 L2BUCH2_RS03680 -CBP44_RS00305 BKB92_RS03735 -CBP44_RS00305 CTB_RS03740 -CBP44_RS00305 SOTONIA3_RS03720 -CBP44_RS00305 AQ193_RS00290 -CBP44_RS00305 E150_RS03705 -CBP44_RS00305 CTO_RS03735 -CBP44_RS00305 BBV13_RS03740 -CBP44_RS00305 FCS84708_RS03695 -CBP44_RS00305 BBV16_RS03750 -CBP44_RS00305 L2BLST_RS03680 -CBP44_RS00305 119740 -CBP44_RS00305 BW688_RS00305 -CBP44_RS00305 7618241 -CBP44_RS00305 AQ199_RS04395 -CBP44_RS00305 BKB93_RS03740 -CBP44_RS00305 G9768_RS03700 -CBP44_RS00305 gnl|Prokka|PADJNBJD_00728 -CBP44_RS00305 L3404_RS03675 -CBP44_RS00305 BKC02_RS03735 -CBP44_RS00305 NILJEPDF_00729 -CBP44_RS00305 LJHENM_03670 -CBP44_RS00305 AOT15_RS04500 -CBP44_RS00305 AP288_RS02070 -CBP44_RS00305 JIEJKO_03670 -CBP44_RS00305 BKC01_RS03740 -CBP44_RS00305 QSDFRQ_00729 -CBP44_RS00305 CTRC943_RS03685 -CBP44_RS00305 AKW53_RS00440 -CBP44_RS00305 BKC03_RS03735 -CBP44_RS00305 CTJTET1_RS03720 -CBP44_RS00305 KW39_RS03715 -CBP44_RS00305 DU10_RS03750 -CBP44_RS00305 CBP48_RS00305 -CBP44_RS00305 A5291_RS03745 -CBP44_RS00305 SOTONK1_RS03700 -CBP44_RS00305 IaCS19096_RS03695 -CBP44_RS00305 DU13_RS03750 -CBP44_RS00305 C15_RS0103805 -CBP44_RS00305 ECS88FINAL_RS0103805 -CBP44_RS00305 O169_RS03710 -CBP44_RS00305 KW36_RS03700 -CBP44_RS00305 BKB95_RS03755 -CBP44_RS00305 CBP42_RS00305 -CBP44_RS00305 SW2_RS03705 -CBP44_RS00305 CTL2C_RS00300 -CBP44_RS00305 L1224_RS03680 -CBP44_RS00305 ECS102511_RS03695 -CBP44_RS00305 BKB96_RS03740 -CBP44_RS00305 BKB99_RS03735 -CBP44_RS00305 L1440_RS03680 -CBP44_RS00305 AQ244_RS04210 -CBP44_RS00475 CBP44_RS00475 -CBP44_RS00475 L2BUCH2_RS03850 -CBP44_RS00475 AQ193_RS00120 -CBP44_RS00475 BKB92_RS03905 -CBP44_RS00475 CTB_RS03910 -CBP44_RS00475 SOTONIA3_RS03890 -CBP44_RS00475 E150_RS03875 -CBP44_RS00475 CTO_RS03905 -CBP44_RS00475 BBV13_RS03910 -CBP44_RS00475 FCS84708_RS03865 -CBP44_RS00475 7618696 -CBP44_RS00475 L2BLST_RS03850 -CBP44_RS00475 BBV16_RS03920 -CBP44_RS00475 120034 -CBP44_RS00475 BW688_RS00475 -CBP44_RS00475 AQ199_RS04565 -CBP44_RS00475 BKB93_RS03910 -CBP44_RS00475 G9768_RS03870 -CBP44_RS00475 gnl|Prokka|PADJNBJD_00761 -CBP44_RS00475 L3404_RS03845 -CBP44_RS00475 NILJEPDF_00762 -CBP44_RS00475 BKC02_RS03905 -CBP44_RS00475 LJHENM_03835 -CBP44_RS00475 AOT15_RS04670 -CBP44_RS00475 AP288_RS02240 -CBP44_RS00475 JIEJKO_03835 -CBP44_RS00475 QSDFRQ_00762 -CBP44_RS00475 BKC01_RS03910 -CBP44_RS00475 CTRC943_RS03855 -CBP44_RS00475 AKW53_RS00610 -CBP44_RS00475 BKC03_RS03905 -CBP44_RS00475 CBP48_RS00475 -CBP44_RS00475 CTJTET1_RS03890 -CBP44_RS00475 KW39_RS03885 -CBP44_RS00475 DU10_RS03920 -CBP44_RS00475 A5291_RS03915 -CBP44_RS00475 SOTONK1_RS03870 -CBP44_RS00475 IaCS19096_RS03865 -CBP44_RS00475 DU13_RS03920 -CBP44_RS00475 C15_RS0103975 -CBP44_RS00475 ECS88FINAL_RS0103975 -CBP44_RS00475 O169_RS03880 -CBP44_RS00475 KW36_RS03870 -CBP44_RS00475 BKB95_RS03925 -CBP44_RS00475 CBP42_RS00475 -CBP44_RS00475 CTL2C_RS00470 -CBP44_RS00475 L1224_RS03850 -CBP44_RS00475 SW2_RS03875 -CBP44_RS00475 L1440_RS03845 -CBP44_RS00475 ECS102511_RS03865 -CBP44_RS00475 AQ244_RS04040 -CBP44_RS00475 BKB96_RS03910 -CBP44_RS00475 BKB99_RS03905 -CBP44_RS00655 CBP44_RS00655 -CBP44_RS00655 L2BUCH2_RS04030 -CBP44_RS00655 CTB_RS04090 -CBP44_RS00655 BKB92_RS04085 -CBP44_RS00655 SOTONIA3_RS04070 -CBP44_RS00655 E150_RS04055 -CBP44_RS00655 CTO_RS04085 -CBP44_RS00655 BBV13_RS04090 -CBP44_RS00655 FCS84708_RS04045 -CBP44_RS00655 120000 -CBP44_RS00655 L2BLST_RS04030 -CBP44_RS00655 AP288_RS04755 -CBP44_RS00655 BBV16_RS04100 -CBP44_RS00655 7618718 -CBP44_RS00655 BW688_RS00655 -CBP44_RS00655 gnl|Prokka|PADJNBJD_00796 -CBP44_RS00655 AQ199_RS04745 -CBP44_RS00655 BKB93_RS04090 -CBP44_RS00655 G9768_RS04050 -CBP44_RS00655 L3404_RS04025 -CBP44_RS00655 AQ193_RS04740 -CBP44_RS00655 NILJEPDF_00797 -CBP44_RS00655 LJHENM_04010 -CBP44_RS00655 BKC02_RS04085 -CBP44_RS00655 JIEJKO_04010 -CBP44_RS00655 QSDFRQ_00797 -CBP44_RS00655 BKC01_RS04090 -CBP44_RS00655 CTRC943_RS04035 -CBP44_RS00655 CTJTET1_RS04225 -CBP44_RS00655 AKW53_RS00785 -CBP44_RS00655 KW39_RS04065 -CBP44_RS00655 BKC03_RS04085 -CBP44_RS00655 CBP48_RS00655 -CBP44_RS00655 CTJTET1_RS04070 -CBP44_RS00655 DU10_RS04100 -CBP44_RS00655 A5291_RS04095 -CBP44_RS00655 SOTONK1_RS04050 -CBP44_RS00655 ECS88FINAL_RS0104150 -CBP44_RS00655 IaCS19096_RS04045 -CBP44_RS00655 DU13_RS04100 -CBP44_RS00655 C15_RS0104155 -CBP44_RS00655 O169_RS04060 -CBP44_RS00655 KW36_RS04050 -CBP44_RS00655 AQ244_RS03835 -CBP44_RS00655 AOT15_RS02355 -CBP44_RS00655 BKB95_RS04105 -CBP44_RS00655 CBP42_RS00655 -CBP44_RS00655 CTL2C_RS00650 -CBP44_RS00655 L1224_RS04030 -CBP44_RS00655 BKB96_RS04090 -CBP44_RS00655 SW2_RS04055 -CBP44_RS00655 L1440_RS04025 -CBP44_RS00655 ECS102511_RS04045 -CBP44_RS00655 BKB99_RS04085 -CBP44_RS00840 CBP44_RS00840 -CBP44_RS00840 CTB_RS04265 -CBP44_RS00840 L2BUCH2_RS04210 -CBP44_RS00840 SOTONIA3_RS04250 -CBP44_RS00840 BKB92_RS04270 -CBP44_RS00840 CTO_RS04260 -CBP44_RS00840 AQ193_RS04540 -CBP44_RS00840 AP288_RS02535 -CBP44_RS00840 BBV13_RS04275 -CBP44_RS00840 119980 -CBP44_RS00840 E150_RS04240 -CBP44_RS00840 AQ244_RS02530 -CBP44_RS00840 7618731 -CBP44_RS00840 L2BLST_RS04210 -CBP44_RS00840 FCS84708_RS04230 -CBP44_RS00840 AQ199_RS00160 -CBP44_RS00840 BBV16_RS04280 -CBP44_RS00840 BW688_RS00840 -CBP44_RS00840 gnl|Prokka|PADJNBJD_00831 -CBP44_RS00840 NILJEPDF_00832 -CBP44_RS00840 G9768_RS04235 -CBP44_RS00840 L3404_RS04205 -CBP44_RS00840 BKB93_RS04275 -CBP44_RS00840 LJHENM_04185 -CBP44_RS00840 JIEJKO_04185 -CBP44_RS00840 BKC02_RS04270 -CBP44_RS00840 QSDFRQ_00832 -CBP44_RS00840 AKW53_RS00950 -CBP44_RS00840 BKC01_RS04275 -CBP44_RS00840 CTRC943_RS04215 -CBP44_RS00840 AOT15_RS01815 -CBP44_RS00840 CTJTET1_RS04405 -CBP44_RS00840 BKC03_RS04270 -CBP44_RS00840 CBP48_RS00840 -CBP44_RS00840 A5291_RS04270 -CBP44_RS00840 KW39_RS04250 -CBP44_RS00840 SOTONK1_RS04235 -CBP44_RS00840 ECS88FINAL_RS0104320 -CBP44_RS00840 IaCS19096_RS04225 -CBP44_RS00840 DU10_RS04285 -CBP44_RS00840 C15_RS0104345 -CBP44_RS00840 DU13_RS04285 -CBP44_RS00840 O169_RS04245 -CBP44_RS00840 KW36_RS04230 -CBP44_RS00840 BKB95_RS04290 -CBP44_RS00840 CBP42_RS00840 -CBP44_RS00840 CTL2C_RS00830 -CBP44_RS00840 L1224_RS04210 -CBP44_RS00840 BKB96_RS04275 -CBP44_RS00840 L1440_RS04205 -CBP44_RS00840 BKB99_RS04270 -CBP44_RS00840 SW2_RS04240 -CBP44_RS00840 ECS102511_RS04230 -CBP44_RS01015 CBP44_RS01015 -CBP44_RS01015 L2BUCH2_RS04375 -CBP44_RS01015 AQ193_RS04370 -CBP44_RS01015 BKB92_RS04445 -CBP44_RS01015 L2BLST_RS04375 -CBP44_RS01015 E150_RS04410 -CBP44_RS01015 gnl|Prokka|PADJNBJD_00862 -CBP44_RS01015 FCS84708_RS04395 -CBP44_RS01015 AQ199_RS00330 -CBP44_RS01015 BW688_RS01015 -CBP44_RS01015 NILJEPDF_00863 -CBP44_RS01015 LJHENM_04340 -CBP44_RS01015 L3404_RS04370 -CBP44_RS01015 JIEJKO_04340 -CBP44_RS01015 QSDFRQ_00863 -CBP44_RS01015 BKB93_RS04450 -CBP44_RS01015 CTRC943_RS04380 -CBP44_RS01015 AKW53_RS01120 -CBP44_RS01015 CBP48_RS01015 -CBP44_RS01015 KW39_RS04415 -CBP44_RS01015 ECS88FINAL_RS0104490 -CBP44_RS01015 DU10_RS04460 -CBP44_RS01015 DU13_RS04460 -CBP44_RS01015 O169_RS04415 -CBP44_RS01015 CBP42_RS01015 -CBP44_RS01015 CTL2C_RS00995 -CBP44_RS01015 L1224_RS04375 -CBP44_RS01015 L1440_RS04370 -CBP44_RS01015 SW2_RS04405 -CBP44_RS01015 ECS102511_RS04400 -CBP44_RS01015 CTB_RS04430 F -CBP44_RS01015 SOTONIA3_RS04415 F -CBP44_RS01015 CTO_RS04425 F -CBP44_RS01015 AQ244_RS05185 F -CBP44_RS01015 AP288_RS04980 F -CBP44_RS01015 BBV13_RS04440 F -CBP44_RS01015 BBV16_RS04445 F -CBP44_RS01015 7618312 F -CBP44_RS01015 119850 F -CBP44_RS01015 G9768_RS04400 F -CBP44_RS01015 BKC02_RS04445 F -CBP44_RS01015 BKC01_RS04450 F -CBP44_RS01015 AOT15_RS01980 F -CBP44_RS01015 CTJTET1_RS04570 F -CBP44_RS01015 BKC03_RS04445 F -CBP44_RS01015 A5291_RS04435 F -CBP44_RS01015 SOTONK1_RS04400 F -CBP44_RS01015 IaCS19096_RS04395 F -CBP44_RS01015 C15_RS0104510 F -CBP44_RS01015 KW36_RS04400 F -CBP44_RS01015 BKB95_RS04465 F -CBP44_RS01015 BKB96_RS04450 F -CBP44_RS01015 BKB99_RS04445 F -CBP44_RS01190 CBP44_RS01190 -CBP44_RS01190 CTB_RS04590 -CBP44_RS01190 L2BUCH2_RS04540 -CBP44_RS01190 SOTONIA3_RS04575 -CBP44_RS01190 CTO_RS04585 -CBP44_RS01190 AQ193_RS04205 -CBP44_RS01190 BBV13_RS04605 -CBP44_RS01190 BKB92_RS04620 -CBP44_RS01190 AP288_RS02870 -CBP44_RS01190 BBV16_RS04610 -CBP44_RS01190 E150_RS04575 -CBP44_RS01190 gnl|Prokka|PADJNBJD_00895 -CBP44_RS01190 L2BLST_RS04540 -CBP44_RS01190 FCS84708_RS04560 -CBP44_RS01190 AQ199_RS00495 -CBP44_RS01190 AQ244_RS02190 -CBP44_RS01190 NILJEPDF_00896 -CBP44_RS01190 BW688_RS01190 -CBP44_RS01190 119944 -CBP44_RS01190 JIEJKO_04505 -CBP44_RS01190 7618754 -CBP44_RS01190 QSDFRQ_00896 -CBP44_RS01190 G9768_RS04560 -CBP44_RS01190 LJHENM_04515 -CBP44_RS01190 L3404_RS04535 -CBP44_RS01190 BKB93_RS04625 -CBP44_RS01190 BKC02_RS04615 -CBP44_RS01190 AKW53_RS01285 -CBP44_RS01190 BKC01_RS04620 -CBP44_RS01190 CTRC943_RS04545 -CBP44_RS01190 AOT15_RS02140 -CBP44_RS01190 CTJTET1_RS04730 -CBP44_RS01190 KW39_RS04580 -CBP44_RS01190 BKC03_RS04615 -CBP44_RS01190 CBP48_RS01190 -CBP44_RS01190 A5291_RS04595 -CBP44_RS01190 SOTONK1_RS04560 -CBP44_RS01190 ECS88FINAL_RS0104670 -CBP44_RS01190 IaCS19096_RS04555 -CBP44_RS01190 C15_RS0104690 -CBP44_RS01190 DU10_RS04635 -CBP44_RS01190 O169_RS04580 -CBP44_RS01190 KW36_RS04560 -CBP44_RS01190 DU13_RS04635 -CBP44_RS01190 BKB95_RS04635 -CBP44_RS01190 CBP42_RS01190 -CBP44_RS01190 CTL2C_RS01160 -CBP44_RS01190 L1224_RS04540 -CBP44_RS01190 BKB96_RS04620 -CBP44_RS01190 L1440_RS04535 -CBP44_RS01190 BKB99_RS04615 -CBP44_RS01190 SW2_RS04570 -CBP44_RS01190 ECS102511_RS04565 -CBP44_RS01365 CBP44_RS01365 -CBP44_RS01365 L2BUCH2_RS04715 -CBP44_RS01365 SOTONIA3_RS04750 -CBP44_RS01365 AQ244_RS02015 -CBP44_RS01365 BKB92_RS04790 -CBP44_RS01365 L2BLST_RS04715 -CBP44_RS01365 AP288_RS03045 -CBP44_RS01365 gnl|Prokka|PADJNBJD_00929 -CBP44_RS01365 FCS84708_RS04735 -CBP44_RS01365 BW688_RS01365 -CBP44_RS01365 NILJEPDF_00930 -CBP44_RS01365 AQ199_RS00670 -CBP44_RS01365 119915 -CBP44_RS01365 L3404_RS04710 -CBP44_RS01365 JIEJKO_04675 -CBP44_RS01365 QSDFRQ_00930 -CBP44_RS01365 LJHENM_04685 -CBP44_RS01365 7618775 -CBP44_RS01365 BKB93_RS04795 -CBP44_RS01365 BKC02_RS04790 -CBP44_RS01365 CTRC943_RS04720 -CBP44_RS01365 BKC01_RS04795 -CBP44_RS01365 CBP48_RS01365 -CBP44_RS01365 CTJTET1_RS04905 -CBP44_RS01365 AOT15_RS00980 -CBP44_RS01365 BKC03_RS04790 -CBP44_RS01365 SOTONK1_RS04735 -CBP44_RS01365 ECS88FINAL_RS0104835 -CBP44_RS01365 DU10_RS04805 -CBP44_RS01365 O169_RS04755 -CBP44_RS01365 IaCS19096_RS04730 -CBP44_RS01365 C15_RS0104855 -CBP44_RS01365 DU13_RS04805 -CBP44_RS01365 KW36_RS04735 -CBP44_RS01365 CTL2C_RS01335 -CBP44_RS01365 CBP42_RS01365 -CBP44_RS01365 L1224_RS04715 -CBP44_RS01365 L1440_RS04710 -CBP44_RS01365 BKB95_RS04810 -CBP44_RS01365 BKB96_RS04795 -CBP44_RS01365 ECS102511_RS04740 -CBP44_RS01365 BKB99_RS04790 -CBP44_RS01365 CTB_RS04760 -CBP44_RS01365 BBV13_RS04775 -CBP44_RS01365 CTO_RS04755 -CBP44_RS01365 BBV16_RS04780 -CBP44_RS01365 E150_RS04750 -CBP44_RS01365 G9768_RS04735 -CBP44_RS01365 A5291_RS04765 -CBP44_RS01365 SW2_RS04745 -CBP44_RS01365 AQ193_RS04030 -CBP44_RS01365 AKW53_RS01460 -CBP44_RS01530 CBP44_RS01530 -CBP44_RS01530 E150_RS00130 -CBP44_RS01530 L2BUCH2_RS00130 -CBP44_RS01530 BKB93_RS00135 -CBP44_RS01530 FCS84708_RS00130 -CBP44_RS01530 AP288_RS03200 -CBP44_RS01530 AQ193_RS03875 -CBP44_RS01530 BBV13_RS00135 -CBP44_RS01530 AQ244_RS01860 -CBP44_RS01530 G9768_RS00130 -CBP44_RS01530 AQ199_RS00825 -CBP44_RS01530 BW688_RS01525 -CBP44_RS01530 L2BLST_RS00130 -CBP44_RS01530 BKC02_RS00135 -CBP44_RS01530 BBV16_RS00135 -CBP44_RS01530 BKC01_RS00135 -CBP44_RS01530 gnl|Prokka|PADJNBJD_00027 -CBP44_RS01530 LJHENM_00135 -CBP44_RS01530 A5291_RS00130 -CBP44_RS01530 SOTONK1_RS00130 -CBP44_RS01530 JIEJKO_00130 -CBP44_RS01530 7618366 -CBP44_RS01530 NILJEPDF_00027 -CBP44_RS01530 L3404_RS00130 -CBP44_RS01530 IaCS19096_RS00130 -CBP44_RS01530 BKC03_RS00135 -CBP44_RS01530 C15_RS0100130 -CBP44_RS01530 QSDFRQ_00027 -CBP44_RS01530 CTJTET1_RS00130 -CBP44_RS01530 DU10_RS00135 -CBP44_RS01530 CTRC943_RS00130 -CBP44_RS01530 O169_RS00130 -CBP44_RS01530 CBP48_RS01525 -CBP44_RS01530 ECS88FINAL_RS0100135 -CBP44_RS01530 DU13_RS00135 -CBP44_RS01530 KW39_RS00130 -CBP44_RS01530 KW36_RS00130 -CBP44_RS01530 BKB95_RS00135 -CBP44_RS01530 AOT15_RS00825 -CBP44_RS01530 SW2_RS00130 -CBP44_RS01530 ECS102511_RS00130 -CBP44_RS01530 CTB_RS00130 -CBP44_RS01530 CTL2C_RS01495 -CBP44_RS01530 CBP42_RS01525 -CBP44_RS01530 L1224_RS00130 -CBP44_RS01530 BKB96_RS00135 -CBP44_RS01530 BKB99_RS00135 -CBP44_RS01530 CTO_RS00130 -CBP44_RS01530 SOTONIA3_RS00130 -CBP44_RS01530 L1440_RS00130 -CBP44_RS01530 BKB92_RS00135 -CBP44_RS01530 119222 -CBP44_RS01700 CBP44_RS01700 -CBP44_RS01700 120627 -CBP44_RS01700 E150_RS00300 -CBP44_RS01700 L2BUCH2_RS00300 -CBP44_RS01700 BKB93_RS00305 -CBP44_RS01700 FCS84708_RS00300 -CBP44_RS01700 AP288_RS03370 -CBP44_RS01700 AQ193_RS03695 -CBP44_RS01700 AQ244_RS01690 -CBP44_RS01700 BBV13_RS00305 -CBP44_RS01700 AQ199_RS00995 -CBP44_RS01700 BW688_RS01695 -CBP44_RS01700 G9768_RS00300 -CBP44_RS01700 L2BLST_RS00300 -CBP44_RS01700 BKC02_RS00305 -CBP44_RS01700 BBV16_RS00305 -CBP44_RS01700 gnl|Prokka|PADJNBJD_00059 -CBP44_RS01700 NILJEPDF_00059 -CBP44_RS01700 LJHENM_00300 -CBP44_RS01700 BKC01_RS00305 -CBP44_RS01700 A5291_RS00300 -CBP44_RS01700 SOTONK1_RS00300 -CBP44_RS01700 L3404_RS00300 -CBP44_RS01700 JIEJKO_00300 -CBP44_RS01700 AKW53_RS01790 -CBP44_RS01700 QSDFRQ_00059 -CBP44_RS01700 IaCS19096_RS00300 -CBP44_RS01700 BKC03_RS00305 -CBP44_RS01700 C15_RS0100305 -CBP44_RS01700 DU10_RS00305 -CBP44_RS01700 7618803 -CBP44_RS01700 CTRC943_RS00300 -CBP44_RS01700 CTJTET1_RS00300 -CBP44_RS01700 O169_RS00300 -CBP44_RS01700 KW36_RS00300 -CBP44_RS01700 DU13_RS00310 -CBP44_RS01700 CBP48_RS01695 -CBP44_RS01700 ECS88FINAL_RS0100310 -CBP44_RS01700 KW39_RS00300 -CBP44_RS01700 AOT15_RS00655 -CBP44_RS01700 BKB95_RS00305 -CBP44_RS01700 SW2_RS00300 -CBP44_RS01700 ECS102511_RS00300 -CBP44_RS01700 CTL2C_RS01665 -CBP44_RS01700 CBP42_RS01695 -CBP44_RS01700 CTB_RS00300 -CBP44_RS01700 BKB96_RS00305 -CBP44_RS01700 L1224_RS00300 -CBP44_RS01700 BKB99_RS00305 -CBP44_RS01700 L1440_RS00300 -CBP44_RS01700 BKB92_RS00305 -CBP44_RS01700 CTO_RS00300 -CBP44_RS01700 SOTONIA3_RS00300 -CBP44_RS02375 CBP44_RS02375 -CBP44_RS02375 AQ199_RS01670 -CBP44_RS02375 L2BLST_RS00965 -CBP44_RS02375 BW688_RS02375 -CBP44_RS02375 BBV13_RS01010 -CBP44_RS02375 G9768_RS00985 -CBP44_RS02375 BKC02_RS00980 -CBP44_RS02375 L3404_RS00960 -CBP44_RS02375 AKW53_RS02470 -CBP44_RS02375 120525 -CBP44_RS02375 BBV16_RS01010 -CBP44_RS02375 BKC01_RS00980 -CBP44_RS02375 DU10_RS00990 -CBP44_RS02375 gnl|Prokka|PADJNBJD_00192 -CBP44_RS02375 AQ193_RS03015 -CBP44_RS02375 BKC03_RS00980 -CBP44_RS02375 NILJEPDF_00192 -CBP44_RS02375 LJHENM_00965 -CBP44_RS02375 CTRC943_RS00965 -CBP44_RS02375 CTJTET1_RS00995 -CBP44_RS02375 C15_RS0101015 -CBP44_RS02375 SOTONK1_RS00980 -CBP44_RS02375 ECS88FINAL_RS0101000 -CBP44_RS02375 KW39_RS00985 -CBP44_RS02375 JIEJKO_00965 -CBP44_RS02375 7618863 -CBP44_RS02375 A5291_RS01005 -CBP44_RS02375 IaCS19096_RS00980 -CBP44_RS02375 QSDFRQ_00192 -CBP44_RS02375 O169_RS00985 -CBP44_RS02375 DU13_RS00990 -CBP44_RS02375 SW2_RS00975 -CBP44_RS02375 BKB95_RS00995 -CBP44_RS02375 CBP48_RS02370 -CBP44_RS02375 KW36_RS00980 -CBP44_RS02375 ECS102511_RS00975 -CBP44_RS02375 BKB96_RS00980 -CBP44_RS02375 CTL2C_RS02330 -CBP44_RS02375 BKB99_RS00980 -CBP44_RS02375 L1224_RS00960 -CBP44_RS02375 L1440_RS00960 -CBP44_RS02375 AQ244_RS03160 -CBP44_RS02375 BKB92_RS00980 -CBP44_RS02375 CBP42_RS02370 -CBP44_RS02375 SOTONIA3_RS00995 -CBP44_RS02375 E150_RS00975 -CBP44_RS02375 CTB_RS01005 -CBP44_RS02375 L2BUCH2_RS00965 -CBP44_RS02375 CTO_RS01005 -CBP44_RS02375 FCS84708_RS00975 -CBP44_RS02375 AOT15_RS01385 -CBP44_RS02375 AP288_RS04045 -CBP44_RS02375 BKB93_RS00980 -CBP44_RS02545 CBP44_RS02545 -CBP44_RS02545 AQ199_RS01840 -CBP44_RS02545 L2BLST_RS01135 -CBP44_RS02545 BW688_RS02545 -CBP44_RS02545 BBV13_RS01180 -CBP44_RS02545 G9768_RS01155 -CBP44_RS02545 BKC02_RS01150 -CBP44_RS02545 L3404_RS01130 -CBP44_RS02545 AKW53_RS02640 -CBP44_RS02545 BBV16_RS01180 -CBP44_RS02545 BKC01_RS01150 -CBP44_RS02545 119389 -CBP44_RS02545 DU10_RS01160 -CBP44_RS02545 gnl|Prokka|PADJNBJD_00226 -CBP44_RS02545 AQ193_RS02845 -CBP44_RS02545 BKC03_RS01150 -CBP44_RS02545 NILJEPDF_00226 -CBP44_RS02545 LJHENM_01135 -CBP44_RS02545 CTRC943_RS01135 -CBP44_RS02545 CTJTET1_RS01165 -CBP44_RS02545 C15_RS0101185 -CBP44_RS02545 SOTONK1_RS01150 -CBP44_RS02545 ECS88FINAL_RS0101170 -CBP44_RS02545 KW39_RS01155 -CBP44_RS02545 JIEJKO_01135 -CBP44_RS02545 A5291_RS01175 -CBP44_RS02545 IaCS19096_RS01150 -CBP44_RS02545 7618471 -CBP44_RS02545 QSDFRQ_00226 -CBP44_RS02545 O169_RS01155 -CBP44_RS02545 DU13_RS01160 -CBP44_RS02545 SW2_RS01145 -CBP44_RS02545 BKB95_RS01165 -CBP44_RS02545 CBP48_RS02540 -CBP44_RS02545 KW36_RS01150 -CBP44_RS02545 ECS102511_RS01145 -CBP44_RS02545 BKB96_RS01150 -CBP44_RS02545 CTL2C_RS02500 -CBP44_RS02545 BKB99_RS01150 -CBP44_RS02545 L1224_RS01130 -CBP44_RS02545 L1440_RS01130 -CBP44_RS02545 AQ244_RS03330 -CBP44_RS02545 BKB92_RS01150 -CBP44_RS02545 CBP42_RS02540 -CBP44_RS02545 SOTONIA3_RS01165 -CBP44_RS02545 E150_RS01145 -CBP44_RS02545 CTB_RS01175 -CBP44_RS02545 L2BUCH2_RS01135 -CBP44_RS02545 CTO_RS01175 -CBP44_RS02545 FCS84708_RS01145 -CBP44_RS02545 AOT15_RS01215 -CBP44_RS02545 AP288_RS04215 -CBP44_RS02545 BKB93_RS01150 -CBP44_RS02715 CBP44_RS02715 -CBP44_RS02715 AQ199_RS02010 -CBP44_RS02715 L2BLST_RS01305 -CBP44_RS02715 BBV13_RS01350 -CBP44_RS02715 BW688_RS02715 -CBP44_RS02715 G9768_RS01325 -CBP44_RS02715 BKC02_RS01320 -CBP44_RS02715 BBV16_RS01350 -CBP44_RS02715 L3404_RS01300 -CBP44_RS02715 AKW53_RS02810 -CBP44_RS02715 BKC01_RS01320 -CBP44_RS02715 gnl|Prokka|PADJNBJD_00259 -CBP44_RS02715 DU10_RS01330 -CBP44_RS02715 NILJEPDF_00259 -CBP44_RS02715 LJHENM_01300 -CBP44_RS02715 AQ193_RS02675 -CBP44_RS02715 BKC03_RS01320 -CBP44_RS02715 CTRC943_RS01305 -CBP44_RS02715 CTJTET1_RS01335 -CBP44_RS02715 KW39_RS01325 -CBP44_RS02715 JIEJKO_01300 -CBP44_RS02715 120470 -CBP44_RS02715 C15_RS0101355 -CBP44_RS02715 SOTONK1_RS01320 -CBP44_RS02715 ECS88FINAL_RS0101340 -CBP44_RS02715 QSDFRQ_00259 -CBP44_RS02715 A5291_RS01345 -CBP44_RS02715 O169_RS01325 -CBP44_RS02715 IaCS19096_RS01320 -CBP44_RS02715 DU13_RS01330 -CBP44_RS02715 7618898 -CBP44_RS02715 SW2_RS01315 -CBP44_RS02715 BKB95_RS01335 -CBP44_RS02715 CBP48_RS02710 -CBP44_RS02715 KW36_RS01320 -CBP44_RS02715 ECS102511_RS01315 -CBP44_RS02715 BKB96_RS01320 -CBP44_RS02715 CTL2C_RS02670 -CBP44_RS02715 BKB99_RS01320 -CBP44_RS02715 L1224_RS01300 -CBP44_RS02715 L1440_RS01300 -CBP44_RS02715 AQ244_RS03500 -CBP44_RS02715 BKB92_RS01320 -CBP44_RS02715 CBP42_RS02710 -CBP44_RS02715 SOTONIA3_RS01335 -CBP44_RS02715 CTB_RS01345 -CBP44_RS02715 E150_RS01315 -CBP44_RS02715 L2BUCH2_RS01305 -CBP44_RS02715 CTO_RS01345 -CBP44_RS02715 FCS84708_RS01315 -CBP44_RS02715 AOT15_RS01045 -CBP44_RS02715 AP288_RS04385 -CBP44_RS02715 BKB93_RS01320 -CBP44_RS03045 CBP44_RS03045 -CBP44_RS03045 BKB93_RS01655 -CBP44_RS03045 L2BLST_RS01630 -CBP44_RS03045 AQ199_RS02335 -CBP44_RS03045 BW688_RS03050 -CBP44_RS03045 BBV13_RS01680 -CBP44_RS03045 G9768_RS01650 -CBP44_RS03045 BKC02_RS01650 -CBP44_RS03045 L3404_RS01625 -CBP44_RS03045 AKW53_RS03140 -CBP44_RS03045 BBV16_RS01680 -CBP44_RS03045 AQ193_RS02345 -CBP44_RS03045 BKC01_RS01655 -CBP44_RS03045 gnl|Prokka|PADJNBJD_00324 -CBP44_RS03045 NILJEPDF_00324 -CBP44_RS03045 LJHENM_01630 -CBP44_RS03045 CTRC943_RS01630 -CBP44_RS03045 BKC03_RS01650 -CBP44_RS03045 DU10_RS01665 -CBP44_RS03045 CTJTET1_RS01660 -CBP44_RS03045 KW39_RS01650 -CBP44_RS03045 JIEJKO_01630 -CBP44_RS03045 C15_RS0101690 -CBP44_RS03045 SOTONK1_RS01650 -CBP44_RS03045 ECS88FINAL_RS0101670 -CBP44_RS03045 QSDFRQ_00324 -CBP44_RS03045 IaCS19096_RS01645 -CBP44_RS03045 120394 -CBP44_RS03045 A5291_RS01675 -CBP44_RS03045 O169_RS01655 -CBP44_RS03045 DU13_RS01660 -CBP44_RS03045 CBP48_RS03040 -CBP44_RS03045 7618940 -CBP44_RS03045 SW2_RS01640 -CBP44_RS03045 BKB95_RS01665 -CBP44_RS03045 CTL2C_RS02995 -CBP44_RS03045 KW36_RS01645 -CBP44_RS03045 ECS102511_RS01640 -CBP44_RS03045 AOT15_RS02645 -CBP44_RS03045 BKB96_RS01650 -CBP44_RS03045 L1224_RS01625 -CBP44_RS03045 BKB99_RS01650 -CBP44_RS03045 L1440_RS01625 -CBP44_RS03045 CBP42_RS03040 -CBP44_RS03045 SOTONIA3_RS01660 -CBP44_RS03045 AP288_RS01440 -CBP44_RS03045 BKB92_RS01655 -CBP44_RS03045 CTB_RS01675 -CBP44_RS03045 E150_RS01645 -CBP44_RS03045 L2BUCH2_RS01630 -CBP44_RS03045 CTO_RS01670 -CBP44_RS03045 FCS84708_RS01640 -7618330 7618330 -7618330 JIEJKO_04455 -7618330 QSDFRQ_00886 -7618330 G9768_RS04510 -7618330 LJHENM_04465 -7618330 L3404_RS04485 -7618330 BKB93_RS04575 -7618330 BKC02_RS04565 -7618330 AKW53_RS01235 -7618330 BKC01_RS04570 -7618330 CTRC943_RS04495 -7618330 AOT15_RS02090 -7618330 CTJTET1_RS04680 -7618330 KW39_RS04530 -7618330 BKC03_RS04565 -7618330 CBP48_RS01140 -7618330 A5291_RS04545 -7618330 SOTONK1_RS04510 -7618330 ECS88FINAL_RS0104615 -7618330 IaCS19096_RS04505 -7618330 C15_RS0104635 -7618330 AQ193_RS04255 -7618330 DU10_RS04585 -7618330 O169_RS04530 -7618330 KW36_RS04510 -7618330 DU13_RS04585 -7618330 AQ244_RS02240 -7618330 BKB95_RS04585 -7618330 CBP42_RS01140 -7618330 CTL2C_RS01110 -7618330 L1224_RS04490 -7618330 BKB96_RS04570 -7618330 L1440_RS04485 -7618330 BKB99_RS04565 -7618330 SW2_RS04520 -7618330 ECS102511_RS04515 -7618330 CBP44_RS01140 -7618330 CTB_RS04540 -7618330 L2BUCH2_RS04490 -7618330 SOTONIA3_RS04525 -7618330 CTO_RS04535 -7618330 BBV13_RS04555 -7618330 BKB92_RS04570 -7618330 AP288_RS02820 -7618330 BBV16_RS04560 -7618330 E150_RS04525 -7618330 gnl|Prokka|PADJNBJD_00885 -7618330 L2BLST_RS04490 -7618330 FCS84708_RS04510 -7618330 AQ199_RS00445 -7618330 NILJEPDF_00886 -7618330 BW688_RS01140 -7618330 119876 -7618905 7618905 -7618905 SW2_RS01390 -7618905 BKB95_RS01415 -7618905 CBP48_RS02790 -7618905 KW36_RS01395 -7618905 ECS102511_RS01390 -7618905 AOT15_RS02395 -7618905 BKB96_RS01400 -7618905 CTL2C_RS02745 -7618905 BKB99_RS01400 -7618905 L1224_RS01375 -7618905 L1440_RS01375 -7618905 AQ244_RS03580 -7618905 CBP42_RS02790 -7618905 SOTONIA3_RS01410 -7618905 BKB92_RS01405 -7618905 CTB_RS01425 -7618905 E150_RS01395 -7618905 L2BUCH2_RS01380 -7618905 CTO_RS01420 -7618905 FCS84708_RS01390 -7618905 AP288_RS04460 -7618905 BKB93_RS01405 -7618905 CBP44_RS02795 -7618905 AQ199_RS02085 -7618905 L2BLST_RS01380 -7618905 BBV13_RS01430 -7618905 BW688_RS02795 -7618905 G9768_RS01400 -7618905 BKC02_RS01400 -7618905 BBV16_RS01430 -7618905 L3404_RS01375 -7618905 AKW53_RS02885 -7618905 BKC01_RS01405 -7618905 gnl|Prokka|PADJNBJD_00274 -7618905 DU10_RS01410 -7618905 NILJEPDF_00274 -7618905 LJHENM_01380 -7618905 BKC03_RS01400 -7618905 CTRC943_RS01380 -7618905 CTJTET1_RS01410 -7618905 KW39_RS01400 -7618905 AQ193_RS02595 -7618905 JIEJKO_01380 -7618905 120459 -7618905 C15_RS0101435 -7618905 SOTONK1_RS01400 -7618905 ECS88FINAL_RS0101420 -7618905 QSDFRQ_00274 -7618905 IaCS19096_RS01395 -7618905 A5291_RS01425 -7618905 O169_RS01405 -7618905 DU13_RS01410 -7618994 7618994 -7618994 BKB96_RS02235 -7618994 BKB99_RS02230 -7618994 CBP48_RS03635 -7618994 CTL2C_RS03570 -7618994 KW36_RS02215 -7618994 AOT15_RS03215 -7618994 BKB95_RS02250 -7618994 120306 -7618994 L1224_RS02200 -7618994 SW2_RS02225 -7618994 ECS102511_RS02220 -7618994 L1440_RS02200 -7618994 CBP42_RS03645 -7618994 CTB_RS02250 -7618994 L2BUCH2_RS02195 -7618994 BKB92_RS02240 -7618994 SOTONIA3_RS02235 -7618994 AP288_RS00860 -7618994 CTO_RS02250 -7618994 E150_RS02225 -7618994 BW688_RS03630 -7618994 L2BLST_RS02200 -7618994 FCS84708_RS02215 -7618994 BBV13_RS02255 -7618994 CBP44_RS03640 -7618994 BKB93_RS02245 -7618994 AQ244_RS00890 -7618994 AQ199_RS02915 -7618994 G9768_RS02220 -7618994 BBV16_RS02260 -7618994 L3404_RS02195 -7618994 BKC02_RS02230 -7618994 BKC01_RS02230 -7618994 AKW53_RS03720 -7618994 gnl|Prokka|PADJNBJD_00438 -7618994 NILJEPDF_00438 -7618994 CTRC943_RS02200 -7618994 AQ193_RS01765 -7618994 LJHENM_02210 -7618994 JIEJKO_02205 -7618994 BKC03_RS02230 -7618994 CTJTET1_RS02230 -7618994 QSDFRQ_00438 -7618994 C15_RS0102265 -7618994 SOTONK1_RS02220 -7618994 DU10_RS02255 -7618994 A5291_RS02250 -7618994 KW39_RS02230 -7618994 IaCS19096_RS02215 -7618994 ECS88FINAL_RS0102265 -7618994 O169_RS02230 -7618994 DU13_RS02250 -120574 120574 -120574 AQ199_RS01310 -120574 L2BLST_RS00615 -120574 BBV13_RS00625 -120574 BW688_RS02015 -120574 G9768_RS00615 -120574 BKC02_RS00625 -120574 BBV16_RS00625 -120574 gnl|Prokka|PADJNBJD_00121 -120574 LJHENM_00605 -120574 AKW53_RS02110 -120574 BKC01_RS00625 -120574 NILJEPDF_00121 -120574 L3404_RS00615 -120574 A5291_RS00620 -120574 SOTONK1_RS00615 -120574 AQ193_RS03380 -120574 JIEJKO_00610 -120574 QSDFRQ_00121 -120574 IaCS19096_RS00615 -120574 BKC03_RS00625 -120574 C15_RS0100635 -120574 CTRC943_RS00615 -120574 CTJTET1_RS00615 -120574 KW39_RS00615 -120574 DU10_RS00625 -120574 ECS88FINAL_RS0100635 -120574 O169_RS00615 -120574 DU13_RS00630 -120574 7618837 -120574 KW36_RS00615 -120574 CBP48_RS02015 -120574 SW2_RS00615 -120574 BKB95_RS00625 -120574 ECS102511_RS00615 -120574 CTL2C_RS01980 -120574 CTB_RS00620 -120574 L1224_RS00615 -120574 AQ244_RS02790 -120574 BKB96_RS00625 -120574 CBP42_RS02015 -120574 AOT15_RS00340 -120574 BKB99_RS00625 -120574 L1440_RS00615 -120574 BKB92_RS00625 -120574 SOTONIA3_RS00615 -120574 CTO_RS00620 -120574 E150_RS00615 -120574 L2BUCH2_RS00615 -120574 CBP44_RS02020 -120574 FCS84708_RS00615 -120574 AP288_RS03685 -120574 BKB93_RS00625 -119335 119335 -119335 AQ199_RS01480 -119335 BBV13_RS00795 -119335 G9768_RS00785 -119335 L2BLST_RS00785 -119335 BW688_RS02185 -119335 BBV16_RS00795 -119335 BKC02_RS00795 -119335 gnl|Prokka|PADJNBJD_00155 -119335 LJHENM_00775 -119335 AKW53_RS02280 -119335 BKC01_RS00795 -119335 NILJEPDF_00155 -119335 A5291_RS00790 -119335 L3404_RS00785 -119335 SOTONK1_RS00785 -119335 AQ193_RS03210 -119335 JIEJKO_00780 -119335 QSDFRQ_00155 -119335 CTJTET1_RS00785 -119335 IaCS19096_RS00785 -119335 BKC03_RS00795 -119335 C15_RS0100810 -119335 CTRC943_RS00785 -119335 ECS88FINAL_RS0100810 -119335 KW39_RS00785 -119335 DU10_RS00795 -119335 O169_RS00785 -119335 DU13_RS00800 -119335 KW36_RS00785 -119335 CBP48_RS02185 -119335 SW2_RS00785 -119335 BKB95_RS00795 -119335 7618439 -119335 ECS102511_RS00785 -119335 CTL2C_RS02150 -119335 CTB_RS00790 -119335 L1224_RS00785 -119335 AQ244_RS02960 -119335 BKB96_RS00795 -119335 CBP42_RS02185 -119335 L1440_RS00785 -119335 AOT15_RS00170 -119335 BKB99_RS00795 -119335 CTO_RS00790 -119335 BKB92_RS00795 -119335 SOTONIA3_RS00785 -119335 E150_RS00785 -119335 L2BUCH2_RS00785 -119335 CBP44_RS02190 -119335 FCS84708_RS00785 -119335 AP288_RS03855 -119335 BKB93_RS00795 -119589 119589 -119589 AOT15_RS03560 -119589 CBP42_RS03965 -119589 L2BUCH2_RS02515 -119589 CTB_RS02570 -119589 SOTONIA3_RS02550 -119589 BKB92_RS02560 -119589 E150_RS02540 -119589 BW688_RS03955 -119589 CTO_RS02570 -119589 L2BLST_RS02515 -119589 FCS84708_RS02530 -119589 BBV13_RS02575 -119589 CBP44_RS03960 -119589 AKW53_RS04680 -119589 AQ199_RS03230 -119589 BBV16_RS02585 -119589 BKB93_RS02565 -119589 G9768_RS02535 -119589 L3404_RS02510 -119589 BKC02_RS02555 -119589 gnl|Prokka|PADJNBJD_00499 -119589 AP288_RS00545 -119589 NILJEPDF_00499 -119589 BKC01_RS02555 -119589 LJHENM_02515 -119589 CTRC943_RS02515 -119589 JIEJKO_02515 -119589 QSDFRQ_00499 -119589 SOTONK1_RS02535 -119589 BKC03_RS02555 -119589 CTJTET1_RS02545 -119589 KW39_RS02545 -119589 IaCS19096_RS02530 -119589 AQ244_RS00575 -119589 C15_RS0102595 -119589 ECS88FINAL_RS0102590 -119589 DU10_RS02575 -119589 A5291_RS02570 -119589 O169_RS02545 -119589 7618598 -119589 DU13_RS02570 -119589 CBP48_RS03955 -119589 CTL2C_RS03885 -119589 KW36_RS02530 -119589 BKB96_RS02560 -119589 BKB99_RS02555 -119589 L1224_RS02515 -119589 BKB95_RS02570 -119589 SW2_RS02540 -119589 ECS102511_RS02535 -119589 L1440_RS02515 -119589 AQ193_RS01450 -120230 120230 -120230 AQ193_RS01295 -120230 CBP42_RS04125 -120230 L2BUCH2_RS02670 -120230 SOTONIA3_RS02705 -120230 BKB92_RS02720 -120230 CTB_RS02725 -120230 E150_RS02695 -120230 BW688_RS04115 -120230 CTO_RS02725 -120230 FCS84708_RS02685 -120230 L2BLST_RS02670 -120230 BBV13_RS02730 -120230 CBP44_RS04120 -120230 AQ199_RS03385 -120230 BKB93_RS02725 -120230 BBV16_RS02740 -120230 G9768_RS02690 -120230 L3404_RS02665 -120230 AKW53_RS04525 -120230 BKC02_RS02715 -120230 gnl|Prokka|PADJNBJD_00530 -120230 NILJEPDF_00530 -120230 BKC01_RS02715 -120230 LJHENM_02670 -120230 CTRC943_RS02670 -120230 AOT15_RS01490 -120230 QSDFRQ_00530 -120230 AP288_RS00390 -120230 JIEJKO_02675 -120230 SOTONK1_RS02690 -120230 CTJTET1_RS02700 -120230 BKC03_RS02715 -120230 KW39_RS02700 -120230 C15_RS0102760 -120230 ECS88FINAL_RS0102755 -120230 IaCS19096_RS02685 -120230 DU10_RS02735 -120230 O169_RS02700 -120230 A5291_RS02725 -120230 AQ244_RS00420 -120230 DU13_RS02730 -120230 CBP48_RS04115 -120230 7619041 -120230 CTL2C_RS04040 -120230 KW36_RS02685 -120230 BKB95_RS02730 -120230 BKB96_RS02720 -120230 BKB99_RS02715 -120230 SW2_RS02695 -120230 L1224_RS02670 -120230 ECS102511_RS02690 -120230 L1440_RS02670 -119924 119924 -119924 JIEJKO_04620 -119924 QSDFRQ_00919 -119924 LJHENM_04630 -119924 L3404_RS04660 -119924 7618769 -119924 G9768_RS04685 -119924 BKB93_RS04745 -119924 BKC02_RS04735 -119924 CTRC943_RS04670 -119924 AKW53_RS01410 -119924 BKC01_RS04740 -119924 AOT15_RS02265 -119924 CTJTET1_RS04855 -119924 CBP48_RS01315 -119924 KW39_RS04705 -119924 BKC03_RS04735 -119924 SOTONK1_RS04685 -119924 AQ193_RS04080 -119924 A5291_RS04715 -119924 ECS88FINAL_RS0104785 -119924 IaCS19096_RS04680 -119924 C15_RS0104805 -119924 DU10_RS04755 -119924 O169_RS04705 -119924 KW36_RS04685 -119924 AQ244_RS02065 -119924 DU13_RS04755 -119924 CTL2C_RS01285 -119924 CBP42_RS01315 -119924 L1224_RS04665 -119924 BKB95_RS04755 -119924 L1440_RS04660 -119924 BKB96_RS04740 -119924 BKB99_RS04735 -119924 SW2_RS04695 -119924 ECS102511_RS04690 -119924 CBP44_RS01315 -119924 L2BUCH2_RS04665 -119924 CTB_RS04710 -119924 SOTONIA3_RS04700 -119924 AP288_RS02995 -119924 BKB92_RS04740 -119924 gnl|Prokka|PADJNBJD_00918 -119924 CTO_RS04705 -119924 L2BLST_RS04665 -119924 BBV13_RS04725 -119924 E150_RS04700 -119924 BBV16_RS04730 -119924 NILJEPDF_00919 -119924 FCS84708_RS04685 -119924 AQ199_RS00620 -119924 BW688_RS01315 -NILJEPDF_00782 NILJEPDF_00782 -NILJEPDF_00782 BKC02_RS04005 -NILJEPDF_00782 LJHENM_03935 -NILJEPDF_00782 AOT15_RS04770 -NILJEPDF_00782 AP288_RS02340 -NILJEPDF_00782 JIEJKO_03935 -NILJEPDF_00782 QSDFRQ_00782 -NILJEPDF_00782 BKC01_RS04010 -NILJEPDF_00782 CTRC943_RS03955 -NILJEPDF_00782 AKW53_RS00710 -NILJEPDF_00782 BKC03_RS04005 -NILJEPDF_00782 CBP48_RS00575 -NILJEPDF_00782 CTJTET1_RS03990 -NILJEPDF_00782 KW39_RS03985 -NILJEPDF_00782 AQ244_RS03940 -NILJEPDF_00782 DU10_RS04020 -NILJEPDF_00782 A5291_RS04015 -NILJEPDF_00782 SOTONK1_RS03970 -NILJEPDF_00782 IaCS19096_RS03965 -NILJEPDF_00782 DU13_RS04020 -NILJEPDF_00782 C15_RS0104075 -NILJEPDF_00782 ECS88FINAL_RS0104080 -NILJEPDF_00782 O169_RS03980 -NILJEPDF_00782 KW36_RS03970 -NILJEPDF_00782 AQ193_RS00020 -NILJEPDF_00782 BKB95_RS04025 -NILJEPDF_00782 CBP42_RS00575 -NILJEPDF_00782 CTL2C_RS00570 -NILJEPDF_00782 L1224_RS03950 -NILJEPDF_00782 SW2_RS03975 -NILJEPDF_00782 L1440_RS03945 -NILJEPDF_00782 ECS102511_RS03965 -NILJEPDF_00782 BKB96_RS04010 -NILJEPDF_00782 BKB99_RS04005 -NILJEPDF_00782 CBP44_RS00575 -NILJEPDF_00782 L2BUCH2_RS03950 -NILJEPDF_00782 BKB92_RS04005 -NILJEPDF_00782 CTB_RS04010 -NILJEPDF_00782 SOTONIA3_RS03990 -NILJEPDF_00782 E150_RS03975 -NILJEPDF_00782 CTO_RS04005 -NILJEPDF_00782 BBV13_RS04010 -NILJEPDF_00782 FCS84708_RS03965 -NILJEPDF_00782 L2BLST_RS03950 -NILJEPDF_00782 BBV16_RS04020 -NILJEPDF_00782 7618707 -NILJEPDF_00782 120017 -NILJEPDF_00782 BW688_RS00575 -NILJEPDF_00782 AQ199_RS04665 -NILJEPDF_00782 BKB93_RS04010 -NILJEPDF_00782 G9768_RS03970 -NILJEPDF_00782 gnl|Prokka|PADJNBJD_00781 -NILJEPDF_00782 L3404_RS03945 -QSDFRQ_00110 QSDFRQ_00110 -QSDFRQ_00110 IaCS19096_RS00560 -QSDFRQ_00110 BKC03_RS00570 -QSDFRQ_00110 C15_RS0100575 -QSDFRQ_00110 CTJTET1_RS00560 -QSDFRQ_00110 KW39_RS00560 -QSDFRQ_00110 DU10_RS00570 -QSDFRQ_00110 CTRC943_RS00560 -QSDFRQ_00110 ECS88FINAL_RS0100575 -QSDFRQ_00110 O169_RS00560 -QSDFRQ_00110 AOT15_RS00395 -QSDFRQ_00110 DU13_RS00575 -QSDFRQ_00110 7618408 -QSDFRQ_00110 KW36_RS00560 -QSDFRQ_00110 CBP48_RS01960 -QSDFRQ_00110 SW2_RS00560 -QSDFRQ_00110 BKB95_RS00570 -QSDFRQ_00110 ECS102511_RS00560 -QSDFRQ_00110 CTL2C_RS01925 -QSDFRQ_00110 CTB_RS00565 -QSDFRQ_00110 AQ244_RS02735 -QSDFRQ_00110 BKB96_RS00570 -QSDFRQ_00110 CBP42_RS01960 -QSDFRQ_00110 L1224_RS00560 -QSDFRQ_00110 BKB99_RS00570 -QSDFRQ_00110 BKB92_RS00570 -QSDFRQ_00110 SOTONIA3_RS00560 -QSDFRQ_00110 L1440_RS00560 -QSDFRQ_00110 CTO_RS00565 -QSDFRQ_00110 E150_RS00560 -QSDFRQ_00110 CBP44_RS01965 -QSDFRQ_00110 119287 -QSDFRQ_00110 L2BUCH2_RS00560 -QSDFRQ_00110 FCS84708_RS00560 -QSDFRQ_00110 AP288_RS03630 -QSDFRQ_00110 BKB93_RS00570 -QSDFRQ_00110 AQ193_RS03435 -QSDFRQ_00110 AQ199_RS01255 -QSDFRQ_00110 BBV13_RS00570 -QSDFRQ_00110 G9768_RS00560 -QSDFRQ_00110 L2BLST_RS00560 -QSDFRQ_00110 BW688_RS01960 -QSDFRQ_00110 BKC02_RS00570 -QSDFRQ_00110 BBV16_RS00570 -QSDFRQ_00110 gnl|Prokka|PADJNBJD_00110 -QSDFRQ_00110 LJHENM_00550 -QSDFRQ_00110 AKW53_RS02055 -QSDFRQ_00110 BKC01_RS00570 -QSDFRQ_00110 NILJEPDF_00110 -QSDFRQ_00110 A5291_RS00565 -QSDFRQ_00110 SOTONK1_RS00560 -QSDFRQ_00110 L3404_RS00560 -QSDFRQ_00110 JIEJKO_00555 -QSDFRQ_00142 QSDFRQ_00142 -QSDFRQ_00142 CTJTET1_RS00720 -QSDFRQ_00142 IaCS19096_RS00720 -QSDFRQ_00142 BKC03_RS00730 -QSDFRQ_00142 C15_RS0100745 -QSDFRQ_00142 CTRC943_RS00720 -QSDFRQ_00142 ECS88FINAL_RS0100745 -QSDFRQ_00142 KW39_RS00720 -QSDFRQ_00142 DU10_RS00730 -QSDFRQ_00142 O169_RS00720 -QSDFRQ_00142 AOT15_RS00235 -QSDFRQ_00142 DU13_RS00735 -QSDFRQ_00142 7618428 -QSDFRQ_00142 KW36_RS00720 -QSDFRQ_00142 CBP48_RS02120 -QSDFRQ_00142 SW2_RS00720 -QSDFRQ_00142 BKB95_RS00730 -QSDFRQ_00142 ECS102511_RS00720 -QSDFRQ_00142 CTL2C_RS02085 -QSDFRQ_00142 CTB_RS00725 -QSDFRQ_00142 L1224_RS00720 -QSDFRQ_00142 AQ244_RS02895 -QSDFRQ_00142 BKB96_RS00730 -QSDFRQ_00142 CBP42_RS02120 -QSDFRQ_00142 BKB99_RS00730 -QSDFRQ_00142 CTO_RS00725 -QSDFRQ_00142 L1440_RS00720 -QSDFRQ_00142 BKB92_RS00730 -QSDFRQ_00142 SOTONIA3_RS00720 -QSDFRQ_00142 E150_RS00720 -QSDFRQ_00142 L2BUCH2_RS00720 -QSDFRQ_00142 CBP44_RS02125 -QSDFRQ_00142 FCS84708_RS00720 -QSDFRQ_00142 AP288_RS03790 -QSDFRQ_00142 BKB93_RS00730 -QSDFRQ_00142 AQ193_RS03275 -QSDFRQ_00142 119318 -QSDFRQ_00142 AQ199_RS01415 -QSDFRQ_00142 BBV13_RS00730 -QSDFRQ_00142 G9768_RS00720 -QSDFRQ_00142 L2BLST_RS00720 -QSDFRQ_00142 BW688_RS02120 -QSDFRQ_00142 BBV16_RS00730 -QSDFRQ_00142 BKC02_RS00730 -QSDFRQ_00142 gnl|Prokka|PADJNBJD_00142 -QSDFRQ_00142 LJHENM_00710 -QSDFRQ_00142 AKW53_RS02215 -QSDFRQ_00142 BKC01_RS00730 -QSDFRQ_00142 NILJEPDF_00142 -QSDFRQ_00142 A5291_RS00725 -QSDFRQ_00142 L3404_RS00720 -QSDFRQ_00142 SOTONK1_RS00720 -QSDFRQ_00142 JIEJKO_00715 -CTB_RS00505 CTB_RS00505 -CTB_RS00505 CTL2C_RS01870 -CTB_RS00505 CBP42_RS01905 -CTB_RS00505 BKB96_RS00515 -CTB_RS00505 L1224_RS00505 -CTB_RS00505 BKB99_RS00515 -CTB_RS00505 BKB92_RS00515 -CTB_RS00505 CTO_RS00505 -CTB_RS00505 L1440_RS00505 -CTB_RS00505 SOTONIA3_RS00505 -CTB_RS00505 E150_RS00505 -CTB_RS00505 CBP44_RS01910 -CTB_RS00505 120588 -CTB_RS00505 L2BUCH2_RS00505 -CTB_RS00505 BKB93_RS00515 -CTB_RS00505 FCS84708_RS00505 -CTB_RS00505 AP288_RS03575 -CTB_RS00505 AOT15_RS00450 -CTB_RS00505 BBV13_RS00510 -CTB_RS00505 AQ199_RS01200 -CTB_RS00505 L2BLST_RS00505 -CTB_RS00505 BW688_RS01905 -CTB_RS00505 G9768_RS00505 -CTB_RS00505 BBV16_RS00510 -CTB_RS00505 BKC02_RS00515 -CTB_RS00505 gnl|Prokka|PADJNBJD_00099 -CTB_RS00505 LJHENM_00495 -CTB_RS00505 NILJEPDF_00099 -CTB_RS00505 BKC01_RS00515 -CTB_RS00505 A5291_RS00505 -CTB_RS00505 JIEJKO_00500 -CTB_RS00505 SOTONK1_RS00505 -CTB_RS00505 L3404_RS00505 -CTB_RS00505 AKW53_RS01995 -CTB_RS00505 QSDFRQ_00099 -CTB_RS00505 IaCS19096_RS00505 -CTB_RS00505 BKC03_RS00515 -CTB_RS00505 DU10_RS00515 -CTB_RS00505 C15_RS0100515 -CTB_RS00505 7618828 -CTB_RS00505 CTRC943_RS00505 -CTB_RS00505 CTJTET1_RS00505 -CTB_RS00505 O169_RS00505 -CTB_RS00505 DU13_RS00520 -CTB_RS00505 ECS88FINAL_RS0100520 -CTB_RS00505 KW39_RS00505 -CTB_RS00505 KW36_RS00505 -CTB_RS00505 CBP48_RS01905 -CTB_RS00505 SW2_RS00505 -CTB_RS00505 BKB95_RS00515 -CTB_RS00505 AQ193_RS03490 -CTB_RS00505 ECS102511_RS00505 -CTB_RS01875 CTB_RS01875 -CTB_RS01875 SOTONIA3_RS01860 -CTB_RS01875 AQ193_RS02135 -CTB_RS01875 BKB92_RS01865 -CTB_RS01875 CTO_RS01875 -CTB_RS01875 E150_RS01855 -CTB_RS01875 FCS84708_RS01845 -CTB_RS01875 BKB93_RS01865 -CTB_RS01875 BBV13_RS01880 -CTB_RS01875 AQ199_RS02545 -CTB_RS01875 G9768_RS01850 -CTB_RS01875 BBV16_RS01880 -CTB_RS01875 BKC02_RS01855 -CTB_RS01875 BKC01_RS01855 -CTB_RS01875 AKW53_RS03350 -CTB_RS01875 gnl|Prokka|PADJNBJD_00364 -CTB_RS01875 NILJEPDF_00364 -CTB_RS01875 LJHENM_01835 -CTB_RS01875 JIEJKO_01830 -CTB_RS01875 BKC03_RS01855 -CTB_RS01875 CTJTET1_RS01860 -CTB_RS01875 AP288_RS01230 -CTB_RS01875 DU10_RS01875 -CTB_RS01875 QSDFRQ_00364 -CTB_RS01875 C15_RS0101890 -CTB_RS01875 SOTONK1_RS01850 -CTB_RS01875 A5291_RS01875 -CTB_RS01875 KW39_RS01860 -CTB_RS01875 IaCS19096_RS01845 -CTB_RS01875 ECS88FINAL_RS0101880 -CTB_RS01875 DU13_RS01870 -CTB_RS01875 119474 -CTB_RS01875 O169_RS01860 -CTB_RS01875 AQ244_RS01260 -CTB_RS01875 BKB95_RS01870 -CTB_RS01875 KW36_RS01845 -CTB_RS01875 AOT15_RS02845 -CTB_RS01875 BKB96_RS01855 -CTB_RS01875 SW2_RS01850 -CTB_RS01875 BKB99_RS01855 -CTB_RS01875 ECS102511_RS01850 -CTB_RS01875 CBP42_RS03265 -CTB_RS01875 L2BUCH2_RS01825 -CTB_RS01875 L2BLST_RS01825 -CTB_RS01875 BW688_RS03255 -CTB_RS01875 CBP44_RS03260 -CTB_RS01875 L3404_RS01825 -CTB_RS01875 CTRC943_RS01830 -CTB_RS01875 7618526 -CTB_RS01875 CTL2C_RS03195 -CTB_RS01875 CBP48_RS03255 -CTB_RS01875 L1224_RS01825 -CTB_RS01875 L1440_RS01825 -CTB_RS03040 CTB_RS03040 -CTB_RS03040 SOTONIA3_RS03025 -CTB_RS03040 BKB92_RS03040 -CTB_RS03040 119629 -CTB_RS03040 BW688_RS04435 -CTB_RS03040 E150_RS03010 -CTB_RS03040 AQ193_RS00980 -CTB_RS03040 CTO_RS03040 -CTB_RS03040 L2BLST_RS02980 -CTB_RS03040 CBP44_RS04440 -CTB_RS03040 FCS84708_RS03005 -CTB_RS03040 BBV13_RS03045 -CTB_RS03040 AQ199_RS03705 -CTB_RS03040 BBV16_RS03055 -CTB_RS03040 BKB93_RS03045 -CTB_RS03040 G9768_RS03010 -CTB_RS03040 L3404_RS02975 -CTB_RS03040 gnl|Prokka|PADJNBJD_00593 -CTB_RS03040 BKC02_RS03040 -CTB_RS03040 NILJEPDF_00593 -CTB_RS03040 LJHENM_02980 -CTB_RS03040 AOT15_RS03810 -CTB_RS03040 CTRC943_RS02980 -CTB_RS03040 BKC01_RS03040 -CTB_RS03040 QSDFRQ_00593 -CTB_RS03040 JIEJKO_02990 -CTB_RS03040 SOTONK1_RS03010 -CTB_RS03040 CTJTET1_RS03020 -CTB_RS03040 BKC03_RS03040 -CTB_RS03040 KW39_RS03020 -CTB_RS03040 C15_RS0103075 -CTB_RS03040 ECS88FINAL_RS0103070 -CTB_RS03040 IaCS19096_RS03005 -CTB_RS03040 DU10_RS03055 -CTB_RS03040 A5291_RS03040 -CTB_RS03040 O169_RS03015 -CTB_RS03040 AP288_RS00075 -CTB_RS03040 CTL2C_RS04350 -CTB_RS03040 DU13_RS03050 -CTB_RS03040 CBP48_RS04440 -CTB_RS03040 L1224_RS02980 -CTB_RS03040 KW36_RS03005 -CTB_RS03040 BKB95_RS03050 -CTB_RS03040 AKW53_RS04235 -CTB_RS03040 BKB96_RS03045 -CTB_RS03040 BKB99_RS03040 -CTB_RS03040 7618624 -CTB_RS03040 SW2_RS03010 -CTB_RS03040 L1440_RS02980 -CTB_RS03040 ECS102511_RS03005 -CTB_RS03040 AQ244_RS00100 -CTB_RS03040 CBP42_RS04445 -CTB_RS03040 L2BUCH2_RS02980 -CTB_RS04750 CTB_RS04750 -CTB_RS04750 SOTONIA3_RS04740 -CTB_RS04750 AP288_RS03035 -CTB_RS04750 BKB92_RS04780 -CTB_RS04750 gnl|Prokka|PADJNBJD_00926 -CTB_RS04750 CTO_RS04745 -CTB_RS04750 L2BLST_RS04705 -CTB_RS04750 BBV13_RS04765 -CTB_RS04750 E150_RS04740 -CTB_RS04750 AQ193_RS04040 -CTB_RS04750 BBV16_RS04770 -CTB_RS04750 NILJEPDF_00927 -CTB_RS04750 FCS84708_RS04725 -CTB_RS04750 AQ199_RS00660 -CTB_RS04750 BW688_RS01355 -CTB_RS04750 119918 -CTB_RS04750 AQ244_RS02025 -CTB_RS04750 JIEJKO_04660 -CTB_RS04750 QSDFRQ_00927 -CTB_RS04750 LJHENM_04670 -CTB_RS04750 L3404_RS04700 -CTB_RS04750 G9768_RS04725 -CTB_RS04750 7618773 -CTB_RS04750 BKB93_RS04785 -CTB_RS04750 BKC02_RS04775 -CTB_RS04750 CTRC943_RS04710 -CTB_RS04750 AKW53_RS01450 -CTB_RS04750 BKC01_RS04780 -CTB_RS04750 AOT15_RS02305 -CTB_RS04750 CTJTET1_RS04895 -CTB_RS04750 CBP48_RS01355 -CTB_RS04750 KW39_RS04745 -CTB_RS04750 BKC03_RS04775 -CTB_RS04750 SOTONK1_RS04725 -CTB_RS04750 A5291_RS04755 -CTB_RS04750 ECS88FINAL_RS0104825 -CTB_RS04750 IaCS19096_RS04720 -CTB_RS04750 C15_RS0104845 -CTB_RS04750 KW36_RS04725 -CTB_RS04750 DU13_RS04795 -CTB_RS04750 CTL2C_RS01325 -CTB_RS04750 CBP42_RS01355 -CTB_RS04750 L1224_RS04705 -CTB_RS04750 BKB95_RS04795 -CTB_RS04750 L1440_RS04700 -CTB_RS04750 BKB96_RS04780 -CTB_RS04750 BKB99_RS04775 -CTB_RS04750 SW2_RS04735 -CTB_RS04750 ECS102511_RS04730 -CTB_RS04750 CBP44_RS01355 -CTB_RS04750 L2BUCH2_RS04705 -CTB_RS04750 LJHENM_04675 F -E150_RS00470 E150_RS00470 -E150_RS00470 CBP44_RS01875 -E150_RS00470 120597 -E150_RS00470 L2BUCH2_RS00470 -E150_RS00470 BKB93_RS00480 -E150_RS00470 FCS84708_RS00470 -E150_RS00470 AP288_RS03540 -E150_RS00470 AQ244_RS01520 -E150_RS00470 AQ193_RS03525 -E150_RS00470 AQ199_RS01165 -E150_RS00470 BBV13_RS00475 -E150_RS00470 L2BLST_RS00470 -E150_RS00470 BW688_RS01870 -E150_RS00470 G9768_RS00470 -E150_RS00470 BKC02_RS00480 -E150_RS00470 gnl|Prokka|PADJNBJD_00092 -E150_RS00470 LJHENM_00460 -E150_RS00470 BBV16_RS00475 -E150_RS00470 NILJEPDF_00092 -E150_RS00470 BKC01_RS00480 -E150_RS00470 A5291_RS00470 -E150_RS00470 JIEJKO_00465 -E150_RS00470 SOTONK1_RS00470 -E150_RS00470 L3404_RS00470 -E150_RS00470 AKW53_RS01960 -E150_RS00470 QSDFRQ_00092 -E150_RS00470 IaCS19096_RS00470 -E150_RS00470 BKC03_RS00480 -E150_RS00470 DU10_RS00480 -E150_RS00470 C15_RS0100475 -E150_RS00470 7618822 -E150_RS00470 CTRC943_RS00470 -E150_RS00470 CTJTET1_RS00470 -E150_RS00470 O169_RS00470 -E150_RS00470 DU13_RS00485 -E150_RS00470 ECS88FINAL_RS0100480 -E150_RS00470 KW39_RS00470 -E150_RS00470 KW36_RS00470 -E150_RS00470 CBP48_RS01870 -E150_RS00470 AOT15_RS00485 -E150_RS00470 SW2_RS00470 -E150_RS00470 BKB95_RS00480 -E150_RS00470 ECS102511_RS00470 -E150_RS00470 CTB_RS00470 -E150_RS00470 CTL2C_RS01835 -E150_RS00470 CBP42_RS01870 -E150_RS00470 BKB96_RS00480 -E150_RS00470 L1224_RS00470 -E150_RS00470 BKB99_RS00480 -E150_RS00470 BKB92_RS00480 -E150_RS00470 CTO_RS00470 -E150_RS00470 L1440_RS00470 -E150_RS00470 SOTONIA3_RS00470 -E150_RS00640 E150_RS00640 -E150_RS00640 L2BUCH2_RS00640 -E150_RS00640 CBP44_RS02045 -E150_RS00640 FCS84708_RS00640 -E150_RS00640 AP288_RS03710 -E150_RS00640 BKB93_RS00650 -E150_RS00640 AQ193_RS03355 -E150_RS00640 119302 -E150_RS00640 AQ199_RS01335 -E150_RS00640 BBV13_RS00650 -E150_RS00640 G9768_RS00640 -E150_RS00640 L2BLST_RS00640 -E150_RS00640 BW688_RS02040 -E150_RS00640 BBV16_RS00650 -E150_RS00640 BKC02_RS00650 -E150_RS00640 gnl|Prokka|PADJNBJD_00126 -E150_RS00640 LJHENM_00630 -E150_RS00640 AKW53_RS02135 -E150_RS00640 BKC01_RS00650 -E150_RS00640 NILJEPDF_00126 -E150_RS00640 A5291_RS00645 -E150_RS00640 L3404_RS00640 -E150_RS00640 SOTONK1_RS00640 -E150_RS00640 JIEJKO_00635 -E150_RS00640 QSDFRQ_00126 -E150_RS00640 IaCS19096_RS00640 -E150_RS00640 BKC03_RS00650 -E150_RS00640 C15_RS0100660 -E150_RS00640 CTRC943_RS00640 -E150_RS00640 CTJTET1_RS00640 -E150_RS00640 KW39_RS00640 -E150_RS00640 DU10_RS00650 -E150_RS00640 ECS88FINAL_RS0100660 -E150_RS00640 O169_RS00640 -E150_RS00640 AOT15_RS00315 -E150_RS00640 DU13_RS00655 -E150_RS00640 7618418 -E150_RS00640 KW36_RS00640 -E150_RS00640 CBP48_RS02040 -E150_RS00640 SW2_RS00640 -E150_RS00640 BKB95_RS00650 -E150_RS00640 ECS102511_RS00640 -E150_RS00640 CTL2C_RS02005 -E150_RS00640 CTB_RS00645 -E150_RS00640 L1224_RS00640 -E150_RS00640 AQ244_RS02815 -E150_RS00640 BKB96_RS00650 -E150_RS00640 CBP42_RS02040 -E150_RS00640 BKB99_RS00650 -E150_RS00640 L1440_RS00640 -E150_RS00640 BKB92_RS00650 -E150_RS00640 CTO_RS00645 -E150_RS00640 SOTONIA3_RS00640 -E150_RS02000 E150_RS02000 -E150_RS02000 L2BLST_RS01970 -E150_RS02000 BW688_RS03400 -E150_RS02000 FCS84708_RS01990 -E150_RS02000 BBV13_RS02025 -E150_RS02000 BKB93_RS02010 -E150_RS02000 CBP44_RS03410 -E150_RS02000 AQ193_RS01990 -E150_RS02000 AQ199_RS02690 -E150_RS02000 G9768_RS01995 -E150_RS02000 BBV16_RS02025 -E150_RS02000 L3404_RS01970 -E150_RS02000 BKC02_RS02000 -E150_RS02000 BKC01_RS02000 -E150_RS02000 AKW53_RS03495 -E150_RS02000 gnl|Prokka|PADJNBJD_00393 -E150_RS02000 NILJEPDF_00393 -E150_RS02000 CTRC943_RS01975 -E150_RS02000 LJHENM_01980 -E150_RS02000 JIEJKO_01975 -E150_RS02000 BKC03_RS02000 -E150_RS02000 CTJTET1_RS02005 -E150_RS02000 QSDFRQ_00393 -E150_RS02000 C15_RS0102040 -E150_RS02000 A5291_RS02020 -E150_RS02000 SOTONK1_RS01995 -E150_RS02000 DU10_RS02025 -E150_RS02000 KW39_RS02005 -E150_RS02000 IaCS19096_RS01990 -E150_RS02000 ECS88FINAL_RS0102030 -E150_RS02000 O169_RS02005 -E150_RS02000 DU13_RS02020 -E150_RS02000 7618541 -E150_RS02000 119501 -E150_RS02000 CTL2C_RS03340 -E150_RS02000 CBP48_RS03405 -E150_RS02000 L1224_RS01970 -E150_RS02000 KW36_RS01990 -E150_RS02000 AOT15_RS02990 -E150_RS02000 BKB95_RS02020 -E150_RS02000 BKB96_RS02000 -E150_RS02000 SW2_RS01995 -E150_RS02000 AP288_RS01085 -E150_RS02000 BKB99_RS02000 -E150_RS02000 L1440_RS01970 -E150_RS02000 ECS102511_RS01995 -E150_RS02000 CTB_RS02020 -E150_RS02000 AQ244_RS01115 -E150_RS02000 CBP42_RS03415 -E150_RS02000 SOTONIA3_RS02005 -E150_RS02000 L2BUCH2_RS01970 -E150_RS02000 BKB92_RS02010 -E150_RS02000 CTO_RS02020 -E150_RS02160 E150_RS02160 -E150_RS02160 L2BLST_RS02130 -E150_RS02160 BBV13_RS02190 -E150_RS02160 BW688_RS03565 -E150_RS02160 FCS84708_RS02150 -E150_RS02160 BKB93_RS02175 -E150_RS02160 CBP44_RS03575 -E150_RS02160 AQ193_RS01830 -E150_RS02160 AQ199_RS02850 -E150_RS02160 BBV16_RS02190 -E150_RS02160 G9768_RS02155 -E150_RS02160 L3404_RS02130 -E150_RS02160 BKC02_RS02165 -E150_RS02160 BKC01_RS02165 -E150_RS02160 AKW53_RS03655 -E150_RS02160 gnl|Prokka|PADJNBJD_00425 -E150_RS02160 NILJEPDF_00425 -E150_RS02160 CTRC943_RS02135 -E150_RS02160 LJHENM_02145 -E150_RS02160 JIEJKO_02140 -E150_RS02160 BKC03_RS02165 -E150_RS02160 CTJTET1_RS02165 -E150_RS02160 QSDFRQ_00425 -E150_RS02160 C15_RS0102200 -E150_RS02160 A5291_RS02180 -E150_RS02160 SOTONK1_RS02155 -E150_RS02160 DU10_RS02190 -E150_RS02160 KW39_RS02165 -E150_RS02160 IaCS19096_RS02150 -E150_RS02160 ECS88FINAL_RS0102195 -E150_RS02160 O169_RS02165 -E150_RS02160 DU13_RS02185 -E150_RS02160 7618553 -E150_RS02160 CTL2C_RS03500 -E150_RS02160 CBP48_RS03570 -E150_RS02160 119519 -E150_RS02160 L1224_RS02130 -E150_RS02160 KW36_RS02150 -E150_RS02160 AOT15_RS03150 -E150_RS02160 BKB95_RS02185 -E150_RS02160 BKB96_RS02165 -E150_RS02160 SW2_RS02155 -E150_RS02160 AP288_RS00925 -E150_RS02160 BKB99_RS02165 -E150_RS02160 L1440_RS02130 -E150_RS02160 ECS102511_RS02155 -E150_RS02160 CTB_RS02180 -E150_RS02160 CBP42_RS03580 -E150_RS02160 SOTONIA3_RS02165 -E150_RS02160 L2BUCH2_RS02130 -E150_RS02160 AQ244_RS00955 -E150_RS02160 BKB92_RS02175 -E150_RS02160 CTO_RS02180 -E150_RS02325 E150_RS02325 -E150_RS02325 CTO_RS02350 -E150_RS02325 BW688_RS03735 -E150_RS02325 L2BLST_RS02300 -E150_RS02325 FCS84708_RS02315 -E150_RS02325 BBV13_RS02355 -E150_RS02325 CBP44_RS03745 -E150_RS02325 BKB93_RS02350 -E150_RS02325 AQ193_RS01665 -E150_RS02325 AQ199_RS03015 -E150_RS02325 G9768_RS02320 -E150_RS02325 BBV16_RS02360 -E150_RS02325 L3404_RS02295 -E150_RS02325 BKC02_RS02335 -E150_RS02325 BKC01_RS02335 -E150_RS02325 gnl|Prokka|PADJNBJD_00458 -E150_RS02325 AKW53_RS03820 -E150_RS02325 NILJEPDF_00458 -E150_RS02325 LJHENM_02310 -E150_RS02325 CTRC943_RS02300 -E150_RS02325 JIEJKO_02310 -E150_RS02325 BKC03_RS02335 -E150_RS02325 QSDFRQ_00458 -E150_RS02325 CTJTET1_RS02330 -E150_RS02325 C15_RS0102370 -E150_RS02325 SOTONK1_RS02320 -E150_RS02325 DU10_RS02360 -E150_RS02325 A5291_RS02350 -E150_RS02325 KW39_RS02330 -E150_RS02325 IaCS19096_RS02315 -E150_RS02325 ECS88FINAL_RS0102370 -E150_RS02325 O169_RS02330 -E150_RS02325 DU13_RS02355 -E150_RS02325 7619002 -E150_RS02325 BKB96_RS02340 -E150_RS02325 BKB99_RS02335 -E150_RS02325 CBP48_RS03740 -E150_RS02325 120294 -E150_RS02325 CTL2C_RS03670 -E150_RS02325 KW36_RS02315 -E150_RS02325 AOT15_RS03315 -E150_RS02325 BKB95_RS02355 -E150_RS02325 L1224_RS02300 -E150_RS02325 AP288_RS00760 -E150_RS02325 SW2_RS02325 -E150_RS02325 ECS102511_RS02320 -E150_RS02325 L1440_RS02300 -E150_RS02325 CBP42_RS03750 -E150_RS02325 CTB_RS02350 -E150_RS02325 L2BUCH2_RS02295 -E150_RS02325 AQ244_RS00790 -E150_RS02325 BKB92_RS02345 -E150_RS02325 SOTONIA3_RS02335 -E150_RS02495 E150_RS02495 -E150_RS02495 CTO_RS02525 -E150_RS02495 BW688_RS03910 -E150_RS02495 BBV13_RS02530 -E150_RS02495 L2BLST_RS02470 -E150_RS02495 FCS84708_RS02485 -E150_RS02495 CBP44_RS03915 -E150_RS02495 AQ193_RS01495 -E150_RS02495 BBV16_RS02540 -E150_RS02495 BKB93_RS02520 -E150_RS02495 AQ199_RS03185 -E150_RS02495 G9768_RS02490 -E150_RS02495 L3404_RS02465 -E150_RS02495 AOT15_RS03605 -E150_RS02495 BKC02_RS02510 -E150_RS02495 gnl|Prokka|PADJNBJD_00491 -E150_RS02495 BKC01_RS02510 -E150_RS02495 NILJEPDF_00491 -E150_RS02495 LJHENM_02475 -E150_RS02495 CTRC943_RS02470 -E150_RS02495 JIEJKO_02475 -E150_RS02495 QSDFRQ_00491 -E150_RS02495 SOTONK1_RS02490 -E150_RS02495 CTJTET1_RS02500 -E150_RS02495 BKC03_RS02510 -E150_RS02495 C15_RS0102550 -E150_RS02495 KW39_RS02500 -E150_RS02495 IaCS19096_RS02485 -E150_RS02495 DU10_RS02530 -E150_RS02495 A5291_RS02525 -E150_RS02495 ECS88FINAL_RS0102545 -E150_RS02495 AKW53_RS04725 -E150_RS02495 O169_RS02500 -E150_RS02495 7618592 -E150_RS02495 DU13_RS02525 -E150_RS02495 BKB96_RS02515 -E150_RS02495 BKB99_RS02510 -E150_RS02495 CBP48_RS03910 -E150_RS02495 CTL2C_RS03840 -E150_RS02495 KW36_RS02485 -E150_RS02495 BKB95_RS02525 -E150_RS02495 L1224_RS02470 -E150_RS02495 AP288_RS00590 -E150_RS02495 SW2_RS02495 -E150_RS02495 ECS102511_RS02490 -E150_RS02495 119579 -E150_RS02495 L1440_RS02470 -E150_RS02495 CBP42_RS03920 -E150_RS02495 L2BUCH2_RS02470 -E150_RS02495 AQ244_RS00620 -E150_RS02495 CTB_RS02525 -E150_RS02495 SOTONIA3_RS02505 -E150_RS02495 BKB92_RS02515 -E150_RS03510 E150_RS03510 -E150_RS03510 SOTONIA3_RS03525 -E150_RS03510 CTO_RS03540 -E150_RS03510 BBV13_RS03545 -E150_RS03510 FCS84708_RS03500 -E150_RS03510 L2BLST_RS03485 -E150_RS03510 AQ193_RS00485 -E150_RS03510 BBV16_RS03555 -E150_RS03510 BW688_RS00105 -E150_RS03510 7618217 -E150_RS03510 AQ199_RS04200 -E150_RS03510 BKB93_RS03540 -E150_RS03510 119703 -E150_RS03510 G9768_RS03505 -E150_RS03510 gnl|Prokka|PADJNBJD_00689 -E150_RS03510 L3404_RS03480 -E150_RS03510 BKC02_RS03535 -E150_RS03510 NILJEPDF_00690 -E150_RS03510 LJHENM_03465 -E150_RS03510 AOT15_RS04305 -E150_RS03510 AP288_RS01870 -E150_RS03510 JIEJKO_03470 -E150_RS03510 BKC01_RS03535 -E150_RS03510 QSDFRQ_00690 -E150_RS03510 CTRC943_RS03490 -E150_RS03510 BKC03_RS03535 -E150_RS03510 CBP48_RS00105 -E150_RS03510 CTJTET1_RS03525 -E150_RS03510 KW39_RS03520 -E150_RS03510 DU10_RS03550 -E150_RS03510 SOTONK1_RS03505 -E150_RS03510 ECS88FINAL_RS0103590 -E150_RS03510 IaCS19096_RS03500 -E150_RS03510 C15_RS0103580 -E150_RS03510 A5291_RS03550 -E150_RS03510 O169_RS03515 -E150_RS03510 DU13_RS03550 -E150_RS03510 KW36_RS03505 -E150_RS03510 AKW53_RS00250 -E150_RS03510 BKB95_RS03555 -E150_RS03510 CBP42_RS00105 -E150_RS03510 SW2_RS03510 -E150_RS03510 CTL2C_RS00105 -E150_RS03510 L1224_RS03485 -E150_RS03510 ECS102511_RS03500 -E150_RS03510 L1440_RS03485 -E150_RS03510 BKB96_RS03545 -E150_RS03510 BKB99_RS03540 -E150_RS03510 CBP44_RS00105 -E150_RS03510 L2BUCH2_RS03485 -E150_RS03510 AQ244_RS04405 -E150_RS03510 BKB92_RS03535 -E150_RS03510 CTB_RS03545 -G9768_RS00965 G9768_RS00965 -G9768_RS00965 BBV13_RS00990 -G9768_RS00965 BKC02_RS00960 -G9768_RS00965 AOT15_RS01405 -G9768_RS00965 L3404_RS00940 -G9768_RS00965 AKW53_RS02450 -G9768_RS00965 119357 -G9768_RS00965 BBV16_RS00990 -G9768_RS00965 BKC01_RS00960 -G9768_RS00965 DU10_RS00970 -G9768_RS00965 gnl|Prokka|PADJNBJD_00188 -G9768_RS00965 BKC03_RS00960 -G9768_RS00965 NILJEPDF_00188 -G9768_RS00965 LJHENM_00945 -G9768_RS00965 CTRC943_RS00945 -G9768_RS00965 CTJTET1_RS00975 -G9768_RS00965 C15_RS0100995 -G9768_RS00965 SOTONK1_RS00960 -G9768_RS00965 ECS88FINAL_RS0100980 -G9768_RS00965 KW39_RS00965 -G9768_RS00965 JIEJKO_00945 -G9768_RS00965 7618450 -G9768_RS00965 A5291_RS00985 -G9768_RS00965 IaCS19096_RS00960 -G9768_RS00965 QSDFRQ_00188 -G9768_RS00965 O169_RS00965 -G9768_RS00965 DU13_RS00970 -G9768_RS00965 SW2_RS00955 -G9768_RS00965 BKB95_RS00975 -G9768_RS00965 CBP48_RS02350 -G9768_RS00965 KW36_RS00960 -G9768_RS00965 ECS102511_RS00955 -G9768_RS00965 AQ193_RS03035 -G9768_RS00965 BKB96_RS00960 -G9768_RS00965 CTL2C_RS02310 -G9768_RS00965 BKB99_RS00960 -G9768_RS00965 L1224_RS00940 -G9768_RS00965 L1440_RS00940 -G9768_RS00965 AQ244_RS03140 -G9768_RS00965 BKB92_RS00960 -G9768_RS00965 CBP42_RS02350 -G9768_RS00965 SOTONIA3_RS00975 -G9768_RS00965 E150_RS00955 -G9768_RS00965 CTB_RS00985 -G9768_RS00965 L2BUCH2_RS00945 -G9768_RS00965 CTO_RS00985 -G9768_RS00965 FCS84708_RS00955 -G9768_RS00965 AP288_RS04025 -G9768_RS00965 BKB93_RS00960 -G9768_RS00965 CBP44_RS02355 -G9768_RS00965 AQ199_RS01650 -G9768_RS00965 L2BLST_RS00945 -G9768_RS00965 BW688_RS02355 -G9768_RS01305 G9768_RS01305 -G9768_RS01305 BKC02_RS01300 -G9768_RS01305 AOT15_RS01065 -G9768_RS01305 BBV16_RS01330 -G9768_RS01305 L3404_RS01280 -G9768_RS01305 AKW53_RS02790 -G9768_RS01305 BKC01_RS01300 -G9768_RS01305 gnl|Prokka|PADJNBJD_00255 -G9768_RS01305 DU10_RS01310 -G9768_RS01305 NILJEPDF_00255 -G9768_RS01305 LJHENM_01280 -G9768_RS01305 BKC03_RS01300 -G9768_RS01305 CTRC943_RS01285 -G9768_RS01305 CTJTET1_RS01315 -G9768_RS01305 KW39_RS01305 -G9768_RS01305 JIEJKO_01280 -G9768_RS01305 119409 -G9768_RS01305 C15_RS0101335 -G9768_RS01305 SOTONK1_RS01300 -G9768_RS01305 ECS88FINAL_RS0101320 -G9768_RS01305 QSDFRQ_00255 -G9768_RS01305 A5291_RS01325 -G9768_RS01305 O169_RS01305 -G9768_RS01305 IaCS19096_RS01300 -G9768_RS01305 DU13_RS01310 -G9768_RS01305 7618484 -G9768_RS01305 SW2_RS01295 -G9768_RS01305 BKB95_RS01315 -G9768_RS01305 CBP48_RS02690 -G9768_RS01305 KW36_RS01300 -G9768_RS01305 ECS102511_RS01295 -G9768_RS01305 AQ193_RS02695 -G9768_RS01305 BKB96_RS01300 -G9768_RS01305 CTL2C_RS02650 -G9768_RS01305 BKB99_RS01300 -G9768_RS01305 L1224_RS01280 -G9768_RS01305 L1440_RS01280 -G9768_RS01305 AQ244_RS03480 -G9768_RS01305 BKB92_RS01300 -G9768_RS01305 CBP42_RS02690 -G9768_RS01305 SOTONIA3_RS01315 -G9768_RS01305 CTB_RS01325 -G9768_RS01305 E150_RS01295 -G9768_RS01305 L2BUCH2_RS01285 -G9768_RS01305 CTO_RS01325 -G9768_RS01305 FCS84708_RS01295 -G9768_RS01305 AP288_RS04365 -G9768_RS01305 BKB93_RS01300 -G9768_RS01305 CBP44_RS02695 -G9768_RS01305 AQ199_RS01990 -G9768_RS01305 L2BLST_RS01285 -G9768_RS01305 BBV13_RS01330 -G9768_RS01305 BW688_RS02695 -G9768_RS01465 G9768_RS01465 -G9768_RS01465 BKC02_RS01465 -G9768_RS01465 AKW53_RS02955 -G9768_RS01465 BBV16_RS01495 -G9768_RS01465 L3404_RS01440 -G9768_RS01465 BKC01_RS01470 -G9768_RS01465 gnl|Prokka|PADJNBJD_00287 -G9768_RS01465 DU10_RS01475 -G9768_RS01465 NILJEPDF_00287 -G9768_RS01465 LJHENM_01445 -G9768_RS01465 BKC03_RS01465 -G9768_RS01465 CTRC943_RS01445 -G9768_RS01465 CTJTET1_RS01475 -G9768_RS01465 KW39_RS01465 -G9768_RS01465 JIEJKO_01445 -G9768_RS01465 C15_RS0101500 -G9768_RS01465 SOTONK1_RS01465 -G9768_RS01465 ECS88FINAL_RS0101485 -G9768_RS01465 119433 -G9768_RS01465 QSDFRQ_00287 -G9768_RS01465 IaCS19096_RS01460 -G9768_RS01465 A5291_RS01490 -G9768_RS01465 O169_RS01470 -G9768_RS01465 DU13_RS01475 -G9768_RS01465 SW2_RS01455 -G9768_RS01465 AQ193_RS02530 -G9768_RS01465 BKB95_RS01480 -G9768_RS01465 CBP48_RS02855 -G9768_RS01465 7618499 -G9768_RS01465 KW36_RS01460 -G9768_RS01465 ECS102511_RS01455 -G9768_RS01465 AOT15_RS02460 -G9768_RS01465 BKB96_RS01465 -G9768_RS01465 CTL2C_RS02810 -G9768_RS01465 BKB99_RS01465 -G9768_RS01465 L1224_RS01440 -G9768_RS01465 L1440_RS01440 -G9768_RS01465 AQ244_RS03645 -G9768_RS01465 CBP42_RS02855 -G9768_RS01465 SOTONIA3_RS01475 -G9768_RS01465 BKB92_RS01470 -G9768_RS01465 CTB_RS01490 -G9768_RS01465 E150_RS01460 -G9768_RS01465 L2BUCH2_RS01445 -G9768_RS01465 CTO_RS01485 -G9768_RS01465 FCS84708_RS01455 -G9768_RS01465 AP288_RS04525 -G9768_RS01465 BKB93_RS01470 -G9768_RS01465 CBP44_RS02860 -G9768_RS01465 AQ199_RS02150 -G9768_RS01465 L2BLST_RS01445 -G9768_RS01465 BBV13_RS01495 -G9768_RS01465 BW688_RS02865 -G9768_RS01625 G9768_RS01625 -G9768_RS01625 BKC02_RS01625 -G9768_RS01625 L3404_RS01600 -G9768_RS01625 AKW53_RS03115 -G9768_RS01625 BBV16_RS01655 -G9768_RS01625 BKC01_RS01630 -G9768_RS01625 gnl|Prokka|PADJNBJD_00319 -G9768_RS01625 NILJEPDF_00319 -G9768_RS01625 LJHENM_01605 -G9768_RS01625 CTRC943_RS01605 -G9768_RS01625 BKC03_RS01625 -G9768_RS01625 DU10_RS01640 -G9768_RS01625 CTJTET1_RS01635 -G9768_RS01625 KW39_RS01625 -G9768_RS01625 JIEJKO_01605 -G9768_RS01625 C15_RS0101665 -G9768_RS01625 SOTONK1_RS01625 -G9768_RS01625 ECS88FINAL_RS0101645 -G9768_RS01625 QSDFRQ_00319 -G9768_RS01625 IaCS19096_RS01620 -G9768_RS01625 120400 -G9768_RS01625 A5291_RS01650 -G9768_RS01625 O169_RS01630 -G9768_RS01625 DU13_RS01635 -G9768_RS01625 CBP48_RS03015 -G9768_RS01625 7618936 -G9768_RS01625 SW2_RS01615 -G9768_RS01625 AQ193_RS02370 -G9768_RS01625 BKB95_RS01640 -G9768_RS01625 CTL2C_RS02970 -G9768_RS01625 KW36_RS01620 -G9768_RS01625 ECS102511_RS01615 -G9768_RS01625 AOT15_RS02620 -G9768_RS01625 BKB96_RS01625 -G9768_RS01625 L1224_RS01600 -G9768_RS01625 BKB99_RS01625 -G9768_RS01625 L1440_RS01600 -G9768_RS01625 CBP42_RS03015 -G9768_RS01625 AQ244_RS03805 -G9768_RS01625 SOTONIA3_RS01635 -G9768_RS01625 BKB92_RS01630 -G9768_RS01625 CTB_RS01650 -G9768_RS01625 E150_RS01620 -G9768_RS01625 L2BUCH2_RS01605 -G9768_RS01625 CTO_RS01645 -G9768_RS01625 FCS84708_RS01615 -G9768_RS01625 AP288_RS04685 -G9768_RS01625 CBP44_RS03020 -G9768_RS01625 BKB93_RS01630 -G9768_RS01625 L2BLST_RS01605 -G9768_RS01625 AQ199_RS02310 -G9768_RS01625 BW688_RS03025 -G9768_RS01625 BBV13_RS01655 -G9768_RS03125 G9768_RS03125 -G9768_RS03125 L3404_RS03095 -G9768_RS03125 gnl|Prokka|PADJNBJD_00615 -G9768_RS03125 NILJEPDF_00615 -G9768_RS03125 LJHENM_03090 -G9768_RS03125 BKC02_RS03155 -G9768_RS03125 AOT15_RS03925 -G9768_RS03125 AP288_RS01495 -G9768_RS03125 CTRC943_RS03100 -G9768_RS03125 BKC01_RS03155 -G9768_RS03125 QSDFRQ_00615 -G9768_RS03125 AQ244_RS04790 -G9768_RS03125 JIEJKO_03100 -G9768_RS03125 SOTONK1_RS03125 -G9768_RS03125 CTJTET1_RS03140 -G9768_RS03125 BKC03_RS03155 -G9768_RS03125 KW39_RS03140 -G9768_RS03125 C15_RS0103190 -G9768_RS03125 ECS88FINAL_RS0103190 -G9768_RS03125 IaCS19096_RS03120 -G9768_RS03125 DU10_RS03170 -G9768_RS03125 A5291_RS03160 -G9768_RS03125 O169_RS03135 -G9768_RS03125 AQ193_RS00860 -G9768_RS03125 CTL2C_RS04470 -G9768_RS03125 DU13_RS03165 -G9768_RS03125 CBP48_RS04555 -G9768_RS03125 L1224_RS03100 -G9768_RS03125 KW36_RS03125 -G9768_RS03125 BKB95_RS03165 -G9768_RS03125 AKW53_RS04350 -G9768_RS03125 BKB96_RS03160 -G9768_RS03125 BKB99_RS03155 -G9768_RS03125 7618634 -G9768_RS03125 SW2_RS03130 -G9768_RS03125 L1440_RS03100 -G9768_RS03125 ECS102511_RS03125 -G9768_RS03125 CBP42_RS04560 -G9768_RS03125 L2BUCH2_RS03100 -G9768_RS03125 CTB_RS03160 -G9768_RS03125 SOTONIA3_RS03140 -G9768_RS03125 BKB92_RS03155 -G9768_RS03125 BW688_RS04550 -G9768_RS03125 119644 -G9768_RS03125 E150_RS03130 -G9768_RS03125 CTO_RS03155 -G9768_RS03125 L2BLST_RS03100 -G9768_RS03125 CBP44_RS04555 -G9768_RS03125 FCS84708_RS03125 -G9768_RS03125 BBV13_RS03160 -G9768_RS03125 AQ199_RS03825 -G9768_RS03125 BBV16_RS03170 -G9768_RS03125 BKB93_RS03160 -G9768_RS03295 G9768_RS03295 -G9768_RS03295 L3404_RS03265 -G9768_RS03295 gnl|Prokka|PADJNBJD_00648 -G9768_RS03295 AP288_RS01665 -G9768_RS03295 BKC02_RS03325 -G9768_RS03295 NILJEPDF_00649 -G9768_RS03295 LJHENM_03260 -G9768_RS03295 AOT15_RS04095 -G9768_RS03295 AQ244_RS04620 -G9768_RS03295 CTRC943_RS03270 -G9768_RS03295 JIEJKO_03265 -G9768_RS03295 BKC01_RS03325 -G9768_RS03295 QSDFRQ_00649 -G9768_RS03295 KW39_RS03310 -G9768_RS03295 BKC03_RS03325 -G9768_RS03295 CTJTET1_RS03310 -G9768_RS03295 ECS88FINAL_RS0103360 -G9768_RS03295 DU10_RS03340 -G9768_RS03295 SOTONK1_RS03295 -G9768_RS03295 O169_RS03305 -G9768_RS03295 IaCS19096_RS03290 -G9768_RS03295 C15_RS0103360 -G9768_RS03295 A5291_RS03335 -G9768_RS03295 AKW53_RS00045 -G9768_RS03295 AQ193_RS00690 -G9768_RS03295 DU13_RS03335 -G9768_RS03295 CTL2C_RS04640 -G9768_RS03295 CBP48_RS04725 -G9768_RS03295 7619113 -G9768_RS03295 SW2_RS03300 -G9768_RS03295 L1224_RS03270 -G9768_RS03295 KW36_RS03295 -G9768_RS03295 ECS102511_RS03295 -G9768_RS03295 L1440_RS03270 -G9768_RS03295 BKB95_RS03340 -G9768_RS03295 BKB96_RS03335 -G9768_RS03295 BKB99_RS03330 -G9768_RS03295 CBP42_RS04730 -G9768_RS03295 L2BUCH2_RS03270 -G9768_RS03295 BKB92_RS03325 -G9768_RS03295 CTB_RS03335 -G9768_RS03295 E150_RS03300 -G9768_RS03295 SOTONIA3_RS03315 -G9768_RS03295 BW688_RS04720 -G9768_RS03295 CTO_RS03330 -G9768_RS03295 FCS84708_RS03295 -G9768_RS03295 BBV13_RS03335 -G9768_RS03295 L2BLST_RS03270 -G9768_RS03295 CBP44_RS04725 -G9768_RS03295 120115 -G9768_RS03295 AQ199_RS03995 -G9768_RS03295 BBV16_RS03345 -G9768_RS03295 BKB93_RS03330 -G9768_RS03465 G9768_RS03465 -G9768_RS03465 gnl|Prokka|PADJNBJD_00682 -G9768_RS03465 L3404_RS03445 -G9768_RS03465 BKC02_RS03500 -G9768_RS03465 NILJEPDF_00683 -G9768_RS03465 LJHENM_03430 -G9768_RS03465 AOT15_RS04265 -G9768_RS03465 AP288_RS01835 -G9768_RS03465 AQ244_RS04445 -G9768_RS03465 JIEJKO_03435 -G9768_RS03465 BKC01_RS03500 -G9768_RS03465 QSDFRQ_00683 -G9768_RS03465 CTRC943_RS03450 -G9768_RS03465 BKC03_RS03500 -G9768_RS03465 CBP48_RS00070 -G9768_RS03465 CTJTET1_RS03485 -G9768_RS03465 KW39_RS03485 -G9768_RS03465 DU10_RS03515 -G9768_RS03465 SOTONK1_RS03465 -G9768_RS03465 ECS88FINAL_RS0103545 -G9768_RS03465 IaCS19096_RS03460 -G9768_RS03465 C15_RS0103540 -G9768_RS03465 A5291_RS03510 -G9768_RS03465 O169_RS03480 -G9768_RS03465 AQ193_RS00520 -G9768_RS03465 DU13_RS03515 -G9768_RS03465 KW36_RS03465 -G9768_RS03465 AKW53_RS00215 -G9768_RS03465 BKB95_RS03520 -G9768_RS03465 CBP42_RS00070 -G9768_RS03465 SW2_RS03475 -G9768_RS03465 CTL2C_RS00070 -G9768_RS03465 L1224_RS03450 -G9768_RS03465 ECS102511_RS03465 -G9768_RS03465 L1440_RS03450 -G9768_RS03465 BKB96_RS03510 -G9768_RS03465 BKB99_RS03505 -G9768_RS03465 CBP44_RS00070 -G9768_RS03465 L2BUCH2_RS03450 -G9768_RS03465 BKB92_RS03500 -G9768_RS03465 CTB_RS03505 -G9768_RS03465 SOTONIA3_RS03485 -G9768_RS03465 E150_RS03475 -G9768_RS03465 CTO_RS03500 -G9768_RS03465 BBV13_RS03505 -G9768_RS03465 FCS84708_RS03465 -G9768_RS03465 L2BLST_RS03450 -G9768_RS03465 7618666 -G9768_RS03465 BBV16_RS03515 -G9768_RS03465 BW688_RS00070 -G9768_RS03465 AQ199_RS04165 -G9768_RS03465 BKB93_RS03505 -G9768_RS03465 120082 -G9768_RS04865 G9768_RS04865 -G9768_RS04865 L3404_RS04815 -G9768_RS04865 BKB93_RS04565 -G9768_RS04865 BKC02_RS04555 -G9768_RS04865 AKW53_RS04810 -G9768_RS04865 BKC01_RS04560 -G9768_RS04865 CTRC943_RS04850 -G9768_RS04865 AOT15_RS04880 -G9768_RS04865 CTJTET1_RS05060 -G9768_RS04865 KW39_RS04880 -G9768_RS04865 BKC03_RS04555 -G9768_RS04865 CBP48_RS01130 -G9768_RS04865 A5291_RS04870 -G9768_RS04865 SOTONK1_RS04835 -G9768_RS04865 ECS88FINAL_RS1000000105105 -G9768_RS04865 IaCS19096_RS04885 -G9768_RS04865 C15_RS1000000105080 -G9768_RS04865 DU10_RS04575 -G9768_RS04865 O169_RS04865 -G9768_RS04865 KW36_RS04860 -G9768_RS04865 DU13_RS04575 -G9768_RS04865 AQ193_RS04960 -G9768_RS04865 BKB95_RS04575 -G9768_RS04865 CBP42_RS01130 -G9768_RS04865 CTL2C_RS04790 -G9768_RS04865 L1224_RS04815 -G9768_RS04865 AQ244_RS05175 -G9768_RS04865 BKB96_RS04560 -G9768_RS04865 L1440_RS04855 -G9768_RS04865 BKB99_RS04555 -G9768_RS04865 SW2_RS04875 -G9768_RS04865 ECS102511_RS04885 -G9768_RS04865 CBP44_RS01130 -G9768_RS04865 CTB_RS04905 -G9768_RS04865 L2BUCH2_RS04815 -G9768_RS04865 SOTONIA3_RS04850 -G9768_RS04865 CTO_RS04945 -G9768_RS04865 BBV13_RS04545 -G9768_RS04865 BKB92_RS04560 -G9768_RS04865 AP288_RS04990 -G9768_RS04865 BBV16_RS04550 -G9768_RS04865 E150_RS04875 -G9768_RS04865 L2BLST_RS04815 -G9768_RS04865 FCS84708_RS04880 -G9768_RS04865 AQ199_RS04895 -G9768_RS04865 BW688_RS01130 -G9768_RS04865 119874 -G9768_RS04865 7618329 -gnl|Prokka|PADJNBJD_00049 gnl|Prokka|PADJNBJD_00049 -gnl|Prokka|PADJNBJD_00049 JIEJKO_00240 -gnl|Prokka|PADJNBJD_00049 NILJEPDF_00049 -gnl|Prokka|PADJNBJD_00049 LJHENM_00250 -gnl|Prokka|PADJNBJD_00049 BKC01_RS00255 -gnl|Prokka|PADJNBJD_00049 A5291_RS00250 -gnl|Prokka|PADJNBJD_00049 SOTONK1_RS00250 -gnl|Prokka|PADJNBJD_00049 L3404_RS00250 -gnl|Prokka|PADJNBJD_00049 7618381 -gnl|Prokka|PADJNBJD_00049 AKW53_RS01740 -gnl|Prokka|PADJNBJD_00049 QSDFRQ_00049 -gnl|Prokka|PADJNBJD_00049 IaCS19096_RS00250 -gnl|Prokka|PADJNBJD_00049 BKC03_RS00255 -gnl|Prokka|PADJNBJD_00049 C15_RS0100250 -gnl|Prokka|PADJNBJD_00049 DU10_RS00255 -gnl|Prokka|PADJNBJD_00049 CTRC943_RS00250 -gnl|Prokka|PADJNBJD_00049 CTJTET1_RS00250 -gnl|Prokka|PADJNBJD_00049 O169_RS00250 -gnl|Prokka|PADJNBJD_00049 CBP48_RS01645 -gnl|Prokka|PADJNBJD_00049 ECS88FINAL_RS0100255 -gnl|Prokka|PADJNBJD_00049 DU13_RS00255 -gnl|Prokka|PADJNBJD_00049 KW39_RS00250 -gnl|Prokka|PADJNBJD_00049 KW36_RS00250 -gnl|Prokka|PADJNBJD_00049 BKB95_RS00255 -gnl|Prokka|PADJNBJD_00049 SW2_RS00250 -gnl|Prokka|PADJNBJD_00049 ECS102511_RS00250 -gnl|Prokka|PADJNBJD_00049 CTL2C_RS01615 -gnl|Prokka|PADJNBJD_00049 AQ193_RS03745 -gnl|Prokka|PADJNBJD_00049 AQ244_RS01740 -gnl|Prokka|PADJNBJD_00049 CBP42_RS01645 -gnl|Prokka|PADJNBJD_00049 CTB_RS00250 -gnl|Prokka|PADJNBJD_00049 L1224_RS00250 -gnl|Prokka|PADJNBJD_00049 BKB96_RS00255 -gnl|Prokka|PADJNBJD_00049 L1440_RS00250 -gnl|Prokka|PADJNBJD_00049 BKB99_RS00255 -gnl|Prokka|PADJNBJD_00049 BKB92_RS00255 -gnl|Prokka|PADJNBJD_00049 CTO_RS00250 -gnl|Prokka|PADJNBJD_00049 SOTONIA3_RS00250 -gnl|Prokka|PADJNBJD_00049 119245 -gnl|Prokka|PADJNBJD_00049 CBP44_RS01650 -gnl|Prokka|PADJNBJD_00049 E150_RS00250 -gnl|Prokka|PADJNBJD_00049 L2BUCH2_RS00250 -gnl|Prokka|PADJNBJD_00049 BKB93_RS00255 -gnl|Prokka|PADJNBJD_00049 FCS84708_RS00250 -gnl|Prokka|PADJNBJD_00049 AP288_RS03320 -gnl|Prokka|PADJNBJD_00049 BBV13_RS00255 -gnl|Prokka|PADJNBJD_00049 AQ199_RS00945 -gnl|Prokka|PADJNBJD_00049 BW688_RS01645 -gnl|Prokka|PADJNBJD_00049 G9768_RS00250 -gnl|Prokka|PADJNBJD_00049 L2BLST_RS00250 -gnl|Prokka|PADJNBJD_00049 AOT15_RS00705 -gnl|Prokka|PADJNBJD_00049 BKC02_RS00255 -gnl|Prokka|PADJNBJD_00148 gnl|Prokka|PADJNBJD_00148 -gnl|Prokka|PADJNBJD_00148 LJHENM_00740 -gnl|Prokka|PADJNBJD_00148 AKW53_RS02245 -gnl|Prokka|PADJNBJD_00148 BKC01_RS00760 -gnl|Prokka|PADJNBJD_00148 NILJEPDF_00148 -gnl|Prokka|PADJNBJD_00148 A5291_RS00755 -gnl|Prokka|PADJNBJD_00148 SOTONK1_RS00750 -gnl|Prokka|PADJNBJD_00148 JIEJKO_00745 -gnl|Prokka|PADJNBJD_00148 QSDFRQ_00148 -gnl|Prokka|PADJNBJD_00148 CTJTET1_RS00750 -gnl|Prokka|PADJNBJD_00148 IaCS19096_RS00750 -gnl|Prokka|PADJNBJD_00148 BKC03_RS00760 -gnl|Prokka|PADJNBJD_00148 C15_RS0100775 -gnl|Prokka|PADJNBJD_00148 ECS88FINAL_RS0100775 -gnl|Prokka|PADJNBJD_00148 KW39_RS00750 -gnl|Prokka|PADJNBJD_00148 DU10_RS00760 -gnl|Prokka|PADJNBJD_00148 O169_RS00750 -gnl|Prokka|PADJNBJD_00148 DU13_RS00765 -gnl|Prokka|PADJNBJD_00148 KW36_RS00750 -gnl|Prokka|PADJNBJD_00148 SW2_RS00750 -gnl|Prokka|PADJNBJD_00148 BKB95_RS00760 -gnl|Prokka|PADJNBJD_00148 ECS102511_RS00750 -gnl|Prokka|PADJNBJD_00148 CTB_RS00755 -gnl|Prokka|PADJNBJD_00148 AQ244_RS02925 -gnl|Prokka|PADJNBJD_00148 BKB96_RS00760 -gnl|Prokka|PADJNBJD_00148 AQ193_RS03245 -gnl|Prokka|PADJNBJD_00148 BKB99_RS00760 -gnl|Prokka|PADJNBJD_00148 CTO_RS00755 -gnl|Prokka|PADJNBJD_00148 BKB92_RS00760 -gnl|Prokka|PADJNBJD_00148 SOTONIA3_RS00750 -gnl|Prokka|PADJNBJD_00148 E150_RS00750 -gnl|Prokka|PADJNBJD_00148 FCS84708_RS00750 -gnl|Prokka|PADJNBJD_00148 AP288_RS03820 -gnl|Prokka|PADJNBJD_00148 BKB93_RS00760 -gnl|Prokka|PADJNBJD_00148 119327 -gnl|Prokka|PADJNBJD_00148 AQ199_RS01445 -gnl|Prokka|PADJNBJD_00148 BBV13_RS00760 -gnl|Prokka|PADJNBJD_00148 G9768_RS00750 -gnl|Prokka|PADJNBJD_00148 AOT15_RS00205 -gnl|Prokka|PADJNBJD_00148 BBV16_RS00760 -gnl|Prokka|PADJNBJD_00148 BKC02_RS00760 -gnl|Prokka|PADJNBJD_00148 L3404_RS00750 -gnl|Prokka|PADJNBJD_00148 CTRC943_RS00750 -gnl|Prokka|PADJNBJD_00148 CBP48_RS02150 -gnl|Prokka|PADJNBJD_00148 7618434 -gnl|Prokka|PADJNBJD_00148 CTL2C_RS02115 -gnl|Prokka|PADJNBJD_00148 L1224_RS00750 -gnl|Prokka|PADJNBJD_00148 CBP42_RS02150 -gnl|Prokka|PADJNBJD_00148 L1440_RS00750 -gnl|Prokka|PADJNBJD_00148 L2BUCH2_RS00750 -gnl|Prokka|PADJNBJD_00148 CBP44_RS02155 -gnl|Prokka|PADJNBJD_00148 L2BLST_RS00750 -gnl|Prokka|PADJNBJD_00148 BW688_RS02150 -gnl|Prokka|PADJNBJD_00250 gnl|Prokka|PADJNBJD_00250 -gnl|Prokka|PADJNBJD_00250 DU10_RS01285 -gnl|Prokka|PADJNBJD_00250 NILJEPDF_00250 -gnl|Prokka|PADJNBJD_00250 LJHENM_01255 -gnl|Prokka|PADJNBJD_00250 BKC03_RS01275 -gnl|Prokka|PADJNBJD_00250 119403 -gnl|Prokka|PADJNBJD_00250 CTRC943_RS01260 -gnl|Prokka|PADJNBJD_00250 CTJTET1_RS01290 -gnl|Prokka|PADJNBJD_00250 KW39_RS01280 -gnl|Prokka|PADJNBJD_00250 JIEJKO_01255 -gnl|Prokka|PADJNBJD_00250 C15_RS0101310 -gnl|Prokka|PADJNBJD_00250 SOTONK1_RS01275 -gnl|Prokka|PADJNBJD_00250 ECS88FINAL_RS0101295 -gnl|Prokka|PADJNBJD_00250 QSDFRQ_00250 -gnl|Prokka|PADJNBJD_00250 A5291_RS01300 -gnl|Prokka|PADJNBJD_00250 IaCS19096_RS01275 -gnl|Prokka|PADJNBJD_00250 O169_RS01280 -gnl|Prokka|PADJNBJD_00250 DU13_RS01285 -gnl|Prokka|PADJNBJD_00250 AOT15_RS01090 -gnl|Prokka|PADJNBJD_00250 7618480 -gnl|Prokka|PADJNBJD_00250 SW2_RS01270 -gnl|Prokka|PADJNBJD_00250 BKB95_RS01290 -gnl|Prokka|PADJNBJD_00250 CBP48_RS02665 -gnl|Prokka|PADJNBJD_00250 KW36_RS01275 -gnl|Prokka|PADJNBJD_00250 ECS102511_RS01270 -gnl|Prokka|PADJNBJD_00250 BKB96_RS01275 -gnl|Prokka|PADJNBJD_00250 CTL2C_RS02625 -gnl|Prokka|PADJNBJD_00250 BKB99_RS01275 -gnl|Prokka|PADJNBJD_00250 L1224_RS01255 -gnl|Prokka|PADJNBJD_00250 L1440_RS01255 -gnl|Prokka|PADJNBJD_00250 AQ244_RS03455 -gnl|Prokka|PADJNBJD_00250 BKB92_RS01275 -gnl|Prokka|PADJNBJD_00250 CBP42_RS02665 -gnl|Prokka|PADJNBJD_00250 SOTONIA3_RS01290 -gnl|Prokka|PADJNBJD_00250 CTB_RS01300 -gnl|Prokka|PADJNBJD_00250 E150_RS01270 -gnl|Prokka|PADJNBJD_00250 L2BUCH2_RS01260 -gnl|Prokka|PADJNBJD_00250 AQ193_RS02720 -gnl|Prokka|PADJNBJD_00250 CTO_RS01300 -gnl|Prokka|PADJNBJD_00250 FCS84708_RS01270 -gnl|Prokka|PADJNBJD_00250 AP288_RS04340 -gnl|Prokka|PADJNBJD_00250 BKB93_RS01275 -gnl|Prokka|PADJNBJD_00250 CBP44_RS02670 -gnl|Prokka|PADJNBJD_00250 AQ199_RS01965 -gnl|Prokka|PADJNBJD_00250 L2BLST_RS01260 -gnl|Prokka|PADJNBJD_00250 BW688_RS02670 -gnl|Prokka|PADJNBJD_00250 BBV13_RS01305 -gnl|Prokka|PADJNBJD_00250 G9768_RS01280 -gnl|Prokka|PADJNBJD_00250 BKC02_RS01275 -gnl|Prokka|PADJNBJD_00250 L3404_RS01255 -gnl|Prokka|PADJNBJD_00250 AKW53_RS02765 -gnl|Prokka|PADJNBJD_00250 BBV16_RS01305 -gnl|Prokka|PADJNBJD_00250 BKC01_RS01275 -gnl|Prokka|PADJNBJD_00515 gnl|Prokka|PADJNBJD_00515 -gnl|Prokka|PADJNBJD_00515 BKC01_RS02630 -gnl|Prokka|PADJNBJD_00515 NILJEPDF_00515 -gnl|Prokka|PADJNBJD_00515 LJHENM_02590 -gnl|Prokka|PADJNBJD_00515 CTRC943_RS02590 -gnl|Prokka|PADJNBJD_00515 AP288_RS00470 -gnl|Prokka|PADJNBJD_00515 SOTONK1_RS02610 -gnl|Prokka|PADJNBJD_00515 CTJTET1_RS02620 -gnl|Prokka|PADJNBJD_00515 JIEJKO_02595 -gnl|Prokka|PADJNBJD_00515 BKC03_RS02630 -gnl|Prokka|PADJNBJD_00515 QSDFRQ_00515 -gnl|Prokka|PADJNBJD_00515 KW39_RS02620 -gnl|Prokka|PADJNBJD_00515 C15_RS0102675 -gnl|Prokka|PADJNBJD_00515 ECS88FINAL_RS0102670 -gnl|Prokka|PADJNBJD_00515 IaCS19096_RS02605 -gnl|Prokka|PADJNBJD_00515 DU10_RS02650 -gnl|Prokka|PADJNBJD_00515 O169_RS02620 -gnl|Prokka|PADJNBJD_00515 A5291_RS02645 -gnl|Prokka|PADJNBJD_00515 AQ244_RS00500 -gnl|Prokka|PADJNBJD_00515 DU13_RS02645 -gnl|Prokka|PADJNBJD_00515 CBP48_RS04030 -gnl|Prokka|PADJNBJD_00515 CTL2C_RS03960 -gnl|Prokka|PADJNBJD_00515 KW36_RS02605 -gnl|Prokka|PADJNBJD_00515 BKB95_RS02645 -gnl|Prokka|PADJNBJD_00515 BKB96_RS02635 -gnl|Prokka|PADJNBJD_00515 BKB99_RS02630 -gnl|Prokka|PADJNBJD_00515 7619029 -gnl|Prokka|PADJNBJD_00515 SW2_RS02615 -gnl|Prokka|PADJNBJD_00515 L1224_RS02590 -gnl|Prokka|PADJNBJD_00515 ECS102511_RS02610 -gnl|Prokka|PADJNBJD_00515 L1440_RS02590 -gnl|Prokka|PADJNBJD_00515 AQ193_RS01375 -gnl|Prokka|PADJNBJD_00515 CBP42_RS04040 -gnl|Prokka|PADJNBJD_00515 120248 -gnl|Prokka|PADJNBJD_00515 L2BUCH2_RS02590 -gnl|Prokka|PADJNBJD_00515 SOTONIA3_RS02625 -gnl|Prokka|PADJNBJD_00515 AOT15_RS03485 -gnl|Prokka|PADJNBJD_00515 BKB92_RS02635 -gnl|Prokka|PADJNBJD_00515 CTB_RS02645 -gnl|Prokka|PADJNBJD_00515 E150_RS02615 -gnl|Prokka|PADJNBJD_00515 BW688_RS04030 -gnl|Prokka|PADJNBJD_00515 CTO_RS02645 -gnl|Prokka|PADJNBJD_00515 FCS84708_RS02605 -gnl|Prokka|PADJNBJD_00515 L2BLST_RS02590 -gnl|Prokka|PADJNBJD_00515 BBV13_RS02650 -gnl|Prokka|PADJNBJD_00515 CBP44_RS04035 -gnl|Prokka|PADJNBJD_00515 AQ199_RS03305 -gnl|Prokka|PADJNBJD_00515 BKB93_RS02640 -gnl|Prokka|PADJNBJD_00515 BBV16_RS02660 -gnl|Prokka|PADJNBJD_00515 G9768_RS02610 -gnl|Prokka|PADJNBJD_00515 L3404_RS02585 -gnl|Prokka|PADJNBJD_00515 AKW53_RS04605 -gnl|Prokka|PADJNBJD_00515 BKC02_RS02630 -gnl|Prokka|PADJNBJD_00681 gnl|Prokka|PADJNBJD_00681 -gnl|Prokka|PADJNBJD_00681 G9768_RS03460 -gnl|Prokka|PADJNBJD_00681 L3404_RS03440 -gnl|Prokka|PADJNBJD_00681 BKC02_RS03495 -gnl|Prokka|PADJNBJD_00681 NILJEPDF_00682 -gnl|Prokka|PADJNBJD_00681 LJHENM_03425 -gnl|Prokka|PADJNBJD_00681 AOT15_RS04260 -gnl|Prokka|PADJNBJD_00681 AP288_RS01830 -gnl|Prokka|PADJNBJD_00681 JIEJKO_03430 -gnl|Prokka|PADJNBJD_00681 BKC01_RS03495 -gnl|Prokka|PADJNBJD_00681 QSDFRQ_00682 -gnl|Prokka|PADJNBJD_00681 CTRC943_RS03445 -gnl|Prokka|PADJNBJD_00681 AQ244_RS04450 -gnl|Prokka|PADJNBJD_00681 BKC03_RS03495 -gnl|Prokka|PADJNBJD_00681 CBP48_RS00065 -gnl|Prokka|PADJNBJD_00681 CTJTET1_RS03480 -gnl|Prokka|PADJNBJD_00681 KW39_RS03480 -gnl|Prokka|PADJNBJD_00681 DU10_RS03510 -gnl|Prokka|PADJNBJD_00681 SOTONK1_RS03460 -gnl|Prokka|PADJNBJD_00681 ECS88FINAL_RS0103540 -gnl|Prokka|PADJNBJD_00681 IaCS19096_RS03455 -gnl|Prokka|PADJNBJD_00681 C15_RS0103535 -gnl|Prokka|PADJNBJD_00681 A5291_RS03505 -gnl|Prokka|PADJNBJD_00681 O169_RS03475 -gnl|Prokka|PADJNBJD_00681 DU13_RS03510 -gnl|Prokka|PADJNBJD_00681 KW36_RS03460 -gnl|Prokka|PADJNBJD_00681 AKW53_RS00210 -gnl|Prokka|PADJNBJD_00681 AQ193_RS00525 -gnl|Prokka|PADJNBJD_00681 BKB95_RS03515 -gnl|Prokka|PADJNBJD_00681 CBP42_RS00065 -gnl|Prokka|PADJNBJD_00681 SW2_RS03470 -gnl|Prokka|PADJNBJD_00681 CTL2C_RS00065 -gnl|Prokka|PADJNBJD_00681 L1224_RS03445 -gnl|Prokka|PADJNBJD_00681 ECS102511_RS03460 -gnl|Prokka|PADJNBJD_00681 L1440_RS03445 -gnl|Prokka|PADJNBJD_00681 BKB96_RS03505 -gnl|Prokka|PADJNBJD_00681 BKB99_RS03500 -gnl|Prokka|PADJNBJD_00681 CBP44_RS00065 -gnl|Prokka|PADJNBJD_00681 L2BUCH2_RS03445 -gnl|Prokka|PADJNBJD_00681 BKB92_RS03495 -gnl|Prokka|PADJNBJD_00681 CTB_RS03500 -gnl|Prokka|PADJNBJD_00681 SOTONIA3_RS03480 -gnl|Prokka|PADJNBJD_00681 E150_RS03470 -gnl|Prokka|PADJNBJD_00681 CTO_RS03495 -gnl|Prokka|PADJNBJD_00681 BBV13_RS03500 -gnl|Prokka|PADJNBJD_00681 FCS84708_RS03460 -gnl|Prokka|PADJNBJD_00681 L2BLST_RS03445 -gnl|Prokka|PADJNBJD_00681 7618665 -gnl|Prokka|PADJNBJD_00681 BBV16_RS03510 -gnl|Prokka|PADJNBJD_00681 BW688_RS00065 -gnl|Prokka|PADJNBJD_00681 AQ199_RS04160 -gnl|Prokka|PADJNBJD_00681 BKB93_RS03500 -gnl|Prokka|PADJNBJD_00681 120084 -SW2_RS00020 SW2_RS00020 -SW2_RS00020 ECS102511_RS00020 -SW2_RS00020 CTB_RS00020 -SW2_RS00020 CTL2C_RS01385 -SW2_RS00020 CBP42_RS01410 -SW2_RS00020 L1224_RS00020 -SW2_RS00020 BKB96_RS00020 -SW2_RS00020 BKB99_RS00020 -SW2_RS00020 CTO_RS00020 -SW2_RS00020 SOTONIA3_RS00020 -SW2_RS00020 L1440_RS00020 -SW2_RS00020 BKB92_RS00020 -SW2_RS00020 119204 -SW2_RS00020 CBP44_RS01410 -SW2_RS00020 AOT15_RS00935 -SW2_RS00020 E150_RS00020 -SW2_RS00020 L2BUCH2_RS00020 -SW2_RS00020 BKB93_RS00020 -SW2_RS00020 FCS84708_RS00020 -SW2_RS00020 AP288_RS03090 -SW2_RS00020 BBV13_RS00020 -SW2_RS00020 G9768_RS00020 -SW2_RS00020 BW688_RS01410 -SW2_RS00020 L2BLST_RS00020 -SW2_RS00020 AQ199_RS00715 -SW2_RS00020 BKC02_RS00020 -SW2_RS00020 BKC01_RS00020 -SW2_RS00020 7618354 -SW2_RS00020 gnl|Prokka|PADJNBJD_00004 -SW2_RS00020 LJHENM_00020 -SW2_RS00020 A5291_RS00020 -SW2_RS00020 SOTONK1_RS00020 -SW2_RS00020 BBV16_RS00020 -SW2_RS00020 JIEJKO_00015 -SW2_RS00020 NILJEPDF_00004 -SW2_RS00020 L3404_RS00020 -SW2_RS00020 IaCS19096_RS00020 -SW2_RS00020 BKC03_RS00020 -SW2_RS00020 C15_RS0100020 -SW2_RS00020 AQ193_RS03985 -SW2_RS00020 QSDFRQ_00004 -SW2_RS00020 CTJTET1_RS00020 -SW2_RS00020 AKW53_RS01505 -SW2_RS00020 DU10_RS00020 -SW2_RS00020 CTRC943_RS00020 -SW2_RS00020 O169_RS00020 -SW2_RS00020 AQ244_RS01970 -SW2_RS00020 CBP48_RS01410 -SW2_RS00020 ECS88FINAL_RS0100020 -SW2_RS00020 DU13_RS00020 -SW2_RS00020 KW39_RS00020 -SW2_RS00020 BKB95_RS00020 -SW2_RS00020 KW36_RS00020 -SW2_RS00185 SW2_RS00185 -SW2_RS00185 ECS102511_RS00185 -SW2_RS00185 CTB_RS00185 -SW2_RS00185 CTL2C_RS01550 -SW2_RS00185 CBP42_RS01580 -SW2_RS00185 L1224_RS00185 -SW2_RS00185 BKB96_RS00190 -SW2_RS00185 BKB99_RS00190 -SW2_RS00185 CTO_RS00185 -SW2_RS00185 SOTONIA3_RS00185 -SW2_RS00185 L1440_RS00185 -SW2_RS00185 BKB92_RS00190 -SW2_RS00185 120646 -SW2_RS00185 AOT15_RS00770 -SW2_RS00185 CBP44_RS01585 -SW2_RS00185 E150_RS00185 -SW2_RS00185 L2BUCH2_RS00185 -SW2_RS00185 BKB93_RS00190 -SW2_RS00185 FCS84708_RS00185 -SW2_RS00185 AP288_RS03255 -SW2_RS00185 BBV13_RS00190 -SW2_RS00185 G9768_RS00185 -SW2_RS00185 AQ199_RS00880 -SW2_RS00185 BW688_RS01580 -SW2_RS00185 L2BLST_RS00185 -SW2_RS00185 BKC02_RS00190 -SW2_RS00185 BBV16_RS00190 -SW2_RS00185 BKC01_RS00190 -SW2_RS00185 gnl|Prokka|PADJNBJD_00038 -SW2_RS00185 LJHENM_00190 -SW2_RS00185 A5291_RS00185 -SW2_RS00185 SOTONK1_RS00185 -SW2_RS00185 JIEJKO_00185 -SW2_RS00185 7618791 -SW2_RS00185 NILJEPDF_00038 -SW2_RS00185 L3404_RS00185 -SW2_RS00185 IaCS19096_RS00185 -SW2_RS00185 AKW53_RS01675 -SW2_RS00185 AQ193_RS03820 -SW2_RS00185 BKC03_RS00190 -SW2_RS00185 C15_RS0100185 -SW2_RS00185 QSDFRQ_00038 -SW2_RS00185 CTJTET1_RS00185 -SW2_RS00185 AQ244_RS01805 -SW2_RS00185 DU10_RS00190 -SW2_RS00185 CTRC943_RS00185 -SW2_RS00185 O169_RS00185 -SW2_RS00185 CBP48_RS01580 -SW2_RS00185 ECS88FINAL_RS0100190 -SW2_RS00185 DU13_RS00190 -SW2_RS00185 KW39_RS00185 -SW2_RS00185 KW36_RS00185 -SW2_RS00185 BKB95_RS00190 -SW2_RS00530 SW2_RS00530 -SW2_RS00530 BKB95_RS00540 -SW2_RS00530 ECS102511_RS00530 -SW2_RS00530 CTB_RS00530 -SW2_RS00530 CTL2C_RS01895 -SW2_RS00530 AQ244_RS02705 -SW2_RS00530 BKB96_RS00540 -SW2_RS00530 CBP42_RS01930 -SW2_RS00530 BKB99_RS00540 -SW2_RS00530 L1224_RS00530 -SW2_RS00530 BKB92_RS00540 -SW2_RS00530 AOT15_RS00425 -SW2_RS00530 CTO_RS00530 -SW2_RS00530 SOTONIA3_RS00530 -SW2_RS00530 L1440_RS00530 -SW2_RS00530 E150_RS00530 -SW2_RS00530 CBP44_RS01935 -SW2_RS00530 119281 -SW2_RS00530 BKB93_RS00540 -SW2_RS00530 L2BUCH2_RS00530 -SW2_RS00530 AP288_RS03600 -SW2_RS00530 FCS84708_RS00530 -SW2_RS00530 AQ199_RS01225 -SW2_RS00530 BBV13_RS00535 -SW2_RS00530 G9768_RS00530 -SW2_RS00530 L2BLST_RS00530 -SW2_RS00530 BW688_RS01930 -SW2_RS00530 BKC02_RS00540 -SW2_RS00530 BBV16_RS00535 -SW2_RS00530 gnl|Prokka|PADJNBJD_00104 -SW2_RS00530 LJHENM_00520 -SW2_RS00530 BKC01_RS00540 -SW2_RS00530 NILJEPDF_00104 -SW2_RS00530 AKW53_RS02025 -SW2_RS00530 A5291_RS00530 -SW2_RS00530 SOTONK1_RS00530 -SW2_RS00530 JIEJKO_00525 -SW2_RS00530 L3404_RS00530 -SW2_RS00530 AQ193_RS03465 -SW2_RS00530 QSDFRQ_00104 -SW2_RS00530 IaCS19096_RS00530 -SW2_RS00530 BKC03_RS00540 -SW2_RS00530 C15_RS0100545 -SW2_RS00530 DU10_RS00540 -SW2_RS00530 CTJTET1_RS00530 -SW2_RS00530 O169_RS00530 -SW2_RS00530 DU13_RS00545 -SW2_RS00530 7618404 -SW2_RS00530 CTRC943_RS00530 -SW2_RS00530 KW39_RS00530 -SW2_RS00530 ECS88FINAL_RS0100545 -SW2_RS00530 KW36_RS00530 -SW2_RS00530 CBP48_RS01930 -SW2_RS01050 SW2_RS01050 -SW2_RS01050 BKB95_RS01070 -SW2_RS01050 CBP48_RS02445 -SW2_RS01050 KW36_RS01055 -SW2_RS01050 ECS102511_RS01050 -SW2_RS01050 BKB96_RS01055 -SW2_RS01050 CTL2C_RS02405 -SW2_RS01050 BKB99_RS01055 -SW2_RS01050 L1224_RS01035 -SW2_RS01050 L1440_RS01035 -SW2_RS01050 AQ244_RS03235 -SW2_RS01050 BKB92_RS01055 -SW2_RS01050 CBP42_RS02445 -SW2_RS01050 SOTONIA3_RS01070 -SW2_RS01050 E150_RS01050 -SW2_RS01050 CTB_RS01080 -SW2_RS01050 L2BUCH2_RS01040 -SW2_RS01050 CTO_RS01080 -SW2_RS01050 FCS84708_RS01050 -SW2_RS01050 AP288_RS04120 -SW2_RS01050 BKB93_RS01055 -SW2_RS01050 AOT15_RS01310 -SW2_RS01050 CBP44_RS02450 -SW2_RS01050 AQ199_RS01745 -SW2_RS01050 L2BLST_RS01040 -SW2_RS01050 BW688_RS02450 -SW2_RS01050 BBV13_RS01085 -SW2_RS01050 G9768_RS01060 -SW2_RS01050 BKC02_RS01055 -SW2_RS01050 L3404_RS01035 -SW2_RS01050 AKW53_RS02545 -SW2_RS01050 BBV16_RS01085 -SW2_RS01050 BKC01_RS01055 -SW2_RS01050 119372 -SW2_RS01050 DU10_RS01065 -SW2_RS01050 gnl|Prokka|PADJNBJD_00207 -SW2_RS01050 BKC03_RS01055 -SW2_RS01050 NILJEPDF_00207 -SW2_RS01050 LJHENM_01040 -SW2_RS01050 CTRC943_RS01040 -SW2_RS01050 CTJTET1_RS01070 -SW2_RS01050 C15_RS0101090 -SW2_RS01050 SOTONK1_RS01055 -SW2_RS01050 ECS88FINAL_RS0101075 -SW2_RS01050 KW39_RS01060 -SW2_RS01050 AQ193_RS02940 -SW2_RS01050 JIEJKO_01040 -SW2_RS01050 A5291_RS01080 -SW2_RS01050 IaCS19096_RS01055 -SW2_RS01050 7618460 -SW2_RS01050 QSDFRQ_00207 -SW2_RS01050 O169_RS01060 -SW2_RS01050 DU13_RS01065 -SW2_RS01230 SW2_RS01230 -SW2_RS01230 BKB95_RS01250 -SW2_RS01230 CBP48_RS02625 -SW2_RS01230 KW36_RS01235 -SW2_RS01230 ECS102511_RS01230 -SW2_RS01230 BKB96_RS01235 -SW2_RS01230 CTL2C_RS02585 -SW2_RS01230 BKB99_RS01235 -SW2_RS01230 L1224_RS01215 -SW2_RS01230 L1440_RS01215 -SW2_RS01230 AQ244_RS03415 -SW2_RS01230 BKB92_RS01235 -SW2_RS01230 CBP42_RS02625 -SW2_RS01230 SOTONIA3_RS01250 -SW2_RS01230 CTB_RS01260 -SW2_RS01230 E150_RS01230 -SW2_RS01230 L2BUCH2_RS01220 -SW2_RS01230 CTO_RS01260 -SW2_RS01230 FCS84708_RS01230 -SW2_RS01230 AP288_RS04300 -SW2_RS01230 BKB93_RS01235 -SW2_RS01230 AOT15_RS01130 -SW2_RS01230 CBP44_RS02630 -SW2_RS01230 AQ199_RS01925 -SW2_RS01230 L2BLST_RS01220 -SW2_RS01230 BW688_RS02630 -SW2_RS01230 BBV13_RS01265 -SW2_RS01230 G9768_RS01240 -SW2_RS01230 BKC02_RS01235 -SW2_RS01230 L3404_RS01215 -SW2_RS01230 AKW53_RS02725 -SW2_RS01230 BBV16_RS01265 -SW2_RS01230 BKC01_RS01235 -SW2_RS01230 gnl|Prokka|PADJNBJD_00242 -SW2_RS01230 DU10_RS01245 -SW2_RS01230 119397 -SW2_RS01230 NILJEPDF_00242 -SW2_RS01230 LJHENM_01215 -SW2_RS01230 BKC03_RS01235 -SW2_RS01230 CTRC943_RS01220 -SW2_RS01230 CTJTET1_RS01250 -SW2_RS01230 KW39_RS01240 -SW2_RS01230 JIEJKO_01215 -SW2_RS01230 C15_RS0101270 -SW2_RS01230 SOTONK1_RS01235 -SW2_RS01230 ECS88FINAL_RS0101255 -SW2_RS01230 AQ193_RS02760 -SW2_RS01230 QSDFRQ_00242 -SW2_RS01230 A5291_RS01260 -SW2_RS01230 IaCS19096_RS01235 -SW2_RS01230 O169_RS01240 -SW2_RS01230 DU13_RS01245 -SW2_RS01230 7618476 -SW2_RS01550 SW2_RS01550 -SW2_RS01550 BKB95_RS01575 -SW2_RS01550 CBP48_RS02950 -SW2_RS01550 7618505 -SW2_RS01550 KW36_RS01555 -SW2_RS01550 ECS102511_RS01550 -SW2_RS01550 AOT15_RS02555 -SW2_RS01550 BKB96_RS01560 -SW2_RS01550 CTL2C_RS02905 -SW2_RS01550 BKB99_RS01560 -SW2_RS01550 L1224_RS01535 -SW2_RS01550 L1440_RS01535 -SW2_RS01550 AQ244_RS03740 -SW2_RS01550 CBP42_RS02950 -SW2_RS01550 SOTONIA3_RS01570 -SW2_RS01550 BKB92_RS01565 -SW2_RS01550 CTB_RS01585 -SW2_RS01550 E150_RS01555 -SW2_RS01550 L2BUCH2_RS01540 -SW2_RS01550 CTO_RS01580 -SW2_RS01550 FCS84708_RS01550 -SW2_RS01550 AP288_RS04620 -SW2_RS01550 BKB93_RS01565 -SW2_RS01550 CBP44_RS02955 -SW2_RS01550 AQ199_RS02245 -SW2_RS01550 L2BLST_RS01540 -SW2_RS01550 BBV13_RS01590 -SW2_RS01550 BW688_RS02960 -SW2_RS01550 G9768_RS01560 -SW2_RS01550 BKC02_RS01560 -SW2_RS01550 AKW53_RS03050 -SW2_RS01550 BBV16_RS01590 -SW2_RS01550 L3404_RS01535 -SW2_RS01550 BKC01_RS01565 -SW2_RS01550 gnl|Prokka|PADJNBJD_00306 -SW2_RS01550 NILJEPDF_00306 -SW2_RS01550 LJHENM_01540 -SW2_RS01550 BKC03_RS01560 -SW2_RS01550 DU10_RS01575 -SW2_RS01550 CTRC943_RS01540 -SW2_RS01550 CTJTET1_RS01570 -SW2_RS01550 KW39_RS01560 -SW2_RS01550 AQ193_RS02435 -SW2_RS01550 JIEJKO_01540 -SW2_RS01550 C15_RS0101605 -SW2_RS01550 SOTONK1_RS01560 -SW2_RS01550 ECS88FINAL_RS0101585 -SW2_RS01550 119442 -SW2_RS01550 QSDFRQ_00306 -SW2_RS01550 IaCS19096_RS01555 -SW2_RS01550 A5291_RS01585 -SW2_RS01550 O169_RS01565 -SW2_RS01550 DU13_RS01570 -CTL2C_RS02040 CTL2C_RS02040 -CTL2C_RS02040 CTB_RS00680 -CTL2C_RS02040 L1224_RS00675 -CTL2C_RS02040 AQ244_RS02850 -CTL2C_RS02040 BKB96_RS00685 -CTL2C_RS02040 CBP42_RS02075 -CTL2C_RS02040 BKB99_RS00685 -CTL2C_RS02040 L1440_RS00675 -CTL2C_RS02040 BKB92_RS00685 -CTL2C_RS02040 CTO_RS00680 -CTL2C_RS02040 SOTONIA3_RS00675 -CTL2C_RS02040 E150_RS00675 -CTL2C_RS02040 L2BUCH2_RS00675 -CTL2C_RS02040 CBP44_RS02080 -CTL2C_RS02040 FCS84708_RS00675 -CTL2C_RS02040 AP288_RS03745 -CTL2C_RS02040 BKB93_RS00685 -CTL2C_RS02040 AOT15_RS00280 -CTL2C_RS02040 120567 -CTL2C_RS02040 AQ199_RS01370 -CTL2C_RS02040 BBV13_RS00685 -CTL2C_RS02040 G9768_RS00675 -CTL2C_RS02040 L2BLST_RS00675 -CTL2C_RS02040 BW688_RS02075 -CTL2C_RS02040 BBV16_RS00685 -CTL2C_RS02040 BKC02_RS00685 -CTL2C_RS02040 gnl|Prokka|PADJNBJD_00133 -CTL2C_RS02040 LJHENM_00665 -CTL2C_RS02040 AKW53_RS02170 -CTL2C_RS02040 BKC01_RS00685 -CTL2C_RS02040 NILJEPDF_00133 -CTL2C_RS02040 A5291_RS00680 -CTL2C_RS02040 L3404_RS00675 -CTL2C_RS02040 SOTONK1_RS00675 -CTL2C_RS02040 JIEJKO_00670 -CTL2C_RS02040 QSDFRQ_00133 -CTL2C_RS02040 IaCS19096_RS00675 -CTL2C_RS02040 BKC03_RS00685 -CTL2C_RS02040 C15_RS0100700 -CTL2C_RS02040 CTRC943_RS00675 -CTL2C_RS02040 CTJTET1_RS00675 -CTL2C_RS02040 KW39_RS00675 -CTL2C_RS02040 DU10_RS00685 -CTL2C_RS02040 ECS88FINAL_RS0100700 -CTL2C_RS02040 O169_RS00675 -CTL2C_RS02040 DU13_RS00690 -CTL2C_RS02040 7618841 -CTL2C_RS02040 KW36_RS00675 -CTL2C_RS02040 CBP48_RS02075 -CTL2C_RS02040 SW2_RS00675 -CTL2C_RS02040 BKB95_RS00685 -CTL2C_RS02040 AQ193_RS03320 -CTL2C_RS02040 ECS102511_RS00675 -CTL2C_RS02220 CTL2C_RS02220 -CTL2C_RS02220 CBP42_RS02260 -CTL2C_RS02220 CBP44_RS02265 -CTL2C_RS02220 BW688_RS02260 -CTL2C_RS02220 CTRC943_RS00855 -CTL2C_RS02220 CBP48_RS02260 -CTL2C_RS03400 CTL2C_RS03400 -CTL2C_RS03400 CBP48_RS03465 -CTL2C_RS03400 120324 -CTL2C_RS03400 L1224_RS02030 -CTL2C_RS03400 KW36_RS02050 -CTL2C_RS03400 AOT15_RS03050 -CTL2C_RS03400 BKB95_RS02080 -CTL2C_RS03400 BKB96_RS02060 -CTL2C_RS03400 SW2_RS02055 -CTL2C_RS03400 BKB99_RS02060 -CTL2C_RS03400 L1440_RS02030 -CTL2C_RS03400 ECS102511_RS02055 -CTL2C_RS03400 CTB_RS02080 -CTL2C_RS03400 CBP42_RS03475 -CTL2C_RS03400 SOTONIA3_RS02065 -CTL2C_RS03400 L2BUCH2_RS02030 -CTL2C_RS03400 BKB92_RS02070 -CTL2C_RS03400 CTO_RS02080 -CTL2C_RS03400 AP288_RS01025 -CTL2C_RS03400 E150_RS02060 -CTL2C_RS03400 L2BLST_RS02030 -CTL2C_RS03400 BW688_RS03460 -CTL2C_RS03400 FCS84708_RS02050 -CTL2C_RS03400 BBV13_RS02085 -CTL2C_RS03400 BKB93_RS02070 -CTL2C_RS03400 CBP44_RS03470 -CTL2C_RS03400 AQ244_RS01055 -CTL2C_RS03400 AQ199_RS02750 -CTL2C_RS03400 G9768_RS02055 -CTL2C_RS03400 BBV16_RS02085 -CTL2C_RS03400 L3404_RS02030 -CTL2C_RS03400 BKC02_RS02060 -CTL2C_RS03400 BKC01_RS02060 -CTL2C_RS03400 AKW53_RS03555 -CTL2C_RS03400 gnl|Prokka|PADJNBJD_00405 -CTL2C_RS03400 NILJEPDF_00405 -CTL2C_RS03400 CTRC943_RS02035 -CTL2C_RS03400 AQ193_RS01930 -CTL2C_RS03400 LJHENM_02040 -CTL2C_RS03400 JIEJKO_02035 -CTL2C_RS03400 BKC03_RS02060 -CTL2C_RS03400 CTJTET1_RS02065 -CTL2C_RS03400 QSDFRQ_00405 -CTL2C_RS03400 C15_RS0102100 -CTL2C_RS03400 A5291_RS02080 -CTL2C_RS03400 SOTONK1_RS02055 -CTL2C_RS03400 DU10_RS02085 -CTL2C_RS03400 KW39_RS02065 -CTL2C_RS03400 IaCS19096_RS02050 -CTL2C_RS03400 ECS88FINAL_RS0102095 -CTL2C_RS03400 O169_RS02065 -CTL2C_RS03400 DU13_RS02080 -CTL2C_RS03400 7618983 -CTL2C_RS04400 CTL2C_RS04400 -CTL2C_RS04400 DU13_RS03100 -CTL2C_RS04400 CBP48_RS04490 -CTL2C_RS04400 L1224_RS03030 -CTL2C_RS04400 KW36_RS03055 -CTL2C_RS04400 BKB95_RS03100 -CTL2C_RS04400 AKW53_RS04285 -CTL2C_RS04400 BKB96_RS03095 -CTL2C_RS04400 BKB99_RS03090 -CTL2C_RS04400 7619091 -CTL2C_RS04400 SW2_RS03060 -CTL2C_RS04400 L1440_RS03030 -CTL2C_RS04400 ECS102511_RS03055 -CTL2C_RS04400 CBP42_RS04495 -CTL2C_RS04400 L2BUCH2_RS03030 -CTL2C_RS04400 CTB_RS03090 -CTL2C_RS04400 SOTONIA3_RS03075 -CTL2C_RS04400 AP288_RS00025 -CTL2C_RS04400 BKB92_RS03090 -CTL2C_RS04400 BW688_RS04485 -CTL2C_RS04400 120152 -CTL2C_RS04400 E150_RS03060 -CTL2C_RS04400 CTO_RS03090 -CTL2C_RS04400 L2BLST_RS03030 -CTL2C_RS04400 CBP44_RS04490 -CTL2C_RS04400 FCS84708_RS03055 -CTL2C_RS04400 BBV13_RS03095 -CTL2C_RS04400 AQ244_RS00050 -CTL2C_RS04400 AQ199_RS03755 -CTL2C_RS04400 BBV16_RS03105 -CTL2C_RS04400 BKB93_RS03095 -CTL2C_RS04400 G9768_RS03060 -CTL2C_RS04400 L3404_RS03025 -CTL2C_RS04400 gnl|Prokka|PADJNBJD_00602 -CTL2C_RS04400 NILJEPDF_00602 -CTL2C_RS04400 LJHENM_03025 -CTL2C_RS04400 BKC02_RS03090 -CTL2C_RS04400 AOT15_RS03860 -CTL2C_RS04400 CTRC943_RS03030 -CTL2C_RS04400 BKC01_RS03090 -CTL2C_RS04400 QSDFRQ_00602 -CTL2C_RS04400 AQ193_RS00930 -CTL2C_RS04400 JIEJKO_03035 -CTL2C_RS04400 SOTONK1_RS03060 -CTL2C_RS04400 CTJTET1_RS03070 -CTL2C_RS04400 BKC03_RS03090 -CTL2C_RS04400 KW39_RS03070 -CTL2C_RS04400 C15_RS0103125 -CTL2C_RS04400 ECS88FINAL_RS0103120 -CTL2C_RS04400 IaCS19096_RS03055 -CTL2C_RS04400 DU10_RS03105 -CTL2C_RS04400 A5291_RS03090 -CTL2C_RS04400 O169_RS03065 -CTL2C_RS04565 CTL2C_RS04565 -CTL2C_RS04565 AKW53_RS04445 -CTL2C_RS04565 CBP48_RS04650 -CTL2C_RS04565 7618646 -CTL2C_RS04565 SW2_RS03225 -CTL2C_RS04565 L1224_RS03195 -CTL2C_RS04565 KW36_RS03220 -CTL2C_RS04565 ECS102511_RS03220 -CTL2C_RS04565 L1440_RS03195 -CTL2C_RS04565 BKB95_RS03265 -CTL2C_RS04565 BKB96_RS03260 -CTL2C_RS04565 BKB99_RS03255 -CTL2C_RS04565 CBP42_RS04655 -CTL2C_RS04565 L2BUCH2_RS03195 -CTL2C_RS04565 BKB92_RS03250 -CTL2C_RS04565 CTB_RS03260 -CTL2C_RS04565 E150_RS03225 -CTL2C_RS04565 SOTONIA3_RS03240 -CTL2C_RS04565 BW688_RS04645 -CTL2C_RS04565 CTO_RS03255 -CTL2C_RS04565 FCS84708_RS03220 -CTL2C_RS04565 L2BLST_RS03195 -CTL2C_RS04565 BBV13_RS03260 -CTL2C_RS04565 CBP44_RS04650 -CTL2C_RS04565 119663 -CTL2C_RS04565 AQ199_RS03920 -CTL2C_RS04565 BKB93_RS03255 -CTL2C_RS04565 BBV16_RS03270 -CTL2C_RS04565 AQ244_RS04695 -CTL2C_RS04565 G9768_RS03220 -CTL2C_RS04565 L3404_RS03190 -CTL2C_RS04565 gnl|Prokka|PADJNBJD_00633 -CTL2C_RS04565 AP288_RS01590 -CTL2C_RS04565 BKC02_RS03250 -CTL2C_RS04565 NILJEPDF_00634 -CTL2C_RS04565 LJHENM_03185 -CTL2C_RS04565 AOT15_RS04020 -CTL2C_RS04565 CTRC943_RS03195 -CTL2C_RS04565 JIEJKO_03190 -CTL2C_RS04565 BKC01_RS03250 -CTL2C_RS04565 QSDFRQ_00634 -CTL2C_RS04565 KW39_RS03235 -CTL2C_RS04565 AQ193_RS00765 -CTL2C_RS04565 BKC03_RS03250 -CTL2C_RS04565 CTJTET1_RS03235 -CTL2C_RS04565 ECS88FINAL_RS0103285 -CTL2C_RS04565 DU10_RS03265 -CTL2C_RS04565 SOTONK1_RS03220 -CTL2C_RS04565 O169_RS03230 -CTL2C_RS04565 IaCS19096_RS03215 -CTL2C_RS04565 C15_RS0103285 -CTL2C_RS04565 A5291_RS03260 -CTL2C_RS04565 DU13_RS03260 -CTO_RS00325 CTO_RS00325 -CTO_RS00325 L1440_RS00325 -CTO_RS00325 AQ193_RS03670 -CTO_RS00325 AQ244_RS01665 -CTO_RS00325 BKB92_RS00330 -CTO_RS00325 SOTONIA3_RS00325 -CTO_RS00325 CBP44_RS01725 -CTO_RS00325 119255 -CTO_RS00325 E150_RS00325 -CTO_RS00325 L2BUCH2_RS00325 -CTO_RS00325 BKB93_RS00330 -CTO_RS00325 FCS84708_RS00325 -CTO_RS00325 AP288_RS03395 -CTO_RS00325 BBV13_RS00330 -CTO_RS00325 AQ199_RS01020 -CTO_RS00325 BW688_RS01720 -CTO_RS00325 G9768_RS00325 -CTO_RS00325 L2BLST_RS00325 -CTO_RS00325 BKC02_RS00330 -CTO_RS00325 BBV16_RS00330 -CTO_RS00325 gnl|Prokka|PADJNBJD_00064 -CTO_RS00325 NILJEPDF_00064 -CTO_RS00325 LJHENM_00325 -CTO_RS00325 A5291_RS00325 -CTO_RS00325 BKC01_RS00330 -CTO_RS00325 SOTONK1_RS00325 -CTO_RS00325 L3404_RS00325 -CTO_RS00325 AOT15_RS00630 -CTO_RS00325 JIEJKO_00325 -CTO_RS00325 AKW53_RS01815 -CTO_RS00325 QSDFRQ_00064 -CTO_RS00325 IaCS19096_RS00325 -CTO_RS00325 BKC03_RS00330 -CTO_RS00325 C15_RS0100330 -CTO_RS00325 DU10_RS00330 -CTO_RS00325 7618387 -CTO_RS00325 CTRC943_RS00325 -CTO_RS00325 CTJTET1_RS00325 -CTO_RS00325 O169_RS00325 -CTO_RS00325 KW36_RS00325 -CTO_RS00325 DU13_RS00335 -CTO_RS00325 CBP48_RS01720 -CTO_RS00325 ECS88FINAL_RS0100335 -CTO_RS00325 KW39_RS00325 -CTO_RS00325 BKB95_RS00330 -CTO_RS00325 SW2_RS00325 -CTO_RS00325 ECS102511_RS00325 -CTO_RS00325 CTB_RS00325 -CTO_RS00325 CTL2C_RS01690 -CTO_RS00325 CBP42_RS01720 -CTO_RS00325 BKB96_RS00330 -CTO_RS00325 L1224_RS00325 -CTO_RS00325 BKB99_RS00330 -CTO_RS01680 CTO_RS01680 -CTO_RS01680 FCS84708_RS01650 -CTO_RS01680 CBP44_RS03055 -CTO_RS01680 BKB93_RS01665 -CTO_RS01680 L2BLST_RS01640 -CTO_RS01680 AQ199_RS02345 -CTO_RS01680 BW688_RS03060 -CTO_RS01680 BBV13_RS01690 -CTO_RS01680 AQ193_RS02335 -CTO_RS01680 G9768_RS01660 -CTO_RS01680 BKC02_RS01660 -CTO_RS01680 L3404_RS01635 -CTO_RS01680 AKW53_RS03150 -CTO_RS01680 BBV16_RS01690 -CTO_RS01680 BKC01_RS01665 -CTO_RS01680 gnl|Prokka|PADJNBJD_00326 -CTO_RS01680 NILJEPDF_00326 -CTO_RS01680 LJHENM_01640 -CTO_RS01680 CTRC943_RS01640 -CTO_RS01680 BKC03_RS01660 -CTO_RS01680 DU10_RS01675 -CTO_RS01680 CTJTET1_RS01670 -CTO_RS01680 KW39_RS01660 -CTO_RS01680 JIEJKO_01640 -CTO_RS01680 C15_RS0101700 -CTO_RS01680 SOTONK1_RS01660 -CTO_RS01680 ECS88FINAL_RS0101680 -CTO_RS01680 QSDFRQ_00326 -CTO_RS01680 IaCS19096_RS01655 -CTO_RS01680 A5291_RS01685 -CTO_RS01680 O169_RS01665 -CTO_RS01680 DU13_RS01670 -CTO_RS01680 120391 -CTO_RS01680 CBP48_RS03050 -CTO_RS01680 SW2_RS01650 -CTO_RS01680 BKB95_RS01675 -CTO_RS01680 7618942 -CTO_RS01680 CTL2C_RS03005 -CTO_RS01680 KW36_RS01655 -CTO_RS01680 ECS102511_RS01650 -CTO_RS01680 AOT15_RS02655 -CTO_RS01680 BKB96_RS01660 -CTO_RS01680 L1224_RS01635 -CTO_RS01680 BKB99_RS01660 -CTO_RS01680 L1440_RS01635 -CTO_RS01680 AP288_RS01430 -CTO_RS01680 CBP42_RS03050 -CTO_RS01680 AQ244_RS01460 -CTO_RS01680 SOTONIA3_RS01670 -CTO_RS01680 BKB92_RS01665 -CTO_RS01680 CTB_RS01685 -CTO_RS01680 E150_RS01655 -CTO_RS01680 L2BUCH2_RS01640 -CTO_RS01860 CTO_RS01860 -CTO_RS01860 E150_RS01840 -CTO_RS01860 L2BLST_RS01810 -CTO_RS01860 FCS84708_RS01830 -CTO_RS01860 AQ193_RS02150 -CTO_RS01860 BW688_RS03240 -CTO_RS01860 BKB93_RS01850 -CTO_RS01860 CBP44_RS03245 -CTO_RS01860 BBV13_RS01865 -CTO_RS01860 AQ199_RS02530 -CTO_RS01860 G9768_RS01835 -CTO_RS01860 L3404_RS01810 -CTO_RS01860 BBV16_RS01865 -CTO_RS01860 BKC02_RS01840 -CTO_RS01860 BKC01_RS01840 -CTO_RS01860 AKW53_RS03335 -CTO_RS01860 gnl|Prokka|PADJNBJD_00361 -CTO_RS01860 NILJEPDF_00361 -CTO_RS01860 CTRC943_RS01815 -CTO_RS01860 LJHENM_01820 -CTO_RS01860 JIEJKO_01815 -CTO_RS01860 BKC03_RS01840 -CTO_RS01860 CTJTET1_RS01845 -CTO_RS01860 DU10_RS01860 -CTO_RS01860 QSDFRQ_00361 -CTO_RS01860 C15_RS0101875 -CTO_RS01860 SOTONK1_RS01835 -CTO_RS01860 A5291_RS01860 -CTO_RS01860 KW39_RS01845 -CTO_RS01860 IaCS19096_RS01830 -CTO_RS01860 ECS88FINAL_RS0101865 -CTO_RS01860 DU13_RS01855 -CTO_RS01860 119470 -CTO_RS01860 O169_RS01845 -CTO_RS01860 7618523 -CTO_RS01860 CTL2C_RS03180 -CTO_RS01860 AP288_RS01245 -CTO_RS01860 BKB95_RS01855 -CTO_RS01860 CBP48_RS03240 -CTO_RS01860 L1224_RS01810 -CTO_RS01860 KW36_RS01830 -CTO_RS01860 AOT15_RS02830 -CTO_RS01860 BKB96_RS01840 -CTO_RS01860 SW2_RS01835 -CTO_RS01860 BKB99_RS01840 -CTO_RS01860 L1440_RS01810 -CTO_RS01860 ECS102511_RS01835 -CTO_RS01860 AQ244_RS01275 -CTO_RS01860 CBP42_RS03250 -CTO_RS01860 CTB_RS01860 -CTO_RS01860 SOTONIA3_RS01845 -CTO_RS01860 L2BUCH2_RS01810 -CTO_RS01860 BKB92_RS01850 -CTO_RS02030 CTO_RS02030 -CTO_RS02030 E150_RS02010 -CTO_RS02030 AQ193_RS01980 -CTO_RS02030 L2BLST_RS01980 -CTO_RS02030 BW688_RS03410 -CTO_RS02030 FCS84708_RS02000 -CTO_RS02030 BBV13_RS02035 -CTO_RS02030 BKB93_RS02020 -CTO_RS02030 CBP44_RS03420 -CTO_RS02030 AQ199_RS02700 -CTO_RS02030 G9768_RS02005 -CTO_RS02030 BBV16_RS02035 -CTO_RS02030 L3404_RS01980 -CTO_RS02030 BKC02_RS02010 -CTO_RS02030 BKC01_RS02010 -CTO_RS02030 AKW53_RS03505 -CTO_RS02030 gnl|Prokka|PADJNBJD_00395 -CTO_RS02030 NILJEPDF_00395 -CTO_RS02030 CTRC943_RS01985 -CTO_RS02030 LJHENM_01990 -CTO_RS02030 JIEJKO_01985 -CTO_RS02030 BKC03_RS02010 -CTO_RS02030 CTJTET1_RS02015 -CTO_RS02030 QSDFRQ_00395 -CTO_RS02030 C15_RS0102050 -CTO_RS02030 A5291_RS02030 -CTO_RS02030 SOTONK1_RS02005 -CTO_RS02030 DU10_RS02035 -CTO_RS02030 KW39_RS02015 -CTO_RS02030 IaCS19096_RS02000 -CTO_RS02030 ECS88FINAL_RS0102040 -CTO_RS02030 O169_RS02015 -CTO_RS02030 AP288_RS01075 -CTO_RS02030 DU13_RS02030 -CTO_RS02030 7618974 -CTO_RS02030 CTL2C_RS03350 -CTO_RS02030 CBP48_RS03415 -CTO_RS02030 120338 -CTO_RS02030 L1224_RS01980 -CTO_RS02030 KW36_RS02000 -CTO_RS02030 AOT15_RS03000 -CTO_RS02030 BKB95_RS02030 -CTO_RS02030 BKB96_RS02010 -CTO_RS02030 SW2_RS02005 -CTO_RS02030 BKB99_RS02010 -CTO_RS02030 L1440_RS01980 -CTO_RS02030 ECS102511_RS02005 -CTO_RS02030 AQ244_RS01105 -CTO_RS02030 CTB_RS02030 -CTO_RS02030 CBP42_RS03425 -CTO_RS02030 SOTONIA3_RS02015 -CTO_RS02030 L2BUCH2_RS01980 -CTO_RS02030 BKB92_RS02020 -CTO_RS02190 CTO_RS02190 -CTO_RS02190 E150_RS02170 -CTO_RS02190 AQ193_RS01820 -CTO_RS02190 L2BLST_RS02140 -CTO_RS02190 BBV13_RS02200 -CTO_RS02190 BW688_RS03575 -CTO_RS02190 FCS84708_RS02160 -CTO_RS02190 BKB93_RS02185 -CTO_RS02190 CBP44_RS03585 -CTO_RS02190 AQ199_RS02860 -CTO_RS02190 BBV16_RS02200 -CTO_RS02190 G9768_RS02165 -CTO_RS02190 L3404_RS02140 -CTO_RS02190 BKC02_RS02175 -CTO_RS02190 BKC01_RS02175 -CTO_RS02190 AKW53_RS03665 -CTO_RS02190 gnl|Prokka|PADJNBJD_00427 -CTO_RS02190 NILJEPDF_00427 -CTO_RS02190 CTRC943_RS02145 -CTO_RS02190 LJHENM_02155 -CTO_RS02190 JIEJKO_02150 -CTO_RS02190 BKC03_RS02175 -CTO_RS02190 CTJTET1_RS02175 -CTO_RS02190 QSDFRQ_00427 -CTO_RS02190 C15_RS0102210 -CTO_RS02190 A5291_RS02190 -CTO_RS02190 SOTONK1_RS02165 -CTO_RS02190 DU10_RS02200 -CTO_RS02190 KW39_RS02175 -CTO_RS02190 IaCS19096_RS02160 -CTO_RS02190 ECS88FINAL_RS0102205 -CTO_RS02190 O169_RS02175 -CTO_RS02190 AP288_RS00915 -CTO_RS02190 DU13_RS02195 -CTO_RS02190 7618555 -CTO_RS02190 CTL2C_RS03510 -CTO_RS02190 CBP48_RS03580 -CTO_RS02190 119522 -CTO_RS02190 L1224_RS02140 -CTO_RS02190 KW36_RS02160 -CTO_RS02190 AOT15_RS03160 -CTO_RS02190 BKB95_RS02195 -CTO_RS02190 BKB96_RS02175 -CTO_RS02190 SW2_RS02165 -CTO_RS02190 BKB99_RS02175 -CTO_RS02190 L1440_RS02140 -CTO_RS02190 ECS102511_RS02165 -CTO_RS02190 AQ244_RS00945 -CTO_RS02190 CTB_RS02190 -CTO_RS02190 CBP42_RS03590 -CTO_RS02190 SOTONIA3_RS02175 -CTO_RS02190 L2BUCH2_RS02140 -CTO_RS02190 BKB92_RS02185 -CTO_RS02355 CTO_RS02355 -CTO_RS02355 E150_RS02330 -CTO_RS02355 BW688_RS03740 -CTO_RS02355 L2BLST_RS02305 -CTO_RS02355 FCS84708_RS02320 -CTO_RS02355 AQ193_RS01660 -CTO_RS02355 BBV13_RS02360 -CTO_RS02355 CBP44_RS03750 -CTO_RS02355 BKB93_RS02355 -CTO_RS02355 AQ199_RS03020 -CTO_RS02355 G9768_RS02325 -CTO_RS02355 BBV16_RS02365 -CTO_RS02355 L3404_RS02300 -CTO_RS02355 BKC02_RS02340 -CTO_RS02355 BKC01_RS02340 -CTO_RS02355 gnl|Prokka|PADJNBJD_00459 -CTO_RS02355 AKW53_RS03825 -CTO_RS02355 NILJEPDF_00459 -CTO_RS02355 LJHENM_02315 -CTO_RS02355 CTRC943_RS02305 -CTO_RS02355 JIEJKO_02315 -CTO_RS02355 BKC03_RS02340 -CTO_RS02355 QSDFRQ_00459 -CTO_RS02355 CTJTET1_RS02335 -CTO_RS02355 C15_RS0102375 -CTO_RS02355 SOTONK1_RS02325 -CTO_RS02355 DU10_RS02365 -CTO_RS02355 A5291_RS02355 -CTO_RS02355 KW39_RS02335 -CTO_RS02355 IaCS19096_RS02320 -CTO_RS02355 ECS88FINAL_RS0102375 -CTO_RS02355 O169_RS02335 -CTO_RS02355 DU13_RS02360 -CTO_RS02355 7619003 -CTO_RS02355 AP288_RS00755 -CTO_RS02355 BKB96_RS02345 -CTO_RS02355 BKB99_RS02340 -CTO_RS02355 CBP48_RS03745 -CTO_RS02355 120292 -CTO_RS02355 CTL2C_RS03675 -CTO_RS02355 KW36_RS02320 -CTO_RS02355 AOT15_RS03320 -CTO_RS02355 BKB95_RS02360 -CTO_RS02355 L1224_RS02305 -CTO_RS02355 SW2_RS02330 -CTO_RS02355 ECS102511_RS02325 -CTO_RS02355 L1440_RS02305 -CTO_RS02355 AQ244_RS00785 -CTO_RS02355 CBP42_RS03755 -CTO_RS02355 CTB_RS02355 -CTO_RS02355 L2BUCH2_RS02300 -CTO_RS02355 BKB92_RS02350 -CTO_RS02355 SOTONIA3_RS02340 -LJHENM_02410 LJHENM_02410 -LJHENM_02410 CTRC943_RS02405 -LJHENM_02410 AP288_RS00655 -LJHENM_02410 JIEJKO_02410 -LJHENM_02410 QSDFRQ_00478 -LJHENM_02410 BKC03_RS02445 -LJHENM_02410 CTJTET1_RS02435 -LJHENM_02410 AOT15_RS00050 -LJHENM_02410 C15_RS0102485 -LJHENM_02410 SOTONK1_RS02425 -LJHENM_02410 DU10_RS02465 -LJHENM_02410 KW39_RS02435 -LJHENM_02410 IaCS19096_RS02420 -LJHENM_02410 A5291_RS02460 -LJHENM_02410 ECS88FINAL_RS0102480 -LJHENM_02410 7618584 -LJHENM_02410 O169_RS02435 -LJHENM_02410 AQ244_RS00685 -LJHENM_02410 DU13_RS02460 -LJHENM_02410 CBP48_RS03845 -LJHENM_02410 BKB95_RS02460 -LJHENM_02410 BKB96_RS02450 -LJHENM_02410 BKB99_RS02445 -LJHENM_02410 CTL2C_RS03775 -LJHENM_02410 KW36_RS02420 -LJHENM_02410 119567 -LJHENM_02410 L1224_RS02405 -LJHENM_02410 SW2_RS02430 -LJHENM_02410 ECS102511_RS02425 -LJHENM_02410 L1440_RS02405 -LJHENM_02410 AQ193_RS01560 -LJHENM_02410 CBP42_RS03855 -LJHENM_02410 L2BUCH2_RS02400 -LJHENM_02410 BKB92_RS02450 -LJHENM_02410 CTB_RS02460 -LJHENM_02410 SOTONIA3_RS02440 -LJHENM_02410 E150_RS02430 -LJHENM_02410 CTO_RS02460 -LJHENM_02410 BBV13_RS02465 -LJHENM_02410 BW688_RS03845 -LJHENM_02410 CBP44_RS03850 -LJHENM_02410 L2BLST_RS02405 -LJHENM_02410 FCS84708_RS02420 -LJHENM_02410 BKB93_RS02455 -LJHENM_02410 BBV16_RS02470 -LJHENM_02410 AQ199_RS03120 -LJHENM_02410 G9768_RS02425 -LJHENM_02410 L3404_RS02400 -LJHENM_02410 BKC02_RS02445 -LJHENM_02410 gnl|Prokka|PADJNBJD_00478 -LJHENM_02410 AKW53_RS03925 -LJHENM_02410 BKC01_RS02445 -LJHENM_02410 NILJEPDF_00478 -LJHENM_03765 LJHENM_03765 -LJHENM_03765 AOT15_RS04595 -LJHENM_03765 AP288_RS02165 -LJHENM_03765 JIEJKO_03765 -LJHENM_03765 BKC01_RS03835 -LJHENM_03765 QSDFRQ_00748 -LJHENM_03765 CTRC943_RS03780 -LJHENM_03765 AKW53_RS00535 -LJHENM_03765 BKC03_RS03830 -LJHENM_03765 CTJTET1_RS03815 -LJHENM_03765 KW39_RS03810 -LJHENM_03765 DU10_RS03845 -LJHENM_03765 CBP48_RS00400 -LJHENM_03765 A5291_RS03840 -LJHENM_03765 SOTONK1_RS03795 -LJHENM_03765 IaCS19096_RS03790 -LJHENM_03765 DU13_RS03845 -LJHENM_03765 C15_RS0103900 -LJHENM_03765 ECS88FINAL_RS0103900 -LJHENM_03765 O169_RS03805 -LJHENM_03765 KW36_RS03795 -LJHENM_03765 AQ244_RS04115 -LJHENM_03765 BKB95_RS03850 -LJHENM_03765 CBP42_RS00400 -LJHENM_03765 SW2_RS03800 -LJHENM_03765 CTL2C_RS00395 -LJHENM_03765 L1224_RS03775 -LJHENM_03765 ECS102511_RS03790 -LJHENM_03765 BKB96_RS03835 -LJHENM_03765 BKB99_RS03830 -LJHENM_03765 L1440_RS03775 -LJHENM_03765 AQ193_RS00195 -LJHENM_03765 CBP44_RS00400 -LJHENM_03765 L2BUCH2_RS03775 -LJHENM_03765 BKB92_RS03830 -LJHENM_03765 CTB_RS03835 -LJHENM_03765 SOTONIA3_RS03815 -LJHENM_03765 E150_RS03800 -LJHENM_03765 CTO_RS03830 -LJHENM_03765 BBV13_RS03835 -LJHENM_03765 FCS84708_RS03790 -LJHENM_03765 BBV16_RS03845 -LJHENM_03765 L2BLST_RS03775 -LJHENM_03765 7618688 -LJHENM_03765 120048 -LJHENM_03765 BW688_RS00400 -LJHENM_03765 AQ199_RS04490 -LJHENM_03765 BKB93_RS03835 -LJHENM_03765 G9768_RS03795 -LJHENM_03765 gnl|Prokka|PADJNBJD_00747 -LJHENM_03765 L3404_RS03770 -LJHENM_03765 BKC02_RS03830 -LJHENM_03765 NILJEPDF_00748 -LJHENM_04130 LJHENM_04130 -LJHENM_04130 G9768_RS04175 -LJHENM_04130 L3404_RS04150 -LJHENM_04130 JIEJKO_04130 -LJHENM_04130 BKC02_RS04210 -LJHENM_04130 QSDFRQ_00821 -LJHENM_04130 AKW53_RS00890 -LJHENM_04130 BKC01_RS04215 -LJHENM_04130 CTRC943_RS04160 -LJHENM_04130 AOT15_RS01760 -LJHENM_04130 CTJTET1_RS04350 -LJHENM_04130 KW39_RS04190 -LJHENM_04130 BKC03_RS04210 -LJHENM_04130 CBP48_RS00780 -LJHENM_04130 A5291_RS04215 -LJHENM_04130 ECS88FINAL_RS0104260 -LJHENM_04130 DU10_RS04225 -LJHENM_04130 SOTONK1_RS04175 -LJHENM_04130 IaCS19096_RS04170 -LJHENM_04130 DU13_RS04225 -LJHENM_04130 C15_RS0104285 -LJHENM_04130 O169_RS04185 -LJHENM_04130 KW36_RS04175 -LJHENM_04130 BKB95_RS04230 -LJHENM_04130 CBP42_RS00780 -LJHENM_04130 CTL2C_RS00775 -LJHENM_04130 L1224_RS04155 -LJHENM_04130 AQ193_RS04600 -LJHENM_04130 BKB96_RS04215 -LJHENM_04130 SW2_RS04180 -LJHENM_04130 L1440_RS04150 -LJHENM_04130 ECS102511_RS04170 -LJHENM_04130 AQ244_RS02590 -LJHENM_04130 BKB99_RS04210 -LJHENM_04130 CBP44_RS00780 -LJHENM_04130 CTB_RS04210 -LJHENM_04130 L2BUCH2_RS04155 -LJHENM_04130 BKB92_RS04210 -LJHENM_04130 SOTONIA3_RS04195 -LJHENM_04130 CTO_RS04205 -LJHENM_04130 AP288_RS02475 -LJHENM_04130 E150_RS04180 -LJHENM_04130 BBV13_RS04215 -LJHENM_04130 119809 -LJHENM_04130 FCS84708_RS04170 -LJHENM_04130 AQ199_RS00100 -LJHENM_04130 7618286 -LJHENM_04130 L2BLST_RS04155 -LJHENM_04130 BBV16_RS04225 -LJHENM_04130 BW688_RS00780 -LJHENM_04130 gnl|Prokka|PADJNBJD_00820 -LJHENM_04130 BKB93_RS04215 -LJHENM_04130 NILJEPDF_00821 -LJHENM_04295 LJHENM_04295 -LJHENM_04295 L3404_RS04325 -LJHENM_04295 G9768_RS04355 -LJHENM_04295 JIEJKO_04295 -LJHENM_04295 QSDFRQ_00854 -LJHENM_04295 BKB93_RS04400 -LJHENM_04295 BKC02_RS04395 -LJHENM_04295 CTRC943_RS04335 -LJHENM_04295 BKC01_RS04400 -LJHENM_04295 AKW53_RS01075 -LJHENM_04295 AOT15_RS01935 -LJHENM_04295 CTJTET1_RS04525 -LJHENM_04295 CBP48_RS00965 -LJHENM_04295 BKC03_RS04395 -LJHENM_04295 A5291_RS04390 -LJHENM_04295 KW39_RS04370 -LJHENM_04295 SOTONK1_RS04355 -LJHENM_04295 IaCS19096_RS04350 -LJHENM_04295 AQ193_RS04415 -LJHENM_04295 C15_RS0104465 -LJHENM_04295 ECS88FINAL_RS0104445 -LJHENM_04295 DU10_RS04410 -LJHENM_04295 KW36_RS04355 -LJHENM_04295 DU13_RS04410 -LJHENM_04295 O169_RS04370 -LJHENM_04295 AQ244_RS02395 -LJHENM_04295 CBP42_RS00965 -LJHENM_04295 CTL2C_RS00950 -LJHENM_04295 L1224_RS04330 -LJHENM_04295 BKB95_RS04415 -LJHENM_04295 L1440_RS04325 -LJHENM_04295 BKB96_RS04400 -LJHENM_04295 BKB99_RS04395 -LJHENM_04295 SW2_RS04360 -LJHENM_04295 ECS102511_RS04355 -LJHENM_04295 CBP44_RS00965 -LJHENM_04295 L2BUCH2_RS04330 -LJHENM_04295 CTB_RS04385 -LJHENM_04295 SOTONIA3_RS04370 -LJHENM_04295 CTO_RS04380 -LJHENM_04295 BKB92_RS04395 -LJHENM_04295 L2BLST_RS04330 -LJHENM_04295 BBV13_RS04395 -LJHENM_04295 AP288_RS02660 -LJHENM_04295 BBV16_RS04400 -LJHENM_04295 E150_RS04365 -LJHENM_04295 gnl|Prokka|PADJNBJD_00853 -LJHENM_04295 BW688_RS00965 -LJHENM_04295 7618308 -LJHENM_04295 FCS84708_RS04350 -LJHENM_04295 AQ199_RS00285 -LJHENM_04295 119843 -LJHENM_04295 NILJEPDF_00854 -LJHENM_04455 LJHENM_04455 -A5291_RS00575 A5291_RS00575 -A5291_RS00575 SOTONK1_RS00570 -A5291_RS00575 L3404_RS00570 -A5291_RS00575 AOT15_RS00385 -A5291_RS00575 JIEJKO_00565 -A5291_RS00575 QSDFRQ_00112 -A5291_RS00575 IaCS19096_RS00570 -A5291_RS00575 BKC03_RS00580 -A5291_RS00575 C15_RS0100585 -A5291_RS00575 CTJTET1_RS00570 -A5291_RS00575 KW39_RS00570 -A5291_RS00575 DU10_RS00580 -A5291_RS00575 CTRC943_RS00570 -A5291_RS00575 ECS88FINAL_RS0100585 -A5291_RS00575 O169_RS00570 -A5291_RS00575 DU13_RS00585 -A5291_RS00575 7618834 -A5291_RS00575 KW36_RS00570 -A5291_RS00575 CBP48_RS01970 -A5291_RS00575 SW2_RS00570 -A5291_RS00575 BKB95_RS00580 -A5291_RS00575 ECS102511_RS00570 -A5291_RS00575 CTL2C_RS01935 -A5291_RS00575 CTB_RS00575 -A5291_RS00575 AQ244_RS02745 -A5291_RS00575 BKB96_RS00580 -A5291_RS00575 CBP42_RS01970 -A5291_RS00575 L1224_RS00570 -A5291_RS00575 BKB99_RS00580 -A5291_RS00575 BKB92_RS00580 -A5291_RS00575 SOTONIA3_RS00570 -A5291_RS00575 L1440_RS00570 -A5291_RS00575 CTO_RS00575 -A5291_RS00575 E150_RS00570 -A5291_RS00575 AQ193_RS03425 -A5291_RS00575 CBP44_RS01975 -A5291_RS00575 120578 -A5291_RS00575 L2BUCH2_RS00570 -A5291_RS00575 FCS84708_RS00570 -A5291_RS00575 AP288_RS03640 -A5291_RS00575 BKB93_RS00580 -A5291_RS00575 AQ199_RS01265 -A5291_RS00575 BBV13_RS00580 -A5291_RS00575 G9768_RS00570 -A5291_RS00575 L2BLST_RS00570 -A5291_RS00575 BW688_RS01970 -A5291_RS00575 BKC02_RS00580 -A5291_RS00575 BBV16_RS00580 -A5291_RS00575 gnl|Prokka|PADJNBJD_00112 -A5291_RS00575 LJHENM_00560 -A5291_RS00575 AKW53_RS02065 -A5291_RS00575 BKC01_RS00580 -A5291_RS00575 NILJEPDF_00112 -A5291_RS04835 A5291_RS04835 -A5291_RS04835 SOTONK1_RS04805 -A5291_RS04835 IaCS19096_RS04790 -A5291_RS04835 AOT15_RS03400 -A5291_RS04835 L1224_RS04785 -A5291_RS04835 ECS102511_RS04795 -A5291_RS04835 L2BUCH2_RS04785 -A5291_RS04835 CTO_RS04810 -A5291_RS04835 SOTONIA3_RS04820 -A5291_RS04835 BBV13_RS04830 -A5291_RS04835 gnl|Prokka|PADJNBJD_00939 -A5291_RS04835 L2BLST_RS04785 -A5291_RS04835 BBV16_RS04835 -A5291_RS04835 FCS84708_RS04790 -A5291_RS04835 AQ193_RS04775 -A5291_RS04835 NILJEPDF_00941 -A5291_RS04835 L3404_RS04780 -A5291_RS04835 AQ199_RS04810 -A5291_RS04835 QSDFRQ_00941 -A5291_RS04835 AP288_RS04855 -A5291_RS04835 AQ244_RS04910 -SOTONIA3_RS01690 SOTONIA3_RS01690 -SOTONIA3_RS01690 BKB92_RS01685 -SOTONIA3_RS01690 CTB_RS01705 -SOTONIA3_RS01690 E150_RS01675 -SOTONIA3_RS01690 L2BUCH2_RS01660 -SOTONIA3_RS01690 AQ193_RS02315 -SOTONIA3_RS01690 CTO_RS01700 -SOTONIA3_RS01690 FCS84708_RS01670 -SOTONIA3_RS01690 CBP44_RS03075 -SOTONIA3_RS01690 BKB93_RS01685 -SOTONIA3_RS01690 L2BLST_RS01660 -SOTONIA3_RS01690 AQ199_RS02365 -SOTONIA3_RS01690 BW688_RS03080 -SOTONIA3_RS01690 BBV13_RS01710 -SOTONIA3_RS01690 G9768_RS01680 -SOTONIA3_RS01690 BKC02_RS01680 -SOTONIA3_RS01690 L3404_RS01655 -SOTONIA3_RS01690 AKW53_RS03170 -SOTONIA3_RS01690 BBV16_RS01710 -SOTONIA3_RS01690 BKC01_RS01685 -SOTONIA3_RS01690 gnl|Prokka|PADJNBJD_00330 -SOTONIA3_RS01690 NILJEPDF_00330 -SOTONIA3_RS01690 LJHENM_01660 -SOTONIA3_RS01690 CTRC943_RS01660 -SOTONIA3_RS01690 BKC03_RS01680 -SOTONIA3_RS01690 DU10_RS01695 -SOTONIA3_RS01690 CTJTET1_RS01690 -SOTONIA3_RS01690 KW39_RS01680 -SOTONIA3_RS01690 JIEJKO_01660 -SOTONIA3_RS01690 C15_RS0101720 -SOTONIA3_RS01690 SOTONK1_RS01680 -SOTONIA3_RS01690 ECS88FINAL_RS0101700 -SOTONIA3_RS01690 QSDFRQ_00330 -SOTONIA3_RS01690 IaCS19096_RS01675 -SOTONIA3_RS01690 AP288_RS01410 -SOTONIA3_RS01690 A5291_RS01705 -SOTONIA3_RS01690 O169_RS01685 -SOTONIA3_RS01690 DU13_RS01690 -SOTONIA3_RS01690 120385 -SOTONIA3_RS01690 AQ244_RS01440 -SOTONIA3_RS01690 CBP48_RS03070 -SOTONIA3_RS01690 SW2_RS01670 -SOTONIA3_RS01690 BKB95_RS01695 -SOTONIA3_RS01690 7618946 -SOTONIA3_RS01690 CTL2C_RS03025 -SOTONIA3_RS01690 KW36_RS01675 -SOTONIA3_RS01690 ECS102511_RS01670 -SOTONIA3_RS01690 AOT15_RS02675 -SOTONIA3_RS01690 BKB96_RS01680 -SOTONIA3_RS01690 L1224_RS01655 -SOTONIA3_RS01690 BKB99_RS01680 -SOTONIA3_RS01690 L1440_RS01655 -SOTONIA3_RS01690 CBP42_RS03070 -SOTONIA3_RS03185 SOTONIA3_RS03185 -SOTONIA3_RS03185 CTB_RS03205 -SOTONIA3_RS03185 BKB92_RS03200 -SOTONIA3_RS03185 BW688_RS04595 -SOTONIA3_RS03185 120138 -SOTONIA3_RS03185 E150_RS03175 -SOTONIA3_RS03185 AQ193_RS00815 -SOTONIA3_RS03185 CTO_RS03200 -SOTONIA3_RS03185 L2BLST_RS03145 -SOTONIA3_RS03185 CBP44_RS04600 -SOTONIA3_RS03185 FCS84708_RS03170 -SOTONIA3_RS03185 BBV13_RS03205 -SOTONIA3_RS03185 AQ199_RS03870 -SOTONIA3_RS03185 BBV16_RS03215 -SOTONIA3_RS03185 BKB93_RS03205 -SOTONIA3_RS03185 G9768_RS03170 -SOTONIA3_RS03185 L3404_RS03140 -SOTONIA3_RS03185 gnl|Prokka|PADJNBJD_00624 -SOTONIA3_RS03185 NILJEPDF_00624 -SOTONIA3_RS03185 LJHENM_03135 -SOTONIA3_RS03185 BKC02_RS03200 -SOTONIA3_RS03185 AOT15_RS03970 -SOTONIA3_RS03185 AP288_RS01540 -SOTONIA3_RS03185 CTRC943_RS03145 -SOTONIA3_RS03185 BKC01_RS03200 -SOTONIA3_RS03185 QSDFRQ_00624 -SOTONIA3_RS03185 JIEJKO_03145 -SOTONIA3_RS03185 SOTONK1_RS03170 -SOTONIA3_RS03185 CTJTET1_RS03185 -SOTONIA3_RS03185 BKC03_RS03200 -SOTONIA3_RS03185 KW39_RS03185 -SOTONIA3_RS03185 C15_RS0103235 -SOTONIA3_RS03185 ECS88FINAL_RS0103235 -SOTONIA3_RS03185 IaCS19096_RS03165 -SOTONIA3_RS03185 DU10_RS03215 -SOTONIA3_RS03185 A5291_RS03205 -SOTONIA3_RS03185 O169_RS03180 -SOTONIA3_RS03185 CTL2C_RS04515 -SOTONIA3_RS03185 DU13_RS03210 -SOTONIA3_RS03185 CBP48_RS04600 -SOTONIA3_RS03185 L1224_RS03145 -SOTONIA3_RS03185 KW36_RS03170 -SOTONIA3_RS03185 BKB95_RS03210 -SOTONIA3_RS03185 AKW53_RS04395 -SOTONIA3_RS03185 BKB96_RS03205 -SOTONIA3_RS03185 BKB99_RS03200 -SOTONIA3_RS03185 7619100 -SOTONIA3_RS03185 SW2_RS03175 -SOTONIA3_RS03185 L1440_RS03145 -SOTONIA3_RS03185 ECS102511_RS03170 -SOTONIA3_RS03185 AQ244_RS04745 -SOTONIA3_RS03185 CBP42_RS04605 -SOTONIA3_RS03185 L2BUCH2_RS03145 -SOTONIA3_RS04240 SOTONIA3_RS04240 -SOTONIA3_RS04240 BKB92_RS04260 -SOTONIA3_RS04240 CTO_RS04250 -SOTONIA3_RS04240 AP288_RS02525 -SOTONIA3_RS04240 BBV13_RS04265 -SOTONIA3_RS04240 119820 -SOTONIA3_RS04240 E150_RS04230 -SOTONIA3_RS04240 7618293 -SOTONIA3_RS04240 L2BLST_RS04200 -SOTONIA3_RS04240 FCS84708_RS04220 -SOTONIA3_RS04240 AQ199_RS00150 -SOTONIA3_RS04240 BBV16_RS04270 -SOTONIA3_RS04240 AQ193_RS04550 -SOTONIA3_RS04240 BW688_RS00830 -SOTONIA3_RS04240 gnl|Prokka|PADJNBJD_00829 -SOTONIA3_RS04240 AQ244_RS02540 -SOTONIA3_RS04240 NILJEPDF_00830 -SOTONIA3_RS04240 G9768_RS04225 -SOTONIA3_RS04240 L3404_RS04195 -SOTONIA3_RS04240 BKB93_RS04265 -SOTONIA3_RS04240 LJHENM_04175 -SOTONIA3_RS04240 JIEJKO_04175 -SOTONIA3_RS04240 BKC02_RS04260 -SOTONIA3_RS04240 QSDFRQ_00830 -SOTONIA3_RS04240 AKW53_RS00940 -SOTONIA3_RS04240 BKC01_RS04265 -SOTONIA3_RS04240 CTRC943_RS04205 -SOTONIA3_RS04240 AOT15_RS01805 -SOTONIA3_RS04240 CTJTET1_RS04395 -SOTONIA3_RS04240 BKC03_RS04260 -SOTONIA3_RS04240 CBP48_RS00830 -SOTONIA3_RS04240 A5291_RS04260 -SOTONIA3_RS04240 KW39_RS04240 -SOTONIA3_RS04240 SOTONK1_RS04225 -SOTONIA3_RS04240 ECS88FINAL_RS01000000104990 -SOTONIA3_RS04240 IaCS19096_RS04215 -SOTONIA3_RS04240 DU10_RS04275 -SOTONIA3_RS04240 C15_RS0104335 -SOTONIA3_RS04240 DU13_RS04275 -SOTONIA3_RS04240 O169_RS04235 -SOTONIA3_RS04240 KW36_RS04220 -SOTONIA3_RS04240 BKB95_RS04280 -SOTONIA3_RS04240 CBP42_RS00830 -SOTONIA3_RS04240 CTL2C_RS00820 -SOTONIA3_RS04240 L1224_RS04200 -SOTONIA3_RS04240 BKB96_RS04265 -SOTONIA3_RS04240 L1440_RS04195 -SOTONIA3_RS04240 BKB99_RS04260 -SOTONIA3_RS04240 SW2_RS04230 -SOTONIA3_RS04240 ECS102511_RS04220 -SOTONIA3_RS04240 CBP44_RS00830 -SOTONIA3_RS04240 CTB_RS04255 -SOTONIA3_RS04240 L2BUCH2_RS04200 -SOTONIA3_RS04565 SOTONIA3_RS04565 -SOTONIA3_RS04565 CTO_RS04575 -SOTONIA3_RS04565 BBV13_RS04595 -SOTONIA3_RS04565 BKB92_RS04610 -SOTONIA3_RS04565 AP288_RS02860 -SOTONIA3_RS04565 BBV16_RS04600 -SOTONIA3_RS04565 E150_RS04565 -SOTONIA3_RS04565 gnl|Prokka|PADJNBJD_00893 -SOTONIA3_RS04565 L2BLST_RS04530 -SOTONIA3_RS04565 FCS84708_RS04550 -SOTONIA3_RS04565 AQ199_RS00485 -SOTONIA3_RS04565 NILJEPDF_00894 -SOTONIA3_RS04565 AQ193_RS04215 -SOTONIA3_RS04565 BW688_RS01180 -SOTONIA3_RS04565 119885 -SOTONIA3_RS04565 JIEJKO_04495 -SOTONIA3_RS04565 7618336 -SOTONIA3_RS04565 QSDFRQ_00894 -SOTONIA3_RS04565 G9768_RS04550 -SOTONIA3_RS04565 LJHENM_04505 -SOTONIA3_RS04565 L3404_RS04525 -SOTONIA3_RS04565 AQ244_RS02200 -SOTONIA3_RS04565 BKB93_RS04615 -SOTONIA3_RS04565 BKC02_RS04605 -SOTONIA3_RS04565 AKW53_RS01275 -SOTONIA3_RS04565 BKC01_RS04610 -SOTONIA3_RS04565 CTRC943_RS04535 -SOTONIA3_RS04565 AOT15_RS02130 -SOTONIA3_RS04565 CTJTET1_RS04720 -SOTONIA3_RS04565 KW39_RS04570 -SOTONIA3_RS04565 BKC03_RS04605 -SOTONIA3_RS04565 CBP48_RS01180 -SOTONIA3_RS04565 A5291_RS04585 -SOTONIA3_RS04565 SOTONK1_RS04550 -SOTONIA3_RS04565 ECS88FINAL_RS0104660 -SOTONIA3_RS04565 IaCS19096_RS04545 -SOTONIA3_RS04565 C15_RS0104680 -SOTONIA3_RS04565 DU10_RS04625 -SOTONIA3_RS04565 O169_RS04570 -SOTONIA3_RS04565 KW36_RS04550 -SOTONIA3_RS04565 DU13_RS04625 -SOTONIA3_RS04565 BKB95_RS04625 -SOTONIA3_RS04565 CBP42_RS01180 -SOTONIA3_RS04565 CTL2C_RS01150 -SOTONIA3_RS04565 L1224_RS04530 -SOTONIA3_RS04565 BKB96_RS04610 -SOTONIA3_RS04565 L1440_RS04525 -SOTONIA3_RS04565 BKB99_RS04605 -SOTONIA3_RS04565 SW2_RS04560 -SOTONIA3_RS04565 ECS102511_RS04555 -SOTONIA3_RS04565 CBP44_RS01180 -SOTONIA3_RS04565 CTB_RS04580 -SOTONIA3_RS04565 L2BUCH2_RS04530 -SOTONK1_RS02595 SOTONK1_RS02595 -SOTONK1_RS02595 CTJTET1_RS02605 -SOTONK1_RS02595 AKW53_RS04620 -SOTONK1_RS02595 JIEJKO_02580 -SOTONK1_RS02595 BKC03_RS02615 -SOTONK1_RS02595 QSDFRQ_00512 -SOTONK1_RS02595 KW39_RS02605 -SOTONK1_RS02595 C15_RS0102660 -SOTONK1_RS02595 ECS88FINAL_RS0102655 -SOTONK1_RS02595 IaCS19096_RS02590 -SOTONK1_RS02595 DU10_RS02635 -SOTONK1_RS02595 O169_RS02605 -SOTONK1_RS02595 A5291_RS02630 -SOTONK1_RS02595 AP288_RS00485 -SOTONK1_RS02595 DU13_RS02630 -SOTONK1_RS02595 CBP48_RS04015 -SOTONK1_RS02595 CTL2C_RS03945 -SOTONK1_RS02595 KW36_RS02590 -SOTONK1_RS02595 BKB95_RS02630 -SOTONK1_RS02595 BKB96_RS02620 -SOTONK1_RS02595 BKB99_RS02615 -SOTONK1_RS02595 7618603 -SOTONK1_RS02595 SW2_RS02600 -SOTONK1_RS02595 L1224_RS02575 -SOTONK1_RS02595 ECS102511_RS02595 -SOTONK1_RS02595 L1440_RS02575 -SOTONK1_RS02595 AQ244_RS00515 -SOTONK1_RS02595 CBP42_RS04025 -SOTONK1_RS02595 119596 -SOTONK1_RS02595 L2BUCH2_RS02575 -SOTONK1_RS02595 SOTONIA3_RS02610 -SOTONK1_RS02595 BKB92_RS02620 -SOTONK1_RS02595 CTB_RS02630 -SOTONK1_RS02595 E150_RS02600 -SOTONK1_RS02595 BW688_RS04015 -SOTONK1_RS02595 CTO_RS02630 -SOTONK1_RS02595 FCS84708_RS02590 -SOTONK1_RS02595 AQ193_RS01390 -SOTONK1_RS02595 L2BLST_RS02575 -SOTONK1_RS02595 BBV13_RS02635 -SOTONK1_RS02595 CBP44_RS04020 -SOTONK1_RS02595 AOT15_RS03500 -SOTONK1_RS02595 AQ199_RS03290 -SOTONK1_RS02595 BKB93_RS02625 -SOTONK1_RS02595 BBV16_RS02645 -SOTONK1_RS02595 G9768_RS02595 -SOTONK1_RS02595 L3404_RS02570 -SOTONK1_RS02595 BKC02_RS02615 -SOTONK1_RS02595 BKC01_RS02615 -SOTONK1_RS02595 gnl|Prokka|PADJNBJD_00512 -SOTONK1_RS02595 NILJEPDF_00512 -SOTONK1_RS02595 LJHENM_02575 -SOTONK1_RS02595 CTRC943_RS02575 -SOTONK1_RS03085 SOTONK1_RS03085 -SOTONK1_RS03085 CTJTET1_RS03095 -SOTONK1_RS03085 BKC03_RS03115 -SOTONK1_RS03085 KW39_RS03095 -SOTONK1_RS03085 C15_RS0103150 -SOTONK1_RS03085 ECS88FINAL_RS0103150 -SOTONK1_RS03085 IaCS19096_RS03080 -SOTONK1_RS03085 DU10_RS03130 -SOTONK1_RS03085 A5291_RS03115 -SOTONK1_RS03085 O169_RS03090 -SOTONK1_RS03085 CTL2C_RS04425 -SOTONK1_RS03085 DU13_RS03125 -SOTONK1_RS03085 CBP48_RS04515 -SOTONK1_RS03085 L1224_RS03055 -SOTONK1_RS03085 KW36_RS03080 -SOTONK1_RS03085 BKB95_RS03125 -SOTONK1_RS03085 AKW53_RS04310 -SOTONK1_RS03085 BKB96_RS03120 -SOTONK1_RS03085 BKB99_RS03115 -SOTONK1_RS03085 7619096 -SOTONK1_RS03085 SW2_RS03085 -SOTONK1_RS03085 L1440_RS03055 -SOTONK1_RS03085 ECS102511_RS03080 -SOTONK1_RS03085 AQ244_RS00025 -SOTONK1_RS03085 CBP42_RS04520 -SOTONK1_RS03085 L2BUCH2_RS03055 -SOTONK1_RS03085 CTB_RS03115 -SOTONK1_RS03085 SOTONIA3_RS03100 -SOTONK1_RS03085 BKB92_RS03115 -SOTONK1_RS03085 BW688_RS04510 -SOTONK1_RS03085 120144 -SOTONK1_RS03085 E150_RS03085 -SOTONK1_RS03085 CTO_RS03115 -SOTONK1_RS03085 L2BLST_RS03055 -SOTONK1_RS03085 CBP44_RS04515 -SOTONK1_RS03085 FCS84708_RS03080 -SOTONK1_RS03085 AQ193_RS00905 -SOTONK1_RS03085 BBV13_RS03120 -SOTONK1_RS03085 AQ199_RS03780 -SOTONK1_RS03085 BBV16_RS03130 -SOTONK1_RS03085 BKB93_RS03120 -SOTONK1_RS03085 G9768_RS03085 -SOTONK1_RS03085 L3404_RS03050 -SOTONK1_RS03085 gnl|Prokka|PADJNBJD_00607 -SOTONK1_RS03085 NILJEPDF_00607 -SOTONK1_RS03085 LJHENM_03050 -SOTONK1_RS03085 BKC02_RS03115 -SOTONK1_RS03085 AOT15_RS03885 -SOTONK1_RS03085 AP288_RS01450 -SOTONK1_RS03085 CTRC943_RS03055 -SOTONK1_RS03085 BKC01_RS03115 -SOTONK1_RS03085 QSDFRQ_00607 -SOTONK1_RS03085 JIEJKO_03060 -L1440_RS01010 L1440_RS01010 -L1440_RS01010 AQ193_RS02965 -L1440_RS01010 AQ244_RS03210 -L1440_RS01010 BKB92_RS01030 -L1440_RS01010 CBP42_RS02420 -L1440_RS01010 SOTONIA3_RS01045 -L1440_RS01010 E150_RS01025 -L1440_RS01010 CTB_RS01055 -L1440_RS01010 L2BUCH2_RS01015 -L1440_RS01010 CTO_RS01055 -L1440_RS01010 FCS84708_RS01025 -L1440_RS01010 AP288_RS04095 -L1440_RS01010 BKB93_RS01030 -L1440_RS01010 CBP44_RS02425 -L1440_RS01010 AQ199_RS01720 -L1440_RS01010 L2BLST_RS01015 -L1440_RS01010 BW688_RS02425 -L1440_RS01010 BBV13_RS01060 -L1440_RS01010 G9768_RS01035 -L1440_RS01010 BKC02_RS01030 -L1440_RS01010 L3404_RS01010 -L1440_RS01010 AKW53_RS02520 -L1440_RS01010 BBV16_RS01060 -L1440_RS01010 BKC01_RS01030 -L1440_RS01010 119365 -L1440_RS01010 AOT15_RS01335 -L1440_RS01010 DU10_RS01040 -L1440_RS01010 gnl|Prokka|PADJNBJD_00202 -L1440_RS01010 BKC03_RS01030 -L1440_RS01010 NILJEPDF_00202 -L1440_RS01010 LJHENM_01015 -L1440_RS01010 CTRC943_RS01015 -L1440_RS01010 CTJTET1_RS01045 -L1440_RS01010 C15_RS0101065 -L1440_RS01010 SOTONK1_RS01030 -L1440_RS01010 ECS88FINAL_RS0101050 -L1440_RS01010 KW39_RS01035 -L1440_RS01010 JIEJKO_01015 -L1440_RS01010 A5291_RS01055 -L1440_RS01010 IaCS19096_RS01030 -L1440_RS01010 7618455 -L1440_RS01010 QSDFRQ_00202 -L1440_RS01010 O169_RS01035 -L1440_RS01010 DU13_RS01040 -L1440_RS01010 SW2_RS01025 -L1440_RS01010 BKB95_RS01045 -L1440_RS01010 CBP48_RS02420 -L1440_RS01010 KW36_RS01030 -L1440_RS01010 ECS102511_RS01025 -L1440_RS01010 BKB96_RS01030 -L1440_RS01010 CTL2C_RS02380 -L1440_RS01010 BKB99_RS01030 -L1440_RS01010 L1224_RS01010 -L1440_RS01190 L1440_RS01190 -L1440_RS01190 AQ193_RS02785 -L1440_RS01190 AQ244_RS03390 -L1440_RS01190 BKB92_RS01210 -L1440_RS01190 CBP42_RS02600 -L1440_RS01190 SOTONIA3_RS01225 -L1440_RS01190 E150_RS01205 -L1440_RS01190 L2BUCH2_RS01195 -L1440_RS01190 CTO_RS01235 -L1440_RS01190 FCS84708_RS01205 -L1440_RS01190 AP288_RS04275 -L1440_RS01190 BKB93_RS01210 -L1440_RS01190 CBP44_RS02605 -L1440_RS01190 AQ199_RS01900 -L1440_RS01190 L2BLST_RS01195 -L1440_RS01190 BW688_RS02605 -L1440_RS01190 BBV13_RS01240 -L1440_RS01190 G9768_RS01215 -L1440_RS01190 BKC02_RS01210 -L1440_RS01190 L3404_RS01190 -L1440_RS01190 AKW53_RS02700 -L1440_RS01190 BBV16_RS01240 -L1440_RS01190 BKC01_RS01210 -L1440_RS01190 120483 -L1440_RS01190 gnl|Prokka|PADJNBJD_00237 -L1440_RS01190 AOT15_RS01155 -L1440_RS01190 DU10_RS01220 -L1440_RS01190 NILJEPDF_00237 -L1440_RS01190 LJHENM_01190 -L1440_RS01190 BKC03_RS01210 -L1440_RS01190 CTRC943_RS01195 -L1440_RS01190 CTJTET1_RS01225 -L1440_RS01190 KW39_RS01215 -L1440_RS01190 JIEJKO_01190 -L1440_RS01190 C15_RS0101245 -L1440_RS01190 SOTONK1_RS01210 -L1440_RS01190 ECS88FINAL_RS0101230 -L1440_RS01190 QSDFRQ_00237 -L1440_RS01190 A5291_RS01235 -L1440_RS01190 IaCS19096_RS01210 -L1440_RS01190 7618890 -L1440_RS01190 O169_RS01215 -L1440_RS01190 DU13_RS01220 -L1440_RS01190 SW2_RS01205 -L1440_RS01190 BKB95_RS01225 -L1440_RS01190 CBP48_RS02600 -L1440_RS01190 KW36_RS01210 -L1440_RS01190 ECS102511_RS01205 -L1440_RS01190 BKB96_RS01210 -L1440_RS01190 CTL2C_RS02560 -L1440_RS01190 BKB99_RS01210 -L1440_RS01190 L1224_RS01190 -L1440_RS01685 L1440_RS01685 -L1440_RS01685 CBP42_RS03100 -L1440_RS01685 SOTONIA3_RS01720 -L1440_RS01685 CTB_RS01735 -L1440_RS01685 BKB92_RS01720 -L1440_RS01685 L2BUCH2_RS01690 -L1440_RS01685 E150_RS01710 -L1440_RS01685 CTO_RS01735 -L1440_RS01685 FCS84708_RS01700 -L1440_RS01685 CBP44_RS03105 -L1440_RS01685 L2BLST_RS01690 -L1440_RS01685 BW688_RS03110 -L1440_RS01685 BKB93_RS01720 -L1440_RS01685 AQ199_RS02400 -L1440_RS01685 BBV13_RS01740 -L1440_RS01685 G9768_RS01710 -L1440_RS01685 AP288_RS01375 -L1440_RS01685 BKC02_RS01710 -L1440_RS01685 L3404_RS01685 -L1440_RS01685 BBV16_RS01740 -L1440_RS01685 AKW53_RS03205 -L1440_RS01685 AQ244_RS01405 -L1440_RS01685 BKC01_RS01715 -L1440_RS01685 gnl|Prokka|PADJNBJD_00336 -L1440_RS01685 NILJEPDF_00336 -L1440_RS01685 LJHENM_01690 -L1440_RS01685 CTRC943_RS01690 -L1440_RS01685 BKC03_RS01710 -L1440_RS01685 CTJTET1_RS01720 -L1440_RS01685 JIEJKO_01690 -L1440_RS01685 DU10_RS01730 -L1440_RS01685 C15_RS0101750 -L1440_RS01685 SOTONK1_RS01710 -L1440_RS01685 KW39_RS01715 -L1440_RS01685 QSDFRQ_00336 -L1440_RS01685 ECS88FINAL_RS0101735 -L1440_RS01685 IaCS19096_RS01705 -L1440_RS01685 A5291_RS01735 -L1440_RS01685 119451 -L1440_RS01685 O169_RS01715 -L1440_RS01685 DU13_RS01725 -L1440_RS01685 CBP48_RS03100 -L1440_RS01685 BKB95_RS01725 -L1440_RS01685 7618510 -L1440_RS01685 SW2_RS01705 -L1440_RS01685 CTL2C_RS03055 -L1440_RS01685 KW36_RS01705 -L1440_RS01685 AOT15_RS02705 -L1440_RS01685 AQ193_RS02280 -L1440_RS01685 BKB96_RS01710 -L1440_RS01685 L1224_RS01685 -L1440_RS01685 ECS102511_RS01705 -L1440_RS01685 BKB99_RS01710 -L1440_RS02685 L1440_RS02685 -L1440_RS02685 120225 -L1440_RS02685 CBP42_RS04140 -L1440_RS02685 L2BUCH2_RS02685 -L1440_RS02685 SOTONIA3_RS02720 -L1440_RS02685 BKB92_RS02735 -L1440_RS02685 CTB_RS02740 -L1440_RS02685 E150_RS02710 -L1440_RS02685 BW688_RS04130 -L1440_RS02685 CTO_RS02740 -L1440_RS02685 FCS84708_RS02700 -L1440_RS02685 L2BLST_RS02685 -L1440_RS02685 AKW53_RS04510 -L1440_RS02685 BBV13_RS02745 -L1440_RS02685 CBP44_RS04135 -L1440_RS02685 AQ199_RS03400 -L1440_RS02685 BKB93_RS02740 -L1440_RS02685 BBV16_RS02755 -L1440_RS02685 G9768_RS02705 -L1440_RS02685 AP288_RS00375 -L1440_RS02685 L3404_RS02680 -L1440_RS02685 BKC02_RS02730 -L1440_RS02685 gnl|Prokka|PADJNBJD_00533 -L1440_RS02685 NILJEPDF_00533 -L1440_RS02685 BKC01_RS02730 -L1440_RS02685 LJHENM_02685 -L1440_RS02685 CTRC943_RS02685 -L1440_RS02685 AOT15_RS01505 -L1440_RS02685 AQ244_RS00405 -L1440_RS02685 QSDFRQ_00533 -L1440_RS02685 JIEJKO_02690 -L1440_RS02685 SOTONK1_RS02705 -L1440_RS02685 CTJTET1_RS02715 -L1440_RS02685 BKC03_RS02730 -L1440_RS02685 KW39_RS02715 -L1440_RS02685 C15_RS0102775 -L1440_RS02685 ECS88FINAL_RS0102770 -L1440_RS02685 IaCS19096_RS02700 -L1440_RS02685 DU10_RS02750 -L1440_RS02685 O169_RS02715 -L1440_RS02685 A5291_RS02740 -L1440_RS02685 DU13_RS02745 -L1440_RS02685 CBP48_RS04130 -L1440_RS02685 7619044 -L1440_RS02685 CTL2C_RS04055 -L1440_RS02685 KW36_RS02700 -L1440_RS02685 AQ193_RS01280 -L1440_RS02685 BKB95_RS02745 -L1440_RS02685 BKB96_RS02735 -L1440_RS02685 BKB99_RS02730 -L1440_RS02685 SW2_RS02710 -L1440_RS02685 L1224_RS02685 -L1440_RS02685 ECS102511_RS02705 -L1224_RS00845 L1224_RS00845 -L1224_RS00845 L1440_RS00845 -L1224_RS00845 CBP42_RS02250 -L1224_RS00845 L2BUCH2_RS00850 -L1224_RS00845 CBP44_RS02255 -L1224_RS00845 BW688_RS02250 -L1224_RS00845 L2BLST_RS00850 -L1224_RS00845 L3404_RS00845 -L1224_RS00845 CTRC943_RS00845 -L1224_RS00845 7618441 -L1224_RS00845 CBP48_RS02250 -L1224_RS00845 CTL2C_RS02210 -L1224_RS00845 AQ193_RS03155 -L1224_RS00845 CTB_RS00845 -L1224_RS00845 AQ244_RS03015 -L1224_RS00845 CTO_RS00845 -L1224_RS00845 BKB92_RS00850 -L1224_RS00845 SOTONIA3_RS00845 -L1224_RS00845 FCS84708_RS00840 -L1224_RS00845 AP288_RS03910 -L1224_RS00845 BKB93_RS00850 -L1224_RS00845 AQ199_RS01535 -L1224_RS00845 AOT15_RS00115 -L1224_RS00845 G9768_RS00845 -L1224_RS00845 119338 -L1224_RS00845 BKC02_RS00850 -L1224_RS00845 AKW53_RS02335 -L1224_RS00845 BKC01_RS00850 -L1224_RS00845 gnl|Prokka|PADJNBJD_00166 -L1224_RS00845 A5291_RS00845 -L1224_RS00845 NILJEPDF_00166 -L1224_RS00845 LJHENM_00835 -L1224_RS00845 SOTONK1_RS00840 -L1224_RS00845 JIEJKO_00835 -L1224_RS00845 BKC03_RS00850 -L1224_RS00845 CTJTET1_RS00845 -L1224_RS00845 KW39_RS00840 -L1224_RS00845 DU10_RS00855 -L1224_RS00845 QSDFRQ_00166 -L1224_RS00845 C15_RS0100870 -L1224_RS00845 ECS88FINAL_RS0100865 -L1224_RS00845 IaCS19096_RS00840 -L1224_RS00845 O169_RS00840 -L1224_RS00845 DU13_RS00855 -L1224_RS00845 KW36_RS00840 -L1224_RS00845 BKB95_RS00855 -L1224_RS00845 SW2_RS00840 -L1224_RS00845 ECS102511_RS00840 -L2BUCH2_RS00460 L2BUCH2_RS00460 -L2BUCH2_RS00460 BKB93_RS00470 -L2BUCH2_RS00460 FCS84708_RS00460 -L2BUCH2_RS00460 AP288_RS03530 -L2BUCH2_RS00460 AQ199_RS01155 -L2BUCH2_RS00460 BBV13_RS00465 -L2BUCH2_RS00460 L2BLST_RS00460 -L2BUCH2_RS00460 AQ244_RS01530 -L2BUCH2_RS00460 BW688_RS01860 -L2BUCH2_RS00460 G9768_RS00460 -L2BUCH2_RS00460 AQ193_RS03535 -L2BUCH2_RS00460 BKC02_RS00470 -L2BUCH2_RS00460 gnl|Prokka|PADJNBJD_00090 -L2BUCH2_RS00460 LJHENM_00450 -L2BUCH2_RS00460 BBV16_RS00465 -L2BUCH2_RS00460 NILJEPDF_00090 -L2BUCH2_RS00460 BKC01_RS00470 -L2BUCH2_RS00460 A5291_RS00460 -L2BUCH2_RS00460 JIEJKO_00455 -L2BUCH2_RS00460 SOTONK1_RS00460 -L2BUCH2_RS00460 L3404_RS00460 -L2BUCH2_RS00460 AKW53_RS01950 -L2BUCH2_RS00460 QSDFRQ_00090 -L2BUCH2_RS00460 IaCS19096_RS00460 -L2BUCH2_RS00460 BKC03_RS00470 -L2BUCH2_RS00460 DU10_RS00470 -L2BUCH2_RS00460 C15_RS0100465 -L2BUCH2_RS00460 7618820 -L2BUCH2_RS00460 CTRC943_RS00460 -L2BUCH2_RS00460 CTJTET1_RS00460 -L2BUCH2_RS00460 O169_RS00460 -L2BUCH2_RS00460 DU13_RS00475 -L2BUCH2_RS00460 ECS88FINAL_RS0100470 -L2BUCH2_RS00460 KW39_RS00460 -L2BUCH2_RS00460 KW36_RS00460 -L2BUCH2_RS00460 CBP48_RS01860 -L2BUCH2_RS00460 SW2_RS00460 -L2BUCH2_RS00460 BKB95_RS00470 -L2BUCH2_RS00460 ECS102511_RS00460 -L2BUCH2_RS00460 AOT15_RS00495 -L2BUCH2_RS00460 CTB_RS00460 -L2BUCH2_RS00460 CTL2C_RS01825 -L2BUCH2_RS00460 CBP42_RS01860 -L2BUCH2_RS00460 BKB96_RS00470 -L2BUCH2_RS00460 L1224_RS00460 -L2BUCH2_RS00460 BKB99_RS00470 -L2BUCH2_RS00460 BKB92_RS00470 -L2BUCH2_RS00460 CTO_RS00460 -L2BUCH2_RS00460 L1440_RS00460 -L2BUCH2_RS00460 SOTONIA3_RS00460 -L2BUCH2_RS00460 E150_RS00460 -L2BUCH2_RS00460 CBP44_RS01865 -L2BUCH2_RS00460 120600 -L2BUCH2_RS00630 L2BUCH2_RS00630 -L2BUCH2_RS00630 CBP44_RS02035 -L2BUCH2_RS00630 FCS84708_RS00630 -L2BUCH2_RS00630 AP288_RS03700 -L2BUCH2_RS00630 BKB93_RS00640 -L2BUCH2_RS00630 119299 -L2BUCH2_RS00630 AQ199_RS01325 -L2BUCH2_RS00630 BBV13_RS00640 -L2BUCH2_RS00630 G9768_RS00630 -L2BUCH2_RS00630 L2BLST_RS00630 -L2BUCH2_RS00630 BW688_RS02030 -L2BUCH2_RS00630 AQ193_RS03365 -L2BUCH2_RS00630 BBV16_RS00640 -L2BUCH2_RS00630 BKC02_RS00640 -L2BUCH2_RS00630 gnl|Prokka|PADJNBJD_00124 -L2BUCH2_RS00630 LJHENM_00620 -L2BUCH2_RS00630 AKW53_RS02125 -L2BUCH2_RS00630 BKC01_RS00640 -L2BUCH2_RS00630 NILJEPDF_00124 -L2BUCH2_RS00630 A5291_RS00635 -L2BUCH2_RS00630 L3404_RS00630 -L2BUCH2_RS00630 SOTONK1_RS00630 -L2BUCH2_RS00630 JIEJKO_00625 -L2BUCH2_RS00630 QSDFRQ_00124 -L2BUCH2_RS00630 IaCS19096_RS00630 -L2BUCH2_RS00630 BKC03_RS00640 -L2BUCH2_RS00630 C15_RS0100650 -L2BUCH2_RS00630 CTRC943_RS00630 -L2BUCH2_RS00630 CTJTET1_RS00630 -L2BUCH2_RS00630 KW39_RS00630 -L2BUCH2_RS00630 DU10_RS00640 -L2BUCH2_RS00630 ECS88FINAL_RS0100650 -L2BUCH2_RS00630 O169_RS00630 -L2BUCH2_RS00630 DU13_RS00645 -L2BUCH2_RS00630 7618416 -L2BUCH2_RS00630 KW36_RS00630 -L2BUCH2_RS00630 CBP48_RS02030 -L2BUCH2_RS00630 SW2_RS00630 -L2BUCH2_RS00630 BKB95_RS00640 -L2BUCH2_RS00630 AOT15_RS00325 -L2BUCH2_RS00630 ECS102511_RS00630 -L2BUCH2_RS00630 CTL2C_RS01995 -L2BUCH2_RS00630 CTB_RS00635 -L2BUCH2_RS00630 L1224_RS00630 -L2BUCH2_RS00630 AQ244_RS02805 -L2BUCH2_RS00630 BKB96_RS00640 -L2BUCH2_RS00630 CBP42_RS02030 -L2BUCH2_RS00630 BKB99_RS00640 -L2BUCH2_RS00630 L1440_RS00630 -L2BUCH2_RS00630 BKB92_RS00640 -L2BUCH2_RS00630 CTO_RS00635 -L2BUCH2_RS00630 SOTONIA3_RS00630 -L2BUCH2_RS00630 E150_RS00630 -L2BUCH2_RS01165 L2BUCH2_RS01165 -L2BUCH2_RS01165 CBP44_RS02575 -L2BUCH2_RS01165 L2BLST_RS01165 -L2BUCH2_RS01165 BW688_RS02575 -L2BUCH2_RS01165 L3404_RS01160 -L2BUCH2_RS01165 CTRC943_RS01165 -L2BUCH2_RS01165 7618884 -L2BUCH2_RS01165 CBP48_RS02570 -L2BUCH2_RS01165 CTL2C_RS02530 -L2BUCH2_RS01165 L1224_RS01160 -L2BUCH2_RS01165 L1440_RS01160 -L2BUCH2_RS01165 CBP42_RS02570 -L2BUCH2_RS01165 CTB_RS01205 -L2BUCH2_RS01165 CTO_RS01205 -L2BUCH2_RS01165 FCS84708_RS01175 -L2BUCH2_RS01165 AP288_RS04245 -L2BUCH2_RS01165 BKB93_RS01180 -L2BUCH2_RS01165 AQ199_RS01870 -L2BUCH2_RS01165 AQ193_RS02815 -L2BUCH2_RS01165 BBV13_RS01210 -L2BUCH2_RS01165 G9768_RS01185 -L2BUCH2_RS01165 BKC02_RS01180 -L2BUCH2_RS01165 AKW53_RS02670 -L2BUCH2_RS01165 BBV16_RS01210 -L2BUCH2_RS01165 BKC01_RS01180 -L2BUCH2_RS01165 120492 -L2BUCH2_RS01165 gnl|Prokka|PADJNBJD_00231 -L2BUCH2_RS01165 DU10_RS01190 -L2BUCH2_RS01165 NILJEPDF_00231 -L2BUCH2_RS01165 LJHENM_01160 -L2BUCH2_RS01165 BKC03_RS01180 -L2BUCH2_RS01165 CTJTET1_RS01195 -L2BUCH2_RS01165 JIEJKO_01160 -L2BUCH2_RS01165 C15_RS0101215 -L2BUCH2_RS01165 SOTONK1_RS01180 -L2BUCH2_RS01165 ECS88FINAL_RS0101200 -L2BUCH2_RS01165 KW39_RS01185 -L2BUCH2_RS01165 QSDFRQ_00231 -L2BUCH2_RS01165 A5291_RS01205 -L2BUCH2_RS01165 IaCS19096_RS01180 -L2BUCH2_RS01165 O169_RS01185 -L2BUCH2_RS01165 DU13_RS01190 -L2BUCH2_RS01165 SW2_RS01175 -L2BUCH2_RS01165 BKB95_RS01195 -L2BUCH2_RS01165 KW36_RS01180 -L2BUCH2_RS01165 ECS102511_RS01175 -L2BUCH2_RS01165 BKB96_RS01180 -L2BUCH2_RS01165 BKB99_RS01180 -L2BUCH2_RS01165 AOT15_RS01185 -L2BUCH2_RS01165 AQ244_RS03360 -L2BUCH2_RS01165 BKB92_RS01180 -L2BUCH2_RS01165 SOTONIA3_RS01195 -L2BUCH2_RS01165 E150_RS01175 -L3404_RS00930 L3404_RS00930 -L3404_RS00930 AKW53_RS02440 -L3404_RS00930 120526 -L3404_RS00930 BBV16_RS00980 -L3404_RS00930 BKC01_RS00950 -L3404_RS00930 AOT15_RS01415 -L3404_RS00930 DU10_RS00960 -L3404_RS00930 gnl|Prokka|PADJNBJD_00186 -L3404_RS00930 BKC03_RS00950 -L3404_RS00930 NILJEPDF_00186 -L3404_RS00930 LJHENM_00935 -L3404_RS00930 CTRC943_RS00935 -L3404_RS00930 CTJTET1_RS00965 -L3404_RS00930 C15_RS0100985 -L3404_RS00930 SOTONK1_RS00950 -L3404_RS00930 ECS88FINAL_RS0100970 -L3404_RS00930 KW39_RS00955 -L3404_RS00930 JIEJKO_00935 -L3404_RS00930 7618862 -L3404_RS00930 A5291_RS00975 -L3404_RS00930 IaCS19096_RS00950 -L3404_RS00930 QSDFRQ_00186 -L3404_RS00930 O169_RS00955 -L3404_RS00930 DU13_RS00960 -L3404_RS00930 SW2_RS00945 -L3404_RS00930 BKB95_RS00965 -L3404_RS00930 CBP48_RS02340 -L3404_RS00930 KW36_RS00950 -L3404_RS00930 ECS102511_RS00945 -L3404_RS00930 BKB96_RS00950 -L3404_RS00930 CTL2C_RS02300 -L3404_RS00930 BKB99_RS00950 -L3404_RS00930 L1224_RS00930 -L3404_RS00930 L1440_RS00930 -L3404_RS00930 AQ193_RS03045 -L3404_RS00930 AQ244_RS03130 -L3404_RS00930 BKB92_RS00950 -L3404_RS00930 CBP42_RS02340 -L3404_RS00930 SOTONIA3_RS00965 -L3404_RS00930 E150_RS00945 -L3404_RS00930 CTB_RS00975 -L3404_RS00930 L2BUCH2_RS00935 -L3404_RS00930 CTO_RS00975 -L3404_RS00930 FCS84708_RS00945 -L3404_RS00930 AP288_RS04015 -L3404_RS00930 BKB93_RS00950 -L3404_RS00930 CBP44_RS02345 -L3404_RS00930 AQ199_RS01640 -L3404_RS00930 L2BLST_RS00935 -L3404_RS00930 BW688_RS02345 -L3404_RS00930 BBV13_RS00980 -L3404_RS00930 G9768_RS00955 -L3404_RS00930 BKC02_RS00950 -L3404_RS01100 L3404_RS01100 -L3404_RS01100 AKW53_RS02610 -L3404_RS01100 BBV16_RS01150 -L3404_RS01100 BKC01_RS01120 -L3404_RS01100 120501 -L3404_RS01100 AOT15_RS01245 -L3404_RS01100 DU10_RS01130 -L3404_RS01100 gnl|Prokka|PADJNBJD_00220 -L3404_RS01100 BKC03_RS01120 -L3404_RS01100 NILJEPDF_00220 -L3404_RS01100 LJHENM_01105 -L3404_RS01100 CTRC943_RS01105 -L3404_RS01100 CTJTET1_RS01135 -L3404_RS01100 C15_RS0101155 -L3404_RS01100 SOTONK1_RS01120 -L3404_RS01100 ECS88FINAL_RS0101140 -L3404_RS01100 KW39_RS01125 -L3404_RS01100 JIEJKO_01105 -L3404_RS01100 A5291_RS01145 -L3404_RS01100 IaCS19096_RS01120 -L3404_RS01100 7618878 -L3404_RS01100 QSDFRQ_00220 -L3404_RS01100 O169_RS01125 -L3404_RS01100 DU13_RS01130 -L3404_RS01100 SW2_RS01115 -L3404_RS01100 BKB95_RS01135 -L3404_RS01100 CBP48_RS02510 -L3404_RS01100 KW36_RS01120 -L3404_RS01100 ECS102511_RS01115 -L3404_RS01100 BKB96_RS01120 -L3404_RS01100 CTL2C_RS02470 -L3404_RS01100 BKB99_RS01120 -L3404_RS01100 L1224_RS01100 -L3404_RS01100 L1440_RS01100 -L3404_RS01100 AQ193_RS02875 -L3404_RS01100 AQ244_RS03300 -L3404_RS01100 BKB92_RS01120 -L3404_RS01100 CBP42_RS02510 -L3404_RS01100 SOTONIA3_RS01135 -L3404_RS01100 E150_RS01115 -L3404_RS01100 CTB_RS01145 -L3404_RS01100 L2BUCH2_RS01105 -L3404_RS01100 CTO_RS01145 -L3404_RS01100 FCS84708_RS01115 -L3404_RS01100 AP288_RS04185 -L3404_RS01100 BKB93_RS01120 -L3404_RS01100 CBP44_RS02515 -L3404_RS01100 AQ199_RS01810 -L3404_RS01100 L2BLST_RS01105 -L3404_RS01100 BW688_RS02515 -L3404_RS01100 BBV13_RS01150 -L3404_RS01100 G9768_RS01125 -L3404_RS01100 BKC02_RS01120 -L3404_RS01270 L3404_RS01270 -L3404_RS01270 AKW53_RS02780 -L3404_RS01270 BKC01_RS01290 -L3404_RS01270 gnl|Prokka|PADJNBJD_00253 -L3404_RS01270 AOT15_RS01075 -L3404_RS01270 DU10_RS01300 -L3404_RS01270 NILJEPDF_00253 -L3404_RS01270 LJHENM_01270 -L3404_RS01270 BKC03_RS01290 -L3404_RS01270 CTRC943_RS01275 -L3404_RS01270 CTJTET1_RS01305 -L3404_RS01270 KW39_RS01295 -L3404_RS01270 JIEJKO_01270 -L3404_RS01270 120473 -L3404_RS01270 C15_RS0101325 -L3404_RS01270 SOTONK1_RS01290 -L3404_RS01270 ECS88FINAL_RS0101310 -L3404_RS01270 QSDFRQ_00253 -L3404_RS01270 A5291_RS01315 -L3404_RS01270 IaCS19096_RS01290 -L3404_RS01270 DU13_RS01300 -L3404_RS01270 7618896 -L3404_RS01270 SW2_RS01285 -L3404_RS01270 BKB95_RS01305 -L3404_RS01270 CBP48_RS02680 -L3404_RS01270 KW36_RS01290 -L3404_RS01270 ECS102511_RS01285 -L3404_RS01270 BKB96_RS01290 -L3404_RS01270 CTL2C_RS02640 -L3404_RS01270 BKB99_RS01290 -L3404_RS01270 L1224_RS01270 -L3404_RS01270 L1440_RS01270 -L3404_RS01270 AQ193_RS02705 -L3404_RS01270 AQ244_RS03470 -L3404_RS01270 BKB92_RS01290 -L3404_RS01270 CBP42_RS02680 -L3404_RS01270 SOTONIA3_RS01305 -L3404_RS01270 CTB_RS01315 -L3404_RS01270 E150_RS01285 -L3404_RS01270 L2BUCH2_RS01275 -L3404_RS01270 CTO_RS01315 -L3404_RS01270 FCS84708_RS01285 -L3404_RS01270 AP288_RS04355 -L3404_RS01270 BKB93_RS01290 -L3404_RS01270 CBP44_RS02685 -L3404_RS01270 AQ199_RS01980 -L3404_RS01270 L2BLST_RS01275 -L3404_RS01270 BW688_RS02685 -L3404_RS01270 G9768_RS01295 -L3404_RS01270 BKC02_RS01290 -L3404_RS01770 L3404_RS01770 -L3404_RS01770 G9768_RS01795 -L3404_RS01770 BBV16_RS01825 -L3404_RS01770 BKC02_RS01800 -L3404_RS01770 AQ244_RS01315 -L3404_RS01770 BKC01_RS01800 -L3404_RS01770 AKW53_RS03295 -L3404_RS01770 gnl|Prokka|PADJNBJD_00353 -L3404_RS01770 NILJEPDF_00353 -L3404_RS01770 CTRC943_RS01775 -L3404_RS01770 LJHENM_01780 -L3404_RS01770 JIEJKO_01775 -L3404_RS01770 BKC03_RS01800 -L3404_RS01770 CTJTET1_RS01805 -L3404_RS01770 DU10_RS01820 -L3404_RS01770 QSDFRQ_00353 -L3404_RS01770 C15_RS0101835 -L3404_RS01770 SOTONK1_RS01795 -L3404_RS01770 A5291_RS01820 -L3404_RS01770 KW39_RS01805 -L3404_RS01770 IaCS19096_RS01790 -L3404_RS01770 120367 -L3404_RS01770 ECS88FINAL_RS0101825 -L3404_RS01770 O169_RS01805 -L3404_RS01770 AQ193_RS02190 -L3404_RS01770 DU13_RS01815 -L3404_RS01770 7618955 -L3404_RS01770 CTL2C_RS03140 -L3404_RS01770 BKB95_RS01815 -L3404_RS01770 CBP48_RS03200 -L3404_RS01770 L1224_RS01770 -L3404_RS01770 KW36_RS01790 -L3404_RS01770 AOT15_RS02790 -L3404_RS01770 BKB96_RS01800 -L3404_RS01770 SW2_RS01795 -L3404_RS01770 BKB99_RS01800 -L3404_RS01770 L1440_RS01770 -L3404_RS01770 ECS102511_RS01795 -L3404_RS01770 CBP42_RS03210 -L3404_RS01770 CTB_RS01820 -L3404_RS01770 SOTONIA3_RS01805 -L3404_RS01770 L2BUCH2_RS01770 -L3404_RS01770 BKB92_RS01810 -L3404_RS01770 CTO_RS01820 -L3404_RS01770 E150_RS01800 -L3404_RS01770 L2BLST_RS01770 -L3404_RS01770 FCS84708_RS01790 -L3404_RS01770 BW688_RS03200 -L3404_RS01770 BKB93_RS01810 -L3404_RS01770 CBP44_RS03205 -L3404_RS01770 BBV13_RS01825 -L3404_RS01770 AP288_RS01285 -L3404_RS01770 AQ199_RS02490 -L3404_RS02930 L3404_RS02930 -L3404_RS02930 BKC02_RS02985 -L3404_RS02930 gnl|Prokka|PADJNBJD_00583 -L3404_RS02930 AOT15_RS03755 -L3404_RS02930 NILJEPDF_00583 -L3404_RS02930 BKC01_RS02985 -L3404_RS02930 LJHENM_02935 -L3404_RS02930 CTRC943_RS02935 -L3404_RS02930 AQ244_RS00155 -L3404_RS02930 QSDFRQ_00583 -L3404_RS02930 JIEJKO_02940 -L3404_RS02930 SOTONK1_RS02955 -L3404_RS02930 CTJTET1_RS02965 -L3404_RS02930 BKC03_RS02985 -L3404_RS02930 C15_RS0103025 -L3404_RS02930 KW39_RS02970 -L3404_RS02930 IaCS19096_RS02950 -L3404_RS02930 ECS88FINAL_RS0103025 -L3404_RS02930 DU10_RS03005 -L3404_RS02930 A5291_RS02990 -L3404_RS02930 O169_RS02965 -L3404_RS02930 AQ193_RS01030 -L3404_RS02930 DU13_RS03000 -L3404_RS02930 CTL2C_RS04305 -L3404_RS02930 BKB95_RS03000 -L3404_RS02930 BKB96_RS02990 -L3404_RS02930 BKB99_RS02985 -L3404_RS02930 CBP48_RS04390 -L3404_RS02930 L1224_RS02935 -L3404_RS02930 AKW53_RS04185 -L3404_RS02930 7618615 -L3404_RS02930 SW2_RS02960 -L3404_RS02930 ECS102511_RS02955 -L3404_RS02930 L1440_RS02935 -L3404_RS02930 CBP42_RS04395 -L3404_RS02930 L2BUCH2_RS02935 -L3404_RS02930 SOTONIA3_RS02970 -L3404_RS02930 CTB_RS02990 -L3404_RS02930 BKB92_RS02990 -L3404_RS02930 E150_RS02960 -L3404_RS02930 BW688_RS04385 -L3404_RS02930 CTO_RS02990 -L3404_RS02930 L2BLST_RS02935 -L3404_RS02930 FCS84708_RS02955 -L3404_RS02930 BBV13_RS02995 -L3404_RS02930 CBP44_RS04390 -L3404_RS02930 AQ199_RS03655 -L3404_RS02930 BBV16_RS03005 -L3404_RS02930 BKB93_RS02995 -L3404_RS02930 G9768_RS02955 -L3404_RS02930 AP288_RS00125 -L3404_RS02930 119615 F -CTRC943_RS03245 CTRC943_RS03245 -CTRC943_RS03245 JIEJKO_03240 -CTRC943_RS03245 BKC01_RS03300 -CTRC943_RS03245 QSDFRQ_00644 -CTRC943_RS03245 KW39_RS03285 -CTRC943_RS03245 BKC03_RS03300 -CTRC943_RS03245 CTJTET1_RS03285 -CTRC943_RS03245 ECS88FINAL_RS0103335 -CTRC943_RS03245 DU10_RS03315 -CTRC943_RS03245 SOTONK1_RS03270 -CTRC943_RS03245 O169_RS03280 -CTRC943_RS03245 IaCS19096_RS03265 -CTRC943_RS03245 C15_RS0103335 -CTRC943_RS03245 A5291_RS03310 -CTRC943_RS03245 AKW53_RS00020 -CTRC943_RS03245 DU13_RS03310 -CTRC943_RS03245 AQ244_RS04645 -CTRC943_RS03245 CTL2C_RS04615 -CTRC943_RS03245 CBP48_RS04700 -CTRC943_RS03245 7618650 -CTRC943_RS03245 SW2_RS03275 -CTRC943_RS03245 L1224_RS03245 -CTRC943_RS03245 KW36_RS03270 -CTRC943_RS03245 ECS102511_RS03270 -CTRC943_RS03245 L1440_RS03245 -CTRC943_RS03245 BKB95_RS03315 -CTRC943_RS03245 BKB96_RS03310 -CTRC943_RS03245 BKB99_RS03305 -CTRC943_RS03245 CBP42_RS04705 -CTRC943_RS03245 L2BUCH2_RS03245 -CTRC943_RS03245 AQ193_RS00715 -CTRC943_RS03245 BKB92_RS03300 -CTRC943_RS03245 CTB_RS03310 -CTRC943_RS03245 E150_RS03275 -CTRC943_RS03245 SOTONIA3_RS03290 -CTRC943_RS03245 BW688_RS04695 -CTRC943_RS03245 CTO_RS03305 -CTRC943_RS03245 FCS84708_RS03270 -CTRC943_RS03245 BBV13_RS03310 -CTRC943_RS03245 L2BLST_RS03245 -CTRC943_RS03245 CBP44_RS04700 -CTRC943_RS03245 119669 -CTRC943_RS03245 AQ199_RS03970 -CTRC943_RS03245 BBV16_RS03320 -CTRC943_RS03245 BKB93_RS03305 -CTRC943_RS03245 G9768_RS03270 -CTRC943_RS03245 L3404_RS03240 -CTRC943_RS03245 gnl|Prokka|PADJNBJD_00643 -CTRC943_RS03245 AP288_RS01640 -CTRC943_RS03245 BKC02_RS03300 -CTRC943_RS03245 NILJEPDF_00644 -CTRC943_RS03245 LJHENM_03235 -CTRC943_RS03245 AOT15_RS04070 -CTRC943_RS03935 CTRC943_RS03935 -CTRC943_RS03935 BKC01_RS03990 -CTRC943_RS03935 AKW53_RS00690 -CTRC943_RS03935 BKC03_RS03985 -CTRC943_RS03935 CBP48_RS00555 -CTRC943_RS03935 CTJTET1_RS03970 -CTRC943_RS03935 KW39_RS03965 -CTRC943_RS03935 DU10_RS04000 -CTRC943_RS03935 A5291_RS03995 -CTRC943_RS03935 SOTONK1_RS03950 -CTRC943_RS03935 IaCS19096_RS03945 -CTRC943_RS03935 DU13_RS04000 -CTRC943_RS03935 C15_RS0104055 -CTRC943_RS03935 ECS88FINAL_RS0104060 -CTRC943_RS03935 O169_RS03960 -CTRC943_RS03935 KW36_RS03950 -CTRC943_RS03935 BKB95_RS04005 -CTRC943_RS03935 CBP42_RS00555 -CTRC943_RS03935 CTL2C_RS00550 -CTRC943_RS03935 L1224_RS03930 -CTRC943_RS03935 SW2_RS03955 -CTRC943_RS03935 L1440_RS03925 -CTRC943_RS03935 ECS102511_RS03945 -CTRC943_RS03935 AQ244_RS03960 -CTRC943_RS03935 BKB96_RS03990 -CTRC943_RS03935 BKB99_RS03985 -CTRC943_RS03935 CBP44_RS00555 -CTRC943_RS03935 L2BUCH2_RS03930 -CTRC943_RS03935 AQ193_RS00040 -CTRC943_RS03935 BKB92_RS03985 -CTRC943_RS03935 CTB_RS03990 -CTRC943_RS03935 SOTONIA3_RS03970 -CTRC943_RS03935 E150_RS03955 -CTRC943_RS03935 CTO_RS03985 -CTRC943_RS03935 BBV13_RS03990 -CTRC943_RS03935 FCS84708_RS03945 -CTRC943_RS03935 L2BLST_RS03930 -CTRC943_RS03935 BBV16_RS04000 -CTRC943_RS03935 7618706 -CTRC943_RS03935 120019 -CTRC943_RS03935 BW688_RS00555 -CTRC943_RS03935 AQ199_RS04645 -CTRC943_RS03935 BKB93_RS03990 -CTRC943_RS03935 G9768_RS03950 -CTRC943_RS03935 gnl|Prokka|PADJNBJD_00777 -CTRC943_RS03935 L3404_RS03925 -CTRC943_RS03935 NILJEPDF_00778 -CTRC943_RS03935 BKC02_RS03985 -CTRC943_RS03935 LJHENM_03915 -CTRC943_RS03935 AOT15_RS04750 -CTRC943_RS03935 AP288_RS02320 -CTRC943_RS03935 JIEJKO_03915 -CTRC943_RS03935 QSDFRQ_00778 -CTRC943_RS04300 CTRC943_RS04300 -CTRC943_RS04300 AKW53_RS01035 -CTRC943_RS04300 BKC01_RS04360 -CTRC943_RS04300 AOT15_RS01900 -CTRC943_RS04300 CTJTET1_RS04490 -CTRC943_RS04300 CBP48_RS00925 -CTRC943_RS04300 BKC03_RS04355 -CTRC943_RS04300 A5291_RS04355 -CTRC943_RS04300 KW39_RS04335 -CTRC943_RS04300 SOTONK1_RS04320 -CTRC943_RS04300 ECS88FINAL_RS0104405 -CTRC943_RS04300 IaCS19096_RS04310 -CTRC943_RS04300 DU10_RS04370 -CTRC943_RS04300 C15_RS0104430 -CTRC943_RS04300 DU13_RS04370 -CTRC943_RS04300 O169_RS04330 -CTRC943_RS04300 KW36_RS04315 -CTRC943_RS04300 CBP42_RS00925 -CTRC943_RS04300 CTL2C_RS00915 -CTRC943_RS04300 L1224_RS04295 -CTRC943_RS04300 BKB95_RS04375 -CTRC943_RS04300 L1440_RS04290 -CTRC943_RS04300 BKB96_RS04360 -CTRC943_RS04300 BKB99_RS04355 -CTRC943_RS04300 SW2_RS04325 -CTRC943_RS04300 ECS102511_RS04315 -CTRC943_RS04300 CBP44_RS00925 -CTRC943_RS04300 L2BUCH2_RS04295 -CTRC943_RS04300 CTB_RS04350 -CTRC943_RS04300 AQ193_RS04455 -CTRC943_RS04300 SOTONIA3_RS04335 -CTRC943_RS04300 BKB92_RS04355 -CTRC943_RS04300 CTO_RS04345 -CTRC943_RS04300 L2BLST_RS04295 -CTRC943_RS04300 AP288_RS02620 -CTRC943_RS04300 AQ244_RS02440 -CTRC943_RS04300 BBV13_RS04360 -CTRC943_RS04300 E150_RS04325 -CTRC943_RS04300 gnl|Prokka|PADJNBJD_00846 -CTRC943_RS04300 FCS84708_RS04315 -CTRC943_RS04300 AQ199_RS00245 -CTRC943_RS04300 BBV16_RS04365 -CTRC943_RS04300 BW688_RS00925 -CTRC943_RS04300 7618303 -CTRC943_RS04300 119836 -CTRC943_RS04300 NILJEPDF_00847 -CTRC943_RS04300 LJHENM_04260 -CTRC943_RS04300 L3404_RS04290 -CTRC943_RS04300 G9768_RS04320 -CTRC943_RS04300 JIEJKO_04260 -CTRC943_RS04300 BKB93_RS04360 -CTRC943_RS04300 QSDFRQ_00847 -CTRC943_RS04300 BKC02_RS04355 -CTJTET1_RS04150 CTJTET1_RS04150 -KW39_RS02930 KW39_RS02930 -KW39_RS02930 ECS88FINAL_RS1000000105070 -KW39_RS02930 DU10_RS02965 -KW39_RS02930 O169_RS04835 -KW39_RS02930 DU13_RS02960 -KW39_RS02930 AKW53_RS04145 -KW39_RS02930 AP288_RS04935 -KW39_RS02930 SW2_RS04835 -KW39_RS02930 ECS102511_RS04850 -KW39_RS02930 BKB92_RS02950 -KW39_RS02930 E150_RS04840 -KW39_RS02930 FCS84708_RS02915 -KW39_RS02930 AQ193_RS04900 -KW39_RS02930 AQ199_RS03615 -KW39_RS02930 BKB93_RS02955 -KW39_RS03270 KW39_RS03270 -KW39_RS03270 BKC03_RS03285 -KW39_RS03270 CTJTET1_RS03270 -KW39_RS03270 ECS88FINAL_RS0103320 -KW39_RS03270 DU10_RS03300 -KW39_RS03270 SOTONK1_RS03255 -KW39_RS03270 O169_RS03265 -KW39_RS03270 IaCS19096_RS03250 -KW39_RS03270 C15_RS0103320 -KW39_RS03270 A5291_RS03295 -KW39_RS03270 AKW53_RS00005 -KW39_RS03270 DU13_RS03295 -KW39_RS03270 CTL2C_RS04600 -KW39_RS03270 CBP48_RS04685 -KW39_RS03270 7618649 -KW39_RS03270 SW2_RS03260 -KW39_RS03270 L1224_RS03230 -KW39_RS03270 KW36_RS03255 -KW39_RS03270 ECS102511_RS03255 -KW39_RS03270 L1440_RS03230 -KW39_RS03270 BKB95_RS03300 -KW39_RS03270 BKB96_RS03295 -KW39_RS03270 BKB99_RS03290 -KW39_RS03270 AQ244_RS04660 -KW39_RS03270 CBP42_RS04690 -KW39_RS03270 L2BUCH2_RS03230 -KW39_RS03270 BKB92_RS03285 -KW39_RS03270 CTB_RS03295 -KW39_RS03270 E150_RS03260 -KW39_RS03270 SOTONIA3_RS03275 -KW39_RS03270 BW688_RS04680 -KW39_RS03270 CTO_RS03290 -KW39_RS03270 FCS84708_RS03255 -KW39_RS03270 BBV13_RS03295 -KW39_RS03270 L2BLST_RS03230 -KW39_RS03270 CBP44_RS04685 -KW39_RS03270 119667 -KW39_RS03270 AQ193_RS00730 -KW39_RS03270 AQ199_RS03955 -KW39_RS03270 BBV16_RS03305 -KW39_RS03270 BKB93_RS03290 -KW39_RS03270 G9768_RS03255 -KW39_RS03270 L3404_RS03225 -KW39_RS03270 gnl|Prokka|PADJNBJD_00640 -KW39_RS03270 AP288_RS01625 -KW39_RS03270 BKC02_RS03285 -KW39_RS03270 NILJEPDF_00641 -KW39_RS03270 LJHENM_03220 -KW39_RS03270 AOT15_RS04055 -KW39_RS03270 CTRC943_RS03230 -KW39_RS03270 JIEJKO_03225 -KW39_RS03270 BKC01_RS03285 -KW39_RS03270 QSDFRQ_00641 -KW36_RS03570 KW36_RS03570 -KW36_RS03570 AKW53_RS00315 -KW36_RS03570 BKB95_RS03620 -KW36_RS03570 CBP42_RS00170 -KW36_RS03570 SW2_RS03575 -KW36_RS03570 CTL2C_RS00170 -KW36_RS03570 L1224_RS03550 -KW36_RS03570 ECS102511_RS03565 -KW36_RS03570 L1440_RS03550 -KW36_RS03570 BKB96_RS03610 -KW36_RS03570 BKB99_RS03605 -KW36_RS03570 CBP44_RS00170 -KW36_RS03570 L2BUCH2_RS03550 -KW36_RS03570 BKB92_RS03600 -KW36_RS03570 CTB_RS03610 -KW36_RS03570 SOTONIA3_RS03590 -KW36_RS03570 E150_RS03575 -KW36_RS03570 CTO_RS03605 -KW36_RS03570 BBV13_RS03610 -KW36_RS03570 FCS84708_RS03565 -KW36_RS03570 L2BLST_RS03550 -KW36_RS03570 BBV16_RS03620 -KW36_RS03570 BW688_RS00170 -KW36_RS03570 AQ199_RS04265 -KW36_RS03570 AQ244_RS04340 -KW36_RS03570 BKB93_RS03605 -KW36_RS03570 7618225 -KW36_RS03570 119715 -KW36_RS03570 G9768_RS03570 -KW36_RS03570 gnl|Prokka|PADJNBJD_00702 -KW36_RS03570 L3404_RS03545 -KW36_RS03570 BKC02_RS03600 -KW36_RS03570 NILJEPDF_00703 -KW36_RS03570 LJHENM_03530 -KW36_RS03570 AOT15_RS04370 -KW36_RS03570 AP288_RS01935 -KW36_RS03570 AQ193_RS00420 -KW36_RS03570 JIEJKO_03535 -KW36_RS03570 BKC01_RS03600 -KW36_RS03570 QSDFRQ_00703 -KW36_RS03570 CTRC943_RS03555 -KW36_RS03570 BKC03_RS03600 -KW36_RS03570 CBP48_RS00170 -KW36_RS03570 CTJTET1_RS03590 -KW36_RS03570 KW39_RS03585 -KW36_RS03570 DU10_RS03615 -KW36_RS03570 SOTONK1_RS03570 -KW36_RS03570 ECS88FINAL_RS0103660 -KW36_RS03570 IaCS19096_RS03565 -KW36_RS03570 C15_RS0103650 -KW36_RS03570 A5291_RS03615 -KW36_RS03570 O169_RS03580 -KW36_RS03570 DU13_RS03615 -ECS102511_RS00175 ECS102511_RS00175 -ECS102511_RS00175 CTB_RS00175 -ECS102511_RS00175 CTL2C_RS01540 -ECS102511_RS00175 CBP42_RS01570 -ECS102511_RS00175 L1224_RS00175 -ECS102511_RS00175 BKB96_RS00180 -ECS102511_RS00175 BKB99_RS00180 -ECS102511_RS00175 CTO_RS00175 -ECS102511_RS00175 SOTONIA3_RS00175 -ECS102511_RS00175 L1440_RS00175 -ECS102511_RS00175 BKB92_RS00180 -ECS102511_RS00175 120647 -ECS102511_RS00175 CBP44_RS01575 -ECS102511_RS00175 E150_RS00175 -ECS102511_RS00175 L2BUCH2_RS00175 -ECS102511_RS00175 AOT15_RS00780 -ECS102511_RS00175 BKB93_RS00180 -ECS102511_RS00175 FCS84708_RS00175 -ECS102511_RS00175 AP288_RS03245 -ECS102511_RS00175 BBV13_RS00180 -ECS102511_RS00175 G9768_RS00175 -ECS102511_RS00175 AQ199_RS00870 -ECS102511_RS00175 BW688_RS01570 -ECS102511_RS00175 L2BLST_RS00175 -ECS102511_RS00175 BKC02_RS00180 -ECS102511_RS00175 BBV16_RS00180 -ECS102511_RS00175 BKC01_RS00180 -ECS102511_RS00175 gnl|Prokka|PADJNBJD_00036 -ECS102511_RS00175 LJHENM_00180 -ECS102511_RS00175 A5291_RS00175 -ECS102511_RS00175 SOTONK1_RS00175 -ECS102511_RS00175 JIEJKO_00175 -ECS102511_RS00175 7618790 -ECS102511_RS00175 NILJEPDF_00036 -ECS102511_RS00175 L3404_RS00175 -ECS102511_RS00175 IaCS19096_RS00175 -ECS102511_RS00175 AKW53_RS01665 -ECS102511_RS00175 BKC03_RS00180 -ECS102511_RS00175 C15_RS0100175 -ECS102511_RS00175 QSDFRQ_00036 -ECS102511_RS00175 CTJTET1_RS00175 -ECS102511_RS00175 DU10_RS00180 -ECS102511_RS00175 CTRC943_RS00175 -ECS102511_RS00175 O169_RS00175 -ECS102511_RS00175 AQ193_RS03830 -ECS102511_RS00175 CBP48_RS01570 -ECS102511_RS00175 ECS88FINAL_RS0100180 -ECS102511_RS00175 DU13_RS00180 -ECS102511_RS00175 KW39_RS00175 -ECS102511_RS00175 KW36_RS00175 -ECS102511_RS00175 AQ244_RS01815 -ECS102511_RS00175 BKB95_RS00180 -ECS102511_RS00175 SW2_RS00175 -ECS102511_RS00350 ECS102511_RS00350 -ECS102511_RS00350 CTB_RS00350 -ECS102511_RS00350 CTL2C_RS01715 -ECS102511_RS00350 CBP42_RS01750 -ECS102511_RS00350 BKB96_RS00360 -ECS102511_RS00350 L1224_RS00350 -ECS102511_RS00350 BKB99_RS00360 -ECS102511_RS00350 CTO_RS00350 -ECS102511_RS00350 L1440_RS00350 -ECS102511_RS00350 BKB92_RS00360 -ECS102511_RS00350 SOTONIA3_RS00350 -ECS102511_RS00350 CBP44_RS01755 -ECS102511_RS00350 120617 -ECS102511_RS00350 E150_RS00350 -ECS102511_RS00350 L2BUCH2_RS00350 -ECS102511_RS00350 AOT15_RS00605 -ECS102511_RS00350 BKB93_RS00360 -ECS102511_RS00350 FCS84708_RS00350 -ECS102511_RS00350 AP288_RS03420 -ECS102511_RS00350 BBV13_RS00355 -ECS102511_RS00350 AQ199_RS01045 -ECS102511_RS00350 BW688_RS01750 -ECS102511_RS00350 G9768_RS00350 -ECS102511_RS00350 L2BLST_RS00350 -ECS102511_RS00350 BKC02_RS00360 -ECS102511_RS00350 BBV16_RS00355 -ECS102511_RS00350 gnl|Prokka|PADJNBJD_00069 -ECS102511_RS00350 NILJEPDF_00069 -ECS102511_RS00350 LJHENM_00350 -ECS102511_RS00350 A5291_RS00350 -ECS102511_RS00350 BKC01_RS00360 -ECS102511_RS00350 SOTONK1_RS00350 -ECS102511_RS00350 L3404_RS00350 -ECS102511_RS00350 JIEJKO_00350 -ECS102511_RS00350 AKW53_RS01840 -ECS102511_RS00350 QSDFRQ_00069 -ECS102511_RS00350 IaCS19096_RS00350 -ECS102511_RS00350 BKC03_RS00360 -ECS102511_RS00350 C15_RS0100360 -ECS102511_RS00350 DU10_RS00360 -ECS102511_RS00350 7618809 -ECS102511_RS00350 CTRC943_RS00350 -ECS102511_RS00350 CTJTET1_RS00350 -ECS102511_RS00350 O169_RS00350 -ECS102511_RS00350 KW36_RS00350 -ECS102511_RS00350 DU13_RS00365 -ECS102511_RS00350 CBP48_RS01750 -ECS102511_RS00350 ECS88FINAL_RS0100365 -ECS102511_RS00350 AQ193_RS03645 -ECS102511_RS00350 AQ244_RS01640 -ECS102511_RS00350 KW39_RS00350 -ECS102511_RS00350 BKB95_RS00360 -ECS102511_RS00350 SW2_RS00350 -ECS102511_RS00515 ECS102511_RS00515 -ECS102511_RS00515 CTB_RS00515 -ECS102511_RS00515 CTL2C_RS01880 -ECS102511_RS00515 CBP42_RS01915 -ECS102511_RS00515 AQ244_RS02690 -ECS102511_RS00515 BKB96_RS00525 -ECS102511_RS00515 L1224_RS00515 -ECS102511_RS00515 BKB99_RS00525 -ECS102511_RS00515 BKB92_RS00525 -ECS102511_RS00515 CTO_RS00515 -ECS102511_RS00515 L1440_RS00515 -ECS102511_RS00515 SOTONIA3_RS00515 -ECS102511_RS00515 E150_RS00515 -ECS102511_RS00515 CBP44_RS01920 -ECS102511_RS00515 119278 -ECS102511_RS00515 AOT15_RS00440 -ECS102511_RS00515 L2BUCH2_RS00515 -ECS102511_RS00515 BKB93_RS00525 -ECS102511_RS00515 FCS84708_RS00515 -ECS102511_RS00515 AP288_RS03585 -ECS102511_RS00515 BBV13_RS00520 -ECS102511_RS00515 AQ199_RS01210 -ECS102511_RS00515 L2BLST_RS00515 -ECS102511_RS00515 BW688_RS01915 -ECS102511_RS00515 G9768_RS00515 -ECS102511_RS00515 BBV16_RS00520 -ECS102511_RS00515 BKC02_RS00525 -ECS102511_RS00515 gnl|Prokka|PADJNBJD_00101 -ECS102511_RS00515 LJHENM_00505 -ECS102511_RS00515 NILJEPDF_00101 -ECS102511_RS00515 BKC01_RS00525 -ECS102511_RS00515 A5291_RS00515 -ECS102511_RS00515 AKW53_RS02010 -ECS102511_RS00515 JIEJKO_00510 -ECS102511_RS00515 SOTONK1_RS00515 -ECS102511_RS00515 L3404_RS00515 -ECS102511_RS00515 QSDFRQ_00101 -ECS102511_RS00515 IaCS19096_RS00515 -ECS102511_RS00515 BKC03_RS00525 -ECS102511_RS00515 DU10_RS00525 -ECS102511_RS00515 C15_RS0100525 -ECS102511_RS00515 7618402 -ECS102511_RS00515 CTRC943_RS00515 -ECS102511_RS00515 CTJTET1_RS00515 -ECS102511_RS00515 O169_RS00515 -ECS102511_RS00515 DU13_RS00530 -ECS102511_RS00515 ECS88FINAL_RS0100530 -ECS102511_RS00515 KW39_RS00515 -ECS102511_RS00515 KW36_RS00515 -ECS102511_RS00515 AQ193_RS03480 -ECS102511_RS00515 CBP48_RS01915 -ECS102511_RS00515 SW2_RS00515 -ECS102511_RS00515 BKB95_RS00525 -ECS102511_RS00685 ECS102511_RS00685 -ECS102511_RS00685 CTL2C_RS02050 -ECS102511_RS00685 CTB_RS00690 -ECS102511_RS00685 L1224_RS00685 -ECS102511_RS00685 AQ244_RS02860 -ECS102511_RS00685 BKB96_RS00695 -ECS102511_RS00685 CBP42_RS02085 -ECS102511_RS00685 BKB99_RS00695 -ECS102511_RS00685 L1440_RS00685 -ECS102511_RS00685 BKB92_RS00695 -ECS102511_RS00685 CTO_RS00690 -ECS102511_RS00685 SOTONIA3_RS00685 -ECS102511_RS00685 E150_RS00685 -ECS102511_RS00685 AOT15_RS00270 -ECS102511_RS00685 L2BUCH2_RS00685 -ECS102511_RS00685 CBP44_RS02090 -ECS102511_RS00685 FCS84708_RS00685 -ECS102511_RS00685 AP288_RS03755 -ECS102511_RS00685 BKB93_RS00695 -ECS102511_RS00685 120564 -ECS102511_RS00685 AQ199_RS01380 -ECS102511_RS00685 BBV13_RS00695 -ECS102511_RS00685 G9768_RS00685 -ECS102511_RS00685 L2BLST_RS00685 -ECS102511_RS00685 BW688_RS02085 -ECS102511_RS00685 BBV16_RS00695 -ECS102511_RS00685 BKC02_RS00695 -ECS102511_RS00685 gnl|Prokka|PADJNBJD_00135 -ECS102511_RS00685 LJHENM_00675 -ECS102511_RS00685 AKW53_RS02180 -ECS102511_RS00685 BKC01_RS00695 -ECS102511_RS00685 NILJEPDF_00135 -ECS102511_RS00685 A5291_RS00690 -ECS102511_RS00685 L3404_RS00685 -ECS102511_RS00685 SOTONK1_RS00685 -ECS102511_RS00685 JIEJKO_00680 -ECS102511_RS00685 QSDFRQ_00135 -ECS102511_RS00685 IaCS19096_RS00685 -ECS102511_RS00685 BKC03_RS00695 -ECS102511_RS00685 C15_RS0100710 -ECS102511_RS00685 CTRC943_RS00685 -ECS102511_RS00685 CTJTET1_RS00685 -ECS102511_RS00685 KW39_RS00685 -ECS102511_RS00685 DU10_RS00695 -ECS102511_RS00685 ECS88FINAL_RS0100710 -ECS102511_RS00685 O169_RS00685 -ECS102511_RS00685 AQ193_RS03310 -ECS102511_RS00685 DU13_RS00700 -ECS102511_RS00685 7618843 -ECS102511_RS00685 KW36_RS00685 -ECS102511_RS00685 CBP48_RS02085 -ECS102511_RS00685 SW2_RS00685 -ECS102511_RS00685 BKB95_RS00695 -FCS84708_RS01980 FCS84708_RS01980 -FCS84708_RS01980 L2BLST_RS01960 F -FCS84708_RS01980 BW688_RS03390 F -FCS84708_RS01980 L3404_RS01960 F -FCS84708_RS01980 CTRC943_RS01965 F -FCS84708_RS01980 CTL2C_RS03330 F -FCS84708_RS01980 L1224_RS01960 F -FCS84708_RS01980 L1440_RS01960 F -FCS84708_RS01980 L2BUCH2_RS01960 F -FCS84708_RS01980 BKB93_RS02000 -FCS84708_RS01980 BBV13_RS02015 -FCS84708_RS01980 AQ199_RS02680 -FCS84708_RS01980 G9768_RS01985 -FCS84708_RS01980 BBV16_RS02015 -FCS84708_RS01980 BKC02_RS01990 -FCS84708_RS01980 AQ193_RS02000 -FCS84708_RS01980 BKC01_RS01990 -FCS84708_RS01980 AKW53_RS03485 -FCS84708_RS01980 gnl|Prokka|PADJNBJD_00391 -FCS84708_RS01980 NILJEPDF_00391 -FCS84708_RS01980 LJHENM_01970 -FCS84708_RS01980 JIEJKO_01965 -FCS84708_RS01980 BKC03_RS01990 -FCS84708_RS01980 CTJTET1_RS01995 -FCS84708_RS01980 QSDFRQ_00391 -FCS84708_RS01980 C15_RS0102030 -FCS84708_RS01980 SOTONK1_RS01985 -FCS84708_RS01980 DU10_RS02015 -FCS84708_RS01980 A5291_RS02010 -FCS84708_RS01980 KW39_RS01995 -FCS84708_RS01980 IaCS19096_RS01980 -FCS84708_RS01980 ECS88FINAL_RS0102020 -FCS84708_RS01980 O169_RS01995 -FCS84708_RS01980 DU13_RS02010 -FCS84708_RS01980 119497 -FCS84708_RS01980 KW36_RS01980 -FCS84708_RS01980 AOT15_RS02980 -FCS84708_RS01980 BKB95_RS02010 -FCS84708_RS01980 BKB96_RS01990 -FCS84708_RS01980 SW2_RS01985 -FCS84708_RS01980 BKB99_RS01990 -FCS84708_RS01980 ECS102511_RS01985 -FCS84708_RS01980 AP288_RS01095 -FCS84708_RS01980 CTB_RS02010 -FCS84708_RS01980 SOTONIA3_RS01995 -FCS84708_RS01980 BKB92_RS02000 -FCS84708_RS01980 CTO_RS02010 -FCS84708_RS01980 AQ244_RS01125 -FCS84708_RS01980 E150_RS01990 -AKW53_RS00145 AKW53_RS00145 -AKW53_RS00145 KW36_RS03395 -AKW53_RS00145 CTL2C_RS04750 -AKW53_RS00145 BKB95_RS03450 -AKW53_RS00145 CBP48_RS04830 -AKW53_RS00145 7619126 -AKW53_RS00145 SW2_RS03405 -AKW53_RS00145 L1224_RS03380 -AKW53_RS00145 ECS102511_RS03395 -AKW53_RS00145 L1440_RS03380 -AKW53_RS00145 BKB96_RS03440 -AKW53_RS00145 BKB99_RS03435 -AKW53_RS00145 CBP42_RS04835 -AKW53_RS00145 L2BUCH2_RS03380 -AKW53_RS00145 BKB92_RS03430 -AKW53_RS00145 CTB_RS03435 -AKW53_RS00145 SOTONIA3_RS03415 -AKW53_RS00145 E150_RS03405 -AKW53_RS00145 CTO_RS03430 -AKW53_RS00145 BBV13_RS03435 -AKW53_RS00145 BW688_RS04825 -AKW53_RS00145 FCS84708_RS03395 -AKW53_RS00145 L2BLST_RS03380 -AKW53_RS00145 CBP44_RS04830 -AKW53_RS00145 120094 -AKW53_RS00145 BBV16_RS03445 -AKW53_RS00145 AQ199_RS04095 -AKW53_RS00145 AQ244_RS04515 -AKW53_RS00145 BKB93_RS03435 -AKW53_RS00145 G9768_RS03395 -AKW53_RS00145 gnl|Prokka|PADJNBJD_00668 -AKW53_RS00145 L3404_RS03375 -AKW53_RS00145 BKC02_RS03430 -AKW53_RS00145 NILJEPDF_00669 -AKW53_RS00145 LJHENM_03360 -AKW53_RS00145 AOT15_RS04195 -AKW53_RS00145 AP288_RS01765 -AKW53_RS00145 AQ193_RS00590 -AKW53_RS00145 JIEJKO_03365 -AKW53_RS00145 BKC01_RS03430 -AKW53_RS00145 QSDFRQ_00669 -AKW53_RS00145 CTRC943_RS03380 -AKW53_RS00145 BKC03_RS03430 -AKW53_RS00145 CTJTET1_RS03415 -AKW53_RS00145 KW39_RS03415 -AKW53_RS00145 DU10_RS03445 -AKW53_RS00145 SOTONK1_RS03395 -AKW53_RS00145 ECS88FINAL_RS0103470 -AKW53_RS00145 IaCS19096_RS03390 -AKW53_RS00145 C15_RS0103465 -AKW53_RS00145 A5291_RS03440 -AKW53_RS00145 O169_RS03410 -AKW53_RS00145 DU13_RS03445 -AKW53_RS00515 AKW53_RS00515 -AKW53_RS00515 BKC03_RS03810 -AKW53_RS00515 CTJTET1_RS03795 -AKW53_RS00515 KW39_RS03790 -AKW53_RS00515 DU10_RS03825 -AKW53_RS00515 CBP48_RS00380 -AKW53_RS00515 A5291_RS03820 -AKW53_RS00515 SOTONK1_RS03775 -AKW53_RS00515 IaCS19096_RS03770 -AKW53_RS00515 DU13_RS03825 -AKW53_RS00515 C15_RS0103880 -AKW53_RS00515 ECS88FINAL_RS0103880 -AKW53_RS00515 O169_RS03785 -AKW53_RS00515 KW36_RS03775 -AKW53_RS00515 BKB95_RS03830 -AKW53_RS00515 CBP42_RS00380 -AKW53_RS00515 SW2_RS03780 -AKW53_RS00515 CTL2C_RS00375 -AKW53_RS00515 L1224_RS03755 -AKW53_RS00515 ECS102511_RS03770 -AKW53_RS00515 BKB96_RS03815 -AKW53_RS00515 BKB99_RS03810 -AKW53_RS00515 L1440_RS03755 -AKW53_RS00515 AQ244_RS04135 -AKW53_RS00515 CBP44_RS00380 -AKW53_RS00515 L2BUCH2_RS03755 -AKW53_RS00515 BKB92_RS03810 -AKW53_RS00515 CTB_RS03815 -AKW53_RS00515 SOTONIA3_RS03795 -AKW53_RS00515 E150_RS03780 -AKW53_RS00515 CTO_RS03810 -AKW53_RS00515 AQ193_RS00215 -AKW53_RS00515 BBV13_RS03815 -AKW53_RS00515 FCS84708_RS03770 -AKW53_RS00515 BBV16_RS03825 -AKW53_RS00515 L2BLST_RS03755 -AKW53_RS00515 7618252 -AKW53_RS00515 119757 -AKW53_RS00515 BW688_RS00380 -AKW53_RS00515 AQ199_RS04470 -AKW53_RS00515 BKB93_RS03815 -AKW53_RS00515 G9768_RS03775 -AKW53_RS00515 gnl|Prokka|PADJNBJD_00743 -AKW53_RS00515 L3404_RS03750 -AKW53_RS00515 BKC02_RS03810 -AKW53_RS00515 NILJEPDF_00744 -AKW53_RS00515 LJHENM_03745 -AKW53_RS00515 AOT15_RS04575 -AKW53_RS00515 AP288_RS02145 -AKW53_RS00515 JIEJKO_03745 -AKW53_RS00515 BKC01_RS03815 -AKW53_RS00515 QSDFRQ_00744 -AKW53_RS00515 CTRC943_RS03760 -AKW53_RS00875 AKW53_RS00875 -AKW53_RS00875 BKC01_RS04200 -AKW53_RS00875 CTRC943_RS04145 -AKW53_RS00875 AOT15_RS01745 -AKW53_RS00875 CTJTET1_RS04335 -AKW53_RS00875 KW39_RS04175 -AKW53_RS00875 BKC03_RS04195 -AKW53_RS00875 CBP48_RS00765 -AKW53_RS00875 A5291_RS04200 -AKW53_RS00875 ECS88FINAL_RS0104245 -AKW53_RS00875 DU10_RS04210 -AKW53_RS00875 SOTONK1_RS04160 -AKW53_RS00875 IaCS19096_RS04155 -AKW53_RS00875 DU13_RS04210 -AKW53_RS00875 C15_RS0104270 -AKW53_RS00875 O169_RS04170 -AKW53_RS00875 KW36_RS04160 -AKW53_RS00875 BKB95_RS04215 -AKW53_RS00875 CBP42_RS00765 -AKW53_RS00875 CTL2C_RS00760 -AKW53_RS00875 L1224_RS04140 -AKW53_RS00875 BKB96_RS04200 -AKW53_RS00875 SW2_RS04165 -AKW53_RS00875 L1440_RS04135 -AKW53_RS00875 ECS102511_RS04155 -AKW53_RS00875 BKB99_RS04195 -AKW53_RS00875 CBP44_RS00765 -AKW53_RS00875 CTB_RS04195 -AKW53_RS00875 L2BUCH2_RS04140 -AKW53_RS00875 AQ193_RS04615 -AKW53_RS00875 AQ244_RS02605 -AKW53_RS00875 BKB92_RS04195 -AKW53_RS00875 SOTONIA3_RS04180 -AKW53_RS00875 CTO_RS04190 -AKW53_RS00875 AP288_RS02460 -AKW53_RS00875 E150_RS04165 -AKW53_RS00875 BBV13_RS04200 -AKW53_RS00875 119806 -AKW53_RS00875 FCS84708_RS04155 -AKW53_RS00875 AQ199_RS00085 -AKW53_RS00875 7618284 -AKW53_RS00875 L2BLST_RS04140 -AKW53_RS00875 BBV16_RS04210 -AKW53_RS00875 BW688_RS00765 -AKW53_RS00875 gnl|Prokka|PADJNBJD_00817 -AKW53_RS00875 BKB93_RS04200 -AKW53_RS00875 NILJEPDF_00818 -AKW53_RS00875 G9768_RS04160 -AKW53_RS00875 L3404_RS04135 -AKW53_RS00875 LJHENM_04115 -AKW53_RS00875 JIEJKO_04115 -AKW53_RS00875 BKC02_RS04195 -AKW53_RS00875 QSDFRQ_00818 -AKW53_RS01205 AKW53_RS01205 -AKW53_RS01205 BKC01_RS04530 -AKW53_RS01205 CTRC943_RS04465 -AKW53_RS01205 AOT15_RS02060 -AKW53_RS01205 CTJTET1_RS04650 -AKW53_RS01205 KW39_RS04500 -AKW53_RS01205 BKC03_RS04525 -AKW53_RS01205 CBP48_RS01100 -AKW53_RS01205 A5291_RS04515 -AKW53_RS01205 SOTONK1_RS04480 -AKW53_RS01205 ECS88FINAL_RS0104580 -AKW53_RS01205 IaCS19096_RS04475 -AKW53_RS01205 C15_RS0104600 -AKW53_RS01205 DU10_RS04545 -AKW53_RS01205 O169_RS04500 -AKW53_RS01205 KW36_RS04480 -AKW53_RS01205 DU13_RS04545 -AKW53_RS01205 BKB95_RS04545 -AKW53_RS01205 CBP42_RS01100 -AKW53_RS01205 CTL2C_RS01080 -AKW53_RS01205 L1224_RS04460 -AKW53_RS01205 BKB96_RS04530 -AKW53_RS01205 L1440_RS04455 -AKW53_RS01205 BKB99_RS04525 -AKW53_RS01205 SW2_RS04490 -AKW53_RS01205 ECS102511_RS04485 -AKW53_RS01205 CBP44_RS01100 -AKW53_RS01205 CTB_RS04510 -AKW53_RS01205 L2BUCH2_RS04460 -AKW53_RS01205 AQ193_RS04285 -AKW53_RS01205 SOTONIA3_RS04495 -AKW53_RS01205 CTO_RS04505 -AKW53_RS01205 AQ244_RS02270 -AKW53_RS01205 BBV13_RS04520 -AKW53_RS01205 BKB92_RS04530 -AKW53_RS01205 AP288_RS02790 -AKW53_RS01205 BBV16_RS04525 -AKW53_RS01205 E150_RS04495 -AKW53_RS01205 L2BLST_RS04460 -AKW53_RS01205 gnl|Prokka|PADJNBJD_00879 -AKW53_RS01205 FCS84708_RS04480 -AKW53_RS01205 AQ199_RS00415 -AKW53_RS01205 BW688_RS01100 -AKW53_RS01205 119870 -AKW53_RS01205 NILJEPDF_00880 -AKW53_RS01205 7618326 -AKW53_RS01205 G9768_RS04480 -AKW53_RS01205 LJHENM_04430 -AKW53_RS01205 L3404_RS04455 -AKW53_RS01205 JIEJKO_04425 -AKW53_RS01205 QSDFRQ_00880 -AKW53_RS01205 BKB93_RS04535 -AKW53_RS01205 BKC02_RS04525 -AKW53_RS01370 AKW53_RS01370 -AKW53_RS01370 BKC01_RS04705 -AKW53_RS01370 AOT15_RS02225 -AKW53_RS01370 CTJTET1_RS04815 -AKW53_RS01370 KW39_RS04665 -AKW53_RS01370 BKC03_RS04700 -AKW53_RS01370 A5291_RS04680 -AKW53_RS01370 ECS88FINAL_RS0104755 -AKW53_RS01370 IaCS19096_RS04640 -AKW53_RS01370 C15_RS0104775 -AKW53_RS01370 DU10_RS04720 -AKW53_RS01370 O169_RS04665 -AKW53_RS01370 KW36_RS04645 -AKW53_RS01370 DU13_RS04720 -AKW53_RS01370 BKB95_RS04720 -AKW53_RS01370 BKB96_RS04705 -AKW53_RS01370 BKB99_RS04700 -AKW53_RS01370 SW2_RS04655 -AKW53_RS01370 ECS102511_RS04650 -AKW53_RS01370 CTB_RS04675 -AKW53_RS01370 AQ193_RS04120 -AKW53_RS01370 SOTONIA3_RS04660 -AKW53_RS01370 CTO_RS04670 -AKW53_RS01370 AP288_RS02955 -AKW53_RS01370 BBV13_RS04690 -AKW53_RS01370 BKB92_RS04705 -AKW53_RS01370 AQ244_RS02105 -AKW53_RS01370 BBV16_RS04695 -AKW53_RS01370 E150_RS04660 -AKW53_RS01370 gnl|Prokka|PADJNBJD_00912 -AKW53_RS01370 FCS84708_RS04645 -AKW53_RS01370 AQ199_RS00580 -AKW53_RS01370 NILJEPDF_00913 -AKW53_RS01370 119896 -AKW53_RS01370 JIEJKO_04590 -AKW53_RS01370 QSDFRQ_00913 -AKW53_RS01370 G9768_RS04645 -AKW53_RS01370 LJHENM_04600 -AKW53_RS01370 BKB93_RS04710 -AKW53_RS01370 BKC02_RS04700 -AKW53_RS01370 A5291_RS04970 F -AKW53_RS01370 CTB_RS04910 F -AKW53_RS01370 CTO_RS04950 F -AKW53_RS01370 BBV13_RS04915 F -AKW53_RS01370 BBV16_RS04920 F -AOT15_RS01060 AOT15_RS01060 -AOT15_RS01060 G9768_RS01310 -AOT15_RS01060 BKC02_RS01305 -AOT15_RS01060 BBV16_RS01335 -AOT15_RS01060 L3404_RS01285 -AOT15_RS01060 AKW53_RS02795 -AOT15_RS01060 BKC01_RS01305 -AOT15_RS01060 gnl|Prokka|PADJNBJD_00256 -AOT15_RS01060 DU10_RS01315 -AOT15_RS01060 NILJEPDF_00256 -AOT15_RS01060 LJHENM_01285 -AOT15_RS01060 BKC03_RS01305 -AOT15_RS01060 CTRC943_RS01290 -AOT15_RS01060 CTJTET1_RS01320 -AOT15_RS01060 KW39_RS01310 -AOT15_RS01060 JIEJKO_01285 -AOT15_RS01060 119411 -AOT15_RS01060 C15_RS0101340 -AOT15_RS01060 SOTONK1_RS01305 -AOT15_RS01060 ECS88FINAL_RS0101325 -AOT15_RS01060 QSDFRQ_00256 -AOT15_RS01060 A5291_RS01330 -AOT15_RS01060 O169_RS01310 -AOT15_RS01060 IaCS19096_RS01305 -AOT15_RS01060 DU13_RS01315 -AOT15_RS01060 AQ193_RS02690 -AOT15_RS01060 7618485 -AOT15_RS01060 SW2_RS01300 -AOT15_RS01060 BKB95_RS01320 -AOT15_RS01060 CBP48_RS02695 -AOT15_RS01060 KW36_RS01305 -AOT15_RS01060 ECS102511_RS01300 -AOT15_RS01060 BKB96_RS01305 -AOT15_RS01060 CTL2C_RS02655 -AOT15_RS01060 BKB99_RS01305 -AOT15_RS01060 L1224_RS01285 -AOT15_RS01060 L1440_RS01285 -AOT15_RS01060 AQ244_RS03485 -AOT15_RS01060 BKB92_RS01305 -AOT15_RS01060 CBP42_RS02695 -AOT15_RS01060 SOTONIA3_RS01320 -AOT15_RS01060 CTB_RS01330 -AOT15_RS01060 E150_RS01300 -AOT15_RS01060 L2BUCH2_RS01290 -AOT15_RS01060 CTO_RS01330 -AOT15_RS01060 FCS84708_RS01300 -AOT15_RS01060 AP288_RS04370 -AOT15_RS01060 BKB93_RS01305 -AOT15_RS01060 CBP44_RS02700 -AOT15_RS01060 AQ199_RS01995 -AOT15_RS01060 L2BLST_RS01290 -AOT15_RS01060 BBV13_RS01335 -AOT15_RS01060 BW688_RS02700 -AOT15_RS01230 AOT15_RS01230 -AOT15_RS01230 BBV13_RS01165 -AOT15_RS01230 G9768_RS01140 -AOT15_RS01230 BKC02_RS01135 -AOT15_RS01230 L3404_RS01115 -AOT15_RS01230 AKW53_RS02625 -AOT15_RS01230 BBV16_RS01165 -AOT15_RS01230 BKC01_RS01135 -AOT15_RS01230 119385 -AOT15_RS01230 DU10_RS01145 -AOT15_RS01230 gnl|Prokka|PADJNBJD_00223 -AOT15_RS01230 BKC03_RS01135 -AOT15_RS01230 NILJEPDF_00223 -AOT15_RS01230 LJHENM_01120 -AOT15_RS01230 CTRC943_RS01120 -AOT15_RS01230 CTJTET1_RS01150 -AOT15_RS01230 C15_RS0101170 -AOT15_RS01230 SOTONK1_RS01135 -AOT15_RS01230 ECS88FINAL_RS0101155 -AOT15_RS01230 KW39_RS01140 -AOT15_RS01230 JIEJKO_01120 -AOT15_RS01230 A5291_RS01160 -AOT15_RS01230 IaCS19096_RS01135 -AOT15_RS01230 7618468 -AOT15_RS01230 QSDFRQ_00223 -AOT15_RS01230 O169_RS01140 -AOT15_RS01230 DU13_RS01145 -AOT15_RS01230 AQ193_RS02860 -AOT15_RS01230 SW2_RS01130 -AOT15_RS01230 BKB95_RS01150 -AOT15_RS01230 CBP48_RS02525 -AOT15_RS01230 KW36_RS01135 -AOT15_RS01230 ECS102511_RS01130 -AOT15_RS01230 BKB96_RS01135 -AOT15_RS01230 CTL2C_RS02485 -AOT15_RS01230 BKB99_RS01135 -AOT15_RS01230 L1224_RS01115 -AOT15_RS01230 L1440_RS01115 -AOT15_RS01230 AQ244_RS03315 -AOT15_RS01230 BKB92_RS01135 -AOT15_RS01230 CBP42_RS02525 -AOT15_RS01230 SOTONIA3_RS01150 -AOT15_RS01230 E150_RS01130 -AOT15_RS01230 CTB_RS01160 -AOT15_RS01230 L2BUCH2_RS01120 -AOT15_RS01230 CTO_RS01160 -AOT15_RS01230 FCS84708_RS01130 -AOT15_RS01230 AP288_RS04200 -AOT15_RS01230 BKB93_RS01135 -AOT15_RS01230 CBP44_RS02530 -AOT15_RS01230 AQ199_RS01825 -AOT15_RS01230 L2BLST_RS01120 -AOT15_RS01230 BW688_RS02530 -AOT15_RS01400 AOT15_RS01400 -AOT15_RS01400 BBV13_RS00995 -AOT15_RS01400 G9768_RS00970 -AOT15_RS01400 BKC02_RS00965 -AOT15_RS01400 L3404_RS00945 -AOT15_RS01400 AKW53_RS02455 -AOT15_RS01400 119358 -AOT15_RS01400 BBV16_RS00995 -AOT15_RS01400 BKC01_RS00965 -AOT15_RS01400 DU10_RS00975 -AOT15_RS01400 gnl|Prokka|PADJNBJD_00189 -AOT15_RS01400 BKC03_RS00965 -AOT15_RS01400 NILJEPDF_00189 -AOT15_RS01400 LJHENM_00950 -AOT15_RS01400 CTRC943_RS00950 -AOT15_RS01400 CTJTET1_RS00980 -AOT15_RS01400 C15_RS0101000 -AOT15_RS01400 SOTONK1_RS00965 -AOT15_RS01400 ECS88FINAL_RS0100985 -AOT15_RS01400 KW39_RS00970 -AOT15_RS01400 JIEJKO_00950 -AOT15_RS01400 7618451 -AOT15_RS01400 A5291_RS00990 -AOT15_RS01400 IaCS19096_RS00965 -AOT15_RS01400 QSDFRQ_00189 -AOT15_RS01400 O169_RS00970 -AOT15_RS01400 DU13_RS00975 -AOT15_RS01400 AQ193_RS03030 -AOT15_RS01400 SW2_RS00960 -AOT15_RS01400 BKB95_RS00980 -AOT15_RS01400 CBP48_RS02355 -AOT15_RS01400 KW36_RS00965 -AOT15_RS01400 ECS102511_RS00960 -AOT15_RS01400 BKB96_RS00965 -AOT15_RS01400 CTL2C_RS02315 -AOT15_RS01400 BKB99_RS00965 -AOT15_RS01400 L1224_RS00945 -AOT15_RS01400 L1440_RS00945 -AOT15_RS01400 AQ244_RS03145 -AOT15_RS01400 BKB92_RS00965 -AOT15_RS01400 CBP42_RS02355 -AOT15_RS01400 SOTONIA3_RS00980 -AOT15_RS01400 E150_RS00960 -AOT15_RS01400 CTB_RS00990 -AOT15_RS01400 L2BUCH2_RS00950 -AOT15_RS01400 CTO_RS00990 -AOT15_RS01400 FCS84708_RS00960 -AOT15_RS01400 AP288_RS04030 -AOT15_RS01400 BKB93_RS00965 -AOT15_RS01400 CBP44_RS02360 -AOT15_RS01400 AQ199_RS01655 -AOT15_RS01400 L2BLST_RS00950 -AOT15_RS01400 BW688_RS02360 -AP288_RS04870 AP288_RS04870 -AP288_RS04870 L1224_RS04770 -AP288_RS04870 ECS102511_RS04780 -AP288_RS04870 AOT15_RS03415 -AP288_RS04870 L2BUCH2_RS04770 -AP288_RS04870 SOTONIA3_RS04805 -AP288_RS04870 BBV13_RS04815 -AP288_RS04870 L2BLST_RS04770 -AP288_RS04870 BBV16_RS04820 -AP288_RS04870 FCS84708_RS04775 -AP288_RS04870 AQ193_RS04760 -AP288_RS04870 NILJEPDF_00938 -AP288_RS04870 CTO_RS04825 -AP288_RS04870 L3404_RS04765 -AP288_RS04870 QSDFRQ_00938 -AP288_RS04870 gnl|Prokka|PADJNBJD_00942 -AP288_RS04870 AQ199_RS04825 -AP288_RS04870 A5291_RS04820 -AP288_RS04870 SOTONK1_RS04790 -AP288_RS04870 IaCS19096_RS04775 -AQ193_RS00285 AQ193_RS00285 -AQ193_RS00285 CBP44_RS00310 -AQ193_RS00285 L2BUCH2_RS03685 -AQ193_RS00285 BKB92_RS03740 -AQ193_RS00285 CTB_RS03745 -AQ193_RS00285 SOTONIA3_RS03725 -AQ193_RS00285 E150_RS03710 -AQ193_RS00285 CTO_RS03740 -AQ193_RS00285 BBV13_RS03745 -AQ193_RS00285 FCS84708_RS03700 -AQ193_RS00285 BBV16_RS03755 -AQ193_RS00285 L2BLST_RS03685 -AQ193_RS00285 119741 -AQ193_RS00285 BW688_RS00310 -AQ193_RS00285 7618242 -AQ193_RS00285 AQ199_RS04400 -AQ193_RS00285 BKB93_RS03745 -AQ193_RS00285 G9768_RS03705 -AQ193_RS00285 gnl|Prokka|PADJNBJD_00729 -AQ193_RS00285 L3404_RS03680 -AQ193_RS00285 BKC02_RS03740 -AQ193_RS00285 NILJEPDF_00730 -AQ193_RS00285 LJHENM_03675 -AQ193_RS00285 AOT15_RS04505 -AQ193_RS00285 AP288_RS02075 -AQ193_RS00285 JIEJKO_03675 -AQ193_RS00285 BKC01_RS03745 -AQ193_RS00285 QSDFRQ_00730 -AQ193_RS00285 CTRC943_RS03690 -AQ193_RS00285 AKW53_RS00445 -AQ193_RS00285 BKC03_RS03740 -AQ193_RS00285 CTJTET1_RS03725 -AQ193_RS00285 KW39_RS03720 -AQ193_RS00285 DU10_RS03755 -AQ193_RS00285 CBP48_RS00310 -AQ193_RS00285 A5291_RS03750 -AQ193_RS00285 SOTONK1_RS03705 -AQ193_RS00285 IaCS19096_RS03700 -AQ193_RS00285 DU13_RS03755 -AQ193_RS00285 C15_RS0103810 -AQ193_RS00285 ECS88FINAL_RS0103810 -AQ193_RS00285 O169_RS03715 -AQ193_RS00285 KW36_RS03705 -AQ193_RS00285 BKB95_RS03760 -AQ193_RS00285 CBP42_RS00310 -AQ193_RS00285 SW2_RS03710 -AQ193_RS00285 CTL2C_RS00305 -AQ193_RS00285 L1224_RS03685 -AQ193_RS00285 ECS102511_RS03700 -AQ193_RS00285 AQ244_RS04205 -AQ193_RS00285 BKB96_RS03745 -AQ193_RS00285 BKB99_RS03740 -AQ193_RS00285 L1440_RS03685 -AQ193_RS00465 AQ193_RS00465 -AQ193_RS00465 CBP44_RS00125 -AQ193_RS00465 L2BUCH2_RS03505 -AQ193_RS00465 BKB92_RS03555 -AQ193_RS00465 CTB_RS03565 -AQ193_RS00465 SOTONIA3_RS03545 -AQ193_RS00465 E150_RS03530 -AQ193_RS00465 CTO_RS03560 -AQ193_RS00465 BBV13_RS03565 -AQ193_RS00465 FCS84708_RS03520 -AQ193_RS00465 L2BLST_RS03505 -AQ193_RS00465 BBV16_RS03575 -AQ193_RS00465 BW688_RS00125 -AQ193_RS00465 7618669 -AQ193_RS00465 AQ199_RS04220 -AQ193_RS00465 BKB93_RS03560 -AQ193_RS00465 120077 -AQ193_RS00465 G9768_RS03525 -AQ193_RS00465 gnl|Prokka|PADJNBJD_00693 -AQ193_RS00465 L3404_RS03500 -AQ193_RS00465 BKC02_RS03555 -AQ193_RS00465 NILJEPDF_00694 -AQ193_RS00465 LJHENM_03485 -AQ193_RS00465 AOT15_RS04325 -AQ193_RS00465 AP288_RS01890 -AQ193_RS00465 JIEJKO_03490 -AQ193_RS00465 BKC01_RS03555 -AQ193_RS00465 QSDFRQ_00694 -AQ193_RS00465 CTRC943_RS03510 -AQ193_RS00465 BKC03_RS03555 -AQ193_RS00465 CBP48_RS00125 -AQ193_RS00465 CTJTET1_RS03545 -AQ193_RS00465 KW39_RS03540 -AQ193_RS00465 DU10_RS03570 -AQ193_RS00465 SOTONK1_RS03525 -AQ193_RS00465 ECS88FINAL_RS0103610 -AQ193_RS00465 IaCS19096_RS03520 -AQ193_RS00465 C15_RS0103600 -AQ193_RS00465 A5291_RS03570 -AQ193_RS00465 O169_RS03535 -AQ193_RS00465 DU13_RS03570 -AQ193_RS00465 KW36_RS03525 -AQ193_RS00465 AKW53_RS00270 -AQ193_RS00465 AQ244_RS04385 -AQ193_RS00465 BKB95_RS03575 -AQ193_RS00465 CBP42_RS00125 -AQ193_RS00465 SW2_RS03530 -AQ193_RS00465 CTL2C_RS00125 -AQ193_RS00465 L1224_RS03505 -AQ193_RS00465 ECS102511_RS03520 -AQ193_RS00465 L1440_RS03505 -AQ193_RS00465 BKB96_RS03565 -AQ193_RS00465 BKB99_RS03560 -AQ193_RS00635 AQ193_RS00635 -AQ193_RS00635 CBP42_RS04790 -AQ193_RS00635 L2BUCH2_RS03335 -AQ193_RS00635 CTB_RS03390 -AQ193_RS00635 BKB92_RS03385 -AQ193_RS00635 SOTONIA3_RS03370 -AQ193_RS00635 E150_RS03360 -AQ193_RS00635 CTO_RS03385 -AQ193_RS00635 BBV13_RS03390 -AQ193_RS00635 BW688_RS04780 -AQ193_RS00635 FCS84708_RS03350 -AQ193_RS00635 L2BLST_RS03335 -AQ193_RS00635 CBP44_RS04785 -AQ193_RS00635 120102 -AQ193_RS00635 BBV16_RS03400 -AQ193_RS00635 AQ199_RS04050 -AQ193_RS00635 BKB93_RS03390 -AQ193_RS00635 G9768_RS03350 -AQ193_RS00635 gnl|Prokka|PADJNBJD_00659 -AQ193_RS00635 L3404_RS03330 -AQ193_RS00635 BKC02_RS03385 -AQ193_RS00635 NILJEPDF_00660 -AQ193_RS00635 LJHENM_03315 -AQ193_RS00635 AOT15_RS04150 -AQ193_RS00635 AP288_RS01720 -AQ193_RS00635 JIEJKO_03320 -AQ193_RS00635 BKC01_RS03385 -AQ193_RS00635 QSDFRQ_00660 -AQ193_RS00635 CTRC943_RS03335 -AQ193_RS00635 BKC03_RS03385 -AQ193_RS00635 CTJTET1_RS03370 -AQ193_RS00635 KW39_RS03370 -AQ193_RS00635 DU10_RS03400 -AQ193_RS00635 SOTONK1_RS03350 -AQ193_RS00635 ECS88FINAL_RS0103420 -AQ193_RS00635 IaCS19096_RS03345 -AQ193_RS00635 C15_RS0103415 -AQ193_RS00635 A5291_RS03395 -AQ193_RS00635 O169_RS03365 -AQ193_RS00635 DU13_RS03400 -AQ193_RS00635 AKW53_RS00100 -AQ193_RS00635 KW36_RS03350 -AQ193_RS00635 AQ244_RS04560 -AQ193_RS00635 CTL2C_RS04705 -AQ193_RS00635 BKB95_RS03405 -AQ193_RS00635 CBP48_RS04785 -AQ193_RS00635 7619121 -AQ193_RS00635 SW2_RS03360 -AQ193_RS00635 L1224_RS03335 -AQ193_RS00635 ECS102511_RS03350 -AQ193_RS00635 L1440_RS03335 -AQ193_RS00635 BKB96_RS03395 -AQ193_RS00635 BKB99_RS03390 -AQ193_RS00795 AQ193_RS00795 -AQ193_RS00795 CBP42_RS04625 -AQ193_RS00795 L2BUCH2_RS03165 -AQ193_RS00795 BKB92_RS03220 -AQ193_RS00795 CTB_RS03230 -AQ193_RS00795 E150_RS03195 -AQ193_RS00795 SOTONIA3_RS03210 -AQ193_RS00795 BW688_RS04615 -AQ193_RS00795 CTO_RS03225 -AQ193_RS00795 FCS84708_RS03190 -AQ193_RS00795 L2BLST_RS03165 -AQ193_RS00795 BBV13_RS03230 -AQ193_RS00795 CBP44_RS04620 -AQ193_RS00795 120132 -AQ193_RS00795 AQ199_RS03890 -AQ193_RS00795 BKB93_RS03225 -AQ193_RS00795 BBV16_RS03240 -AQ193_RS00795 G9768_RS03190 -AQ193_RS00795 L3404_RS03160 -AQ193_RS00795 gnl|Prokka|PADJNBJD_00627 -AQ193_RS00795 AP288_RS01560 -AQ193_RS00795 BKC02_RS03220 -AQ193_RS00795 NILJEPDF_00628 -AQ193_RS00795 LJHENM_03155 -AQ193_RS00795 AOT15_RS03990 -AQ193_RS00795 CTRC943_RS03165 -AQ193_RS00795 JIEJKO_03160 -AQ193_RS00795 BKC01_RS03220 -AQ193_RS00795 QSDFRQ_00628 -AQ193_RS00795 KW39_RS03205 -AQ193_RS00795 BKC03_RS03220 -AQ193_RS00795 CTJTET1_RS03205 -AQ193_RS00795 ECS88FINAL_RS0103255 -AQ193_RS00795 DU10_RS03235 -AQ193_RS00795 SOTONK1_RS03190 -AQ193_RS00795 O169_RS03200 -AQ193_RS00795 IaCS19096_RS03185 -AQ193_RS00795 C15_RS0103255 -AQ193_RS00795 A5291_RS03230 -AQ193_RS00795 AQ244_RS04725 -AQ193_RS00795 DU13_RS03230 -AQ193_RS00795 CTL2C_RS04535 -AQ193_RS00795 AKW53_RS04415 -AQ193_RS00795 CBP48_RS04620 -AQ193_RS00795 7619102 -AQ193_RS00795 SW2_RS03195 -AQ193_RS00795 L1224_RS03165 -AQ193_RS00795 KW36_RS03190 -AQ193_RS00795 ECS102511_RS03190 -AQ193_RS00795 L1440_RS03165 -AQ193_RS00795 BKB95_RS03235 -AQ193_RS00795 BKB96_RS03230 -AQ193_RS00795 BKB99_RS03225 -AQ193_RS01130 AQ193_RS01130 -AQ193_RS01130 CBP42_RS04290 -AQ193_RS01130 120178 -AQ193_RS01130 L2BUCH2_RS02835 -AQ193_RS01130 SOTONIA3_RS02870 -AQ193_RS01130 BKB92_RS02885 -AQ193_RS01130 CTB_RS02890 -AQ193_RS01130 E150_RS02860 -AQ193_RS01130 BW688_RS04280 -AQ193_RS01130 CTO_RS02890 -AQ193_RS01130 FCS84708_RS02850 -AQ193_RS01130 L2BLST_RS02835 -AQ193_RS01130 BBV13_RS02895 -AQ193_RS01130 CBP44_RS04285 -AQ193_RS01130 AQ199_RS03550 -AQ193_RS01130 BKB93_RS02890 -AQ193_RS01130 BBV16_RS02905 -AQ193_RS01130 G9768_RS02855 -AQ193_RS01130 L3404_RS02830 -AQ193_RS01130 BKC02_RS02880 -AQ193_RS01130 gnl|Prokka|PADJNBJD_00563 -AQ193_RS01130 NILJEPDF_00563 -AQ193_RS01130 BKC01_RS02880 -AQ193_RS01130 LJHENM_02835 -AQ193_RS01130 CTRC943_RS02835 -AQ193_RS01130 AOT15_RS01655 -AQ193_RS01130 QSDFRQ_00563 -AQ193_RS01130 AP288_RS00225 -AQ193_RS01130 JIEJKO_02840 -AQ193_RS01130 SOTONK1_RS02855 -AQ193_RS01130 CTJTET1_RS02865 -AQ193_RS01130 BKC03_RS02880 -AQ193_RS01130 KW39_RS02865 -AQ193_RS01130 C15_RS0102925 -AQ193_RS01130 ECS88FINAL_RS0102920 -AQ193_RS01130 IaCS19096_RS02850 -AQ193_RS01130 DU10_RS02900 -AQ193_RS01130 O169_RS02865 -AQ193_RS01130 A5291_RS02890 -AQ193_RS01130 AQ244_RS00255 -AQ193_RS01130 DU13_RS02895 -AQ193_RS01130 CBP48_RS04280 -AQ193_RS01130 CTL2C_RS04205 -AQ193_RS01130 KW36_RS02850 -AQ193_RS01130 AKW53_RS04080 -AQ193_RS01130 BKB95_RS02895 -AQ193_RS01130 BKB96_RS02885 -AQ193_RS01130 BKB99_RS02880 -AQ193_RS01130 7619074 -AQ193_RS01130 SW2_RS02860 -AQ193_RS01130 L1224_RS02835 -AQ193_RS01130 ECS102511_RS02855 -AQ193_RS01130 L1440_RS02835 -AQ193_RS01465 AQ193_RS01465 -AQ193_RS01465 CBP42_RS03950 -AQ193_RS01465 L2BUCH2_RS02500 -AQ193_RS01465 CTB_RS02555 -AQ193_RS01465 SOTONIA3_RS02535 -AQ193_RS01465 AOT15_RS03575 -AQ193_RS01465 BKB92_RS02545 -AQ193_RS01465 E150_RS02525 -AQ193_RS01465 CTO_RS02555 -AQ193_RS01465 BW688_RS03940 -AQ193_RS01465 FCS84708_RS02515 -AQ193_RS01465 BBV13_RS02560 -AQ193_RS01465 L2BLST_RS02500 -AQ193_RS01465 CBP44_RS03945 -AQ193_RS01465 AQ199_RS03215 -AQ193_RS01465 BBV16_RS02570 -AQ193_RS01465 BKB93_RS02550 -AQ193_RS01465 G9768_RS02520 -AQ193_RS01465 L3404_RS02495 -AQ193_RS01465 AKW53_RS04695 -AQ193_RS01465 BKC02_RS02540 -AQ193_RS01465 gnl|Prokka|PADJNBJD_00497 -AQ193_RS01465 BKC01_RS02540 -AQ193_RS01465 NILJEPDF_00497 -AQ193_RS01465 LJHENM_02505 -AQ193_RS01465 CTRC943_RS02500 -AQ193_RS01465 AP288_RS00560 -AQ193_RS01465 JIEJKO_02505 -AQ193_RS01465 QSDFRQ_00497 -AQ193_RS01465 SOTONK1_RS02520 -AQ193_RS01465 CTJTET1_RS02530 -AQ193_RS01465 BKC03_RS02540 -AQ193_RS01465 KW39_RS02530 -AQ193_RS01465 C15_RS0102580 -AQ193_RS01465 ECS88FINAL_RS0102575 -AQ193_RS01465 IaCS19096_RS02515 -AQ193_RS01465 DU10_RS02560 -AQ193_RS01465 A5291_RS02555 -AQ193_RS01465 O169_RS02530 -AQ193_RS01465 AQ244_RS00590 -AQ193_RS01465 DU13_RS02555 -AQ193_RS01465 7619019 -AQ193_RS01465 BKB96_RS02545 -AQ193_RS01465 BKB99_RS02540 -AQ193_RS01465 CBP48_RS03940 -AQ193_RS01465 CTL2C_RS03870 -AQ193_RS01465 KW36_RS02515 -AQ193_RS01465 BKB95_RS02555 -AQ193_RS01465 SW2_RS02525 -AQ193_RS01465 L1224_RS02500 -AQ193_RS01465 ECS102511_RS02520 -AQ193_RS01465 L1440_RS02500 -AQ193_RS01465 120265 -AQ193_RS02295 AQ193_RS02295 -AQ193_RS02295 CBP42_RS03090 -AQ193_RS02295 SOTONIA3_RS01710 -AQ193_RS02295 BKB92_RS01705 -AQ193_RS02295 CTB_RS01725 -AQ193_RS02295 E150_RS01695 -AQ193_RS02295 L2BUCH2_RS01680 -AQ193_RS02295 CTO_RS01720 -AQ193_RS02295 FCS84708_RS01690 -AQ193_RS02295 CBP44_RS03095 -AQ193_RS02295 BKB93_RS01705 -AQ193_RS02295 L2BLST_RS01680 -AQ193_RS02295 AQ199_RS02385 -AQ193_RS02295 BW688_RS03100 -AQ193_RS02295 BBV13_RS01730 -AQ193_RS02295 G9768_RS01700 -AQ193_RS02295 BKC02_RS01700 -AQ193_RS02295 L3404_RS01675 -AQ193_RS02295 AKW53_RS03190 -AQ193_RS02295 BBV16_RS01730 -AQ193_RS02295 BKC01_RS01705 -AQ193_RS02295 gnl|Prokka|PADJNBJD_00334 -AQ193_RS02295 AP288_RS01390 -AQ193_RS02295 NILJEPDF_00334 -AQ193_RS02295 LJHENM_01680 -AQ193_RS02295 CTRC943_RS01680 -AQ193_RS02295 BKC03_RS01700 -AQ193_RS02295 DU10_RS01715 -AQ193_RS02295 CTJTET1_RS01710 -AQ193_RS02295 KW39_RS01700 -AQ193_RS02295 JIEJKO_01680 -AQ193_RS02295 C15_RS0101740 -AQ193_RS02295 SOTONK1_RS01700 -AQ193_RS02295 ECS88FINAL_RS0101720 -AQ193_RS02295 AQ244_RS01420 -AQ193_RS02295 QSDFRQ_00334 -AQ193_RS02295 IaCS19096_RS01695 -AQ193_RS02295 A5291_RS01725 -AQ193_RS02295 O169_RS01705 -AQ193_RS02295 DU13_RS01710 -AQ193_RS02295 120378 -AQ193_RS02295 CBP48_RS03090 -AQ193_RS02295 SW2_RS01690 -AQ193_RS02295 BKB95_RS01715 -AQ193_RS02295 7618950 -AQ193_RS02295 CTL2C_RS03045 -AQ193_RS02295 KW36_RS01695 -AQ193_RS02295 ECS102511_RS01690 -AQ193_RS02295 AOT15_RS02695 -AQ193_RS02295 BKB96_RS01700 -AQ193_RS02295 L1224_RS01675 -AQ193_RS02295 BKB99_RS01700 -AQ193_RS02295 L1440_RS01675 -AQ193_RS05030 AQ193_RS05030 -AQ193_RS05030 AP288_RS05055 -AQ193_RS05030 AQ244_RS05255 -AQ193_RS05030 AQ199_RS04985 -AQ199_RS00795 AQ199_RS00795 -AQ199_RS00795 G9768_RS00100 -AQ199_RS00795 BW688_RS01495 -AQ199_RS00795 L2BLST_RS00100 -AQ199_RS00795 BKC02_RS00105 -AQ199_RS00795 BBV16_RS00105 -AQ199_RS00795 BKC01_RS00105 -AQ199_RS00795 gnl|Prokka|PADJNBJD_00021 -AQ199_RS00795 LJHENM_00105 -AQ199_RS00795 A5291_RS00100 -AQ199_RS00795 SOTONK1_RS00100 -AQ199_RS00795 JIEJKO_00100 -AQ199_RS00795 7618362 -AQ199_RS00795 NILJEPDF_00021 -AQ199_RS00795 L3404_RS00100 -AQ199_RS00795 IaCS19096_RS00100 -AQ199_RS00795 BKC03_RS00105 -AQ199_RS00795 C15_RS0100100 -AQ199_RS00795 AKW53_RS01585 -AQ199_RS00795 QSDFRQ_00021 -AQ199_RS00795 CTJTET1_RS00100 -AQ199_RS00795 AQ193_RS03905 -AQ199_RS00795 DU10_RS00105 -AQ199_RS00795 CTRC943_RS00100 -AQ199_RS00795 O169_RS00100 -AQ199_RS00795 AQ244_RS01890 -AQ199_RS00795 CBP48_RS01495 -AQ199_RS00795 ECS88FINAL_RS0100105 -AQ199_RS00795 DU13_RS00105 -AQ199_RS00795 KW39_RS00100 -AQ199_RS00795 BKB95_RS00105 -AQ199_RS00795 KW36_RS00100 -AQ199_RS00795 SW2_RS00100 -AQ199_RS00795 ECS102511_RS00100 -AQ199_RS00795 CTB_RS00100 -AQ199_RS00795 CTL2C_RS01465 -AQ199_RS00795 CBP42_RS01495 -AQ199_RS00795 L1224_RS00100 -AQ199_RS00795 BKB96_RS00105 -AQ199_RS00795 BKB99_RS00105 -AQ199_RS00795 CTO_RS00100 -AQ199_RS00795 SOTONIA3_RS00100 -AQ199_RS00795 L1440_RS00100 -AQ199_RS00795 BKB92_RS00105 -AQ199_RS00795 119216 -AQ199_RS00795 CBP44_RS01500 -AQ199_RS00795 E150_RS00100 -AQ199_RS00795 AOT15_RS00855 -AQ199_RS00795 L2BUCH2_RS00100 -AQ199_RS00795 BKB93_RS00105 -AQ199_RS00795 FCS84708_RS00100 -AQ199_RS00795 AP288_RS03170 -AQ199_RS00795 BBV13_RS00105 -AQ199_RS01135 AQ199_RS01135 -AQ199_RS01135 BBV13_RS00445 -AQ199_RS01135 L2BLST_RS00440 -AQ199_RS01135 BW688_RS01840 -AQ199_RS01135 G9768_RS00440 -AQ199_RS01135 BKC02_RS00450 -AQ199_RS01135 gnl|Prokka|PADJNBJD_00086 -AQ199_RS01135 LJHENM_00430 -AQ199_RS01135 BBV16_RS00445 -AQ199_RS01135 NILJEPDF_00086 -AQ199_RS01135 A5291_RS00440 -AQ199_RS01135 JIEJKO_00435 -AQ199_RS01135 BKC01_RS00450 -AQ199_RS01135 SOTONK1_RS00440 -AQ199_RS01135 L3404_RS00440 -AQ199_RS01135 AKW53_RS01930 -AQ199_RS01135 QSDFRQ_00086 -AQ199_RS01135 IaCS19096_RS00440 -AQ199_RS01135 AQ244_RS01550 -AQ199_RS01135 BKC03_RS00450 -AQ199_RS01135 DU10_RS00450 -AQ199_RS01135 C15_RS0100445 -AQ199_RS01135 AQ193_RS03555 -AQ199_RS01135 7618816 -AQ199_RS01135 CTRC943_RS00440 -AQ199_RS01135 CTJTET1_RS00440 -AQ199_RS01135 O169_RS00440 -AQ199_RS01135 DU13_RS00455 -AQ199_RS01135 ECS88FINAL_RS0100450 -AQ199_RS01135 KW36_RS00440 -AQ199_RS01135 CBP48_RS01840 -AQ199_RS01135 KW39_RS00440 -AQ199_RS01135 SW2_RS00440 -AQ199_RS01135 BKB95_RS00450 -AQ199_RS01135 ECS102511_RS00440 -AQ199_RS01135 CTB_RS00440 -AQ199_RS01135 CTL2C_RS01805 -AQ199_RS01135 CBP42_RS01840 -AQ199_RS01135 BKB96_RS00450 -AQ199_RS01135 L1224_RS00440 -AQ199_RS01135 BKB99_RS00450 -AQ199_RS01135 BKB92_RS00450 -AQ199_RS01135 CTO_RS00440 -AQ199_RS01135 L1440_RS00440 -AQ199_RS01135 SOTONIA3_RS00440 -AQ199_RS01135 AOT15_RS00515 -AQ199_RS01135 E150_RS00440 -AQ199_RS01135 CBP44_RS01845 -AQ199_RS01135 120606 -AQ199_RS01135 L2BUCH2_RS00440 -AQ199_RS01135 BKB93_RS00450 -AQ199_RS01135 FCS84708_RS00440 -AQ199_RS01135 AP288_RS03510 -AQ199_RS01305 AQ199_RS01305 -AQ199_RS01305 L2BLST_RS00610 -AQ199_RS01305 BBV13_RS00620 -AQ199_RS01305 BW688_RS02010 -AQ199_RS01305 G9768_RS00610 -AQ199_RS01305 BKC02_RS00620 -AQ199_RS01305 BBV16_RS00620 -AQ199_RS01305 gnl|Prokka|PADJNBJD_00120 -AQ199_RS01305 LJHENM_00600 -AQ199_RS01305 AKW53_RS02105 -AQ199_RS01305 BKC01_RS00620 -AQ199_RS01305 NILJEPDF_00120 -AQ199_RS01305 L3404_RS00610 -AQ199_RS01305 A5291_RS00615 -AQ199_RS01305 SOTONK1_RS00610 -AQ199_RS01305 JIEJKO_00605 -AQ199_RS01305 QSDFRQ_00120 -AQ199_RS01305 IaCS19096_RS00610 -AQ199_RS01305 AQ193_RS03385 -AQ199_RS01305 BKC03_RS00620 -AQ199_RS01305 C15_RS0100630 -AQ199_RS01305 CTRC943_RS00610 -AQ199_RS01305 CTJTET1_RS00610 -AQ199_RS01305 KW39_RS00610 -AQ199_RS01305 DU10_RS00620 -AQ199_RS01305 ECS88FINAL_RS0100630 -AQ199_RS01305 O169_RS00610 -AQ199_RS01305 DU13_RS00625 -AQ199_RS01305 7618414 -AQ199_RS01305 KW36_RS00610 -AQ199_RS01305 CBP48_RS02010 -AQ199_RS01305 SW2_RS00610 -AQ199_RS01305 BKB95_RS00620 -AQ199_RS01305 ECS102511_RS00610 -AQ199_RS01305 CTL2C_RS01975 -AQ199_RS01305 CTB_RS00615 -AQ199_RS01305 L1224_RS00610 -AQ199_RS01305 AQ244_RS02785 -AQ199_RS01305 BKB96_RS00620 -AQ199_RS01305 CBP42_RS02010 -AQ199_RS01305 BKB99_RS00620 -AQ199_RS01305 L1440_RS00610 -AQ199_RS01305 BKB92_RS00620 -AQ199_RS01305 SOTONIA3_RS00610 -AQ199_RS01305 AOT15_RS00345 -AQ199_RS01305 CTO_RS00615 -AQ199_RS01305 E150_RS00610 -AQ199_RS01305 L2BUCH2_RS00610 -AQ199_RS01305 CBP44_RS02015 -AQ199_RS01305 FCS84708_RS00610 -AQ199_RS01305 AP288_RS03680 -AQ199_RS01305 BKB93_RS00620 -AQ199_RS01305 119296 -AQ199_RS01475 AQ199_RS01475 -AQ199_RS01475 BBV13_RS00790 -AQ199_RS01475 G9768_RS00780 -AQ199_RS01475 L2BLST_RS00780 -AQ199_RS01475 BW688_RS02180 -AQ199_RS01475 BBV16_RS00790 -AQ199_RS01475 BKC02_RS00790 -AQ199_RS01475 gnl|Prokka|PADJNBJD_00154 -AQ199_RS01475 LJHENM_00770 -AQ199_RS01475 AKW53_RS02275 -AQ199_RS01475 BKC01_RS00790 -AQ199_RS01475 NILJEPDF_00154 -AQ199_RS01475 A5291_RS00785 -AQ199_RS01475 L3404_RS00780 -AQ199_RS01475 SOTONK1_RS00780 -AQ199_RS01475 JIEJKO_00775 -AQ199_RS01475 QSDFRQ_00154 -AQ199_RS01475 CTJTET1_RS00780 -AQ199_RS01475 IaCS19096_RS00780 -AQ199_RS01475 AQ193_RS03215 -AQ199_RS01475 BKC03_RS00790 -AQ199_RS01475 C15_RS0100805 -AQ199_RS01475 CTRC943_RS00780 -AQ199_RS01475 ECS88FINAL_RS0100805 -AQ199_RS01475 KW39_RS00780 -AQ199_RS01475 DU10_RS00790 -AQ199_RS01475 O169_RS00780 -AQ199_RS01475 DU13_RS00795 -AQ199_RS01475 KW36_RS00780 -AQ199_RS01475 CBP48_RS02180 -AQ199_RS01475 SW2_RS00780 -AQ199_RS01475 BKB95_RS00790 -AQ199_RS01475 7618438 -AQ199_RS01475 ECS102511_RS00780 -AQ199_RS01475 CTL2C_RS02145 -AQ199_RS01475 CTB_RS00785 -AQ199_RS01475 L1224_RS00780 -AQ199_RS01475 AQ244_RS02955 -AQ199_RS01475 BKB96_RS00790 -AQ199_RS01475 CBP42_RS02180 -AQ199_RS01475 BKB99_RS00790 -AQ199_RS01475 CTO_RS00785 -AQ199_RS01475 BKB92_RS00790 -AQ199_RS01475 SOTONIA3_RS00780 -AQ199_RS01475 AOT15_RS00175 -AQ199_RS01475 E150_RS00780 -AQ199_RS01475 L2BUCH2_RS00780 -AQ199_RS01475 CBP44_RS02185 -AQ199_RS01475 FCS84708_RS00780 -AQ199_RS01475 AP288_RS03850 -AQ199_RS01475 BKB93_RS00790 -AQ199_RS01475 119334 -AQ199_RS02500 AQ199_RS02500 -AQ199_RS02500 AQ244_RS01305 -AQ199_RS02500 G9768_RS01805 -AQ199_RS02500 L3404_RS01780 -AQ199_RS02500 BBV16_RS01835 -AQ199_RS02500 BKC02_RS01810 -AQ199_RS02500 BKC01_RS01810 -AQ199_RS02500 AKW53_RS03305 -AQ199_RS02500 gnl|Prokka|PADJNBJD_00355 -AQ199_RS02500 NILJEPDF_00355 -AQ199_RS02500 CTRC943_RS01785 -AQ199_RS02500 LJHENM_01790 -AQ199_RS02500 JIEJKO_01785 -AQ199_RS02500 BKC03_RS01810 -AQ199_RS02500 CTJTET1_RS01815 -AQ199_RS02500 AQ193_RS02180 -AQ199_RS02500 DU10_RS01830 -AQ199_RS02500 QSDFRQ_00355 -AQ199_RS02500 C15_RS0101845 -AQ199_RS02500 SOTONK1_RS01805 -AQ199_RS02500 A5291_RS01830 -AQ199_RS02500 KW39_RS01815 -AQ199_RS02500 IaCS19096_RS01800 -AQ199_RS02500 119467 -AQ199_RS02500 ECS88FINAL_RS0101835 -AQ199_RS02500 O169_RS01815 -AQ199_RS02500 7618521 -AQ199_RS02500 CTL2C_RS03150 -AQ199_RS02500 BKB95_RS01825 -AQ199_RS02500 CBP48_RS03210 -AQ199_RS02500 L1224_RS01780 -AQ199_RS02500 KW36_RS01800 -AQ199_RS02500 AOT15_RS02800 -AQ199_RS02500 BKB96_RS01810 -AQ199_RS02500 SW2_RS01805 -AQ199_RS02500 BKB99_RS01810 -AQ199_RS02500 L1440_RS01780 -AQ199_RS02500 ECS102511_RS01805 -AQ199_RS02500 CBP42_RS03220 -AQ199_RS02500 CTB_RS01830 -AQ199_RS02500 SOTONIA3_RS01815 -AQ199_RS02500 L2BUCH2_RS01780 -AQ199_RS02500 BKB92_RS01820 -AQ199_RS02500 CTO_RS01830 -AQ199_RS02500 E150_RS01810 -AQ199_RS02500 AP288_RS01275 -AQ199_RS02500 L2BLST_RS01780 -AQ199_RS02500 FCS84708_RS01800 -AQ199_RS02500 BW688_RS03210 -AQ199_RS02500 BKB93_RS01820 -AQ199_RS02500 CBP44_RS03215 -AQ199_RS02500 BBV13_RS01835 -AQ199_RS02825 AQ199_RS02825 -AQ199_RS02825 AQ244_RS00980 -AQ199_RS02825 G9768_RS02130 -AQ199_RS02825 BBV16_RS02165 -AQ199_RS02825 L3404_RS02105 -AQ199_RS02825 BKC02_RS02140 -AQ199_RS02825 BKC01_RS02140 -AQ199_RS02825 AKW53_RS03630 -AQ199_RS02825 gnl|Prokka|PADJNBJD_00420 -AQ199_RS02825 NILJEPDF_00420 -AQ199_RS02825 CTRC943_RS02110 -AQ199_RS02825 LJHENM_02120 -AQ199_RS02825 JIEJKO_02115 -AQ199_RS02825 BKC03_RS02140 -AQ199_RS02825 CTJTET1_RS02140 -AQ199_RS02825 AQ193_RS01855 -AQ199_RS02825 QSDFRQ_00420 -AQ199_RS02825 C15_RS0102175 -AQ199_RS02825 A5291_RS02155 -AQ199_RS02825 SOTONK1_RS02130 -AQ199_RS02825 DU10_RS02165 -AQ199_RS02825 KW39_RS02140 -AQ199_RS02825 IaCS19096_RS02125 -AQ199_RS02825 ECS88FINAL_RS0102170 -AQ199_RS02825 O169_RS02140 -AQ199_RS02825 DU13_RS02160 -AQ199_RS02825 7618988 -AQ199_RS02825 CTL2C_RS03475 -AQ199_RS02825 CBP48_RS03545 -AQ199_RS02825 120316 -AQ199_RS02825 L1224_RS02105 -AQ199_RS02825 KW36_RS02125 -AQ199_RS02825 AOT15_RS03125 -AQ199_RS02825 BKB95_RS02160 -AQ199_RS02825 BKB96_RS02140 -AQ199_RS02825 SW2_RS02130 -AQ199_RS02825 BKB99_RS02140 -AQ199_RS02825 L1440_RS02105 -AQ199_RS02825 ECS102511_RS02130 -AQ199_RS02825 CTB_RS02155 -AQ199_RS02825 CBP42_RS03555 -AQ199_RS02825 SOTONIA3_RS02140 -AQ199_RS02825 L2BUCH2_RS02105 -AQ199_RS02825 BKB92_RS02150 -AQ199_RS02825 CTO_RS02155 -AQ199_RS02825 E150_RS02135 -AQ199_RS02825 AP288_RS00950 -AQ199_RS02825 L2BLST_RS02105 -AQ199_RS02825 BW688_RS03540 -AQ199_RS02825 FCS84708_RS02125 -AQ199_RS02825 BBV13_RS02165 -AQ199_RS02825 BKB93_RS02150 -AQ199_RS02825 CBP44_RS03550 -AQ199_RS02990 AQ199_RS02990 -AQ199_RS02990 G9768_RS02295 -AQ199_RS02990 AQ244_RS00815 -AQ199_RS02990 BBV16_RS02335 -AQ199_RS02990 L3404_RS02270 -AQ199_RS02990 BKC02_RS02310 -AQ199_RS02990 BKC01_RS02310 -AQ199_RS02990 gnl|Prokka|PADJNBJD_00453 -AQ199_RS02990 AKW53_RS03795 -AQ199_RS02990 NILJEPDF_00453 -AQ199_RS02990 LJHENM_02285 -AQ199_RS02990 CTRC943_RS02275 -AQ199_RS02990 JIEJKO_02285 -AQ199_RS02990 BKC03_RS02310 -AQ199_RS02990 QSDFRQ_00453 -AQ199_RS02990 CTJTET1_RS02305 -AQ199_RS02990 AQ193_RS01690 -AQ199_RS02990 C15_RS0102340 -AQ199_RS02990 SOTONK1_RS02295 -AQ199_RS02990 DU10_RS02335 -AQ199_RS02990 A5291_RS02325 -AQ199_RS02990 KW39_RS02305 -AQ199_RS02990 IaCS19096_RS02290 -AQ199_RS02990 ECS88FINAL_RS0102340 -AQ199_RS02990 O169_RS02305 -AQ199_RS02990 DU13_RS02330 -AQ199_RS02990 7618999 -AQ199_RS02990 BKB96_RS02315 -AQ199_RS02990 BKB99_RS02310 -AQ199_RS02990 CBP48_RS03715 -AQ199_RS02990 120298 -AQ199_RS02990 CTL2C_RS03645 -AQ199_RS02990 KW36_RS02290 -AQ199_RS02990 AOT15_RS03290 -AQ199_RS02990 BKB95_RS02330 -AQ199_RS02990 L1224_RS02275 -AQ199_RS02990 SW2_RS02300 -AQ199_RS02990 ECS102511_RS02295 -AQ199_RS02990 L1440_RS02275 -AQ199_RS02990 CBP42_RS03725 -AQ199_RS02990 CTB_RS02325 -AQ199_RS02990 L2BUCH2_RS02270 -AQ199_RS02990 BKB92_RS02320 -AQ199_RS02990 SOTONIA3_RS02310 -AQ199_RS02990 CTO_RS02325 -AQ199_RS02990 E150_RS02300 -AQ199_RS02990 AP288_RS00785 -AQ199_RS02990 BW688_RS03710 -AQ199_RS02990 L2BLST_RS02275 -AQ199_RS02990 FCS84708_RS02290 -AQ199_RS02990 BBV13_RS02330 -AQ199_RS02990 CBP44_RS03720 -AQ199_RS02990 BKB93_RS02325 -AQ199_RS03340 AQ199_RS03340 -AQ199_RS03340 AQ244_RS00465 -AQ199_RS03340 BKB93_RS02675 -AQ199_RS03340 BBV16_RS02695 -AQ199_RS03340 G9768_RS02645 -AQ199_RS03340 L3404_RS02620 -AQ199_RS03340 BKC02_RS02665 -AQ199_RS03340 BKC01_RS02665 -AQ199_RS03340 gnl|Prokka|PADJNBJD_00522 -AQ199_RS03340 NILJEPDF_00522 -AQ199_RS03340 LJHENM_02625 -AQ199_RS03340 CTRC943_RS02625 -AQ199_RS03340 AQ193_RS01340 -AQ199_RS03340 SOTONK1_RS02645 -AQ199_RS03340 CTJTET1_RS02655 -AQ199_RS03340 JIEJKO_02630 -AQ199_RS03340 BKC03_RS02665 -AQ199_RS03340 QSDFRQ_00522 -AQ199_RS03340 KW39_RS02655 -AQ199_RS03340 AOT15_RS03450 -AQ199_RS03340 C15_RS0102710 -AQ199_RS03340 ECS88FINAL_RS0102705 -AQ199_RS03340 IaCS19096_RS02640 -AQ199_RS03340 DU10_RS02685 -AQ199_RS03340 O169_RS02655 -AQ199_RS03340 A5291_RS02680 -AQ199_RS03340 DU13_RS02680 -AQ199_RS03340 CBP48_RS04065 -AQ199_RS03340 CTL2C_RS03995 -AQ199_RS03340 KW36_RS02640 -AQ199_RS03340 BKB95_RS02680 -AQ199_RS03340 BKB96_RS02670 -AQ199_RS03340 BKB99_RS02665 -AQ199_RS03340 7619035 -AQ199_RS03340 SW2_RS02650 -AQ199_RS03340 L1224_RS02625 -AQ199_RS03340 ECS102511_RS02645 -AQ199_RS03340 L1440_RS02625 -AQ199_RS03340 AKW53_RS04570 -AQ199_RS03340 CBP42_RS04075 -AQ199_RS03340 120239 -AQ199_RS03340 L2BUCH2_RS02625 -AQ199_RS03340 SOTONIA3_RS02660 -AQ199_RS03340 BKB92_RS02670 -AQ199_RS03340 CTB_RS02680 -AQ199_RS03340 E150_RS02650 -AQ199_RS03340 AP288_RS00435 -AQ199_RS03340 BW688_RS04065 -AQ199_RS03340 CTO_RS02680 -AQ199_RS03340 FCS84708_RS02640 -AQ199_RS03340 L2BLST_RS02625 -AQ199_RS03340 BBV13_RS02685 -AQ199_RS03340 CBP44_RS04070 -AQ199_RS03505 AQ199_RS03505 -AQ199_RS03505 AQ244_RS00300 -AQ199_RS03505 BKB93_RS02845 -AQ199_RS03505 BBV16_RS02860 -AQ199_RS03505 G9768_RS02810 -AQ199_RS03505 L3404_RS02785 -AQ199_RS03505 BKC02_RS02835 -AQ199_RS03505 gnl|Prokka|PADJNBJD_00554 -AQ199_RS03505 NILJEPDF_00554 -AQ199_RS03505 BKC01_RS02835 -AQ199_RS03505 LJHENM_02790 -AQ199_RS03505 CTRC943_RS02790 -AQ199_RS03505 AOT15_RS01610 -AQ199_RS03505 QSDFRQ_00554 -AQ199_RS03505 AQ193_RS01175 -AQ199_RS03505 JIEJKO_02795 -AQ199_RS03505 SOTONK1_RS02810 -AQ199_RS03505 CTJTET1_RS02820 -AQ199_RS03505 BKC03_RS02835 -AQ199_RS03505 KW39_RS02820 -AQ199_RS03505 C15_RS0102880 -AQ199_RS03505 ECS88FINAL_RS0102875 -AQ199_RS03505 IaCS19096_RS02805 -AQ199_RS03505 DU10_RS02855 -AQ199_RS03505 O169_RS02820 -AQ199_RS03505 A5291_RS02845 -AQ199_RS03505 DU13_RS02850 -AQ199_RS03505 CBP48_RS04235 -AQ199_RS03505 7619065 -AQ199_RS03505 CTL2C_RS04160 -AQ199_RS03505 KW36_RS02805 -AQ199_RS03505 AKW53_RS04035 -AQ199_RS03505 BKB95_RS02850 -AQ199_RS03505 BKB96_RS02840 -AQ199_RS03505 BKB99_RS02835 -AQ199_RS03505 SW2_RS02815 -AQ199_RS03505 L1224_RS02790 -AQ199_RS03505 ECS102511_RS02810 -AQ199_RS03505 L1440_RS02790 -AQ199_RS03505 120192 -AQ199_RS03505 CBP42_RS04245 -AQ199_RS03505 L2BUCH2_RS02790 -AQ199_RS03505 SOTONIA3_RS02825 -AQ199_RS03505 BKB92_RS02840 -AQ199_RS03505 CTB_RS02845 -AQ199_RS03505 E150_RS02815 -AQ199_RS03505 AP288_RS00270 -AQ199_RS03505 BW688_RS04235 -AQ199_RS03505 CTO_RS02845 -AQ199_RS03505 FCS84708_RS02805 -AQ199_RS03505 L2BLST_RS02790 -AQ199_RS03505 BBV13_RS02850 -AQ199_RS03505 CBP44_RS04240 -AQ199_RS03670 AQ199_RS03670 -AQ199_RS03670 AQ244_RS00135 -AQ199_RS03670 BBV16_RS03020 -AQ199_RS03670 BKB93_RS03010 -AQ199_RS03670 G9768_RS02975 -AQ199_RS03670 L3404_RS02940 -AQ199_RS03670 gnl|Prokka|PADJNBJD_00586 -AQ199_RS03670 BKC02_RS03005 -AQ199_RS03670 NILJEPDF_00586 -AQ199_RS03670 LJHENM_02945 -AQ199_RS03670 AOT15_RS03775 -AQ199_RS03670 CTRC943_RS02945 -AQ199_RS03670 BKC01_RS03005 -AQ199_RS03670 QSDFRQ_00586 -AQ199_RS03670 JIEJKO_02955 -AQ199_RS03670 AQ193_RS01015 -AQ199_RS03670 SOTONK1_RS02975 -AQ199_RS03670 CTJTET1_RS02985 -AQ199_RS03670 BKC03_RS03005 -AQ199_RS03670 KW39_RS02985 -AQ199_RS03670 C15_RS0103040 -AQ199_RS03670 ECS88FINAL_RS0103035 -AQ199_RS03670 IaCS19096_RS02970 -AQ199_RS03670 DU10_RS03020 -AQ199_RS03670 A5291_RS03005 -AQ199_RS03670 O169_RS02980 -AQ199_RS03670 CTL2C_RS04315 -AQ199_RS03670 DU13_RS03015 -AQ199_RS03670 CBP48_RS04405 -AQ199_RS03670 L1224_RS02945 -AQ199_RS03670 KW36_RS02970 -AQ199_RS03670 BKB95_RS03015 -AQ199_RS03670 7618617 -AQ199_RS03670 AKW53_RS04200 -AQ199_RS03670 BKB96_RS03010 -AQ199_RS03670 BKB99_RS03005 -AQ199_RS03670 SW2_RS02975 -AQ199_RS03670 L1440_RS02945 -AQ199_RS03670 ECS102511_RS02970 -AQ199_RS03670 CBP42_RS04410 -AQ199_RS03670 L2BUCH2_RS02945 -AQ199_RS03670 119618 -AQ199_RS03670 CTB_RS03005 -AQ199_RS03670 SOTONIA3_RS02990 -AQ199_RS03670 BKB92_RS03005 -AQ199_RS03670 BW688_RS04400 -AQ199_RS03670 E150_RS02975 -AQ199_RS03670 AP288_RS00110 -AQ199_RS03670 CTO_RS03005 -AQ199_RS03670 L2BLST_RS02945 -AQ199_RS03670 CBP44_RS04405 -AQ199_RS03670 FCS84708_RS02970 -AQ199_RS03670 BBV13_RS03010 -AQ199_RS03670 G9768_RS02970 F -AQ199_RS03670 AQ244_RS00140 F -AQ199_RS03670 gnl|Prokka|PADJNBJD_00585 F -AQ199_RS03670 BKC02_RS03000 F -AQ199_RS03670 NILJEPDF_00585 F -AQ199_RS03670 AOT15_RS03770 F -AQ199_RS03670 BKC01_RS03000 F -AQ199_RS03670 QSDFRQ_00585 F -AQ199_RS03670 JIEJKO_02950 F -AQ199_RS03670 SOTONK1_RS02970 F -AQ199_RS03670 CTJTET1_RS02980 F -AQ199_RS03670 BKC03_RS03000 F -AQ199_RS03670 C15_RS0103035 F -AQ199_RS03670 IaCS19096_RS02965 F -AQ199_RS03670 KW36_RS02965 F -AQ199_RS03670 BKB96_RS03005 F -AQ199_RS03670 BKB99_RS03000 F -AQ199_RS03670 119164 F -AQ199_RS03670 SOTONIA3_RS02985 F -AQ199_RS03835 AQ199_RS03835 -AQ199_RS03835 BBV16_RS03180 -AQ199_RS03835 BKB93_RS03170 -AQ199_RS03835 G9768_RS03135 -AQ199_RS03835 L3404_RS03105 -AQ199_RS03835 gnl|Prokka|PADJNBJD_00617 -AQ199_RS03835 AQ244_RS04780 -AQ199_RS03835 NILJEPDF_00617 -AQ199_RS03835 LJHENM_03100 -AQ199_RS03835 BKC02_RS03165 -AQ199_RS03835 AOT15_RS03935 -AQ199_RS03835 AP288_RS01505 -AQ199_RS03835 CTRC943_RS03110 -AQ199_RS03835 BKC01_RS03165 -AQ199_RS03835 QSDFRQ_00617 -AQ199_RS03835 JIEJKO_03110 -AQ199_RS03835 AQ193_RS00850 -AQ199_RS03835 SOTONK1_RS03135 -AQ199_RS03835 CTJTET1_RS03150 -AQ199_RS03835 BKC03_RS03165 -AQ199_RS03835 KW39_RS03150 -AQ199_RS03835 C15_RS0103200 -AQ199_RS03835 ECS88FINAL_RS0103200 -AQ199_RS03835 IaCS19096_RS03130 -AQ199_RS03835 DU10_RS03180 -AQ199_RS03835 A5291_RS03170 -AQ199_RS03835 O169_RS03145 -AQ199_RS03835 CTL2C_RS04480 -AQ199_RS03835 DU13_RS03175 -AQ199_RS03835 CBP48_RS04565 -AQ199_RS03835 L1224_RS03110 -AQ199_RS03835 KW36_RS03135 -AQ199_RS03835 BKB95_RS03175 -AQ199_RS03835 AKW53_RS04360 -AQ199_RS03835 BKB96_RS03170 -AQ199_RS03835 BKB99_RS03165 -AQ199_RS03835 7618636 -AQ199_RS03835 SW2_RS03140 -AQ199_RS03835 L1440_RS03110 -AQ199_RS03835 ECS102511_RS03135 -AQ199_RS03835 CBP42_RS04570 -AQ199_RS03835 L2BUCH2_RS03110 -AQ199_RS03835 CTB_RS03170 -AQ199_RS03835 SOTONIA3_RS03150 -AQ199_RS03835 BKB92_RS03165 -AQ199_RS03835 BW688_RS04560 -AQ199_RS03835 119647 -AQ199_RS03835 E150_RS03140 -AQ199_RS03835 CTO_RS03165 -AQ199_RS03835 L2BLST_RS03110 -AQ199_RS03835 CBP44_RS04565 -AQ199_RS03835 FCS84708_RS03135 -AQ199_RS03835 BBV13_RS03170 -AQ199_RS04010 AQ199_RS04010 -AQ199_RS04010 BBV16_RS03360 -AQ199_RS04010 BKB93_RS03345 -AQ199_RS04010 AQ244_RS04600 -AQ199_RS04010 G9768_RS03310 -AQ199_RS04010 L3404_RS03280 -AQ199_RS04010 gnl|Prokka|PADJNBJD_00651 -AQ199_RS04010 AP288_RS01680 -AQ199_RS04010 BKC02_RS03340 -AQ199_RS04010 NILJEPDF_00652 -AQ199_RS04010 LJHENM_03275 -AQ199_RS04010 AOT15_RS04110 -AQ199_RS04010 CTRC943_RS03285 -AQ199_RS04010 JIEJKO_03280 -AQ199_RS04010 BKC01_RS03340 -AQ199_RS04010 QSDFRQ_00652 -AQ199_RS04010 AQ193_RS00675 -AQ199_RS04010 KW39_RS03325 -AQ199_RS04010 BKC03_RS03340 -AQ199_RS04010 CTJTET1_RS03325 -AQ199_RS04010 ECS88FINAL_RS0103375 -AQ199_RS04010 DU10_RS03355 -AQ199_RS04010 SOTONK1_RS03310 -AQ199_RS04010 O169_RS03320 -AQ199_RS04010 IaCS19096_RS03305 -AQ199_RS04010 C15_RS0103375 -AQ199_RS04010 A5291_RS03350 -AQ199_RS04010 AKW53_RS00060 -AQ199_RS04010 DU13_RS03350 -AQ199_RS04010 CTL2C_RS04655 -AQ199_RS04010 CBP48_RS04740 -AQ199_RS04010 7619116 -AQ199_RS04010 SW2_RS03315 -AQ199_RS04010 L1224_RS03285 -AQ199_RS04010 KW36_RS03310 -AQ199_RS04010 ECS102511_RS03310 -AQ199_RS04010 L1440_RS03285 -AQ199_RS04010 BKB95_RS03355 -AQ199_RS04010 BKB96_RS03350 -AQ199_RS04010 BKB99_RS03345 -AQ199_RS04010 CBP42_RS04745 -AQ199_RS04010 L2BUCH2_RS03285 -AQ199_RS04010 BKB92_RS03340 -AQ199_RS04010 CTB_RS03350 -AQ199_RS04010 E150_RS03315 -AQ199_RS04010 SOTONIA3_RS03330 -AQ199_RS04010 BW688_RS04735 -AQ199_RS04010 CTO_RS03345 -AQ199_RS04010 FCS84708_RS03310 -AQ199_RS04010 BBV13_RS03350 -AQ199_RS04010 L2BLST_RS03285 -AQ199_RS04010 CBP44_RS04740 -AQ199_RS04010 120110 -AQ199_RS04520 AQ199_RS04520 -AQ199_RS04520 BKB93_RS03865 -AQ199_RS04520 G9768_RS03825 -AQ199_RS04520 gnl|Prokka|PADJNBJD_00752 -AQ199_RS04520 L3404_RS03800 -AQ199_RS04520 NILJEPDF_00753 -AQ199_RS04520 BKC02_RS03860 -AQ199_RS04520 LJHENM_03790 -AQ199_RS04520 AQ244_RS04085 -AQ199_RS04520 AOT15_RS04625 -AQ199_RS04520 AP288_RS02195 -AQ199_RS04520 JIEJKO_03790 -AQ199_RS04520 QSDFRQ_00753 -AQ199_RS04520 BKC01_RS03865 -AQ199_RS04520 CTRC943_RS03810 -AQ199_RS04520 AKW53_RS00565 -AQ199_RS04520 AQ193_RS00165 -AQ199_RS04520 BKC03_RS03860 -AQ199_RS04520 CBP48_RS00430 -AQ199_RS04520 CTJTET1_RS03845 -AQ199_RS04520 KW39_RS03840 -AQ199_RS04520 DU10_RS03875 -AQ199_RS04520 A5291_RS03870 -AQ199_RS04520 SOTONK1_RS03825 -AQ199_RS04520 IaCS19096_RS03820 -AQ199_RS04520 DU13_RS03875 -AQ199_RS04520 C15_RS0103930 -AQ199_RS04520 ECS88FINAL_RS0103930 -AQ199_RS04520 O169_RS03835 -AQ199_RS04520 KW36_RS03825 -AQ199_RS04520 BKB95_RS03880 -AQ199_RS04520 CBP42_RS00430 -AQ199_RS04520 CTL2C_RS00425 -AQ199_RS04520 L1224_RS03805 -AQ199_RS04520 SW2_RS03830 -AQ199_RS04520 L1440_RS03800 -AQ199_RS04520 ECS102511_RS03820 -AQ199_RS04520 BKB96_RS03865 -AQ199_RS04520 BKB99_RS03860 -AQ199_RS04520 CBP44_RS00430 -AQ199_RS04520 L2BUCH2_RS03805 -AQ199_RS04520 BKB92_RS03860 -AQ199_RS04520 CTB_RS03865 -AQ199_RS04520 SOTONIA3_RS03845 -AQ199_RS04520 E150_RS03830 -AQ199_RS04520 CTO_RS03860 -AQ199_RS04520 BBV13_RS03865 -AQ199_RS04520 FCS84708_RS03820 -AQ199_RS04520 L2BLST_RS03805 -AQ199_RS04520 BBV16_RS03875 -AQ199_RS04520 7618254 -AQ199_RS04520 119760 -AQ199_RS04520 BW688_RS00430 -AQ199_RS04685 AQ199_RS04685 -AQ199_RS04685 BKB93_RS04030 -AQ199_RS04685 G9768_RS03990 -AQ199_RS04685 AQ244_RS03895 -AQ199_RS04685 BKC02_RS04025 -AQ199_RS04685 AQ244_RS03920 -AQ199_RS04685 AOT15_RS04790 -AQ199_RS04685 AP288_RS02360 -AQ199_RS04685 BKC01_RS04030 -AQ199_RS04685 BKC03_RS04025 -AQ199_RS04685 CTJTET1_RS04010 -AQ199_RS04685 KW39_RS04005 -AQ199_RS04685 DU10_RS04040 -AQ199_RS04685 A5291_RS04035 -AQ199_RS04685 SOTONK1_RS03990 -AQ199_RS04685 IaCS19096_RS03985 -AQ199_RS04685 DU13_RS04040 -AQ199_RS04685 C15_RS0104095 -AQ199_RS04685 O169_RS04000 -AQ199_RS04685 KW36_RS03990 -AQ199_RS04685 BKB95_RS04045 -AQ199_RS04685 CTL2C_RS00590 -AQ199_RS04685 SW2_RS03995 -AQ199_RS04685 ECS102511_RS03985 -AQ199_RS04685 BKB96_RS04030 -AQ199_RS04685 BKB99_RS04025 -AQ199_RS04685 BKB92_RS04025 -AQ199_RS04685 SOTONIA3_RS04010 -AQ199_RS04685 E150_RS03995 -AQ199_RS04685 CTO_RS04025 -AQ199_RS04685 BBV13_RS04030 -AQ199_RS04685 FCS84708_RS03985 -AQ199_RS04685 BBV16_RS04040 -AQ199_RS04685 L3404_RS03965 -AQ199_RS04685 CBP44_RS00665 -AQ199_RS04685 L2BUCH2_RS04040 -AQ199_RS04685 AQ244_RS03910 -AQ199_RS04685 BKB92_RS04095 -AQ199_RS04685 SOTONIA3_RS04080 -AQ199_RS04685 E150_RS04065 -AQ199_RS04685 BBV13_RS04100 -AQ199_RS04685 CTRC943_RS03975 -AQ199_RS04685 FCS84708_RS04055 -AQ199_RS04685 L2BLST_RS04040 -AQ199_RS04685 BBV16_RS04110 -AQ199_RS04685 BW688_RS00665 -AQ199_RS04685 CBP48_RS00595 -AQ199_RS04685 BKB93_RS04100 -AQ199_RS04685 G9768_RS04060 -AQ199_RS04685 L3404_RS04035 -AQ199_RS04685 BKC02_RS04095 -AQ199_RS04685 CBP42_RS00595 -AQ199_RS04685 L1224_RS03970 -AQ199_RS04685 BKC01_RS04100 -AQ199_RS04685 L1440_RS03965 -AQ199_RS04685 CTRC943_RS04045 -AQ199_RS04685 KW39_RS04075 -AQ199_RS04685 BKC03_RS04095 -AQ199_RS04685 CBP48_RS00665 -AQ199_RS04685 CTJTET1_RS04080 -AQ199_RS04685 DU10_RS04110 -AQ199_RS04685 SOTONK1_RS04060 -AQ199_RS04685 IaCS19096_RS04055 -AQ199_RS04685 DU13_RS04110 -AQ199_RS04685 CBP44_RS00595 -AQ199_RS04685 C15_RS0104165 -AQ199_RS04685 L2BUCH2_RS03970 -AQ199_RS04685 O169_RS04070 -AQ199_RS04685 KW36_RS04060 -AQ199_RS04685 AOT15_RS02365 -AQ199_RS04685 BKB95_RS04115 -AQ199_RS04685 CBP42_RS00665 -AQ199_RS04685 CTL2C_RS00660 -AQ199_RS04685 L1224_RS04040 -AQ199_RS04685 BKB96_RS04100 -AQ199_RS04685 SW2_RS04065 -AQ199_RS04685 L1440_RS04035 -AQ199_RS04685 L2BLST_RS03970 -AQ199_RS04685 ECS102511_RS04055 -AQ199_RS04685 BKB99_RS04095 -AQ199_RS04685 BW688_RS00595 -AQ199_RS04845 AQ199_RS04845 -AQ199_RS04845 AP288_RS04810 -AQ199_RS04845 AQ193_RS04830 -AQ199_RS04845 AQ244_RS04860 F -AQ244_RS00645 AQ244_RS00645 -AQ244_RS00645 BBV16_RS02515 -AQ244_RS00645 BKB93_RS02495 -AQ244_RS00645 AQ199_RS03160 -AQ244_RS00645 G9768_RS02465 -AQ244_RS00645 L3404_RS02440 -AQ244_RS00645 BKC02_RS02485 -AQ244_RS00645 gnl|Prokka|PADJNBJD_00486 -AQ244_RS00645 BKC01_RS02485 -AQ244_RS00645 NILJEPDF_00486 -AQ244_RS00645 LJHENM_02450 -AQ244_RS00645 CTRC943_RS02445 -AQ244_RS00645 AQ193_RS01520 -AQ244_RS00645 JIEJKO_02450 -AQ244_RS00645 QSDFRQ_00486 -AQ244_RS00645 SOTONK1_RS02465 -AQ244_RS00645 CTJTET1_RS02475 -AQ244_RS00645 BKC03_RS02485 -AQ244_RS00645 AOT15_RS03630 -AQ244_RS00645 C15_RS0102525 -AQ244_RS00645 KW39_RS02475 -AQ244_RS00645 IaCS19096_RS02460 -AQ244_RS00645 DU10_RS02505 -AQ244_RS00645 A5291_RS02500 -AQ244_RS00645 ECS88FINAL_RS0102520 -AQ244_RS00645 O169_RS02475 -AQ244_RS00645 7618588 -AQ244_RS00645 DU13_RS02500 -AQ244_RS00645 BKB96_RS02490 -AQ244_RS00645 BKB99_RS02485 -AQ244_RS00645 CBP48_RS03885 -AQ244_RS00645 CTL2C_RS03815 -AQ244_RS00645 KW36_RS02460 -AQ244_RS00645 BKB95_RS02500 -AQ244_RS00645 L1224_RS02445 -AQ244_RS00645 SW2_RS02470 -AQ244_RS00645 ECS102511_RS02465 -AQ244_RS00645 119573 -AQ244_RS00645 L1440_RS02445 -AQ244_RS00645 AKW53_RS04750 -AQ244_RS00645 CBP42_RS03895 -AQ244_RS00645 L2BUCH2_RS02445 -AQ244_RS00645 CTB_RS02500 -AQ244_RS00645 SOTONIA3_RS02480 -AQ244_RS00645 BKB92_RS02490 -AQ244_RS00645 AP288_RS00615 -AQ244_RS00645 E150_RS02470 -AQ244_RS00645 CTO_RS02500 -AQ244_RS00645 BW688_RS03885 -AQ244_RS00645 BBV13_RS02505 -AQ244_RS00645 L2BLST_RS02445 -AQ244_RS00645 FCS84708_RS02460 -AQ244_RS00645 CBP44_RS03890 -AQ244_RS03200 AQ244_RS03200 -AQ244_RS03200 BKB92_RS01020 -AQ244_RS03200 CBP42_RS02410 -AQ244_RS03200 SOTONIA3_RS01035 -AQ244_RS03200 E150_RS01015 -AQ244_RS03200 AQ193_RS02975 -AQ244_RS03200 CTB_RS01045 -AQ244_RS03200 L2BUCH2_RS01005 -AQ244_RS03200 CTO_RS01045 -AQ244_RS03200 FCS84708_RS01015 -AQ244_RS03200 AP288_RS04085 -AQ244_RS03200 BKB93_RS01020 -AQ244_RS03200 CBP44_RS02415 -AQ244_RS03200 AQ199_RS01710 -AQ244_RS03200 L2BLST_RS01005 -AQ244_RS03200 BW688_RS02415 -AQ244_RS03200 BBV13_RS01050 -AQ244_RS03200 G9768_RS01025 -AQ244_RS03200 BKC02_RS01020 -AQ244_RS03200 L3404_RS01000 -AQ244_RS03200 AKW53_RS02510 -AQ244_RS03200 BBV16_RS01050 -AQ244_RS03200 BKC01_RS01020 -AQ244_RS03200 120512 -AQ244_RS03200 DU10_RS01030 -AQ244_RS03200 gnl|Prokka|PADJNBJD_00200 -AQ244_RS03200 BKC03_RS01020 -AQ244_RS03200 NILJEPDF_00200 -AQ244_RS03200 LJHENM_01005 -AQ244_RS03200 CTRC943_RS01005 -AQ244_RS03200 CTJTET1_RS01035 -AQ244_RS03200 C15_RS0101055 -AQ244_RS03200 SOTONK1_RS01020 -AQ244_RS03200 ECS88FINAL_RS0101040 -AQ244_RS03200 KW39_RS01025 -AQ244_RS03200 JIEJKO_01005 -AQ244_RS03200 A5291_RS01045 -AQ244_RS03200 IaCS19096_RS01020 -AQ244_RS03200 AOT15_RS01345 -AQ244_RS03200 7618871 -AQ244_RS03200 QSDFRQ_00200 -AQ244_RS03200 O169_RS01025 -AQ244_RS03200 DU13_RS01030 -AQ244_RS03200 SW2_RS01015 -AQ244_RS03200 BKB95_RS01035 -AQ244_RS03200 CBP48_RS02410 -AQ244_RS03200 KW36_RS01020 -AQ244_RS03200 ECS102511_RS01015 -AQ244_RS03200 BKB96_RS01020 -AQ244_RS03200 CTL2C_RS02370 -AQ244_RS03200 BKB99_RS01020 -AQ244_RS03200 L1224_RS01000 -AQ244_RS03200 L1440_RS01000 -AQ244_RS03380 AQ244_RS03380 -AQ244_RS03380 BKB92_RS01200 -AQ244_RS03380 CBP42_RS02590 -AQ244_RS03380 SOTONIA3_RS01215 -AQ244_RS03380 E150_RS01195 -AQ244_RS03380 AQ193_RS02795 -AQ244_RS03380 CTB_RS01225 -AQ244_RS03380 L2BUCH2_RS01185 -AQ244_RS03380 CTO_RS01225 -AQ244_RS03380 FCS84708_RS01195 -AQ244_RS03380 AP288_RS04265 -AQ244_RS03380 BKB93_RS01200 -AQ244_RS03380 CBP44_RS02595 -AQ244_RS03380 AQ199_RS01890 -AQ244_RS03380 L2BLST_RS01185 -AQ244_RS03380 BW688_RS02595 -AQ244_RS03380 BBV13_RS01230 -AQ244_RS03380 G9768_RS01205 -AQ244_RS03380 BKC02_RS01200 -AQ244_RS03380 L3404_RS01180 -AQ244_RS03380 AKW53_RS02690 -AQ244_RS03380 BBV16_RS01230 -AQ244_RS03380 BKC01_RS01200 -AQ244_RS03380 120486 -AQ244_RS03380 gnl|Prokka|PADJNBJD_00235 -AQ244_RS03380 DU10_RS01210 -AQ244_RS03380 NILJEPDF_00235 -AQ244_RS03380 LJHENM_01180 -AQ244_RS03380 BKC03_RS01200 -AQ244_RS03380 CTRC943_RS01185 -AQ244_RS03380 CTJTET1_RS01215 -AQ244_RS03380 KW39_RS01205 -AQ244_RS03380 JIEJKO_01180 -AQ244_RS03380 C15_RS0101235 -AQ244_RS03380 SOTONK1_RS01200 -AQ244_RS03380 ECS88FINAL_RS0101220 -AQ244_RS03380 QSDFRQ_00235 -AQ244_RS03380 A5291_RS01225 -AQ244_RS03380 IaCS19096_RS01200 -AQ244_RS03380 AOT15_RS01165 -AQ244_RS03380 7618888 -AQ244_RS03380 O169_RS01205 -AQ244_RS03380 DU13_RS01210 -AQ244_RS03380 SW2_RS01195 -AQ244_RS03380 BKB95_RS01215 -AQ244_RS03380 CBP48_RS02590 -AQ244_RS03380 KW36_RS01200 -AQ244_RS03380 ECS102511_RS01195 -AQ244_RS03380 BKB96_RS01200 -AQ244_RS03380 CTL2C_RS02550 -AQ244_RS03380 BKB99_RS01200 -AQ244_RS03380 L1224_RS01180 -AQ244_RS03380 L1440_RS01180 -AQ244_RS03540 AQ244_RS03540 -AQ244_RS03540 BKB92_RS01365 -AQ244_RS03540 CBP42_RS02755 -AQ244_RS03540 SOTONIA3_RS01375 -AQ244_RS03540 CTB_RS01385 -AQ244_RS03540 E150_RS01355 -AQ244_RS03540 AQ193_RS02635 -AQ244_RS03540 L2BUCH2_RS01345 -AQ244_RS03540 CTO_RS01385 -AQ244_RS03540 FCS84708_RS01355 -AQ244_RS03540 AP288_RS04425 -AQ244_RS03540 BKB93_RS01365 -AQ244_RS03540 CBP44_RS02760 -AQ244_RS03540 AQ199_RS02050 -AQ244_RS03540 L2BLST_RS01345 -AQ244_RS03540 BBV13_RS01395 -AQ244_RS03540 BW688_RS02760 -AQ244_RS03540 G9768_RS01365 -AQ244_RS03540 BKC02_RS01365 -AQ244_RS03540 BBV16_RS01395 -AQ244_RS03540 L3404_RS01340 -AQ244_RS03540 AKW53_RS02850 -AQ244_RS03540 BKC01_RS01365 -AQ244_RS03540 gnl|Prokka|PADJNBJD_00267 -AQ244_RS03540 DU10_RS01375 -AQ244_RS03540 NILJEPDF_00267 -AQ244_RS03540 LJHENM_01345 -AQ244_RS03540 BKC03_RS01365 -AQ244_RS03540 CTRC943_RS01345 -AQ244_RS03540 CTJTET1_RS01375 -AQ244_RS03540 KW39_RS01365 -AQ244_RS03540 JIEJKO_01345 -AQ244_RS03540 120464 -AQ244_RS03540 C15_RS0101395 -AQ244_RS03540 SOTONK1_RS01360 -AQ244_RS03540 ECS88FINAL_RS0101380 -AQ244_RS03540 QSDFRQ_00267 -AQ244_RS03540 A5291_RS01385 -AQ244_RS03540 O169_RS01365 -AQ244_RS03540 IaCS19096_RS01360 -AQ244_RS03540 AOT15_RS01005 -AQ244_RS03540 DU13_RS01375 -AQ244_RS03540 7618902 -AQ244_RS03540 SW2_RS01355 -AQ244_RS03540 BKB95_RS01380 -AQ244_RS03540 CBP48_RS02755 -AQ244_RS03540 KW36_RS01360 -AQ244_RS03540 ECS102511_RS01355 -AQ244_RS03540 BKB96_RS01365 -AQ244_RS03540 CTL2C_RS02710 -AQ244_RS03540 BKB99_RS01365 -AQ244_RS03540 L1224_RS01340 -AQ244_RS03540 L1440_RS01340 -AQ244_RS03705 AQ244_RS03705 -AQ244_RS03705 CBP42_RS02915 -AQ244_RS03705 SOTONIA3_RS01535 -AQ244_RS03705 AQ193_RS02470 -AQ244_RS03705 BKB92_RS01530 -AQ244_RS03705 CTB_RS01550 -AQ244_RS03705 E150_RS01520 -AQ244_RS03705 L2BUCH2_RS01505 -AQ244_RS03705 CTO_RS01545 -AQ244_RS03705 FCS84708_RS01515 -AQ244_RS03705 AP288_RS04585 -AQ244_RS03705 BKB93_RS01530 -AQ244_RS03705 CBP44_RS02920 -AQ244_RS03705 AQ199_RS02210 -AQ244_RS03705 L2BLST_RS01505 -AQ244_RS03705 BBV13_RS01555 -AQ244_RS03705 BW688_RS02925 -AQ244_RS03705 G9768_RS01525 -AQ244_RS03705 BKC02_RS01525 -AQ244_RS03705 AKW53_RS03015 -AQ244_RS03705 BBV16_RS01555 -AQ244_RS03705 L3404_RS01500 -AQ244_RS03705 BKC01_RS01530 -AQ244_RS03705 gnl|Prokka|PADJNBJD_00299 -AQ244_RS03705 NILJEPDF_00299 -AQ244_RS03705 LJHENM_01505 -AQ244_RS03705 BKC03_RS01525 -AQ244_RS03705 DU10_RS01540 -AQ244_RS03705 CTRC943_RS01505 -AQ244_RS03705 CTJTET1_RS01535 -AQ244_RS03705 KW39_RS01525 -AQ244_RS03705 JIEJKO_01505 -AQ244_RS03705 C15_RS0101570 -AQ244_RS03705 SOTONK1_RS01525 -AQ244_RS03705 ECS88FINAL_RS0101550 -AQ244_RS03705 120435 -AQ244_RS03705 QSDFRQ_00299 -AQ244_RS03705 IaCS19096_RS01520 -AQ244_RS03705 A5291_RS01550 -AQ244_RS03705 O169_RS01530 -AQ244_RS03705 DU13_RS01535 -AQ244_RS03705 SW2_RS01515 -AQ244_RS03705 BKB95_RS01540 -AQ244_RS03705 CBP48_RS02915 -AQ244_RS03705 7618920 -AQ244_RS03705 KW36_RS01520 -AQ244_RS03705 ECS102511_RS01515 -AQ244_RS03705 AOT15_RS02520 -AQ244_RS03705 BKB96_RS01525 -AQ244_RS03705 CTL2C_RS02870 -AQ244_RS03705 BKB99_RS01525 -AQ244_RS03705 L1224_RS01500 -AQ244_RS03705 L1440_RS01500 -AQ244_RS04920 AQ244_RS04920 -AQ244_RS04920 AOT15_RS03390 -AQ244_RS04920 A5291_RS04845 -AQ244_RS04920 SOTONK1_RS04815 -AQ244_RS04920 IaCS19096_RS04800 -AQ244_RS04920 L1224_RS04795 -AQ244_RS04920 ECS102511_RS04805 -AQ244_RS04920 CTO_RS04800 -AQ244_RS04920 L2BUCH2_RS04795 -AQ244_RS04920 gnl|Prokka|PADJNBJD_00937 -AQ244_RS04920 SOTONIA3_RS04830 -AQ244_RS04920 BBV13_RS04840 -AQ244_RS04920 L2BLST_RS04795 -AQ244_RS04920 BBV16_RS04845 -AQ244_RS04920 FCS84708_RS04800 -AQ244_RS04920 AQ193_RS04785 -AQ244_RS04920 AQ199_RS04800 -AQ244_RS04920 NILJEPDF_00943 -AQ244_RS04920 L3404_RS04790 -AQ244_RS04920 QSDFRQ_00943 -AQ244_RS04920 AP288_RS04845 -BBV13_RS00280 BBV13_RS00280 -BBV13_RS00280 AQ199_RS00970 -BBV13_RS00280 BW688_RS01670 -BBV13_RS00280 G9768_RS00275 -BBV13_RS00280 L2BLST_RS00275 -BBV13_RS00280 BKC02_RS00280 -BBV13_RS00280 BBV16_RS00280 -BBV13_RS00280 gnl|Prokka|PADJNBJD_00054 -BBV13_RS00280 NILJEPDF_00054 -BBV13_RS00280 LJHENM_00275 -BBV13_RS00280 JIEJKO_00270 -BBV13_RS00280 BKC01_RS00280 -BBV13_RS00280 A5291_RS00275 -BBV13_RS00280 SOTONK1_RS00275 -BBV13_RS00280 L3404_RS00275 -BBV13_RS00280 AKW53_RS01765 -BBV13_RS00280 QSDFRQ_00054 -BBV13_RS00280 IaCS19096_RS00275 -BBV13_RS00280 AQ193_RS03720 -BBV13_RS00280 AQ244_RS01715 -BBV13_RS00280 BKC03_RS00280 -BBV13_RS00280 7618800 -BBV13_RS00280 C15_RS0100275 -BBV13_RS00280 DU10_RS00280 -BBV13_RS00280 CTRC943_RS00275 -BBV13_RS00280 CTJTET1_RS00275 -BBV13_RS00280 O169_RS00275 -BBV13_RS00280 KW36_RS00275 -BBV13_RS00280 DU13_RS00285 -BBV13_RS00280 CBP48_RS01670 -BBV13_RS00280 ECS88FINAL_RS0100280 -BBV13_RS00280 KW39_RS00275 -BBV13_RS00280 BKB95_RS00280 -BBV13_RS00280 SW2_RS00275 -BBV13_RS00280 ECS102511_RS00275 -BBV13_RS00280 CTL2C_RS01640 -BBV13_RS00280 CBP42_RS01670 -BBV13_RS00280 CTB_RS00275 -BBV13_RS00280 BKB96_RS00280 -BBV13_RS00280 L1224_RS00275 -BBV13_RS00280 BKB99_RS00280 -BBV13_RS00280 L1440_RS00275 -BBV13_RS00280 BKB92_RS00280 -BBV13_RS00280 CTO_RS00275 -BBV13_RS00280 SOTONIA3_RS00275 -BBV13_RS00280 AOT15_RS00680 -BBV13_RS00280 120632 -BBV13_RS00280 CBP44_RS01675 -BBV13_RS00280 E150_RS00275 -BBV13_RS00280 L2BUCH2_RS00275 -BBV13_RS00280 BKB93_RS00280 -BBV13_RS00280 FCS84708_RS00275 -BBV13_RS00280 AP288_RS03345 -BBV16_RS00085 BBV16_RS00085 -BBV16_RS00085 BKC01_RS00085 -BBV16_RS00085 7618360 -BBV16_RS00085 gnl|Prokka|PADJNBJD_00017 -BBV16_RS00085 LJHENM_00085 -BBV16_RS00085 A5291_RS00085 -BBV16_RS00085 SOTONK1_RS00085 -BBV16_RS00085 JIEJKO_00080 -BBV16_RS00085 NILJEPDF_00017 -BBV16_RS00085 L3404_RS00085 -BBV16_RS00085 IaCS19096_RS00085 -BBV16_RS00085 BKC03_RS00085 -BBV16_RS00085 C15_RS0100085 -BBV16_RS00085 AKW53_RS01570 -BBV16_RS00085 QSDFRQ_00017 -BBV16_RS00085 CTJTET1_RS00085 -BBV16_RS00085 DU10_RS00085 -BBV16_RS00085 CTRC943_RS00085 -BBV16_RS00085 O169_RS00085 -BBV16_RS00085 CBP48_RS01475 -BBV16_RS00085 ECS88FINAL_RS0100090 -BBV16_RS00085 DU13_RS00085 -BBV16_RS00085 KW39_RS00085 -BBV16_RS00085 BKB95_RS00085 -BBV16_RS00085 KW36_RS00085 -BBV16_RS00085 SW2_RS00085 -BBV16_RS00085 AQ193_RS03920 -BBV16_RS00085 ECS102511_RS00085 -BBV16_RS00085 AQ244_RS01905 -BBV16_RS00085 CTB_RS00085 -BBV16_RS00085 CTL2C_RS01450 -BBV16_RS00085 CBP42_RS01475 -BBV16_RS00085 L1224_RS00085 -BBV16_RS00085 BKB96_RS00085 -BBV16_RS00085 BKB99_RS00085 -BBV16_RS00085 CTO_RS00085 -BBV16_RS00085 SOTONIA3_RS00085 -BBV16_RS00085 L1440_RS00085 -BBV16_RS00085 BKB92_RS00085 -BBV16_RS00085 119213 -BBV16_RS00085 CBP44_RS01480 -BBV16_RS00085 E150_RS00085 -BBV16_RS00085 L2BUCH2_RS00085 -BBV16_RS00085 BKB93_RS00085 -BBV16_RS00085 FCS84708_RS00085 -BBV16_RS00085 AP288_RS03155 -BBV16_RS00085 BBV13_RS00085 -BBV16_RS00085 G9768_RS00085 -BBV16_RS00085 AOT15_RS00870 -BBV16_RS00085 AQ199_RS00780 -BBV16_RS00085 BW688_RS01475 -BBV16_RS00085 L2BLST_RS00085 -BBV16_RS00085 BKC02_RS00085 -BBV16_RS00770 BBV16_RS00770 -BBV16_RS00770 BKC02_RS00770 -BBV16_RS00770 gnl|Prokka|PADJNBJD_00150 -BBV16_RS00770 LJHENM_00750 -BBV16_RS00770 AKW53_RS02255 -BBV16_RS00770 BKC01_RS00770 -BBV16_RS00770 NILJEPDF_00150 -BBV16_RS00770 A5291_RS00765 -BBV16_RS00770 L3404_RS00760 -BBV16_RS00770 SOTONK1_RS00760 -BBV16_RS00770 JIEJKO_00755 -BBV16_RS00770 QSDFRQ_00150 -BBV16_RS00770 CTJTET1_RS00760 -BBV16_RS00770 IaCS19096_RS00760 -BBV16_RS00770 BKC03_RS00770 -BBV16_RS00770 C15_RS0100785 -BBV16_RS00770 CTRC943_RS00760 -BBV16_RS00770 ECS88FINAL_RS0100785 -BBV16_RS00770 KW39_RS00760 -BBV16_RS00770 DU10_RS00770 -BBV16_RS00770 O169_RS00760 -BBV16_RS00770 DU13_RS00775 -BBV16_RS00770 KW36_RS00760 -BBV16_RS00770 CBP48_RS02160 -BBV16_RS00770 SW2_RS00760 -BBV16_RS00770 BKB95_RS00770 -BBV16_RS00770 7618436 -BBV16_RS00770 ECS102511_RS00760 -BBV16_RS00770 AQ193_RS03235 -BBV16_RS00770 CTL2C_RS02125 -BBV16_RS00770 CTB_RS00765 -BBV16_RS00770 L1224_RS00760 -BBV16_RS00770 AQ244_RS02935 -BBV16_RS00770 BKB96_RS00770 -BBV16_RS00770 CBP42_RS02160 -BBV16_RS00770 BKB99_RS00770 -BBV16_RS00770 CTO_RS00765 -BBV16_RS00770 L1440_RS00760 -BBV16_RS00770 BKB92_RS00770 -BBV16_RS00770 SOTONIA3_RS00760 -BBV16_RS00770 E150_RS00760 -BBV16_RS00770 L2BUCH2_RS00760 -BBV16_RS00770 CBP44_RS02165 -BBV16_RS00770 FCS84708_RS00760 -BBV16_RS00770 AP288_RS03830 -BBV16_RS00770 BKB93_RS00770 -BBV16_RS00770 119330 -BBV16_RS00770 AOT15_RS00195 -BBV16_RS00770 AQ199_RS01455 -BBV16_RS00770 BBV13_RS00770 -BBV16_RS00770 G9768_RS00760 -BBV16_RS00770 L2BLST_RS00760 -BBV16_RS00770 BW688_RS02160 -BW688_RS01665 BW688_RS01665 -BW688_RS01665 7618799 -BW688_RS01665 CTRC943_RS00270 -BW688_RS01665 CBP48_RS01665 -BW688_RS01665 CTL2C_RS01635 -BW688_RS01665 CBP42_RS01665 -BW688_RS01665 L1440_RS00270 -BW688_RS01665 CBP44_RS01670 -BW688_RS01665 BBV13_RS00275 -BW688_RS01665 BBV16_RS00275 -BW688_RS01665 A5291_RS00270 -BW688_RS01665 CTB_RS00270 -BW688_RS01665 CTO_RS00270 -BW688_RS01665 AQ199_RS00965 -BW688_RS01665 G9768_RS00270 -BW688_RS01665 BKC02_RS00275 -BW688_RS01665 gnl|Prokka|PADJNBJD_00053 -BW688_RS01665 NILJEPDF_00053 -BW688_RS01665 LJHENM_00270 -BW688_RS01665 JIEJKO_00265 -BW688_RS01665 BKC01_RS00275 -BW688_RS01665 SOTONK1_RS00270 -BW688_RS01665 QSDFRQ_00053 -BW688_RS01665 IaCS19096_RS00270 -BW688_RS01665 BKC03_RS00275 -BW688_RS01665 C15_RS0100270 -BW688_RS01665 DU10_RS00275 -BW688_RS01665 CTJTET1_RS00270 -BW688_RS01665 AQ193_RS03725 -BW688_RS01665 AQ244_RS01720 -BW688_RS01665 O169_RS00270 -BW688_RS01665 DU13_RS00280 -BW688_RS01665 KW39_RS00270 -BW688_RS01665 BKB95_RS00275 -BW688_RS01665 SW2_RS00270 -BW688_RS01665 BKB96_RS00275 -BW688_RS01665 BKB99_RS00275 -BW688_RS01665 BKB92_RS00275 -BW688_RS01665 SOTONIA3_RS00270 -BW688_RS01665 120633 -BW688_RS01665 E150_RS00270 -BW688_RS01665 AOT15_RS00685 -BW688_RS01665 BKB93_RS00275 -BW688_RS01665 FCS84708_RS00270 -BW688_RS01665 AP288_RS03340 -BW688_RS01665 L3404_RS00270 -BW688_RS01665 L2BLST_RS00270 -BW688_RS01665 L1224_RS00270 -BW688_RS01665 L2BUCH2_RS00270 -BW688_RS01665 ECS102511_RS00270 -BW688_RS01665 AKW53_RS01760 -BW688_RS04430 BW688_RS04430 -BW688_RS04430 L2BLST_RS02975 -BW688_RS04430 CBP44_RS04435 -BW688_RS04430 L3404_RS02970 -BW688_RS04430 CTRC943_RS02975 -BW688_RS04430 CTL2C_RS04345 -BW688_RS04430 CBP48_RS04435 -BW688_RS04430 L1224_RS02975 -BW688_RS04430 7618623 -BW688_RS04430 L1440_RS02975 -BW688_RS04430 CBP42_RS04440 -BW688_RS04430 L2BUCH2_RS02975 -BW688_RS04430 CTB_RS03035 -BW688_RS04430 SOTONIA3_RS03020 -BW688_RS04430 BKB92_RS03035 -BW688_RS04430 119627 -BW688_RS04430 E150_RS03005 -BW688_RS04430 CTO_RS03035 -BW688_RS04430 FCS84708_RS03000 -BW688_RS04430 AQ193_RS00985 -BW688_RS04430 BBV13_RS03040 -BW688_RS04430 AQ199_RS03700 -BW688_RS04430 BBV16_RS03050 -BW688_RS04430 BKB93_RS03040 -BW688_RS04430 G9768_RS03005 -BW688_RS04430 gnl|Prokka|PADJNBJD_00592 -BW688_RS04430 BKC02_RS03035 -BW688_RS04430 NILJEPDF_00592 -BW688_RS04430 LJHENM_02975 -BW688_RS04430 AOT15_RS03805 -BW688_RS04430 BKC01_RS03035 -BW688_RS04430 QSDFRQ_00592 -BW688_RS04430 JIEJKO_02985 -BW688_RS04430 SOTONK1_RS03005 -BW688_RS04430 CTJTET1_RS03015 -BW688_RS04430 BKC03_RS03035 -BW688_RS04430 KW39_RS03015 -BW688_RS04430 C15_RS0103070 -BW688_RS04430 ECS88FINAL_RS0103065 -BW688_RS04430 IaCS19096_RS03000 -BW688_RS04430 DU10_RS03050 -BW688_RS04430 A5291_RS03035 -BW688_RS04430 O169_RS03010 -BW688_RS04430 AP288_RS00080 -BW688_RS04430 DU13_RS03045 -BW688_RS04430 KW36_RS03000 -BW688_RS04430 BKB95_RS03045 -BW688_RS04430 AKW53_RS04230 -BW688_RS04430 BKB96_RS03040 -BW688_RS04430 BKB99_RS03035 -BW688_RS04430 SW2_RS03005 -BW688_RS04430 ECS102511_RS03000 -BW688_RS04430 AQ244_RS00105 -BKC02_RS04370 BKC02_RS04370 -BKC02_RS04370 CTRC943_RS04315 -BKC02_RS04370 AKW53_RS01050 -BKC02_RS04370 BKC01_RS04375 -BKC02_RS04370 AOT15_RS01915 -BKC02_RS04370 CTJTET1_RS04505 -BKC02_RS04370 CBP48_RS00940 -BKC02_RS04370 BKC03_RS04370 -BKC02_RS04370 A5291_RS04370 -BKC02_RS04370 KW39_RS04350 -BKC02_RS04370 SOTONK1_RS04335 -BKC02_RS04370 ECS88FINAL_RS0104425 -BKC02_RS04370 IaCS19096_RS04330 -BKC02_RS04370 DU10_RS04385 -BKC02_RS04370 C15_RS0104445 -BKC02_RS04370 DU13_RS04385 -BKC02_RS04370 O169_RS04345 -BKC02_RS04370 KW36_RS04335 -BKC02_RS04370 CBP42_RS00940 -BKC02_RS04370 CTL2C_RS00930 -BKC02_RS04370 L1224_RS04310 -BKC02_RS04370 BKB95_RS04390 -BKC02_RS04370 L1440_RS04305 -BKC02_RS04370 BKB96_RS04375 -BKC02_RS04370 AQ193_RS04440 -BKC02_RS04370 BKB99_RS04370 -BKC02_RS04370 SW2_RS04340 -BKC02_RS04370 ECS102511_RS04330 -BKC02_RS04370 AQ244_RS02415 -BKC02_RS04370 CBP44_RS00940 -BKC02_RS04370 L2BUCH2_RS04310 -BKC02_RS04370 CTB_RS04365 -BKC02_RS04370 SOTONIA3_RS04350 -BKC02_RS04370 BKB92_RS04370 -BKC02_RS04370 CTO_RS04360 -BKC02_RS04370 L2BLST_RS04310 -BKC02_RS04370 AP288_RS02635 -BKC02_RS04370 BBV13_RS04375 -BKC02_RS04370 E150_RS04340 -BKC02_RS04370 gnl|Prokka|PADJNBJD_00849 -BKC02_RS04370 FCS84708_RS04330 -BKC02_RS04370 AQ199_RS00260 -BKC02_RS04370 BW688_RS00940 -BKC02_RS04370 7618740 -BKC02_RS04370 119966 -BKC02_RS04370 NILJEPDF_00850 -BKC02_RS04370 LJHENM_04275 -BKC02_RS04370 L3404_RS04305 -BKC02_RS04370 G9768_RS04335 -BKC02_RS04370 JIEJKO_04275 -BKC02_RS04370 BKB93_RS04375 -BKC02_RS04370 QSDFRQ_00850 -BKC03_RS03460 BKC03_RS03460 -BKC03_RS03460 CBP48_RS00030 -BKC03_RS03460 CTJTET1_RS03445 -BKC03_RS03460 KW39_RS03445 -BKC03_RS03460 DU10_RS03475 -BKC03_RS03460 SOTONK1_RS03425 -BKC03_RS03460 ECS88FINAL_RS0103505 -BKC03_RS03460 IaCS19096_RS03420 -BKC03_RS03460 C15_RS0103500 -BKC03_RS03460 A5291_RS03470 -BKC03_RS03460 O169_RS03440 -BKC03_RS03460 DU13_RS03475 -BKC03_RS03460 AKW53_RS00175 -BKC03_RS03460 KW36_RS03425 -BKC03_RS03460 BKB95_RS03480 -BKC03_RS03460 CBP42_RS00030 -BKC03_RS03460 SW2_RS03435 -BKC03_RS03460 CTL2C_RS00030 -BKC03_RS03460 L1224_RS03410 -BKC03_RS03460 ECS102511_RS03425 -BKC03_RS03460 L1440_RS03410 -BKC03_RS03460 BKB96_RS03470 -BKC03_RS03460 BKB99_RS03465 -BKC03_RS03460 AQ244_RS04485 -BKC03_RS03460 CBP44_RS00030 -BKC03_RS03460 L2BUCH2_RS03410 -BKC03_RS03460 BKB92_RS03460 -BKC03_RS03460 CTB_RS03465 -BKC03_RS03460 SOTONIA3_RS03445 -BKC03_RS03460 E150_RS03435 -BKC03_RS03460 CTO_RS03460 -BKC03_RS03460 BBV13_RS03465 -BKC03_RS03460 FCS84708_RS03425 -BKC03_RS03460 AQ193_RS00560 -BKC03_RS03460 L2BLST_RS03410 -BKC03_RS03460 7618207 -BKC03_RS03460 BBV16_RS03475 -BKC03_RS03460 BW688_RS00030 -BKC03_RS03460 119686 -BKC03_RS03460 AQ199_RS04125 -BKC03_RS03460 BKB93_RS03465 -BKC03_RS03460 G9768_RS03425 -BKC03_RS03460 gnl|Prokka|PADJNBJD_00674 -BKC03_RS03460 L3404_RS03405 -BKC03_RS03460 BKC02_RS03460 -BKC03_RS03460 NILJEPDF_00675 -BKC03_RS03460 LJHENM_03390 -BKC03_RS03460 AOT15_RS04225 -BKC03_RS03460 AP288_RS01795 -BKC03_RS03460 JIEJKO_03395 -BKC03_RS03460 BKC01_RS03460 -BKC03_RS03460 QSDFRQ_00675 -BKC03_RS03460 CTRC943_RS03410 -BKC03_RS03625 BKC03_RS03625 -BKC03_RS03625 CBP48_RS00195 -BKC03_RS03625 CTJTET1_RS03615 -BKC03_RS03625 KW39_RS03610 -BKC03_RS03625 DU10_RS03640 -BKC03_RS03625 SOTONK1_RS03595 -BKC03_RS03625 ECS88FINAL_RS0103685 -BKC03_RS03625 IaCS19096_RS03590 -BKC03_RS03625 C15_RS0103675 -BKC03_RS03625 A5291_RS03640 -BKC03_RS03625 O169_RS03605 -BKC03_RS03625 DU13_RS03640 -BKC03_RS03625 KW36_RS03595 -BKC03_RS03625 AKW53_RS00340 -BKC03_RS03625 BKB95_RS03645 -BKC03_RS03625 CBP42_RS00195 -BKC03_RS03625 SW2_RS03600 -BKC03_RS03625 CTL2C_RS00195 -BKC03_RS03625 L1224_RS03575 -BKC03_RS03625 ECS102511_RS03590 -BKC03_RS03625 L1440_RS03575 -BKC03_RS03625 BKB96_RS03635 -BKC03_RS03625 BKB99_RS03630 -BKC03_RS03625 AQ244_RS04315 -BKC03_RS03625 CBP44_RS00195 -BKC03_RS03625 L2BUCH2_RS03575 -BKC03_RS03625 BKB92_RS03625 -BKC03_RS03625 CTB_RS03635 -BKC03_RS03625 SOTONIA3_RS03615 -BKC03_RS03625 E150_RS03600 -BKC03_RS03625 CTO_RS03630 -BKC03_RS03625 BBV13_RS03635 -BKC03_RS03625 FCS84708_RS03590 -BKC03_RS03625 AQ193_RS00395 -BKC03_RS03625 L2BLST_RS03575 -BKC03_RS03625 BW688_RS00195 -BKC03_RS03625 AQ199_RS04290 -BKC03_RS03625 BKB93_RS03630 -BKC03_RS03625 7618230 -BKC03_RS03625 119723 -BKC03_RS03625 G9768_RS03595 -BKC03_RS03625 gnl|Prokka|PADJNBJD_00707 -BKC03_RS03625 L3404_RS03570 -BKC03_RS03625 BKC02_RS03625 -BKC03_RS03625 NILJEPDF_00708 -BKC03_RS03625 LJHENM_03555 -BKC03_RS03625 AOT15_RS04395 -BKC03_RS03625 AP288_RS01960 -BKC03_RS03625 JIEJKO_03560 -BKC03_RS03625 BKC01_RS03625 -BKC03_RS03625 QSDFRQ_00708 -BKC03_RS03625 CTRC943_RS03580 -BKB95_RS01745 BKB95_RS01745 -BKB95_RS01745 KW36_RS04805 -BKB95_RS01745 AOT15_RS04895 -BKB95_RS01745 BKB96_RS01730 -BKB95_RS01745 SW2_RS04820 -BKB95_RS01745 BKB99_RS01730 -BKB95_RS01745 ECS102511_RS04835 -BKB95_RS01745 CTB_RS04845 -BKB95_RS01745 SOTONIA3_RS04880 -BKB95_RS01745 BKB92_RS01740 -BKB95_RS01745 AP288_RS04950 -BKB95_RS01745 CTO_RS04880 -BKB95_RS01745 E150_RS04825 -BKB95_RS01745 FCS84708_RS04835 -BKB95_RS01745 BKB93_RS01740 -BKB95_RS01745 AQ244_RS05150 -BKB95_RS01745 BBV13_RS04865 -BKB95_RS01745 AQ199_RS04935 -BKB95_RS01745 G9768_RS04820 -BKB95_RS01745 BBV16_RS04875 -BKB95_RS01745 BKC02_RS01730 -BKB95_RS01745 BKC01_RS01730 -BKB95_RS01745 AKW53_RS04850 -BKB95_RS01745 AQ193_RS04915 -BKB95_RS01745 BKC03_RS01730 -BKB95_RS01745 CTJTET1_RS04990 -BKB95_RS01745 DU10_RS01750 -BKB95_RS01745 C15_RS1000000105025 -BKB95_RS01745 SOTONK1_RS04855 -BKB95_RS01745 A5291_RS04900 -BKB95_RS01745 KW39_RS04835 -BKB95_RS01745 IaCS19096_RS04835 -BKB95_RS01745 ECS88FINAL_RS1000000105055 -BKB95_RS01745 O169_RS04820 -BKB95_RS01745 DU13_RS01745 -BKB95_RS03610 BKB95_RS03610 -BKB95_RS03610 CBP42_RS00160 -BKB95_RS03610 SW2_RS03565 -BKB95_RS03610 CTL2C_RS00160 -BKB95_RS03610 L1224_RS03540 -BKB95_RS03610 ECS102511_RS03555 -BKB95_RS03610 L1440_RS03540 -BKB95_RS03610 BKB96_RS03600 -BKB95_RS03610 BKB99_RS03595 -BKB95_RS03610 CBP44_RS00160 -BKB95_RS03610 L2BUCH2_RS03540 -BKB95_RS03610 BKB92_RS03590 -BKB95_RS03610 CTB_RS03600 -BKB95_RS03610 SOTONIA3_RS03580 -BKB95_RS03610 E150_RS03565 -BKB95_RS03610 CTO_RS03595 -BKB95_RS03610 BBV13_RS03600 -BKB95_RS03610 FCS84708_RS03555 -BKB95_RS03610 L2BLST_RS03540 -BKB95_RS03610 BBV16_RS03610 -BKB95_RS03610 BW688_RS00160 -BKB95_RS03610 AQ199_RS04255 -BKB95_RS03610 BKB93_RS03595 -BKB95_RS03610 7618671 -BKB95_RS03610 120074 -BKB95_RS03610 G9768_RS03560 -BKB95_RS03610 gnl|Prokka|PADJNBJD_00700 -BKB95_RS03610 L3404_RS03535 -BKB95_RS03610 AQ244_RS04350 -BKB95_RS03610 BKC02_RS03590 -BKB95_RS03610 NILJEPDF_00701 -BKB95_RS03610 LJHENM_03520 -BKB95_RS03610 AOT15_RS04360 -BKB95_RS03610 AP288_RS01925 -BKB95_RS03610 JIEJKO_03525 -BKB95_RS03610 BKC01_RS03590 -BKB95_RS03610 QSDFRQ_00701 -BKB95_RS03610 CTRC943_RS03545 -BKB95_RS03610 BKC03_RS03590 -BKB95_RS03610 CBP48_RS00160 -BKB95_RS03610 CTJTET1_RS03580 -BKB95_RS03610 KW39_RS03575 -BKB95_RS03610 AQ193_RS00430 -BKB95_RS03610 DU10_RS03605 -BKB95_RS03610 SOTONK1_RS03560 -BKB95_RS03610 ECS88FINAL_RS0103645 -BKB95_RS03610 IaCS19096_RS03555 -BKB95_RS03610 C15_RS0103635 -BKB95_RS03610 A5291_RS03605 -BKB95_RS03610 O169_RS03570 -BKB95_RS03610 DU13_RS03605 -BKB95_RS03610 KW36_RS03560 -BKB95_RS03610 AKW53_RS00305 -BKB95_RS03795 BKB95_RS03795 -BKB95_RS03795 CBP42_RS00345 -BKB95_RS03795 SW2_RS03745 -BKB95_RS03795 CTL2C_RS00340 -BKB95_RS03795 L1224_RS03720 -BKB95_RS03795 ECS102511_RS03735 -BKB95_RS03795 BKB96_RS03780 -BKB95_RS03795 BKB99_RS03775 -BKB95_RS03795 L1440_RS03720 -BKB95_RS03795 CBP44_RS00345 -BKB95_RS03795 L2BUCH2_RS03720 -BKB95_RS03795 BKB92_RS03775 -BKB95_RS03795 CTB_RS03780 -BKB95_RS03795 SOTONIA3_RS03760 -BKB95_RS03795 E150_RS03745 -BKB95_RS03795 CTO_RS03775 -BKB95_RS03795 BBV13_RS03780 -BKB95_RS03795 FCS84708_RS03735 -BKB95_RS03795 BBV16_RS03790 -BKB95_RS03795 L2BLST_RS03720 -BKB95_RS03795 119749 -BKB95_RS03795 BW688_RS00345 -BKB95_RS03795 7618247 -BKB95_RS03795 AQ199_RS04435 -BKB95_RS03795 BKB93_RS03780 -BKB95_RS03795 G9768_RS03740 -BKB95_RS03795 gnl|Prokka|PADJNBJD_00736 -BKB95_RS03795 L3404_RS03715 -BKB95_RS03795 BKC02_RS03775 -BKB95_RS03795 NILJEPDF_00737 -BKB95_RS03795 AQ244_RS04170 -BKB95_RS03795 LJHENM_03710 -BKB95_RS03795 AOT15_RS04540 -BKB95_RS03795 AP288_RS02110 -BKB95_RS03795 JIEJKO_03710 -BKB95_RS03795 BKC01_RS03780 -BKB95_RS03795 QSDFRQ_00737 -BKB95_RS03795 CTRC943_RS03725 -BKB95_RS03795 AKW53_RS00480 -BKB95_RS03795 AQ193_RS00250 -BKB95_RS03795 BKC03_RS03775 -BKB95_RS03795 CTJTET1_RS03760 -BKB95_RS03795 KW39_RS03755 -BKB95_RS03795 DU10_RS03790 -BKB95_RS03795 CBP48_RS00345 -BKB95_RS03795 A5291_RS03785 -BKB95_RS03795 SOTONK1_RS03740 -BKB95_RS03795 IaCS19096_RS03735 -BKB95_RS03795 DU13_RS03790 -BKB95_RS03795 C15_RS0103845 -BKB95_RS03795 ECS88FINAL_RS0103845 -BKB95_RS03795 O169_RS03750 -BKB95_RS03795 KW36_RS03740 -BKB95_RS03960 BKB95_RS03960 -BKB95_RS03960 CBP42_RS00510 -BKB95_RS03960 CTL2C_RS00505 -BKB95_RS03960 L1224_RS03885 -BKB95_RS03960 SW2_RS03910 -BKB95_RS03960 L1440_RS03880 -BKB95_RS03960 ECS102511_RS03900 -BKB95_RS03960 BKB96_RS03945 -BKB95_RS03960 BKB99_RS03940 -BKB95_RS03960 CBP44_RS00510 -BKB95_RS03960 L2BUCH2_RS03885 -BKB95_RS03960 BKB92_RS03940 -BKB95_RS03960 CTB_RS03945 -BKB95_RS03960 SOTONIA3_RS03925 -BKB95_RS03960 E150_RS03910 -BKB95_RS03960 CTO_RS03940 -BKB95_RS03960 BBV13_RS03945 -BKB95_RS03960 FCS84708_RS03900 -BKB95_RS03960 L2BLST_RS03885 -BKB95_RS03960 BBV16_RS03955 -BKB95_RS03960 7618260 -BKB95_RS03960 119769 -BKB95_RS03960 BW688_RS00510 -BKB95_RS03960 AQ199_RS04600 -BKB95_RS03960 BKB93_RS03945 -BKB95_RS03960 G9768_RS03905 -BKB95_RS03960 gnl|Prokka|PADJNBJD_00768 -BKB95_RS03960 L3404_RS03880 -BKB95_RS03960 NILJEPDF_00769 -BKB95_RS03960 BKC02_RS03940 -BKB95_RS03960 LJHENM_03870 -BKB95_RS03960 AQ244_RS04005 -BKB95_RS03960 AOT15_RS04705 -BKB95_RS03960 AP288_RS02275 -BKB95_RS03960 JIEJKO_03870 -BKB95_RS03960 QSDFRQ_00769 -BKB95_RS03960 BKC01_RS03945 -BKB95_RS03960 CTRC943_RS03890 -BKB95_RS03960 AKW53_RS00645 -BKB95_RS03960 AQ193_RS00085 -BKB95_RS03960 BKC03_RS03940 -BKB95_RS03960 CBP48_RS00510 -BKB95_RS03960 CTJTET1_RS03925 -BKB95_RS03960 KW39_RS03920 -BKB95_RS03960 DU10_RS03955 -BKB95_RS03960 A5291_RS03950 -BKB95_RS03960 SOTONK1_RS03905 -BKB95_RS03960 IaCS19096_RS03900 -BKB95_RS03960 DU13_RS03955 -BKB95_RS03960 C15_RS0104010 -BKB95_RS03960 ECS88FINAL_RS0104015 -BKB95_RS03960 O169_RS03915 -BKB95_RS03960 KW36_RS03905 -BKB95_RS04155 BKB95_RS04155 -BKB95_RS04155 CBP42_RS00705 -BKB95_RS04155 CTL2C_RS00700 -BKB95_RS04155 L1224_RS04080 -BKB95_RS04155 BKB96_RS04140 -BKB95_RS04155 SW2_RS04105 -BKB95_RS04155 L1440_RS04075 -BKB95_RS04155 ECS102511_RS04095 -BKB95_RS04155 BKB99_RS04135 -BKB95_RS04155 CBP44_RS00705 -BKB95_RS04155 CTB_RS04135 -BKB95_RS04155 L2BUCH2_RS04080 -BKB95_RS04155 BKB92_RS04135 -BKB95_RS04155 SOTONIA3_RS04120 -BKB95_RS04155 CTO_RS04130 -BKB95_RS04155 AP288_RS02400 -BKB95_RS04155 E150_RS04105 -BKB95_RS04155 BBV13_RS04140 -BKB95_RS04155 119994 -BKB95_RS04155 FCS84708_RS04095 -BKB95_RS04155 AQ199_RS00025 -BKB95_RS04155 7618722 -BKB95_RS04155 L2BLST_RS04080 -BKB95_RS04155 BBV16_RS04150 -BKB95_RS04155 BW688_RS00705 -BKB95_RS04155 gnl|Prokka|PADJNBJD_00805 -BKB95_RS04155 BKB93_RS04140 -BKB95_RS04155 NILJEPDF_00806 -BKB95_RS04155 G9768_RS04100 -BKB95_RS04155 L3404_RS04075 -BKB95_RS04155 LJHENM_04055 -BKB95_RS04155 JIEJKO_04055 -BKB95_RS04155 BKC02_RS04135 -BKB95_RS04155 QSDFRQ_00806 -BKB95_RS04155 AKW53_RS00815 -BKB95_RS04155 BKC01_RS04140 -BKB95_RS04155 CTRC943_RS04085 -BKB95_RS04155 AOT15_RS01685 -BKB95_RS04155 CTJTET1_RS04275 -BKB95_RS04155 KW39_RS04115 -BKB95_RS04155 BKC03_RS04135 -BKB95_RS04155 CBP48_RS00705 -BKB95_RS04155 A5291_RS04140 -BKB95_RS04155 ECS88FINAL_RS0104185 -BKB95_RS04155 DU10_RS04150 -BKB95_RS04155 SOTONK1_RS04100 -BKB95_RS04155 IaCS19096_RS04095 -BKB95_RS04155 DU13_RS04150 -BKB95_RS04155 C15_RS0104210 -BKB95_RS04155 O169_RS04110 -BKB95_RS04155 KW36_RS04100 -BKB95_RS04155 AQ193_RS04675 -BKB95_RS04155 AQ244_RS02665 -BKB95_RS04495 BKB95_RS04495 -BKB95_RS04495 CBP42_RS01050 -BKB95_RS04495 CTL2C_RS01030 -BKB95_RS04495 L1224_RS04410 -BKB95_RS04495 BKB96_RS04480 -BKB95_RS04495 L1440_RS04405 -BKB95_RS04495 BKB99_RS04475 -BKB95_RS04495 SW2_RS04440 -BKB95_RS04495 ECS102511_RS04435 -BKB95_RS04495 CBP44_RS01050 -BKB95_RS04495 CTB_RS04460 -BKB95_RS04495 L2BUCH2_RS04410 -BKB95_RS04495 SOTONIA3_RS04445 -BKB95_RS04495 CTO_RS04455 -BKB95_RS04495 BKB92_RS04480 -BKB95_RS04495 AP288_RS02740 -BKB95_RS04495 BBV13_RS04470 -BKB95_RS04495 E150_RS04445 -BKB95_RS04495 gnl|Prokka|PADJNBJD_00868 -BKB95_RS04495 L2BLST_RS04410 -BKB95_RS04495 BBV16_RS04475 -BKB95_RS04495 FCS84708_RS04430 -BKB95_RS04495 AQ199_RS00365 -BKB95_RS04495 119957 -BKB95_RS04495 NILJEPDF_00869 -BKB95_RS04495 BW688_RS01050 -BKB95_RS04495 7618746 -BKB95_RS04495 LJHENM_04375 -BKB95_RS04495 JIEJKO_04370 -BKB95_RS04495 QSDFRQ_00869 -BKB95_RS04495 G9768_RS04430 -BKB95_RS04495 L3404_RS04405 -BKB95_RS04495 BKB93_RS04485 -BKB95_RS04495 BKC02_RS04475 -BKB95_RS04495 AKW53_RS01155 -BKB95_RS04495 BKC01_RS04480 -BKB95_RS04495 CTRC943_RS04415 -BKB95_RS04495 AOT15_RS02010 -BKB95_RS04495 CTJTET1_RS04600 -BKB95_RS04495 KW39_RS04450 -BKB95_RS04495 BKC03_RS04475 -BKB95_RS04495 CBP48_RS01050 -BKB95_RS04495 A5291_RS04465 -BKB95_RS04495 SOTONK1_RS04430 -BKB95_RS04495 ECS88FINAL_RS0104525 -BKB95_RS04495 IaCS19096_RS04425 -BKB95_RS04495 C15_RS0104545 -BKB95_RS04495 AQ193_RS04335 -BKB95_RS04495 DU10_RS04495 -BKB95_RS04495 O169_RS04450 -BKB95_RS04495 KW36_RS04430 -BKB95_RS04495 DU13_RS04495 -BKB95_RS04495 AQ244_RS02320 -BKB96_RS02400 BKB96_RS02400 -BKB96_RS02400 BKB99_RS02395 -BKB96_RS02400 CBP48_RS03800 -BKB96_RS02400 120279 -BKB96_RS02400 CTL2C_RS03730 -BKB96_RS02400 KW36_RS02375 -BKB96_RS02400 BKB95_RS02415 -BKB96_RS02400 L1224_RS02360 -BKB96_RS02400 SW2_RS02385 -BKB96_RS02400 ECS102511_RS02380 -BKB96_RS02400 L1440_RS02360 -BKB96_RS02400 CBP42_RS03810 -BKB96_RS02400 CTB_RS02410 -BKB96_RS02400 L2BUCH2_RS02355 -BKB96_RS02400 BKB92_RS02405 -BKB96_RS02400 SOTONIA3_RS02395 -BKB96_RS02400 AP288_RS00700 -BKB96_RS02400 CTO_RS02410 -BKB96_RS02400 E150_RS02385 -BKB96_RS02400 BW688_RS03795 -BKB96_RS02400 L2BLST_RS02360 -BKB96_RS02400 FCS84708_RS02375 -BKB96_RS02400 BBV13_RS02415 -BKB96_RS02400 CBP44_RS03805 -BKB96_RS02400 BKB93_RS02410 -BKB96_RS02400 AQ244_RS00730 -BKB96_RS02400 AQ199_RS03075 -BKB96_RS02400 G9768_RS02380 -BKB96_RS02400 BBV16_RS02420 -BKB96_RS02400 L3404_RS02355 -BKB96_RS02400 BKC02_RS02395 -BKB96_RS02400 AKW53_RS03880 -BKB96_RS02400 BKC01_RS02395 -BKB96_RS02400 gnl|Prokka|PADJNBJD_00470 -BKB96_RS02400 NILJEPDF_00470 -BKB96_RS02400 LJHENM_02370 -BKB96_RS02400 CTRC943_RS02360 -BKB96_RS02400 AQ193_RS01605 -BKB96_RS02400 JIEJKO_02370 -BKB96_RS02400 BKC03_RS02395 -BKB96_RS02400 QSDFRQ_00470 -BKB96_RS02400 CTJTET1_RS02390 -BKB96_RS02400 AOT15_RS00005 -BKB96_RS02400 C15_RS0102430 -BKB96_RS02400 SOTONK1_RS02380 -BKB96_RS02400 DU10_RS02420 -BKB96_RS02400 A5291_RS02410 -BKB96_RS02400 KW39_RS02390 -BKB96_RS02400 IaCS19096_RS02375 -BKB96_RS02400 ECS88FINAL_RS0102430 -BKB96_RS02400 O169_RS02390 -BKB96_RS02400 DU13_RS02415 -BKB96_RS02400 7619011 -BKB92_RS03375 BKB92_RS03375 -BKB92_RS03375 CTB_RS03385 -BKB92_RS03375 E150_RS03355 -BKB92_RS03375 SOTONIA3_RS03365 -BKB92_RS03375 AQ193_RS00640 -BKB92_RS03375 CTO_RS03380 -BKB92_RS03375 FCS84708_RS03345 -BKB92_RS03375 BBV13_RS03385 -BKB92_RS03375 120104 -BKB92_RS03375 AQ199_RS04045 -BKB92_RS03375 BBV16_RS03395 -BKB92_RS03375 BKB93_RS03380 -BKB92_RS03375 G9768_RS03345 -BKB92_RS03375 gnl|Prokka|PADJNBJD_00658 -BKB92_RS03375 AP288_RS01715 -BKB92_RS03375 BKC02_RS03375 -BKB92_RS03375 NILJEPDF_00659 -BKB92_RS03375 LJHENM_03310 -BKB92_RS03375 AOT15_RS04145 -BKB92_RS03375 JIEJKO_03315 -BKB92_RS03375 BKC01_RS03375 -BKB92_RS03375 QSDFRQ_00659 -BKB92_RS03375 KW39_RS03365 -BKB92_RS03375 BKC03_RS03375 -BKB92_RS03375 DU10_RS03390 -BKB92_RS03375 CTJTET1_RS03365 -BKB92_RS03375 ECS88FINAL_RS0103410 -BKB92_RS03375 SOTONK1_RS03345 -BKB92_RS03375 O169_RS03360 -BKB92_RS03375 IaCS19096_RS03340 -BKB92_RS03375 DU13_RS03390 -BKB92_RS03375 C15_RS0103410 -BKB92_RS03375 A5291_RS03390 -BKB92_RS03375 AKW53_RS00095 -BKB92_RS03375 KW36_RS03345 -BKB92_RS03375 SW2_RS03355 -BKB92_RS03375 ECS102511_RS03345 -BKB92_RS03375 BKB95_RS03395 -BKB92_RS03375 AQ244_RS04565 -BKB92_RS03375 BKB96_RS03385 -BKB92_RS03375 BKB99_RS03380 -BKB92_RS03375 L2BUCH2_RS03325 -BKB92_RS03375 BW688_RS04770 -BKB92_RS03375 L2BLST_RS03325 -BKB92_RS03375 CBP44_RS04775 -BKB92_RS03375 L3404_RS03320 -BKB92_RS03375 CTRC943_RS03325 -BKB92_RS03375 CTL2C_RS04695 -BKB92_RS03375 CBP48_RS04775 -BKB92_RS03375 L1224_RS03325 -BKB92_RS03375 7619120 -BKB92_RS03375 L1440_RS03325 -BKB92_RS03375 CBP42_RS04780 -BKC01_RS01610 BKC01_RS01610 -BKC01_RS01610 gnl|Prokka|PADJNBJD_00315 -BKC01_RS01610 NILJEPDF_00315 -BKC01_RS01610 CTRC943_RS01585 -BKC01_RS01610 BKC03_RS01605 -BKC01_RS01610 DU10_RS01620 -BKC01_RS01610 CTJTET1_RS01615 -BKC01_RS01610 KW39_RS01605 -BKC01_RS01610 JIEJKO_01585 -BKC01_RS01610 C15_RS0101645 -BKC01_RS01610 SOTONK1_RS01605 -BKC01_RS01610 ECS88FINAL_RS0101625 -BKC01_RS01610 120416 -BKC01_RS01610 QSDFRQ_00315 -BKC01_RS01610 IaCS19096_RS01600 -BKC01_RS01610 A5291_RS01630 -BKC01_RS01610 CBP48_RS02995 -BKC01_RS01610 7618932 -BKC01_RS01610 SW2_RS01595 -BKC01_RS01610 BKB95_RS01620 -BKC01_RS01610 CTL2C_RS02950 -BKC01_RS01610 KW36_RS01600 -BKC01_RS01610 ECS102511_RS01595 -BKC01_RS01610 AOT15_RS02600 -BKC01_RS01610 BKB96_RS01605 -BKC01_RS01610 L1224_RS01580 -BKC01_RS01610 BKB99_RS01605 -BKC01_RS01610 L1440_RS01580 -BKC01_RS01610 CBP42_RS02995 -BKC01_RS01610 AQ244_RS03785 -BKC01_RS01610 SOTONIA3_RS01615 -BKC01_RS01610 AQ193_RS02390 -BKC01_RS01610 BKB92_RS01610 -BKC01_RS01610 CTB_RS01630 -BKC01_RS01610 E150_RS01600 -BKC01_RS01610 L2BUCH2_RS01585 -BKC01_RS01610 CTO_RS01625 -BKC01_RS01610 AP288_RS04665 -BKC01_RS01610 CBP44_RS03000 -BKC01_RS01610 BKB93_RS01610 -BKC01_RS01610 L2BLST_RS01585 -BKC01_RS01610 AQ199_RS02290 -BKC01_RS01610 BW688_RS03005 -BKC01_RS01610 BBV13_RS01635 -BKC01_RS01610 G9768_RS01605 -BKC01_RS01610 BKC02_RS01605 -BKC01_RS01610 L3404_RS01580 -BKC01_RS01610 AKW53_RS03095 -BKC01_RS01610 BBV16_RS01635 -BKC01_RS01610 LJHENM_01585 -BKC01_RS01610 O169_RS01610 -BKC01_RS01610 DU13_RS01615 -BKC01_RS01610 FCS84708_RS01595 -BKC01_RS02290 BKC01_RS02290 -BKC01_RS02290 AP288_RS00805 -BKC01_RS02290 gnl|Prokka|PADJNBJD_00449 -BKC01_RS02290 AKW53_RS03775 -BKC01_RS02290 NILJEPDF_00449 -BKC01_RS02290 LJHENM_02265 -BKC01_RS02290 CTRC943_RS02255 -BKC01_RS02290 JIEJKO_02265 -BKC01_RS02290 BKC03_RS02290 -BKC01_RS02290 QSDFRQ_00449 -BKC01_RS02290 CTJTET1_RS02285 -BKC01_RS02290 AQ244_RS00835 -BKC01_RS02290 C15_RS0102320 -BKC01_RS02290 SOTONK1_RS02275 -BKC01_RS02290 DU10_RS02315 -BKC01_RS02290 A5291_RS02305 -BKC01_RS02290 KW39_RS02285 -BKC01_RS02290 IaCS19096_RS02270 -BKC01_RS02290 ECS88FINAL_RS0102320 -BKC01_RS02290 O169_RS02285 -BKC01_RS02290 DU13_RS02310 -BKC01_RS02290 7618572 -BKC01_RS02290 BKB96_RS02295 -BKC01_RS02290 BKB99_RS02290 -BKC01_RS02290 CBP48_RS03695 -BKC01_RS02290 119548 -BKC01_RS02290 CTL2C_RS03625 -BKC01_RS02290 KW36_RS02270 -BKC01_RS02290 AOT15_RS03270 -BKC01_RS02290 BKB95_RS02310 -BKC01_RS02290 L1224_RS02255 -BKC01_RS02290 AQ193_RS01710 -BKC01_RS02290 SW2_RS02280 -BKC01_RS02290 ECS102511_RS02275 -BKC01_RS02290 L1440_RS02255 -BKC01_RS02290 CBP42_RS03705 -BKC01_RS02290 CTB_RS02305 -BKC01_RS02290 L2BUCH2_RS02250 -BKC01_RS02290 BKB92_RS02300 -BKC01_RS02290 SOTONIA3_RS02290 -BKC01_RS02290 CTO_RS02305 -BKC01_RS02290 E150_RS02280 -BKC01_RS02290 BW688_RS03690 -BKC01_RS02290 L2BLST_RS02255 -BKC01_RS02290 FCS84708_RS02270 -BKC01_RS02290 BBV13_RS02310 -BKC01_RS02290 CBP44_RS03700 -BKC01_RS02290 BKB93_RS02305 -BKC01_RS02290 AQ199_RS02970 -BKC01_RS02290 G9768_RS02275 -BKC01_RS02290 BBV16_RS02315 -BKC01_RS02290 L3404_RS02250 -BKC01_RS02290 BKC02_RS02290 -DU10_RS00935 DU10_RS00935 -DU10_RS00935 gnl|Prokka|PADJNBJD_00181 -DU10_RS00935 BKC03_RS00925 -DU10_RS00935 NILJEPDF_00181 -DU10_RS00935 LJHENM_00910 -DU10_RS00935 CTRC943_RS00910 -DU10_RS00935 CTJTET1_RS00940 -DU10_RS00935 C15_RS0100960 -DU10_RS00935 SOTONK1_RS00925 -DU10_RS00935 ECS88FINAL_RS0100945 -DU10_RS00935 KW39_RS00930 -DU10_RS00935 JIEJKO_00910 -DU10_RS00935 7618448 -DU10_RS00935 A5291_RS00950 -DU10_RS00935 IaCS19096_RS00925 -DU10_RS00935 QSDFRQ_00181 -DU10_RS00935 O169_RS00930 -DU10_RS00935 DU13_RS00935 -DU10_RS00935 AOT15_RS01440 -DU10_RS00935 SW2_RS00920 -DU10_RS00935 BKB95_RS00940 -DU10_RS00935 CBP48_RS02315 -DU10_RS00935 KW36_RS00925 -DU10_RS00935 ECS102511_RS00920 -DU10_RS00935 BKB96_RS00925 -DU10_RS00935 CTL2C_RS02275 -DU10_RS00935 BKB99_RS00925 -DU10_RS00935 L1224_RS00905 -DU10_RS00935 L1440_RS00905 -DU10_RS00935 AQ244_RS03105 -DU10_RS00935 BKB92_RS00925 -DU10_RS00935 CBP42_RS02315 -DU10_RS00935 SOTONIA3_RS00940 -DU10_RS00935 E150_RS00920 -DU10_RS00935 CTB_RS00950 -DU10_RS00935 L2BUCH2_RS00910 -DU10_RS00935 AQ193_RS03070 -DU10_RS00935 CTO_RS00950 -DU10_RS00935 FCS84708_RS00920 -DU10_RS00935 AP288_RS03990 -DU10_RS00935 BKB93_RS00925 -DU10_RS00935 CBP44_RS02320 -DU10_RS00935 AQ199_RS01615 -DU10_RS00935 L2BLST_RS00910 -DU10_RS00935 BW688_RS02320 -DU10_RS00935 BBV13_RS00955 -DU10_RS00935 G9768_RS00930 -DU10_RS00935 BKC02_RS00925 -DU10_RS00935 L3404_RS00905 -DU10_RS00935 AKW53_RS02415 -DU10_RS00935 119354 -DU10_RS00935 BBV16_RS00955 -DU10_RS00935 BKC01_RS00925 -DU10_RS01115 DU10_RS01115 -DU10_RS01115 gnl|Prokka|PADJNBJD_00217 -DU10_RS01115 BKC03_RS01105 -DU10_RS01115 NILJEPDF_00217 -DU10_RS01115 LJHENM_01090 -DU10_RS01115 CTRC943_RS01090 -DU10_RS01115 CTJTET1_RS01120 -DU10_RS01115 C15_RS0101140 -DU10_RS01115 SOTONK1_RS01105 -DU10_RS01115 ECS88FINAL_RS0101125 -DU10_RS01115 KW39_RS01110 -DU10_RS01115 JIEJKO_01090 -DU10_RS01115 A5291_RS01130 -DU10_RS01115 IaCS19096_RS01105 -DU10_RS01115 7618466 -DU10_RS01115 QSDFRQ_00217 -DU10_RS01115 O169_RS01110 -DU10_RS01115 DU13_RS01115 -DU10_RS01115 AOT15_RS01260 -DU10_RS01115 SW2_RS01100 -DU10_RS01115 BKB95_RS01120 -DU10_RS01115 CBP48_RS02495 -DU10_RS01115 KW36_RS01105 -DU10_RS01115 ECS102511_RS01100 -DU10_RS01115 BKB96_RS01105 -DU10_RS01115 CTL2C_RS02455 -DU10_RS01115 BKB99_RS01105 -DU10_RS01115 L1224_RS01085 -DU10_RS01115 L1440_RS01085 -DU10_RS01115 AQ244_RS03285 -DU10_RS01115 BKB92_RS01105 -DU10_RS01115 CBP42_RS02495 -DU10_RS01115 SOTONIA3_RS01120 -DU10_RS01115 E150_RS01100 -DU10_RS01115 CTB_RS01130 -DU10_RS01115 L2BUCH2_RS01090 -DU10_RS01115 AQ193_RS02890 -DU10_RS01115 CTO_RS01130 -DU10_RS01115 FCS84708_RS01100 -DU10_RS01115 AP288_RS04170 -DU10_RS01115 BKB93_RS01105 -DU10_RS01115 CBP44_RS02500 -DU10_RS01115 AQ199_RS01795 -DU10_RS01115 L2BLST_RS01090 -DU10_RS01115 BW688_RS02500 -DU10_RS01115 BBV13_RS01135 -DU10_RS01115 G9768_RS01110 -DU10_RS01115 BKC02_RS01105 -DU10_RS01115 L3404_RS01085 -DU10_RS01115 AKW53_RS02595 -DU10_RS01115 BBV16_RS01135 -DU10_RS01115 BKC01_RS01105 -DU10_RS01115 119382 -CBP48_RS01260 CBP48_RS01260 -CBP48_RS01260 CTJTET1_RS04800 -CBP48_RS01260 KW39_RS04650 -CBP48_RS01260 BKC03_RS04685 -CBP48_RS01260 A5291_RS04665 -CBP48_RS01260 SOTONK1_RS04630 -CBP48_RS01260 ECS88FINAL_RS0104740 -CBP48_RS01260 IaCS19096_RS04625 -CBP48_RS01260 C15_RS0104760 -CBP48_RS01260 DU10_RS04705 -CBP48_RS01260 O169_RS04650 -CBP48_RS01260 KW36_RS04630 -CBP48_RS01260 DU13_RS04705 -CBP48_RS01260 CTL2C_RS01230 -CBP48_RS01260 BKB95_RS04705 -CBP48_RS01260 CBP42_RS01260 -CBP48_RS01260 L1224_RS04610 -CBP48_RS01260 BKB96_RS04690 -CBP48_RS01260 L1440_RS04605 -CBP48_RS01260 BKB99_RS04685 -CBP48_RS01260 SW2_RS04640 -CBP48_RS01260 ECS102511_RS04635 -CBP48_RS01260 CBP44_RS01260 -CBP48_RS01260 CTB_RS04660 -CBP48_RS01260 L2BUCH2_RS04610 -CBP48_RS01260 SOTONIA3_RS04645 -CBP48_RS01260 CTO_RS04655 -CBP48_RS01260 AP288_RS02940 -CBP48_RS01260 BBV13_RS04675 -CBP48_RS01260 BKB92_RS04690 -CBP48_RS01260 BBV16_RS04680 -CBP48_RS01260 E150_RS04645 -CBP48_RS01260 gnl|Prokka|PADJNBJD_00909 -CBP48_RS01260 L2BLST_RS04610 -CBP48_RS01260 FCS84708_RS04630 -CBP48_RS01260 AQ199_RS00565 -CBP48_RS01260 NILJEPDF_00910 -CBP48_RS01260 AQ193_RS04135 -CBP48_RS01260 BW688_RS01260 -CBP48_RS01260 119932 -CBP48_RS01260 JIEJKO_04575 -CBP48_RS01260 7618762 -CBP48_RS01260 QSDFRQ_00910 -CBP48_RS01260 G9768_RS04630 -CBP48_RS01260 LJHENM_04585 -CBP48_RS01260 L3404_RS04605 -CBP48_RS01260 AQ244_RS02120 -CBP48_RS01260 BKB93_RS04695 -CBP48_RS01260 BKC02_RS04685 -CBP48_RS01260 AKW53_RS01355 -CBP48_RS01260 BKC01_RS04690 -CBP48_RS01260 CTRC943_RS04615 -CBP48_RS01260 AOT15_RS02210 -CBP42_RS04465 CBP42_RS04465 -CBP42_RS04465 L2BUCH2_RS03000 -CBP42_RS04465 CTB_RS03060 -CBP42_RS04465 SOTONIA3_RS03045 -CBP42_RS04465 BKB92_RS03060 -CBP42_RS04465 BW688_RS04455 -CBP42_RS04465 119633 -CBP42_RS04465 E150_RS03030 -CBP42_RS04465 CTO_RS03060 -CBP42_RS04465 L2BLST_RS03000 -CBP42_RS04465 CBP44_RS04460 -CBP42_RS04465 FCS84708_RS03025 -CBP42_RS04465 BBV13_RS03065 -CBP42_RS04465 AQ199_RS03725 -CBP42_RS04465 BBV16_RS03075 -CBP42_RS04465 BKB93_RS03065 -CBP42_RS04465 G9768_RS03030 -CBP42_RS04465 L3404_RS02995 -CBP42_RS04465 gnl|Prokka|PADJNBJD_00596 -CBP42_RS04465 NILJEPDF_00596 -CBP42_RS04465 LJHENM_02995 -CBP42_RS04465 BKC02_RS03060 -CBP42_RS04465 AOT15_RS03830 -CBP42_RS04465 AP288_RS00055 -CBP42_RS04465 CTRC943_RS03000 -CBP42_RS04465 BKC01_RS03060 -CBP42_RS04465 QSDFRQ_00596 -CBP42_RS04465 JIEJKO_03005 -CBP42_RS04465 SOTONK1_RS03030 -CBP42_RS04465 CTJTET1_RS03040 -CBP42_RS04465 AQ244_RS00080 -CBP42_RS04465 BKC03_RS03060 -CBP42_RS04465 KW39_RS03040 -CBP42_RS04465 C15_RS0103095 -CBP42_RS04465 ECS88FINAL_RS0103090 -CBP42_RS04465 IaCS19096_RS03025 -CBP42_RS04465 DU10_RS03075 -CBP42_RS04465 A5291_RS03060 -CBP42_RS04465 O169_RS03035 -CBP42_RS04465 CTL2C_RS04370 -CBP42_RS04465 DU13_RS03070 -CBP42_RS04465 CBP48_RS04460 -CBP42_RS04465 L1224_RS03000 -CBP42_RS04465 KW36_RS03025 -CBP42_RS04465 BKB95_RS03070 -CBP42_RS04465 AKW53_RS04255 -CBP42_RS04465 BKB96_RS03065 -CBP42_RS04465 BKB99_RS03060 -CBP42_RS04465 7618627 -CBP42_RS04465 SW2_RS03030 -CBP42_RS04465 L1440_RS03000 -CBP42_RS04465 ECS102511_RS03025 -CBP42_RS04465 AQ193_RS00960 -CBP44_RS00480 CBP44_RS00480 -CBP44_RS00480 AQ193_RS00115 -CBP44_RS00480 L2BUCH2_RS03855 -CBP44_RS00480 BKB92_RS03910 -CBP44_RS00480 CTB_RS03915 -CBP44_RS00480 SOTONIA3_RS03895 -CBP44_RS00480 E150_RS03880 -CBP44_RS00480 CTO_RS03910 -CBP44_RS00480 BBV13_RS03915 -CBP44_RS00480 FCS84708_RS03870 -CBP44_RS00480 7618697 -CBP44_RS00480 L2BLST_RS03855 -CBP44_RS00480 BBV16_RS03925 -CBP44_RS00480 120033 -CBP44_RS00480 BW688_RS00480 -CBP44_RS00480 AQ199_RS04570 -CBP44_RS00480 BKB93_RS03915 -CBP44_RS00480 G9768_RS03875 -CBP44_RS00480 gnl|Prokka|PADJNBJD_00762 -CBP44_RS00480 L3404_RS03850 -CBP44_RS00480 NILJEPDF_00763 -CBP44_RS00480 BKC02_RS03910 -CBP44_RS00480 LJHENM_03840 -CBP44_RS00480 AOT15_RS04675 -CBP44_RS00480 AP288_RS02245 -CBP44_RS00480 JIEJKO_03840 -CBP44_RS00480 QSDFRQ_00763 -CBP44_RS00480 BKC01_RS03915 -CBP44_RS00480 CTRC943_RS03860 -CBP44_RS00480 AKW53_RS00615 -CBP44_RS00480 BKC03_RS03910 -CBP44_RS00480 CBP48_RS00480 -CBP44_RS00480 CTJTET1_RS03895 -CBP44_RS00480 KW39_RS03890 -CBP44_RS00480 DU10_RS03925 -CBP44_RS00480 A5291_RS03920 -CBP44_RS00480 SOTONK1_RS03875 -CBP44_RS00480 IaCS19096_RS03870 -CBP44_RS00480 DU13_RS03925 -CBP44_RS00480 C15_RS0103980 -CBP44_RS00480 ECS88FINAL_RS0103980 -CBP44_RS00480 O169_RS03885 -CBP44_RS00480 KW36_RS03875 -CBP44_RS00480 AQ244_RS04035 -CBP44_RS00480 BKB95_RS03930 -CBP44_RS00480 CBP42_RS00480 -CBP44_RS00480 CTL2C_RS00475 -CBP44_RS00480 L1224_RS03855 -CBP44_RS00480 SW2_RS03880 -CBP44_RS00480 L1440_RS03850 -CBP44_RS00480 ECS102511_RS03870 -CBP44_RS00480 BKB96_RS03915 -CBP44_RS00480 BKB99_RS03910 -CBP44_RS00845 CBP44_RS00845 -CBP44_RS00845 CTB_RS04270 -CBP44_RS00845 L2BUCH2_RS04215 -CBP44_RS00845 AQ193_RS04535 -CBP44_RS00845 SOTONIA3_RS04255 -CBP44_RS00845 BKB92_RS04275 -CBP44_RS00845 CTO_RS04265 -CBP44_RS00845 AQ244_RS02525 -CBP44_RS00845 AP288_RS02540 -CBP44_RS00845 BBV13_RS04280 -CBP44_RS00845 E150_RS04245 -CBP44_RS00845 119822 -CBP44_RS00845 L2BLST_RS04215 -CBP44_RS00845 FCS84708_RS04235 -CBP44_RS00845 AQ199_RS00165 -CBP44_RS00845 BBV16_RS04285 -CBP44_RS00845 7618294 -CBP44_RS00845 BW688_RS00845 -CBP44_RS00845 gnl|Prokka|PADJNBJD_00832 -CBP44_RS00845 NILJEPDF_00833 -CBP44_RS00845 G9768_RS04240 -CBP44_RS00845 L3404_RS04210 -CBP44_RS00845 BKB93_RS04280 -CBP44_RS00845 LJHENM_04190 -CBP44_RS00845 JIEJKO_04190 -CBP44_RS00845 BKC02_RS04275 -CBP44_RS00845 QSDFRQ_00833 -CBP44_RS00845 AKW53_RS00955 -CBP44_RS00845 BKC01_RS04280 -CBP44_RS00845 CTRC943_RS04220 -CBP44_RS00845 AOT15_RS01820 -CBP44_RS00845 CTJTET1_RS04410 -CBP44_RS00845 BKC03_RS04275 -CBP44_RS00845 CBP48_RS00845 -CBP44_RS00845 A5291_RS04275 -CBP44_RS00845 KW39_RS04255 -CBP44_RS00845 SOTONK1_RS04240 -CBP44_RS00845 ECS88FINAL_RS0104325 -CBP44_RS00845 IaCS19096_RS04230 -CBP44_RS00845 DU10_RS04290 -CBP44_RS00845 C15_RS0104350 -CBP44_RS00845 DU13_RS04290 -CBP44_RS00845 O169_RS04250 -CBP44_RS00845 KW36_RS04235 -CBP44_RS00845 BKB95_RS04295 -CBP44_RS00845 CBP42_RS00845 -CBP44_RS00845 CTL2C_RS00835 -CBP44_RS00845 L1224_RS04215 -CBP44_RS00845 BKB96_RS04280 -CBP44_RS00845 L1440_RS04210 -CBP44_RS00845 BKB99_RS04275 -CBP44_RS00845 SW2_RS04245 -CBP44_RS00845 ECS102511_RS04235 -CBP44_RS01020 CBP44_RS01020 -CBP44_RS01020 L2BUCH2_RS04380 -CBP44_RS01020 L2BLST_RS04380 -CBP44_RS01020 7618313 -CBP44_RS01020 BW688_RS01020 -CBP44_RS01020 L3404_RS04375 -CBP44_RS01020 CTRC943_RS04385 -CBP44_RS01020 CBP48_RS01020 -CBP44_RS01020 CBP42_RS01020 -CBP44_RS01020 CTL2C_RS01000 -CBP44_RS01020 L1224_RS04380 -CBP44_RS01020 L1440_RS04375 -CBP44_RS01195 CBP44_RS01195 -CBP44_RS01195 CTB_RS04595 -CBP44_RS01195 L2BUCH2_RS04545 -CBP44_RS01195 AQ193_RS04200 -CBP44_RS01195 SOTONIA3_RS04580 -CBP44_RS01195 CTO_RS04590 -CBP44_RS01195 BBV13_RS04610 -CBP44_RS01195 BKB92_RS04625 -CBP44_RS01195 AQ244_RS02185 -CBP44_RS01195 BBV16_RS04615 -CBP44_RS01195 E150_RS04580 -CBP44_RS01195 gnl|Prokka|PADJNBJD_00896 -CBP44_RS01195 L2BLST_RS04545 -CBP44_RS01195 FCS84708_RS04565 -CBP44_RS01195 AQ199_RS00500 -CBP44_RS01195 NILJEPDF_00897 -CBP44_RS01195 BW688_RS01195 -CBP44_RS01195 119887 -CBP44_RS01195 JIEJKO_04510 -CBP44_RS01195 7618337 -CBP44_RS01195 QSDFRQ_00897 -CBP44_RS01195 G9768_RS04565 -CBP44_RS01195 LJHENM_04520 -CBP44_RS01195 L3404_RS04540 -CBP44_RS01195 BKB93_RS04630 -CBP44_RS01195 BKC02_RS04620 -CBP44_RS01195 AKW53_RS01290 -CBP44_RS01195 BKC01_RS04625 -CBP44_RS01195 CTRC943_RS04550 -CBP44_RS01195 AOT15_RS02145 -CBP44_RS01195 CTJTET1_RS04735 -CBP44_RS01195 KW39_RS04585 -CBP44_RS01195 BKC03_RS04620 -CBP44_RS01195 CBP48_RS01195 -CBP44_RS01195 A5291_RS04600 -CBP44_RS01195 SOTONK1_RS04565 -CBP44_RS01195 ECS88FINAL_RS0104675 -CBP44_RS01195 IaCS19096_RS04560 -CBP44_RS01195 C15_RS0104695 -CBP44_RS01195 DU10_RS04640 -CBP44_RS01195 O169_RS04585 -CBP44_RS01195 KW36_RS04565 -CBP44_RS01195 DU13_RS04640 -CBP44_RS01195 BKB95_RS04640 -CBP44_RS01195 CBP42_RS01195 -CBP44_RS01195 L1224_RS04545 -CBP44_RS01195 BKB96_RS04625 -CBP44_RS01195 L1440_RS04540 -CBP44_RS01195 BKB99_RS04620 -CBP44_RS01195 SW2_RS04575 -CBP44_RS01195 ECS102511_RS04570 -CBP44_RS01370 CBP44_RS01370 -CBP44_RS01370 L2BUCH2_RS04720 -CBP44_RS01370 L2BLST_RS04720 -CBP44_RS01370 BW688_RS01370 -CBP44_RS01370 L3404_RS04715 -CBP44_RS01370 7618776 -CBP44_RS01370 CTRC943_RS04725 -CBP44_RS01370 CBP48_RS01370 -CBP44_RS01370 CTL2C_RS01340 -CBP44_RS01370 CBP42_RS01370 -CBP44_RS01370 L1224_RS04720 -CBP44_RS01370 L1440_RS04715 -CBP44_RS01370 SW2_RS04750 -CBP44_RS01370 AQ193_RS04025 -CBP44_RS01370 E150_RS04755 -CBP44_RS01370 G9768_RS04740 -CBP44_RS01370 AKW53_RS01465 -CBP44_RS01370 AQ244_RS02010 -CBP44_RS01370 CTB_RS04765 -CBP44_RS01370 SOTONIA3_RS04755 -CBP44_RS01370 BKB92_RS04795 -CBP44_RS01370 AP288_RS03050 -CBP44_RS01370 BBV13_RS04780 -CBP44_RS01370 gnl|Prokka|PADJNBJD_00930 -CBP44_RS01370 CTO_RS04760 -CBP44_RS01370 BBV16_RS04785 -CBP44_RS01370 FCS84708_RS04740 -CBP44_RS01370 NILJEPDF_00931 -CBP44_RS01370 AQ199_RS00675 -CBP44_RS01370 119913 -CBP44_RS01370 JIEJKO_04680 -CBP44_RS01370 QSDFRQ_00931 -CBP44_RS01370 LJHENM_04690 -CBP44_RS01370 BKB93_RS04800 -CBP44_RS01370 BKC02_RS04795 -CBP44_RS01370 AOT15_RS00975 -CBP44_RS01370 BKC01_RS04800 -CBP44_RS01370 KW39_RS04760 -CBP44_RS01370 CTJTET1_RS04910 -CBP44_RS01370 BKC03_RS04795 -CBP44_RS01370 SOTONK1_RS04740 -CBP44_RS01370 ECS88FINAL_RS0104840 -CBP44_RS01370 DU10_RS04810 -CBP44_RS01370 A5291_RS04770 -CBP44_RS01370 O169_RS04760 -CBP44_RS01370 IaCS19096_RS04735 -CBP44_RS01370 C15_RS0104860 -CBP44_RS01370 DU13_RS04810 -CBP44_RS01370 KW36_RS04740 -CBP44_RS01370 BKB95_RS04815 -CBP44_RS01370 BKB96_RS04800 -CBP44_RS01370 ECS102511_RS04745 -CBP44_RS01370 BKB99_RS04795 -CBP44_RS01535 CBP44_RS01535 -CBP44_RS01535 E150_RS00135 -CBP44_RS01535 L2BUCH2_RS00135 -CBP44_RS01535 AQ193_RS03870 -CBP44_RS01535 BKB93_RS00140 -CBP44_RS01535 FCS84708_RS00135 -CBP44_RS01535 AP288_RS03205 -CBP44_RS01535 AQ244_RS01855 -CBP44_RS01535 BBV13_RS00140 -CBP44_RS01535 G9768_RS00135 -CBP44_RS01535 AQ199_RS00830 -CBP44_RS01535 BW688_RS01530 -CBP44_RS01535 L2BLST_RS00135 -CBP44_RS01535 BKC02_RS00140 -CBP44_RS01535 BBV16_RS00140 -CBP44_RS01535 BKC01_RS00140 -CBP44_RS01535 gnl|Prokka|PADJNBJD_00028 -CBP44_RS01535 LJHENM_00140 -CBP44_RS01535 A5291_RS00135 -CBP44_RS01535 SOTONK1_RS00135 -CBP44_RS01535 JIEJKO_00135 -CBP44_RS01535 7618367 -CBP44_RS01535 NILJEPDF_00028 -CBP44_RS01535 L3404_RS00135 -CBP44_RS01535 IaCS19096_RS00135 -CBP44_RS01535 AKW53_RS01625 -CBP44_RS01535 BKC03_RS00140 -CBP44_RS01535 C15_RS0100135 -CBP44_RS01535 QSDFRQ_00028 -CBP44_RS01535 CTJTET1_RS00135 -CBP44_RS01535 DU10_RS00140 -CBP44_RS01535 CTRC943_RS00135 -CBP44_RS01535 O169_RS00135 -CBP44_RS01535 CBP48_RS01530 -CBP44_RS01535 ECS88FINAL_RS0100140 -CBP44_RS01535 AOT15_RS00820 -CBP44_RS01535 DU13_RS00140 -CBP44_RS01535 KW39_RS00135 -CBP44_RS01535 KW36_RS00135 -CBP44_RS01535 BKB95_RS00140 -CBP44_RS01535 SW2_RS00135 -CBP44_RS01535 ECS102511_RS00135 -CBP44_RS01535 CTB_RS00135 -CBP44_RS01535 CTL2C_RS01500 -CBP44_RS01535 CBP42_RS01530 -CBP44_RS01535 L1224_RS00135 -CBP44_RS01535 BKB96_RS00140 -CBP44_RS01535 BKB99_RS00140 -CBP44_RS01535 CTO_RS00135 -CBP44_RS01535 SOTONIA3_RS00135 -CBP44_RS01535 L1440_RS00135 -CBP44_RS01535 BKB92_RS00140 -CBP44_RS01535 119224 -CBP44_RS01705 CBP44_RS01705 -CBP44_RS01705 L2BUCH2_RS00305 -CBP44_RS01705 BW688_RS01700 -CBP44_RS01705 L2BLST_RS00305 -CBP44_RS01705 L3404_RS00305 -CBP44_RS01705 7618804 -CBP44_RS01705 CTRC943_RS00305 -CBP44_RS01705 CBP48_RS01700 -CBP44_RS01705 CTL2C_RS01670 -CBP44_RS01705 CBP42_RS01700 -CBP44_RS01705 L1224_RS00305 -CBP44_RS01705 L1440_RS00305 -CBP44_RS01705 120625 -CBP44_RS01705 E150_RS00305 -CBP44_RS01705 AQ193_RS03690 -CBP44_RS01705 AQ244_RS01685 -CBP44_RS01705 BKB93_RS00310 -CBP44_RS01705 FCS84708_RS00305 -CBP44_RS01705 AP288_RS03375 -CBP44_RS01705 BBV13_RS00310 -CBP44_RS01705 AQ199_RS01000 -CBP44_RS01705 G9768_RS00305 -CBP44_RS01705 BKC02_RS00310 -CBP44_RS01705 BBV16_RS00310 -CBP44_RS01705 gnl|Prokka|PADJNBJD_00060 -CBP44_RS01705 NILJEPDF_00060 -CBP44_RS01705 LJHENM_00305 -CBP44_RS01705 BKC01_RS00310 -CBP44_RS01705 SOTONK1_RS00305 -CBP44_RS01705 JIEJKO_00305 -CBP44_RS01705 AKW53_RS01795 -CBP44_RS01705 QSDFRQ_00060 -CBP44_RS01705 IaCS19096_RS00305 -CBP44_RS01705 BKC03_RS00310 -CBP44_RS01705 C15_RS0100310 -CBP44_RS01705 DU10_RS00310 -CBP44_RS01705 CTJTET1_RS00305 -CBP44_RS01705 O169_RS00305 -CBP44_RS01705 KW36_RS00305 -CBP44_RS01705 DU13_RS00315 -CBP44_RS01705 ECS88FINAL_RS0100315 -CBP44_RS01705 AOT15_RS00650 -CBP44_RS01705 KW39_RS00305 -CBP44_RS01705 BKB95_RS00310 -CBP44_RS01705 SW2_RS00305 -CBP44_RS01705 ECS102511_RS00305 -CBP44_RS01705 BKB96_RS00310 -CBP44_RS01705 BKB99_RS00310 -CBP44_RS01705 BKB92_RS00310 -CBP44_RS01705 SOTONIA3_RS00305 -7618172 7618172 -7618172 119131 -7618906 7618906 -7618906 SW2_RS01395 -7618906 BKB95_RS01420 -7618906 CBP48_RS02795 -7618906 KW36_RS01400 -7618906 ECS102511_RS01395 -7618906 AOT15_RS02400 -7618906 BKB96_RS01405 -7618906 CTL2C_RS02750 -7618906 BKB99_RS01405 -7618906 L1224_RS01380 -7618906 L1440_RS01380 -7618906 AQ244_RS03585 -7618906 CBP42_RS02795 -7618906 SOTONIA3_RS01415 -7618906 BKB92_RS01410 -7618906 CTB_RS01430 -7618906 E150_RS01400 -7618906 L2BUCH2_RS01385 -7618906 CTO_RS01425 -7618906 FCS84708_RS01395 -7618906 AP288_RS04465 -7618906 BKB93_RS01410 -7618906 CBP44_RS02800 -7618906 AQ199_RS02090 -7618906 L2BLST_RS01385 -7618906 BBV13_RS01435 -7618906 BW688_RS02800 -7618906 G9768_RS01405 -7618906 BKC02_RS01405 -7618906 BBV16_RS01435 -7618906 L3404_RS01380 -7618906 AKW53_RS02890 -7618906 BKC01_RS01410 -7618906 gnl|Prokka|PADJNBJD_00275 -7618906 AQ193_RS02590 -7618906 DU10_RS01415 -7618906 NILJEPDF_00275 -7618906 LJHENM_01385 -7618906 BKC03_RS01405 -7618906 CTRC943_RS01385 -7618906 CTJTET1_RS01415 -7618906 KW39_RS01405 -7618906 JIEJKO_01385 -7618906 120457 -7618906 C15_RS0101440 -7618906 SOTONK1_RS01405 -7618906 ECS88FINAL_RS0101425 -7618906 QSDFRQ_00275 -7618906 IaCS19096_RS01400 -7618906 A5291_RS01430 -7618906 O169_RS01410 -7618906 DU13_RS01415 -CTB_RS00860 CTB_RS00860 -CTB_RS00860 BBV13_RS00865 -CTB_RS00860 BBV16_RS00865 -CTB_RS00860 A5291_RS00860 -CTB_RS00860 CTO_RS00860 F -CTB_RS02050 CTB_RS02050 -CTB_RS02050 CBP42_RS03445 -CTB_RS02050 SOTONIA3_RS02035 -CTB_RS02050 L2BUCH2_RS02000 -CTB_RS02050 BKB92_RS02040 -CTB_RS02050 CTO_RS02050 -CTB_RS02050 E150_RS02030 -CTB_RS02050 L2BLST_RS02000 -CTB_RS02050 BW688_RS03430 -CTB_RS02050 FCS84708_RS02020 -CTB_RS02050 BBV13_RS02055 -CTB_RS02050 BKB93_RS02040 -CTB_RS02050 CBP44_RS03440 -CTB_RS02050 AQ199_RS02720 -CTB_RS02050 G9768_RS02025 -CTB_RS02050 BBV16_RS02055 -CTB_RS02050 L3404_RS02000 -CTB_RS02050 BKC02_RS02030 -CTB_RS02050 BKC01_RS02030 -CTB_RS02050 AKW53_RS03525 -CTB_RS02050 AP288_RS01055 -CTB_RS02050 gnl|Prokka|PADJNBJD_00399 -CTB_RS02050 NILJEPDF_00399 -CTB_RS02050 CTRC943_RS02005 -CTB_RS02050 LJHENM_02010 -CTB_RS02050 JIEJKO_02005 -CTB_RS02050 BKC03_RS02030 -CTB_RS02050 CTJTET1_RS02035 -CTB_RS02050 QSDFRQ_00399 -CTB_RS02050 C15_RS0102070 -CTB_RS02050 A5291_RS02050 -CTB_RS02050 SOTONK1_RS02025 -CTB_RS02050 AQ244_RS01085 -CTB_RS02050 DU10_RS02055 -CTB_RS02050 KW39_RS02035 -CTB_RS02050 IaCS19096_RS02020 -CTB_RS02050 ECS88FINAL_RS0102065 -CTB_RS02050 O169_RS02035 -CTB_RS02050 DU13_RS02050 -CTB_RS02050 7618978 -CTB_RS02050 CTL2C_RS03370 -CTB_RS02050 CBP48_RS03435 -CTB_RS02050 120331 -CTB_RS02050 L1224_RS02000 -CTB_RS02050 KW36_RS02020 -CTB_RS02050 AOT15_RS03020 -CTB_RS02050 BKB95_RS02050 -CTB_RS02050 BKB96_RS02030 -CTB_RS02050 SW2_RS02025 -CTB_RS02050 BKB99_RS02030 -CTB_RS02050 L1440_RS02000 -CTB_RS02050 ECS102511_RS02025 -CTB_RS02050 AQ193_RS01960 -CTB_RS02210 CTB_RS02210 -CTB_RS02210 CBP42_RS03610 -CTB_RS02210 SOTONIA3_RS02195 -CTB_RS02210 L2BUCH2_RS02160 -CTB_RS02210 BKB92_RS02205 -CTB_RS02210 CTO_RS02210 -CTB_RS02210 E150_RS02190 -CTB_RS02210 L2BLST_RS02160 -CTB_RS02210 BBV13_RS02220 -CTB_RS02210 BW688_RS03595 -CTB_RS02210 FCS84708_RS02180 -CTB_RS02210 BKB93_RS02205 -CTB_RS02210 CBP44_RS03605 -CTB_RS02210 AQ199_RS02880 -CTB_RS02210 BBV16_RS02220 -CTB_RS02210 G9768_RS02185 -CTB_RS02210 L3404_RS02160 -CTB_RS02210 BKC02_RS02195 -CTB_RS02210 BKC01_RS02195 -CTB_RS02210 AKW53_RS03685 -CTB_RS02210 AP288_RS00895 -CTB_RS02210 gnl|Prokka|PADJNBJD_00431 -CTB_RS02210 NILJEPDF_00431 -CTB_RS02210 CTRC943_RS02165 -CTB_RS02210 LJHENM_02175 -CTB_RS02210 JIEJKO_02170 -CTB_RS02210 BKC03_RS02195 -CTB_RS02210 CTJTET1_RS02195 -CTB_RS02210 QSDFRQ_00431 -CTB_RS02210 C15_RS0102230 -CTB_RS02210 A5291_RS02210 -CTB_RS02210 SOTONK1_RS02185 -CTB_RS02210 DU10_RS02220 -CTB_RS02210 KW39_RS02195 -CTB_RS02210 IaCS19096_RS02180 -CTB_RS02210 AQ244_RS00925 -CTB_RS02210 ECS88FINAL_RS0102225 -CTB_RS02210 O169_RS02195 -CTB_RS02210 DU13_RS02215 -CTB_RS02210 7618559 -CTB_RS02210 CTL2C_RS03530 -CTB_RS02210 BKB96_RS02195 -CTB_RS02210 CBP48_RS03600 -CTB_RS02210 119528 -CTB_RS02210 L1224_RS02160 -CTB_RS02210 KW36_RS02180 -CTB_RS02210 AOT15_RS03180 -CTB_RS02210 BKB95_RS02215 -CTB_RS02210 BKB99_RS02195 -CTB_RS02210 SW2_RS02185 -CTB_RS02210 L1440_RS02160 -CTB_RS02210 ECS102511_RS02185 -CTB_RS02210 AQ193_RS01800 -CTB_RS03045 CTB_RS03045 -CTB_RS03045 SOTONIA3_RS03030 -CTB_RS03045 AQ193_RS00975 -CTB_RS03045 BKB92_RS03045 -CTB_RS03045 BW688_RS04440 -CTB_RS03045 119168 -CTB_RS03045 E150_RS03015 -CTB_RS03045 CTO_RS03045 -CTB_RS03045 L2BLST_RS02985 -CTB_RS03045 CBP44_RS04445 -CTB_RS03045 FCS84708_RS03010 -CTB_RS03045 BBV13_RS03050 -CTB_RS03045 AQ199_RS03710 -CTB_RS03045 BBV16_RS03060 -CTB_RS03045 BKB93_RS03050 -CTB_RS03045 G9768_RS03015 -CTB_RS03045 L3404_RS02980 -CTB_RS03045 BKC02_RS03045 -CTB_RS03045 AOT15_RS03815 -CTB_RS03045 CTRC943_RS02985 -CTB_RS03045 BKC01_RS03045 -CTB_RS03045 SOTONK1_RS03015 -CTB_RS03045 CTJTET1_RS03025 -CTB_RS03045 BKC03_RS03045 -CTB_RS03045 KW39_RS03025 -CTB_RS03045 AP288_RS00070 -CTB_RS03045 C15_RS0103080 -CTB_RS03045 ECS88FINAL_RS0103075 -CTB_RS03045 IaCS19096_RS03010 -CTB_RS03045 DU10_RS03060 -CTB_RS03045 A5291_RS03045 -CTB_RS03045 O169_RS03020 -CTB_RS03045 CTL2C_RS04355 -CTB_RS03045 DU13_RS03055 -CTB_RS03045 CBP48_RS04445 -CTB_RS03045 L1224_RS02985 -CTB_RS03045 KW36_RS03010 -CTB_RS03045 AQ244_RS00095 -CTB_RS03045 BKB95_RS03055 -CTB_RS03045 AKW53_RS04240 -CTB_RS03045 BKB96_RS03050 -CTB_RS03045 BKB99_RS03045 -CTB_RS03045 7618202 -CTB_RS03045 SW2_RS03015 -CTB_RS03045 L1440_RS02985 -CTB_RS03045 ECS102511_RS03010 -CTB_RS03045 CBP42_RS04450 -CTB_RS03045 L2BUCH2_RS02985 -CTB_RS04920 CTB_RS04920 -CTB_RS04920 SOTONIA3_RS04935 -CTB_RS04920 AP288_RS04995 -CTB_RS04920 AQ193_RS04955 -CTB_RS04920 gnl|Prokka|PADJNBJD_00927 -CTB_RS04920 CTO_RS04960 -CTB_RS04920 E150_RS04880 -CTB_RS04920 NILJEPDF_00928 -CTB_RS04920 AQ199_RS04900 -CTB_RS04920 AQ244_RS05170 -CTB_RS04920 JIEJKO_04665 -CTB_RS04920 QSDFRQ_00928 -CTB_RS04920 G9768_RS04870 -CTB_RS04920 BKC02_RS04780 -CTB_RS04920 AKW53_RS04815 -CTB_RS04920 BKC01_RS04785 -CTB_RS04920 AOT15_RS04885 -CTB_RS04920 CTJTET1_RS05065 -CTB_RS04920 BKC03_RS04780 -CTB_RS04920 SOTONK1_RS04915 -CTB_RS04920 A5291_RS04980 -CTB_RS04920 IaCS19096_RS04890 -CTB_RS04920 C15_RS1000000105085 -CTB_RS04920 KW36_RS04865 -CTB_RS04920 BKB95_RS04800 -CTB_RS04920 BKB96_RS04785 -CTB_RS04920 BKB99_RS04780 -CTB_RS04920 SW2_RS04880 -E150_RS02500 E150_RS02500 -E150_RS02500 CTO_RS02530 -E150_RS02500 BW688_RS03915 -E150_RS02500 BBV13_RS02535 -E150_RS02500 L2BLST_RS02475 -E150_RS02500 FCS84708_RS02490 -E150_RS02500 AQ193_RS01490 -E150_RS02500 CBP44_RS03920 -E150_RS02500 BBV16_RS02545 -E150_RS02500 BKB93_RS02525 -E150_RS02500 AOT15_RS03600 -E150_RS02500 AQ199_RS03190 -E150_RS02500 G9768_RS02495 -E150_RS02500 L3404_RS02470 -E150_RS02500 BKC02_RS02515 -E150_RS02500 gnl|Prokka|PADJNBJD_00492 -E150_RS02500 BKC01_RS02515 -E150_RS02500 NILJEPDF_00492 -E150_RS02500 LJHENM_02480 -E150_RS02500 CTRC943_RS02475 -E150_RS02500 JIEJKO_02480 -E150_RS02500 QSDFRQ_00492 -E150_RS02500 SOTONK1_RS02495 -E150_RS02500 CTJTET1_RS02505 -E150_RS02500 BKC03_RS02515 -E150_RS02500 AKW53_RS04720 -E150_RS02500 C15_RS0102555 -E150_RS02500 KW39_RS02505 -E150_RS02500 IaCS19096_RS02490 -E150_RS02500 DU10_RS02535 -E150_RS02500 A5291_RS02530 -E150_RS02500 ECS88FINAL_RS0102550 -E150_RS02500 O169_RS02505 -E150_RS02500 7618593 -E150_RS02500 DU13_RS02530 -E150_RS02500 AP288_RS00585 -E150_RS02500 BKB96_RS02520 -E150_RS02500 BKB99_RS02515 -E150_RS02500 CBP48_RS03915 -E150_RS02500 CTL2C_RS03845 -E150_RS02500 KW36_RS02490 -E150_RS02500 BKB95_RS02530 -E150_RS02500 L1224_RS02475 -E150_RS02500 SW2_RS02500 -E150_RS02500 ECS102511_RS02495 -E150_RS02500 119581 -E150_RS02500 L1440_RS02475 -E150_RS02500 AQ244_RS00615 -E150_RS02500 CBP42_RS03925 -E150_RS02500 L2BUCH2_RS02475 -E150_RS02500 CTB_RS02530 -E150_RS02500 SOTONIA3_RS02510 -E150_RS02500 BKB92_RS02520 -G9768_RS01470 G9768_RS01470 -G9768_RS01470 BKC02_RS01470 -G9768_RS01470 AKW53_RS02960 -G9768_RS01470 BBV16_RS01500 -G9768_RS01470 L3404_RS01445 -G9768_RS01470 BKC01_RS01475 -G9768_RS01470 gnl|Prokka|PADJNBJD_00288 -G9768_RS01470 DU10_RS01480 -G9768_RS01470 NILJEPDF_00288 -G9768_RS01470 LJHENM_01450 -G9768_RS01470 BKC03_RS01470 -G9768_RS01470 CTRC943_RS01450 -G9768_RS01470 CTJTET1_RS01480 -G9768_RS01470 KW39_RS01470 -G9768_RS01470 JIEJKO_01450 -G9768_RS01470 C15_RS0101505 -G9768_RS01470 SOTONK1_RS01470 -G9768_RS01470 ECS88FINAL_RS0101490 -G9768_RS01470 119434 -G9768_RS01470 QSDFRQ_00288 -G9768_RS01470 IaCS19096_RS01465 -G9768_RS01470 A5291_RS01495 -G9768_RS01470 O169_RS01475 -G9768_RS01470 DU13_RS01480 -G9768_RS01470 AQ193_RS02525 -G9768_RS01470 SW2_RS01460 -G9768_RS01470 BKB95_RS01485 -G9768_RS01470 CBP48_RS02860 -G9768_RS01470 7618500 -G9768_RS01470 KW36_RS01465 -G9768_RS01470 ECS102511_RS01460 -G9768_RS01470 AOT15_RS02465 -G9768_RS01470 BKB96_RS01470 -G9768_RS01470 CTL2C_RS02815 -G9768_RS01470 BKB99_RS01470 -G9768_RS01470 L1224_RS01445 -G9768_RS01470 L1440_RS01445 -G9768_RS01470 AQ244_RS03650 -G9768_RS01470 CBP42_RS02860 -G9768_RS01470 SOTONIA3_RS01480 -G9768_RS01470 BKB92_RS01475 -G9768_RS01470 CTB_RS01495 -G9768_RS01470 E150_RS01465 -G9768_RS01470 L2BUCH2_RS01450 -G9768_RS01470 CTO_RS01490 -G9768_RS01470 FCS84708_RS01460 -G9768_RS01470 AP288_RS04530 -G9768_RS01470 BKB93_RS01475 -G9768_RS01470 CBP44_RS02865 -G9768_RS01470 AQ199_RS02155 -G9768_RS01470 L2BLST_RS01450 -G9768_RS01470 BBV13_RS01500 -G9768_RS01470 BW688_RS02870 -G9768_RS01630 G9768_RS01630 -G9768_RS01630 BKC02_RS01630 -G9768_RS01630 L3404_RS01605 -G9768_RS01630 AKW53_RS03120 -G9768_RS01630 BBV16_RS01660 -G9768_RS01630 BKC01_RS01635 -G9768_RS01630 gnl|Prokka|PADJNBJD_00320 -G9768_RS01630 NILJEPDF_00320 -G9768_RS01630 LJHENM_01610 -G9768_RS01630 CTRC943_RS01610 -G9768_RS01630 BKC03_RS01630 -G9768_RS01630 DU10_RS01645 -G9768_RS01630 CTJTET1_RS01640 -G9768_RS01630 KW39_RS01630 -G9768_RS01630 JIEJKO_01610 -G9768_RS01630 C15_RS0101670 -G9768_RS01630 SOTONK1_RS01630 -G9768_RS01630 ECS88FINAL_RS0101650 -G9768_RS01630 QSDFRQ_00320 -G9768_RS01630 IaCS19096_RS01625 -G9768_RS01630 119448 -G9768_RS01630 A5291_RS01655 -G9768_RS01630 O169_RS01635 -G9768_RS01630 DU13_RS01640 -G9768_RS01630 AQ193_RS02365 -G9768_RS01630 CBP48_RS03020 -G9768_RS01630 7618508 -G9768_RS01630 SW2_RS01620 -G9768_RS01630 BKB95_RS01645 -G9768_RS01630 CTL2C_RS02975 -G9768_RS01630 KW36_RS01625 -G9768_RS01630 ECS102511_RS01620 -G9768_RS01630 AOT15_RS02625 -G9768_RS01630 BKB96_RS01630 -G9768_RS01630 L1224_RS01605 -G9768_RS01630 BKB99_RS01630 -G9768_RS01630 L1440_RS01605 -G9768_RS01630 CBP42_RS03020 -G9768_RS01630 AQ244_RS03810 -G9768_RS01630 SOTONIA3_RS01640 -G9768_RS01630 BKB92_RS01635 -G9768_RS01630 CTB_RS01655 -G9768_RS01630 E150_RS01625 -G9768_RS01630 L2BUCH2_RS01610 -G9768_RS01630 CTO_RS01650 -G9768_RS01630 FCS84708_RS01620 -G9768_RS01630 AP288_RS04690 -G9768_RS01630 CBP44_RS03025 -G9768_RS01630 BKB93_RS01635 -G9768_RS01630 L2BLST_RS01610 -G9768_RS01630 AQ199_RS02315 -G9768_RS01630 BW688_RS03030 -G9768_RS01630 BBV13_RS01660 -G9768_RS03300 G9768_RS03300 -G9768_RS03300 L3404_RS03270 -G9768_RS03300 gnl|Prokka|PADJNBJD_00649 -G9768_RS03300 AQ244_RS04615 -G9768_RS03300 AP288_RS01670 -G9768_RS03300 BKC02_RS03330 -G9768_RS03300 NILJEPDF_00650 -G9768_RS03300 LJHENM_03265 -G9768_RS03300 AOT15_RS04100 -G9768_RS03300 CTRC943_RS03275 -G9768_RS03300 JIEJKO_03270 -G9768_RS03300 BKC01_RS03330 -G9768_RS03300 QSDFRQ_00650 -G9768_RS03300 KW39_RS03315 -G9768_RS03300 BKC03_RS03330 -G9768_RS03300 CTJTET1_RS03315 -G9768_RS03300 ECS88FINAL_RS0103365 -G9768_RS03300 DU10_RS03345 -G9768_RS03300 SOTONK1_RS03300 -G9768_RS03300 O169_RS03310 -G9768_RS03300 IaCS19096_RS03295 -G9768_RS03300 AQ193_RS00685 -G9768_RS03300 C15_RS0103365 -G9768_RS03300 A5291_RS03340 -G9768_RS03300 AKW53_RS00050 -G9768_RS03300 DU13_RS03340 -G9768_RS03300 CTL2C_RS04645 -G9768_RS03300 CBP48_RS04730 -G9768_RS03300 7619114 -G9768_RS03300 SW2_RS03305 -G9768_RS03300 L1224_RS03275 -G9768_RS03300 KW36_RS03300 -G9768_RS03300 ECS102511_RS03300 -G9768_RS03300 L1440_RS03275 -G9768_RS03300 BKB95_RS03345 -G9768_RS03300 BKB96_RS03340 -G9768_RS03300 BKB99_RS03335 -G9768_RS03300 CBP42_RS04735 -G9768_RS03300 L2BUCH2_RS03275 -G9768_RS03300 BKB92_RS03330 -G9768_RS03300 CTB_RS03340 -G9768_RS03300 E150_RS03305 -G9768_RS03300 SOTONIA3_RS03320 -G9768_RS03300 BW688_RS04725 -G9768_RS03300 CTO_RS03335 -G9768_RS03300 FCS84708_RS03300 -G9768_RS03300 BBV13_RS03340 -G9768_RS03300 L2BLST_RS03275 -G9768_RS03300 CBP44_RS04730 -G9768_RS03300 120113 -G9768_RS03300 AQ199_RS04000 -G9768_RS03300 BBV16_RS03350 -G9768_RS03300 BKB93_RS03335 -gnl|Prokka|PADJNBJD_00283 gnl|Prokka|PADJNBJD_00283 -gnl|Prokka|PADJNBJD_00283 BKC01_RS01450 -gnl|Prokka|PADJNBJD_00283 DU10_RS01455 -gnl|Prokka|PADJNBJD_00283 NILJEPDF_00283 -gnl|Prokka|PADJNBJD_00283 LJHENM_01425 -gnl|Prokka|PADJNBJD_00283 BKC03_RS01445 -gnl|Prokka|PADJNBJD_00283 CTRC943_RS01425 -gnl|Prokka|PADJNBJD_00283 CTJTET1_RS01455 -gnl|Prokka|PADJNBJD_00283 KW39_RS01445 -gnl|Prokka|PADJNBJD_00283 JIEJKO_01425 -gnl|Prokka|PADJNBJD_00283 119428 -gnl|Prokka|PADJNBJD_00283 C15_RS0101480 -gnl|Prokka|PADJNBJD_00283 SOTONK1_RS01445 -gnl|Prokka|PADJNBJD_00283 ECS88FINAL_RS0101465 -gnl|Prokka|PADJNBJD_00283 QSDFRQ_00283 -gnl|Prokka|PADJNBJD_00283 IaCS19096_RS01440 -gnl|Prokka|PADJNBJD_00283 A5291_RS01470 -gnl|Prokka|PADJNBJD_00283 O169_RS01450 -gnl|Prokka|PADJNBJD_00283 DU13_RS01455 -gnl|Prokka|PADJNBJD_00283 7618496 -gnl|Prokka|PADJNBJD_00283 SW2_RS01435 -gnl|Prokka|PADJNBJD_00283 BKB95_RS01460 -gnl|Prokka|PADJNBJD_00283 CBP48_RS02835 -gnl|Prokka|PADJNBJD_00283 KW36_RS01440 -gnl|Prokka|PADJNBJD_00283 ECS102511_RS01435 -gnl|Prokka|PADJNBJD_00283 AOT15_RS02440 -gnl|Prokka|PADJNBJD_00283 BKB96_RS01445 -gnl|Prokka|PADJNBJD_00283 CTL2C_RS02790 -gnl|Prokka|PADJNBJD_00283 BKB99_RS01445 -gnl|Prokka|PADJNBJD_00283 L1224_RS01420 -gnl|Prokka|PADJNBJD_00283 L1440_RS01420 -gnl|Prokka|PADJNBJD_00283 AQ244_RS03625 -gnl|Prokka|PADJNBJD_00283 CBP42_RS02835 -gnl|Prokka|PADJNBJD_00283 SOTONIA3_RS01455 -gnl|Prokka|PADJNBJD_00283 AQ193_RS02550 -gnl|Prokka|PADJNBJD_00283 BKB92_RS01450 -gnl|Prokka|PADJNBJD_00283 CTB_RS01470 -gnl|Prokka|PADJNBJD_00283 E150_RS01440 -gnl|Prokka|PADJNBJD_00283 L2BUCH2_RS01425 -gnl|Prokka|PADJNBJD_00283 CTO_RS01465 -gnl|Prokka|PADJNBJD_00283 FCS84708_RS01435 -gnl|Prokka|PADJNBJD_00283 AP288_RS04505 -gnl|Prokka|PADJNBJD_00283 BKB93_RS01450 -gnl|Prokka|PADJNBJD_00283 CBP44_RS02840 -gnl|Prokka|PADJNBJD_00283 AQ199_RS02130 -gnl|Prokka|PADJNBJD_00283 L2BLST_RS01425 -gnl|Prokka|PADJNBJD_00283 BBV13_RS01475 -gnl|Prokka|PADJNBJD_00283 BW688_RS02845 -gnl|Prokka|PADJNBJD_00283 G9768_RS01445 -gnl|Prokka|PADJNBJD_00283 BKC02_RS01445 -gnl|Prokka|PADJNBJD_00283 AKW53_RS02935 -gnl|Prokka|PADJNBJD_00283 BBV16_RS01475 -gnl|Prokka|PADJNBJD_00283 L3404_RS01420 -gnl|Prokka|PADJNBJD_00716 gnl|Prokka|PADJNBJD_00716 -gnl|Prokka|PADJNBJD_00716 G9768_RS03640 -gnl|Prokka|PADJNBJD_00716 L3404_RS03615 -gnl|Prokka|PADJNBJD_00716 BKC02_RS03670 -gnl|Prokka|PADJNBJD_00716 NILJEPDF_00717 -gnl|Prokka|PADJNBJD_00716 LJHENM_03605 -gnl|Prokka|PADJNBJD_00716 AOT15_RS04440 -gnl|Prokka|PADJNBJD_00716 AP288_RS02005 -gnl|Prokka|PADJNBJD_00716 AQ244_RS04270 -gnl|Prokka|PADJNBJD_00716 JIEJKO_03610 -gnl|Prokka|PADJNBJD_00716 BKC01_RS03670 -gnl|Prokka|PADJNBJD_00716 QSDFRQ_00717 -gnl|Prokka|PADJNBJD_00716 CTRC943_RS03625 -gnl|Prokka|PADJNBJD_00716 BKC03_RS03670 -gnl|Prokka|PADJNBJD_00716 CBP48_RS00240 -gnl|Prokka|PADJNBJD_00716 CTJTET1_RS03660 -gnl|Prokka|PADJNBJD_00716 KW39_RS03655 -gnl|Prokka|PADJNBJD_00716 DU10_RS03685 -gnl|Prokka|PADJNBJD_00716 SOTONK1_RS03640 -gnl|Prokka|PADJNBJD_00716 ECS88FINAL_RS0103730 -gnl|Prokka|PADJNBJD_00716 IaCS19096_RS03635 -gnl|Prokka|PADJNBJD_00716 C15_RS0103720 -gnl|Prokka|PADJNBJD_00716 A5291_RS03685 -gnl|Prokka|PADJNBJD_00716 O169_RS03650 -gnl|Prokka|PADJNBJD_00716 AQ193_RS00350 -gnl|Prokka|PADJNBJD_00716 DU13_RS03685 -gnl|Prokka|PADJNBJD_00716 KW36_RS03640 -gnl|Prokka|PADJNBJD_00716 BKB95_RS03690 -gnl|Prokka|PADJNBJD_00716 CBP42_RS00240 -gnl|Prokka|PADJNBJD_00716 SW2_RS03645 -gnl|Prokka|PADJNBJD_00716 CTL2C_RS00240 -gnl|Prokka|PADJNBJD_00716 L1224_RS03620 -gnl|Prokka|PADJNBJD_00716 ECS102511_RS03635 -gnl|Prokka|PADJNBJD_00716 L1440_RS03620 -gnl|Prokka|PADJNBJD_00716 BKB96_RS03680 -gnl|Prokka|PADJNBJD_00716 BKB99_RS03675 -gnl|Prokka|PADJNBJD_00716 CBP44_RS00240 -gnl|Prokka|PADJNBJD_00716 L2BUCH2_RS03620 -gnl|Prokka|PADJNBJD_00716 BKB92_RS03670 -gnl|Prokka|PADJNBJD_00716 CTB_RS03680 -gnl|Prokka|PADJNBJD_00716 SOTONIA3_RS03660 -gnl|Prokka|PADJNBJD_00716 E150_RS03645 -gnl|Prokka|PADJNBJD_00716 CTO_RS03675 -gnl|Prokka|PADJNBJD_00716 BBV13_RS03680 -gnl|Prokka|PADJNBJD_00716 FCS84708_RS03635 -gnl|Prokka|PADJNBJD_00716 L2BLST_RS03620 -gnl|Prokka|PADJNBJD_00716 BBV16_RS03690 -gnl|Prokka|PADJNBJD_00716 BW688_RS00240 -gnl|Prokka|PADJNBJD_00716 120071 -gnl|Prokka|PADJNBJD_00716 AQ199_RS04335 -gnl|Prokka|PADJNBJD_00716 BKB93_RS03675 -gnl|Prokka|PADJNBJD_00716 7618673 -CTL2C_RS01200 CTL2C_RS01200 -CTL2C_RS01200 BKB95_RS04675 -CTL2C_RS01200 CBP42_RS01230 -CTL2C_RS01200 L1224_RS04580 -CTL2C_RS01200 BKB96_RS04660 -CTL2C_RS01200 L1440_RS04575 -CTL2C_RS01200 BKB99_RS04655 -CTL2C_RS01200 SW2_RS04610 -CTL2C_RS01200 ECS102511_RS04605 -CTL2C_RS01200 CBP44_RS01230 -CTL2C_RS01200 CTB_RS04630 -CTL2C_RS01200 L2BUCH2_RS04580 -CTL2C_RS01200 SOTONIA3_RS04615 -CTL2C_RS01200 CTO_RS04625 -CTL2C_RS01200 AP288_RS02910 -CTL2C_RS01200 BBV13_RS04645 -CTL2C_RS01200 BKB92_RS04660 -CTL2C_RS01200 BBV16_RS04650 -CTL2C_RS01200 E150_RS04615 -CTL2C_RS01200 gnl|Prokka|PADJNBJD_00903 -CTL2C_RS01200 L2BLST_RS04580 -CTL2C_RS01200 FCS84708_RS04600 -CTL2C_RS01200 AQ199_RS00535 -CTL2C_RS01200 NILJEPDF_00904 -CTL2C_RS01200 BW688_RS01230 -CTL2C_RS01200 119938 -CTL2C_RS01200 JIEJKO_04545 -CTL2C_RS01200 7618758 -CTL2C_RS01200 QSDFRQ_00904 -CTL2C_RS01200 G9768_RS04600 -CTL2C_RS01200 LJHENM_04555 -CTL2C_RS01200 L3404_RS04575 -CTL2C_RS01200 BKB93_RS04665 -CTL2C_RS01200 BKC02_RS04655 -CTL2C_RS01200 AKW53_RS01325 -CTL2C_RS01200 BKC01_RS04660 -CTL2C_RS01200 CTRC943_RS04585 -CTL2C_RS01200 AOT15_RS02180 -CTL2C_RS01200 CTJTET1_RS04770 -CTL2C_RS01200 KW39_RS04620 -CTL2C_RS01200 BKC03_RS04655 -CTL2C_RS01200 CBP48_RS01230 -CTL2C_RS01200 A5291_RS04635 -CTL2C_RS01200 AQ193_RS04165 -CTL2C_RS01200 SOTONK1_RS04600 -CTL2C_RS01200 ECS88FINAL_RS0104710 -CTL2C_RS01200 IaCS19096_RS04595 -CTL2C_RS01200 C15_RS0104730 -CTL2C_RS01200 DU10_RS04675 -CTL2C_RS01200 O169_RS04620 -CTL2C_RS01200 KW36_RS04600 -CTL2C_RS01200 AQ244_RS02150 -CTL2C_RS01200 DU13_RS04675 -CTO_RS01865 CTO_RS01865 -CTO_RS01865 E150_RS01845 -CTO_RS01865 AQ193_RS02145 -CTO_RS01865 L2BLST_RS01815 -CTO_RS01865 FCS84708_RS01835 -CTO_RS01865 BW688_RS03245 -CTO_RS01865 BKB93_RS01855 -CTO_RS01865 CBP44_RS03250 -CTO_RS01865 BBV13_RS01870 -CTO_RS01865 AQ199_RS02535 -CTO_RS01865 G9768_RS01840 -CTO_RS01865 L3404_RS01815 -CTO_RS01865 BBV16_RS01870 -CTO_RS01865 BKC02_RS01845 -CTO_RS01865 BKC01_RS01845 -CTO_RS01865 AKW53_RS03340 -CTO_RS01865 gnl|Prokka|PADJNBJD_00362 -CTO_RS01865 NILJEPDF_00362 -CTO_RS01865 CTRC943_RS01820 -CTO_RS01865 LJHENM_01825 -CTO_RS01865 JIEJKO_01820 -CTO_RS01865 BKC03_RS01845 -CTO_RS01865 CTJTET1_RS01850 -CTO_RS01865 DU10_RS01865 -CTO_RS01865 QSDFRQ_00362 -CTO_RS01865 C15_RS0101880 -CTO_RS01865 SOTONK1_RS01840 -CTO_RS01865 A5291_RS01865 -CTO_RS01865 KW39_RS01850 -CTO_RS01865 IaCS19096_RS01835 -CTO_RS01865 ECS88FINAL_RS0101870 -CTO_RS01865 DU13_RS01860 -CTO_RS01865 119471 -CTO_RS01865 O169_RS01850 -CTO_RS01865 AP288_RS01240 -CTO_RS01865 7618524 -CTO_RS01865 CTL2C_RS03185 -CTO_RS01865 BKB95_RS01860 -CTO_RS01865 CBP48_RS03245 -CTO_RS01865 L1224_RS01815 -CTO_RS01865 KW36_RS01835 -CTO_RS01865 AOT15_RS02835 -CTO_RS01865 BKB96_RS01845 -CTO_RS01865 SW2_RS01840 -CTO_RS01865 BKB99_RS01845 -CTO_RS01865 L1440_RS01815 -CTO_RS01865 ECS102511_RS01840 -CTO_RS01865 AQ244_RS01270 -CTO_RS01865 CBP42_RS03255 -CTO_RS01865 CTB_RS01865 -CTO_RS01865 SOTONIA3_RS01850 -CTO_RS01865 L2BUCH2_RS01815 -CTO_RS01865 BKB92_RS01855 -SOTONIA3_RS03360 SOTONIA3_RS03360 -SOTONIA3_RS03360 CTB_RS03380 -SOTONIA3_RS03360 BW688_RS04765 -SOTONIA3_RS03360 CTO_RS03375 -SOTONIA3_RS03360 BBV13_RS03380 -SOTONIA3_RS03360 L2BLST_RS03320 -SOTONIA3_RS03360 CBP44_RS04770 -SOTONIA3_RS03360 120105 -SOTONIA3_RS03360 BBV16_RS03390 -SOTONIA3_RS03360 G9768_RS03340 -SOTONIA3_RS03360 L3404_RS03315 -SOTONIA3_RS03360 gnl|Prokka|PADJNBJD_00657 -SOTONIA3_RS03360 BKC02_RS03370 -SOTONIA3_RS03360 NILJEPDF_00658 -SOTONIA3_RS03360 AOT15_RS04140 -SOTONIA3_RS03360 CTRC943_RS03320 -SOTONIA3_RS03360 JIEJKO_03310 -SOTONIA3_RS03360 BKC01_RS03370 -SOTONIA3_RS03360 QSDFRQ_00658 -SOTONIA3_RS03360 BKC03_RS03370 -SOTONIA3_RS03360 DU10_RS03385 -SOTONIA3_RS03360 CTJTET1_RS03360 -SOTONIA3_RS03360 SOTONK1_RS03340 -SOTONIA3_RS03360 IaCS19096_RS03335 -SOTONIA3_RS03360 C15_RS0103405 -SOTONIA3_RS03360 A5291_RS03385 -SOTONIA3_RS03360 CTL2C_RS04690 -SOTONIA3_RS03360 CBP48_RS04770 -SOTONIA3_RS03360 L1224_RS03320 -SOTONIA3_RS03360 BKB95_RS03390 -SOTONIA3_RS03360 7619119 -SOTONIA3_RS03360 L1440_RS03320 -SOTONIA3_RS03360 BKB96_RS03380 -SOTONIA3_RS03360 BKB99_RS03375 -SOTONIA3_RS03360 AQ244_RS04570 -SOTONIA3_RS03360 CBP42_RS04775 -SOTONIA3_RS03360 L2BUCH2_RS03320 -SOTONIA3_RS03360 BKB92_RS03370 -SOTONIA3_RS03360 E150_RS03350 -SOTONIA3_RS03360 FCS84708_RS03340 -SOTONIA3_RS03360 AQ193_RS00645 -SOTONIA3_RS03360 AQ199_RS04040 -SOTONIA3_RS03360 BKB93_RS03375 -SOTONIA3_RS03360 AP288_RS01710 -SOTONIA3_RS03360 LJHENM_03305 -SOTONIA3_RS03360 KW39_RS03360 -SOTONIA3_RS03360 ECS88FINAL_RS0103405 -SOTONIA3_RS03360 O169_RS03355 -SOTONIA3_RS03360 AKW53_RS00090 -SOTONIA3_RS03360 SW2_RS03350 -SOTONIA3_RS03360 ECS102511_RS03340 -SOTONK1_RS03090 SOTONK1_RS03090 -SOTONK1_RS03090 CTJTET1_RS03100 -SOTONK1_RS03090 BKC03_RS03120 -SOTONK1_RS03090 KW39_RS03100 -SOTONK1_RS03090 C15_RS0103155 -SOTONK1_RS03090 ECS88FINAL_RS0103155 -SOTONK1_RS03090 IaCS19096_RS03085 -SOTONK1_RS03090 DU10_RS03135 -SOTONK1_RS03090 A5291_RS03120 -SOTONK1_RS03090 O169_RS03095 -SOTONK1_RS03090 CTL2C_RS04430 -SOTONK1_RS03090 DU13_RS03130 -SOTONK1_RS03090 CBP48_RS04520 -SOTONK1_RS03090 L1224_RS03060 -SOTONK1_RS03090 KW36_RS03085 -SOTONK1_RS03090 BKB95_RS03130 -SOTONK1_RS03090 AKW53_RS04315 -SOTONK1_RS03090 BKB96_RS03125 -SOTONK1_RS03090 BKB99_RS03120 -SOTONK1_RS03090 7619097 -SOTONK1_RS03090 SW2_RS03090 -SOTONK1_RS03090 L1440_RS03060 -SOTONK1_RS03090 ECS102511_RS03085 -SOTONK1_RS03090 AQ244_RS00020 -SOTONK1_RS03090 CBP42_RS04525 -SOTONK1_RS03090 L2BUCH2_RS03060 -SOTONK1_RS03090 CTB_RS03120 -SOTONK1_RS03090 SOTONIA3_RS03105 -SOTONK1_RS03090 BKB92_RS03120 -SOTONK1_RS03090 BW688_RS04515 -SOTONK1_RS03090 120142 -SOTONK1_RS03090 E150_RS03090 -SOTONK1_RS03090 AQ193_RS00900 -SOTONK1_RS03090 CTO_RS03120 -SOTONK1_RS03090 L2BLST_RS03060 -SOTONK1_RS03090 CBP44_RS04520 -SOTONK1_RS03090 FCS84708_RS03085 -SOTONK1_RS03090 BBV13_RS03125 -SOTONK1_RS03090 AQ199_RS03785 -SOTONK1_RS03090 BBV16_RS03135 -SOTONK1_RS03090 BKB93_RS03125 -SOTONK1_RS03090 G9768_RS03090 -SOTONK1_RS03090 L3404_RS03055 -SOTONK1_RS03090 gnl|Prokka|PADJNBJD_00608 -SOTONK1_RS03090 NILJEPDF_00608 -SOTONK1_RS03090 LJHENM_03055 -SOTONK1_RS03090 BKC02_RS03120 -SOTONK1_RS03090 AOT15_RS03890 -SOTONK1_RS03090 AP288_RS01455 -SOTONK1_RS03090 CTRC943_RS03060 -SOTONK1_RS03090 BKC01_RS03120 -SOTONK1_RS03090 QSDFRQ_00608 -SOTONK1_RS03090 JIEJKO_03065 -L1440_RS00840 L1440_RS00840 -L1440_RS00840 CBP42_RS02245 -L1440_RS00840 CBP44_RS02250 -L1440_RS00840 L3404_RS00840 -L1440_RS00840 CBP48_RS02245 -L1224_RS04765 L1224_RS04765 -L1224_RS04765 AP288_RS04875 -L1224_RS04765 AQ244_RS04930 -L1224_RS04765 ECS102511_RS04775 -L1224_RS04765 L2BUCH2_RS04765 -L1224_RS04765 AOT15_RS03420 -L1224_RS04765 SOTONIA3_RS04800 -L1224_RS04765 BBV13_RS04810 -L1224_RS04765 L2BLST_RS04765 -L1224_RS04765 BBV16_RS04815 -L1224_RS04765 FCS84708_RS04770 -L1224_RS04765 AQ193_RS04755 -L1224_RS04765 NILJEPDF_00937 -L1224_RS04765 L3404_RS04760 -L1224_RS04765 QSDFRQ_00937 -L1224_RS04765 CTO_RS04830 -L1224_RS04765 gnl|Prokka|PADJNBJD_00943 -L1224_RS04765 AQ199_RS04830 -L1224_RS04765 A5291_RS04815 -L1224_RS04765 SOTONK1_RS04785 -L1224_RS04765 IaCS19096_RS04770 -L2BUCH2_RS00990 L2BUCH2_RS00990 -L2BUCH2_RS00990 E150_RS01000 -L2BUCH2_RS00990 CTB_RS01030 -L2BUCH2_RS00990 CTO_RS01030 -L2BUCH2_RS00990 FCS84708_RS01000 -L2BUCH2_RS00990 AP288_RS04070 -L2BUCH2_RS00990 BKB93_RS01005 -L2BUCH2_RS00990 CBP44_RS02400 -L2BUCH2_RS00990 AQ193_RS02990 -L2BUCH2_RS00990 AQ199_RS01695 -L2BUCH2_RS00990 L2BLST_RS00990 -L2BUCH2_RS00990 BW688_RS02400 -L2BUCH2_RS00990 BBV13_RS01035 -L2BUCH2_RS00990 G9768_RS01010 -L2BUCH2_RS00990 BKC02_RS01005 -L2BUCH2_RS00990 L3404_RS00985 -L2BUCH2_RS00990 AKW53_RS02495 -L2BUCH2_RS00990 BBV16_RS01035 -L2BUCH2_RS00990 BKC01_RS01005 -L2BUCH2_RS00990 120517 -L2BUCH2_RS00990 DU10_RS01015 -L2BUCH2_RS00990 gnl|Prokka|PADJNBJD_00197 -L2BUCH2_RS00990 BKC03_RS01005 -L2BUCH2_RS00990 NILJEPDF_00197 -L2BUCH2_RS00990 LJHENM_00990 -L2BUCH2_RS00990 CTRC943_RS00990 -L2BUCH2_RS00990 CTJTET1_RS01020 -L2BUCH2_RS00990 C15_RS0101040 -L2BUCH2_RS00990 SOTONK1_RS01005 -L2BUCH2_RS00990 ECS88FINAL_RS0101025 -L2BUCH2_RS00990 KW39_RS01010 -L2BUCH2_RS00990 JIEJKO_00990 -L2BUCH2_RS00990 A5291_RS01030 -L2BUCH2_RS00990 IaCS19096_RS01005 -L2BUCH2_RS00990 7618868 -L2BUCH2_RS00990 QSDFRQ_00197 -L2BUCH2_RS00990 O169_RS01010 -L2BUCH2_RS00990 DU13_RS01015 -L2BUCH2_RS00990 SW2_RS01000 -L2BUCH2_RS00990 BKB95_RS01020 -L2BUCH2_RS00990 CBP48_RS02395 -L2BUCH2_RS00990 KW36_RS01005 -L2BUCH2_RS00990 ECS102511_RS01000 -L2BUCH2_RS00990 BKB96_RS01005 -L2BUCH2_RS00990 CTL2C_RS02355 -L2BUCH2_RS00990 AOT15_RS01360 -L2BUCH2_RS00990 BKB99_RS01005 -L2BUCH2_RS00990 L1224_RS00985 -L2BUCH2_RS00990 L1440_RS00985 -L2BUCH2_RS00990 AQ244_RS03185 -L2BUCH2_RS00990 BKB92_RS01005 -L2BUCH2_RS00990 CBP42_RS02395 -L2BUCH2_RS00990 SOTONIA3_RS01020 -L2BUCH2_RS01170 L2BUCH2_RS01170 -L2BUCH2_RS01170 CBP44_RS02580 -L2BUCH2_RS01170 L2BLST_RS01170 -L2BUCH2_RS01170 BW688_RS02580 -L2BUCH2_RS01170 L3404_RS01165 -L2BUCH2_RS01170 CTRC943_RS01170 -L2BUCH2_RS01170 7618885 -L2BUCH2_RS01170 CBP48_RS02575 -L2BUCH2_RS01170 CTL2C_RS02535 -L2BUCH2_RS01170 L1224_RS01165 -L2BUCH2_RS01170 L1440_RS01165 -L2BUCH2_RS01170 CBP42_RS02575 -L2BUCH2_RS01170 E150_RS01180 -L2BUCH2_RS01170 CTB_RS01210 -L2BUCH2_RS01170 CTO_RS01210 -L2BUCH2_RS01170 FCS84708_RS01180 -L2BUCH2_RS01170 AP288_RS04250 -L2BUCH2_RS01170 BKB93_RS01185 -L2BUCH2_RS01170 AQ193_RS02810 -L2BUCH2_RS01170 AQ199_RS01875 -L2BUCH2_RS01170 BBV13_RS01215 -L2BUCH2_RS01170 G9768_RS01190 -L2BUCH2_RS01170 BKC02_RS01185 -L2BUCH2_RS01170 AKW53_RS02675 -L2BUCH2_RS01170 BBV16_RS01215 -L2BUCH2_RS01170 BKC01_RS01185 -L2BUCH2_RS01170 120490 -L2BUCH2_RS01170 gnl|Prokka|PADJNBJD_00232 -L2BUCH2_RS01170 DU10_RS01195 -L2BUCH2_RS01170 NILJEPDF_00232 -L2BUCH2_RS01170 LJHENM_01165 -L2BUCH2_RS01170 BKC03_RS01185 -L2BUCH2_RS01170 CTJTET1_RS01200 -L2BUCH2_RS01170 JIEJKO_01165 -L2BUCH2_RS01170 C15_RS0101220 -L2BUCH2_RS01170 SOTONK1_RS01185 -L2BUCH2_RS01170 ECS88FINAL_RS0101205 -L2BUCH2_RS01170 KW39_RS01190 -L2BUCH2_RS01170 QSDFRQ_00232 -L2BUCH2_RS01170 A5291_RS01210 -L2BUCH2_RS01170 IaCS19096_RS01185 -L2BUCH2_RS01170 O169_RS01190 -L2BUCH2_RS01170 DU13_RS01195 -L2BUCH2_RS01170 SW2_RS01180 -L2BUCH2_RS01170 BKB95_RS01200 -L2BUCH2_RS01170 KW36_RS01185 -L2BUCH2_RS01170 ECS102511_RS01180 -L2BUCH2_RS01170 BKB96_RS01185 -L2BUCH2_RS01170 AOT15_RS01180 -L2BUCH2_RS01170 BKB99_RS01185 -L2BUCH2_RS01170 AQ244_RS03365 -L2BUCH2_RS01170 BKB92_RS01185 -L2BUCH2_RS01170 SOTONIA3_RS01200 -CTRC943_RS04305 CTRC943_RS04305 -CTRC943_RS04305 AKW53_RS01040 -CTRC943_RS04305 BKC01_RS04365 -CTRC943_RS04305 AOT15_RS01905 -CTRC943_RS04305 CTJTET1_RS04495 -CTRC943_RS04305 CBP48_RS00930 -CTRC943_RS04305 BKC03_RS04360 -CTRC943_RS04305 A5291_RS04360 -CTRC943_RS04305 KW39_RS04340 -CTRC943_RS04305 SOTONK1_RS04325 -CTRC943_RS04305 ECS88FINAL_RS0104410 -CTRC943_RS04305 IaCS19096_RS04315 -CTRC943_RS04305 DU10_RS04375 -CTRC943_RS04305 C15_RS0104435 -CTRC943_RS04305 DU13_RS04375 -CTRC943_RS04305 O169_RS04335 -CTRC943_RS04305 KW36_RS04320 -CTRC943_RS04305 CBP42_RS00930 -CTRC943_RS04305 CTL2C_RS00920 -CTRC943_RS04305 L1224_RS04300 -CTRC943_RS04305 BKB95_RS04380 -CTRC943_RS04305 L1440_RS04295 -CTRC943_RS04305 BKB96_RS04365 -CTRC943_RS04305 BKB99_RS04360 -CTRC943_RS04305 SW2_RS04330 -CTRC943_RS04305 ECS102511_RS04320 -CTRC943_RS04305 CBP44_RS00930 -CTRC943_RS04305 L2BUCH2_RS04300 -CTRC943_RS04305 AQ193_RS04450 -CTRC943_RS04305 CTB_RS04355 -CTRC943_RS04305 AQ244_RS02425 -CTRC943_RS04305 SOTONIA3_RS04340 -CTRC943_RS04305 BKB92_RS04360 -CTRC943_RS04305 CTO_RS04350 -CTRC943_RS04305 L2BLST_RS04300 -CTRC943_RS04305 AP288_RS02625 -CTRC943_RS04305 BBV13_RS04365 -CTRC943_RS04305 E150_RS04330 -CTRC943_RS04305 gnl|Prokka|PADJNBJD_00847 -CTRC943_RS04305 FCS84708_RS04320 -CTRC943_RS04305 AQ199_RS00250 -CTRC943_RS04305 BBV16_RS04370 -CTRC943_RS04305 BW688_RS00930 -CTRC943_RS04305 7618739 -CTRC943_RS04305 119968 -CTRC943_RS04305 NILJEPDF_00848 -CTRC943_RS04305 LJHENM_04265 -CTRC943_RS04305 L3404_RS04295 -CTRC943_RS04305 G9768_RS04325 -CTRC943_RS04305 JIEJKO_04265 -CTRC943_RS04305 BKB93_RS04365 -CTRC943_RS04305 QSDFRQ_00848 -CTRC943_RS04305 BKC02_RS04360 -CTRC943_RS04305 AQ244_RS02435 F -CTRC943_RS04635 CTRC943_RS04635 -CTRC943_RS04635 AKW53_RS01375 -CTRC943_RS04635 BKC01_RS04710 -CTRC943_RS04635 AOT15_RS02230 -CTRC943_RS04635 CTJTET1_RS04820 -CTRC943_RS04635 CBP48_RS01280 -CTRC943_RS04635 KW39_RS04670 -CTRC943_RS04635 BKC03_RS04705 -CTRC943_RS04635 SOTONK1_RS04650 -CTRC943_RS04635 A5291_RS04685 -CTRC943_RS04635 ECS88FINAL_RS0104760 -CTRC943_RS04635 IaCS19096_RS04645 -CTRC943_RS04635 C15_RS0104780 -CTRC943_RS04635 DU10_RS04725 -CTRC943_RS04635 O169_RS04670 -CTRC943_RS04635 KW36_RS04650 -CTRC943_RS04635 DU13_RS04725 -CTRC943_RS04635 CTL2C_RS01250 -CTRC943_RS04635 CBP42_RS01280 -CTRC943_RS04635 L1224_RS04630 -CTRC943_RS04635 BKB95_RS04725 -CTRC943_RS04635 L1440_RS04625 -CTRC943_RS04635 BKB96_RS04710 -CTRC943_RS04635 BKB99_RS04705 -CTRC943_RS04635 SW2_RS04660 -CTRC943_RS04635 ECS102511_RS04655 -CTRC943_RS04635 CBP44_RS01280 -CTRC943_RS04635 L2BUCH2_RS04630 -CTRC943_RS04635 AQ193_RS04115 -CTRC943_RS04635 CTB_RS04680 -CTRC943_RS04635 SOTONIA3_RS04665 -CTRC943_RS04635 AQ244_RS02100 -CTRC943_RS04635 AP288_RS02960 -CTRC943_RS04635 BKB92_RS04710 -CTRC943_RS04635 CTO_RS04675 -CTRC943_RS04635 L2BLST_RS04630 -CTRC943_RS04635 BBV13_RS04695 -CTRC943_RS04635 E150_RS04665 -CTRC943_RS04635 gnl|Prokka|PADJNBJD_00913 -CTRC943_RS04635 BBV16_RS04700 -CTRC943_RS04635 FCS84708_RS04650 -CTRC943_RS04635 AQ199_RS00585 -CTRC943_RS04635 BW688_RS01280 -CTRC943_RS04635 NILJEPDF_00914 -CTRC943_RS04635 7618765 -CTRC943_RS04635 119927 -CTRC943_RS04635 L3404_RS04625 -CTRC943_RS04635 JIEJKO_04595 -CTRC943_RS04635 QSDFRQ_00914 -CTRC943_RS04635 G9768_RS04650 -CTRC943_RS04635 LJHENM_04605 -CTRC943_RS04635 BKB93_RS04715 -CTRC943_RS04635 BKC02_RS04705 -CTJTET1_RS00725 CTJTET1_RS00725 -CTJTET1_RS00725 SOTONK1_RS00725 -CTJTET1_RS00725 JIEJKO_00720 -CTJTET1_RS00725 QSDFRQ_00143 -CTJTET1_RS00725 IaCS19096_RS00725 -CTJTET1_RS00725 AOT15_RS00230 -CTJTET1_RS00725 BKC03_RS00735 -CTJTET1_RS00725 C15_RS0100750 -CTJTET1_RS00725 CTRC943_RS00725 -CTJTET1_RS00725 ECS88FINAL_RS0100750 -CTJTET1_RS00725 KW39_RS00725 -CTJTET1_RS00725 DU10_RS00735 -CTJTET1_RS00725 O169_RS00725 -CTJTET1_RS00725 DU13_RS00740 -CTJTET1_RS00725 KW36_RS00725 -CTJTET1_RS00725 CBP48_RS02125 -CTJTET1_RS00725 7618429 -CTJTET1_RS00725 SW2_RS00725 -CTJTET1_RS00725 BKB95_RS00735 -CTJTET1_RS00725 ECS102511_RS00725 -CTJTET1_RS00725 CTL2C_RS02090 -CTJTET1_RS00725 CTB_RS00730 -CTJTET1_RS00725 L1224_RS00725 -CTJTET1_RS00725 AQ244_RS02900 -CTJTET1_RS00725 BKB96_RS00735 -CTJTET1_RS00725 CBP42_RS02125 -CTJTET1_RS00725 BKB99_RS00735 -CTJTET1_RS00725 CTO_RS00730 -CTJTET1_RS00725 L1440_RS00725 -CTJTET1_RS00725 BKB92_RS00735 -CTJTET1_RS00725 SOTONIA3_RS00725 -CTJTET1_RS00725 E150_RS00725 -CTJTET1_RS00725 L2BUCH2_RS00725 -CTJTET1_RS00725 AQ193_RS03270 -CTJTET1_RS00725 CBP44_RS02130 -CTJTET1_RS00725 FCS84708_RS00725 -CTJTET1_RS00725 AP288_RS03795 -CTJTET1_RS00725 BKB93_RS00735 -CTJTET1_RS00725 119320 -CTJTET1_RS00725 AQ199_RS01420 -CTJTET1_RS00725 BBV13_RS00735 -CTJTET1_RS00725 G9768_RS00725 -CTJTET1_RS00725 L2BLST_RS00725 -CTJTET1_RS00725 BW688_RS02125 -CTJTET1_RS00725 BBV16_RS00735 -CTJTET1_RS00725 BKC02_RS00735 -CTJTET1_RS00725 gnl|Prokka|PADJNBJD_00143 -CTJTET1_RS00725 LJHENM_00715 -CTJTET1_RS00725 AKW53_RS02220 -CTJTET1_RS00725 BKC01_RS00735 -CTJTET1_RS00725 NILJEPDF_00143 -CTJTET1_RS00725 A5291_RS00730 -CTJTET1_RS00725 L3404_RS00725 -CTJTET1_RS04155 CTJTET1_RS04155 -KW39_RS03275 KW39_RS03275 -KW39_RS03275 BKC03_RS03290 -KW39_RS03275 CTJTET1_RS03275 -KW39_RS03275 ECS88FINAL_RS0103325 -KW39_RS03275 DU10_RS03305 -KW39_RS03275 SOTONK1_RS03260 -KW39_RS03275 O169_RS03270 -KW39_RS03275 IaCS19096_RS03255 -KW39_RS03275 C15_RS0103325 -KW39_RS03275 A5291_RS03300 -KW39_RS03275 AKW53_RS00010 -KW39_RS03275 DU13_RS03300 -KW39_RS03275 CTL2C_RS04605 -KW39_RS03275 CBP48_RS04690 -KW39_RS03275 7619108 -KW39_RS03275 SW2_RS03265 -KW39_RS03275 L1224_RS03235 -KW39_RS03275 KW36_RS03260 -KW39_RS03275 ECS102511_RS03260 -KW39_RS03275 L1440_RS03235 -KW39_RS03275 BKB95_RS03305 -KW39_RS03275 AQ244_RS04655 -KW39_RS03275 BKB96_RS03300 -KW39_RS03275 BKB99_RS03295 -KW39_RS03275 CBP42_RS04695 -KW39_RS03275 L2BUCH2_RS03235 -KW39_RS03275 BKB92_RS03290 -KW39_RS03275 CTB_RS03300 -KW39_RS03275 E150_RS03265 -KW39_RS03275 SOTONIA3_RS03280 -KW39_RS03275 BW688_RS04685 -KW39_RS03275 CTO_RS03295 -KW39_RS03275 FCS84708_RS03260 -KW39_RS03275 AQ193_RS00725 -KW39_RS03275 BBV13_RS03300 -KW39_RS03275 L2BLST_RS03235 -KW39_RS03275 CBP44_RS04690 -KW39_RS03275 120122 -KW39_RS03275 AQ199_RS03960 -KW39_RS03275 BBV16_RS03310 -KW39_RS03275 BKB93_RS03295 -KW39_RS03275 G9768_RS03260 -KW39_RS03275 L3404_RS03230 -KW39_RS03275 gnl|Prokka|PADJNBJD_00641 -KW39_RS03275 AP288_RS01630 -KW39_RS03275 BKC02_RS03290 -KW39_RS03275 NILJEPDF_00642 -KW39_RS03275 LJHENM_03225 -KW39_RS03275 AOT15_RS04060 -KW39_RS03275 CTRC943_RS03235 -KW39_RS03275 JIEJKO_03230 -KW39_RS03275 BKC01_RS03290 -KW39_RS03275 QSDFRQ_00642 -AKW53_RS01210 AKW53_RS01210 -AKW53_RS01210 BKC01_RS04535 -AKW53_RS01210 CTRC943_RS04470 -AKW53_RS01210 AOT15_RS02065 -AKW53_RS01210 CTJTET1_RS04655 -AKW53_RS01210 KW39_RS04505 -AKW53_RS01210 BKC03_RS04530 -AKW53_RS01210 CBP48_RS01105 -AKW53_RS01210 A5291_RS04520 -AKW53_RS01210 SOTONK1_RS04485 -AKW53_RS01210 ECS88FINAL_RS0104585 -AKW53_RS01210 IaCS19096_RS04480 -AKW53_RS01210 C15_RS0104605 -AKW53_RS01210 DU10_RS04550 -AKW53_RS01210 O169_RS04505 -AKW53_RS01210 KW36_RS04485 -AKW53_RS01210 DU13_RS04550 -AKW53_RS01210 BKB95_RS04550 -AKW53_RS01210 CBP42_RS01105 -AKW53_RS01210 CTL2C_RS01085 -AKW53_RS01210 L1224_RS04465 -AKW53_RS01210 BKB96_RS04535 -AKW53_RS01210 L1440_RS04460 -AKW53_RS01210 BKB99_RS04530 -AKW53_RS01210 SW2_RS04495 -AKW53_RS01210 ECS102511_RS04490 -AKW53_RS01210 AQ193_RS04280 -AKW53_RS01210 CBP44_RS01105 -AKW53_RS01210 CTB_RS04515 -AKW53_RS01210 L2BUCH2_RS04465 -AKW53_RS01210 AQ244_RS02265 -AKW53_RS01210 SOTONIA3_RS04500 -AKW53_RS01210 CTO_RS04510 -AKW53_RS01210 BBV13_RS04525 -AKW53_RS01210 BKB92_RS04535 -AKW53_RS01210 AP288_RS02795 -AKW53_RS01210 BBV16_RS04530 -AKW53_RS01210 E150_RS04500 -AKW53_RS01210 L2BLST_RS04465 -AKW53_RS01210 gnl|Prokka|PADJNBJD_00880 -AKW53_RS01210 FCS84708_RS04485 -AKW53_RS01210 AQ199_RS00420 -AKW53_RS01210 BW688_RS01105 -AKW53_RS01210 119954 -AKW53_RS01210 NILJEPDF_00881 -AKW53_RS01210 7618748 -AKW53_RS01210 G9768_RS04485 -AKW53_RS01210 LJHENM_04435 -AKW53_RS01210 L3404_RS04460 -AKW53_RS01210 JIEJKO_04430 -AKW53_RS01210 QSDFRQ_00881 -AKW53_RS01210 BKB93_RS04540 -AKW53_RS01210 BKC02_RS04530 -AP288_RS03870 AP288_RS03870 -AP288_RS03870 L2BUCH2_RS00805 F -AP288_RS03870 CBP44_RS02210 F -AP288_RS03870 L2BLST_RS00805 F -AP288_RS03870 BW688_RS02205 F -AP288_RS03870 L3404_RS00805 F -AP288_RS03870 CTRC943_RS00805 F -AP288_RS03870 CBP48_RS02205 F -AP288_RS03870 CTL2C_RS02170 F -AP288_RS03870 L1224_RS00805 F -AP288_RS03870 CBP42_RS02205 F -AP288_RS03870 L1440_RS00805 F -AP288_RS03870 FCS84708_RS00800 -AP288_RS03870 BKB93_RS00810 -AP288_RS03870 120556 -AP288_RS03870 AQ199_RS01495 -AP288_RS03870 BBV13_RS00810 -AP288_RS03870 AQ193_RS03195 -AP288_RS03870 BBV16_RS00810 -AP288_RS03870 BKC02_RS00810 -AP288_RS03870 gnl|Prokka|PADJNBJD_00158 -AP288_RS03870 LJHENM_00790 -AP288_RS03870 AKW53_RS02295 -AP288_RS03870 BKC01_RS00810 -AP288_RS03870 NILJEPDF_00158 -AP288_RS03870 A5291_RS00805 -AP288_RS03870 SOTONK1_RS00800 -AP288_RS03870 JIEJKO_00795 -AP288_RS03870 QSDFRQ_00158 -AP288_RS03870 CTJTET1_RS00800 -AP288_RS03870 IaCS19096_RS00800 -AP288_RS03870 BKC03_RS00810 -AP288_RS03870 C15_RS0100825 -AP288_RS03870 ECS88FINAL_RS01000000104895 -AP288_RS03870 KW39_RS00800 -AP288_RS03870 DU10_RS00810 -AP288_RS03870 O169_RS00800 -AP288_RS03870 DU13_RS00815 -AP288_RS03870 KW36_RS00800 -AP288_RS03870 SW2_RS00800 -AP288_RS03870 BKB95_RS00810 -AP288_RS03870 AOT15_RS00155 -AP288_RS03870 ECS102511_RS00800 -AP288_RS03870 CTB_RS00805 -AP288_RS03870 AQ244_RS02975 -AP288_RS03870 CTO_RS00805 -AP288_RS03870 BKB92_RS00810 -AP288_RS03870 SOTONIA3_RS00800 -AP288_RS03870 E150_RS00800 -AP288_RS03870 L1224_RS00800 F -AP288_RS03870 L3404_RS00800 F -AP288_RS03870 L2BUCH2_RS00800 F -AP288_RS03870 CBP44_RS02205 F -AP288_RS03870 G9768_RS00800 F -AP288_RS03870 L2BLST_RS00800 F -AP288_RS03870 BW688_RS02200 F -AP288_RS03870 CTRC943_RS00800 F -AP288_RS03870 CBP48_RS02200 F -AP288_RS03870 CTL2C_RS02165 F -AP288_RS03870 CBP42_RS02200 F -AP288_RS03870 L1440_RS00800 F -AQ193_RS04890 AQ193_RS04890 -AQ193_RS04890 BKB92_RS03380 -AQ193_RS04890 E150_RS04850 -AQ193_RS04890 FCS84708_RS04855 -AQ193_RS04890 AQ199_RS04955 -AQ193_RS04890 BKB93_RS03385 -AQ193_RS04890 AP288_RS04965 -AQ193_RS04890 KW39_RS04855 -AQ193_RS04890 DU10_RS03395 -AQ193_RS04890 ECS88FINAL_RS1000000105080 -AQ193_RS04890 O169_RS04845 -AQ193_RS04890 DU13_RS03395 -AQ193_RS04890 AKW53_RS04790 -AQ193_RS04890 SW2_RS04845 -AQ193_RS04890 ECS102511_RS04860 -AQ193_RS03865 AQ193_RS03865 -AQ193_RS03865 CBP44_RS01540 -AQ193_RS03865 E150_RS00140 -AQ193_RS03865 L2BUCH2_RS00140 -AQ193_RS03865 AQ244_RS01850 -AQ193_RS03865 BKB93_RS00145 -AQ193_RS03865 FCS84708_RS00140 -AQ193_RS03865 AP288_RS03210 -AQ193_RS03865 BBV13_RS00145 -AQ193_RS03865 G9768_RS00140 -AQ193_RS03865 AQ199_RS00835 -AQ193_RS03865 BW688_RS01535 -AQ193_RS03865 L2BLST_RS00140 -AQ193_RS03865 BKC02_RS00145 -AQ193_RS03865 BBV16_RS00145 -AQ193_RS03865 BKC01_RS00145 -AQ193_RS03865 gnl|Prokka|PADJNBJD_00029 -AQ193_RS03865 LJHENM_00145 -AQ193_RS03865 A5291_RS00140 -AQ193_RS03865 SOTONK1_RS00140 -AQ193_RS03865 JIEJKO_00140 -AQ193_RS03865 7618368 -AQ193_RS03865 NILJEPDF_00029 -AQ193_RS03865 L3404_RS00140 -AQ193_RS03865 IaCS19096_RS00140 -AQ193_RS03865 AKW53_RS01630 -AQ193_RS03865 BKC03_RS00145 -AQ193_RS03865 C15_RS0100140 -AQ193_RS03865 QSDFRQ_00029 -AQ193_RS03865 CTJTET1_RS00140 -AQ193_RS03865 DU10_RS00145 -AQ193_RS03865 CTRC943_RS00140 -AQ193_RS03865 AOT15_RS00815 -AQ193_RS03865 O169_RS00140 -AQ193_RS03865 CBP48_RS01535 -AQ193_RS03865 ECS88FINAL_RS0100145 -AQ193_RS03865 DU13_RS00145 -AQ193_RS03865 KW39_RS00140 -AQ193_RS03865 KW36_RS00140 -AQ193_RS03865 BKB95_RS00145 -AQ193_RS03865 SW2_RS00140 -AQ193_RS03865 ECS102511_RS00140 -AQ193_RS03865 CTB_RS00140 -AQ193_RS03865 CTL2C_RS01505 -AQ193_RS03865 CBP42_RS01535 -AQ193_RS03865 L1224_RS00140 -AQ193_RS03865 BKB96_RS00145 -AQ193_RS03865 BKB99_RS00145 -AQ193_RS03865 CTO_RS00140 -AQ193_RS03865 SOTONIA3_RS00140 -AQ193_RS03865 L1440_RS00140 -AQ193_RS03865 BKB92_RS00145 -AQ193_RS03865 119225 -AQ193_RS04195 AQ193_RS04195 -AQ193_RS04195 CBP44_RS01200 -AQ193_RS04195 CTB_RS04600 -AQ193_RS04195 L2BUCH2_RS04550 -AQ193_RS04195 SOTONIA3_RS04585 -AQ193_RS04195 AQ244_RS02180 -AQ193_RS04195 CTO_RS04595 -AQ193_RS04195 AP288_RS02880 -AQ193_RS04195 BBV13_RS04615 -AQ193_RS04195 BKB92_RS04630 -AQ193_RS04195 BBV16_RS04620 -AQ193_RS04195 E150_RS04585 -AQ193_RS04195 gnl|Prokka|PADJNBJD_00897 -AQ193_RS04195 L2BLST_RS04550 -AQ193_RS04195 FCS84708_RS04570 -AQ193_RS04195 AQ199_RS00505 -AQ193_RS04195 NILJEPDF_00898 -AQ193_RS04195 BW688_RS01200 -AQ193_RS04195 119888 -AQ193_RS04195 JIEJKO_04515 -AQ193_RS04195 7618338 -AQ193_RS04195 QSDFRQ_00898 -AQ193_RS04195 G9768_RS04570 -AQ193_RS04195 LJHENM_04525 -AQ193_RS04195 L3404_RS04545 -AQ193_RS04195 BKB93_RS04635 -AQ193_RS04195 BKC02_RS04625 -AQ193_RS04195 AKW53_RS01295 -AQ193_RS04195 BKC01_RS04630 -AQ193_RS04195 CTRC943_RS04555 -AQ193_RS04195 AOT15_RS02150 -AQ193_RS04195 CTJTET1_RS04740 -AQ193_RS04195 KW39_RS04590 -AQ193_RS04195 BKC03_RS04625 -AQ193_RS04195 CBP48_RS01200 -AQ193_RS04195 A5291_RS04605 -AQ193_RS04195 SOTONK1_RS04570 -AQ193_RS04195 ECS88FINAL_RS0104680 -AQ193_RS04195 IaCS19096_RS04565 -AQ193_RS04195 C15_RS0104700 -AQ193_RS04195 DU10_RS04645 -AQ193_RS04195 O169_RS04590 -AQ193_RS04195 KW36_RS04570 -AQ193_RS04195 DU13_RS04645 -AQ193_RS04195 CTL2C_RS01170 -AQ193_RS04195 BKB95_RS04645 -AQ193_RS04195 CBP42_RS01200 -AQ193_RS04195 L1224_RS04550 -AQ193_RS04195 BKB96_RS04630 -AQ193_RS04195 L1440_RS04545 -AQ193_RS04195 BKB99_RS04625 -AQ193_RS04195 SW2_RS04580 -AQ193_RS04195 ECS102511_RS04575 -AQ193_RS04360 AQ193_RS04360 -AQ193_RS04360 CBP44_RS01025 -AQ193_RS04360 CTB_RS04435 -AQ193_RS04360 L2BUCH2_RS04385 -AQ193_RS04360 AQ244_RS02345 -AQ193_RS04360 SOTONIA3_RS04420 -AQ193_RS04360 CTO_RS04430 -AQ193_RS04360 BKB92_RS04455 -AQ193_RS04360 AP288_RS02715 -AQ193_RS04360 BBV13_RS04445 -AQ193_RS04360 E150_RS04420 -AQ193_RS04360 gnl|Prokka|PADJNBJD_00863 -AQ193_RS04360 L2BLST_RS04385 -AQ193_RS04360 BBV16_RS04450 -AQ193_RS04360 119851 -AQ193_RS04360 FCS84708_RS04405 -AQ193_RS04360 AQ199_RS00340 -AQ193_RS04360 7618314 -AQ193_RS04360 NILJEPDF_00864 -AQ193_RS04360 BW688_RS01025 -AQ193_RS04360 LJHENM_04350 -AQ193_RS04360 JIEJKO_04345 -AQ193_RS04360 QSDFRQ_00864 -AQ193_RS04360 G9768_RS04405 -AQ193_RS04360 L3404_RS04380 -AQ193_RS04360 BKB93_RS04460 -AQ193_RS04360 BKC02_RS04450 -AQ193_RS04360 AKW53_RS01130 -AQ193_RS04360 BKC01_RS04455 -AQ193_RS04360 CTRC943_RS04390 -AQ193_RS04360 AOT15_RS01985 -AQ193_RS04360 CTJTET1_RS04575 -AQ193_RS04360 KW39_RS04425 -AQ193_RS04360 BKC03_RS04450 -AQ193_RS04360 CBP48_RS01025 -AQ193_RS04360 A5291_RS04440 -AQ193_RS04360 SOTONK1_RS04405 -AQ193_RS04360 ECS88FINAL_RS0104495 -AQ193_RS04360 IaCS19096_RS04400 -AQ193_RS04360 C15_RS0104515 -AQ193_RS04360 DU10_RS04470 -AQ193_RS04360 O169_RS04425 -AQ193_RS04360 KW36_RS04405 -AQ193_RS04360 DU13_RS04470 -AQ193_RS04360 BKB95_RS04470 -AQ193_RS04360 CBP42_RS01025 -AQ193_RS04360 CTL2C_RS01005 -AQ193_RS04360 L1224_RS04385 -AQ193_RS04360 BKB96_RS04455 -AQ193_RS04360 L1440_RS04380 -AQ193_RS04360 BKB99_RS04450 -AQ193_RS04360 SW2_RS04415 -AQ193_RS04360 ECS102511_RS04410 -AQ193_RS04530 AQ193_RS04530 -AQ193_RS04530 CBP44_RS00850 -AQ193_RS04530 CTB_RS04275 -AQ193_RS04530 L2BUCH2_RS04220 -AQ193_RS04530 AQ244_RS02520 -AQ193_RS04530 SOTONIA3_RS04260 -AQ193_RS04530 BKB92_RS04280 -AQ193_RS04530 CTO_RS04270 -AQ193_RS04530 AP288_RS02545 -AQ193_RS04530 BBV13_RS04285 -AQ193_RS04530 E150_RS04250 -AQ193_RS04530 119823 -AQ193_RS04530 L2BLST_RS04220 -AQ193_RS04530 FCS84708_RS04240 -AQ193_RS04530 AQ199_RS00170 -AQ193_RS04530 BBV16_RS04290 -AQ193_RS04530 7618295 -AQ193_RS04530 BW688_RS00850 -AQ193_RS04530 gnl|Prokka|PADJNBJD_00833 -AQ193_RS04530 NILJEPDF_00834 -AQ193_RS04530 G9768_RS04245 -AQ193_RS04530 L3404_RS04215 -AQ193_RS04530 BKB93_RS04285 -AQ193_RS04530 LJHENM_04195 -AQ193_RS04530 JIEJKO_04195 -AQ193_RS04530 BKC02_RS04280 -AQ193_RS04530 QSDFRQ_00834 -AQ193_RS04530 AKW53_RS00960 -AQ193_RS04530 BKC01_RS04285 -AQ193_RS04530 CTRC943_RS04225 -AQ193_RS04530 AOT15_RS01825 -AQ193_RS04530 CTJTET1_RS04415 -AQ193_RS04530 BKC03_RS04280 -AQ193_RS04530 CBP48_RS00850 -AQ193_RS04530 A5291_RS04280 -AQ193_RS04530 KW39_RS04260 -AQ193_RS04530 SOTONK1_RS04245 -AQ193_RS04530 ECS88FINAL_RS0104335 -AQ193_RS04530 IaCS19096_RS04235 -AQ193_RS04530 DU10_RS04295 -AQ193_RS04530 C15_RS0104360 -AQ193_RS04530 DU13_RS04295 -AQ193_RS04530 O169_RS04255 -AQ193_RS04530 KW36_RS04240 -AQ193_RS04530 BKB95_RS04300 -AQ193_RS04530 CBP42_RS00850 -AQ193_RS04530 CTL2C_RS00840 -AQ193_RS04530 L1224_RS04220 -AQ193_RS04530 BKB96_RS04285 -AQ193_RS04530 L1440_RS04215 -AQ193_RS04530 BKB99_RS04280 -AQ193_RS04530 SW2_RS04250 -AQ193_RS04530 ECS102511_RS04240 -AQ193_RS04695 AQ193_RS04695 -AQ193_RS04695 AQ244_RS02685 -AQ193_RS04695 CBP44_RS00685 -AQ193_RS04695 CTB_RS04115 -AQ193_RS04695 L2BUCH2_RS04060 -AQ193_RS04695 BKB92_RS04115 -AQ193_RS04695 SOTONIA3_RS04100 -AQ193_RS04695 CTO_RS04110 -AQ193_RS04695 AP288_RS02380 -AQ193_RS04695 E150_RS04085 -AQ193_RS04695 BBV13_RS04120 -AQ193_RS04695 119792 -AQ193_RS04695 FCS84708_RS04075 -AQ193_RS04695 AQ199_RS00005 -AQ193_RS04695 7618275 -AQ193_RS04695 L2BLST_RS04060 -AQ193_RS04695 BBV16_RS04130 -AQ193_RS04695 BW688_RS00685 -AQ193_RS04695 gnl|Prokka|PADJNBJD_00801 -AQ193_RS04695 BKB93_RS04120 -AQ193_RS04695 NILJEPDF_00802 -AQ193_RS04695 G9768_RS04080 -AQ193_RS04695 L3404_RS04055 -AQ193_RS04695 LJHENM_04035 -AQ193_RS04695 JIEJKO_04035 -AQ193_RS04695 BKC02_RS04115 -AQ193_RS04695 QSDFRQ_00802 -AQ193_RS04695 BKC01_RS04120 -AQ193_RS04695 CTRC943_RS04065 -AQ193_RS04695 AOT15_RS01665 -AQ193_RS04695 CTJTET1_RS04255 -AQ193_RS04695 KW39_RS04095 -AQ193_RS04695 BKC03_RS04115 -AQ193_RS04695 CBP48_RS00685 -AQ193_RS04695 A5291_RS04120 -AQ193_RS04695 ECS88FINAL_RS0104160 -AQ193_RS04695 DU10_RS04130 -AQ193_RS04695 SOTONK1_RS04080 -AQ193_RS04695 IaCS19096_RS04075 -AQ193_RS04695 DU13_RS04130 -AQ193_RS04695 C15_RS0104185 -AQ193_RS04695 O169_RS04090 -AQ193_RS04695 KW36_RS04080 -AQ193_RS04695 BKB95_RS04135 -AQ193_RS04695 CBP42_RS00685 -AQ193_RS04695 CTL2C_RS00680 -AQ193_RS04695 L1224_RS04060 -AQ193_RS04695 BKB96_RS04120 -AQ193_RS04695 SW2_RS04085 -AQ193_RS04695 L1440_RS04055 -AQ193_RS04695 ECS102511_RS04075 -AQ193_RS04695 BKB99_RS04115 -AQ193_RS05035 AQ193_RS05035 -AQ193_RS05035 AP288_RS05060 -AQ193_RS05035 AQ199_RS04980 -AQ193_RS05035 AQ244_RS05260 -AQ199_RS01140 AQ199_RS01140 -AQ199_RS01140 BBV13_RS00450 -AQ199_RS01140 L2BLST_RS00445 -AQ199_RS01140 BW688_RS01845 -AQ199_RS01140 G9768_RS00445 -AQ199_RS01140 BKC02_RS00455 -AQ199_RS01140 gnl|Prokka|PADJNBJD_00087 -AQ199_RS01140 LJHENM_00435 -AQ199_RS01140 BBV16_RS00450 -AQ199_RS01140 NILJEPDF_00087 -AQ199_RS01140 A5291_RS00445 -AQ199_RS01140 JIEJKO_00440 -AQ199_RS01140 BKC01_RS00455 -AQ199_RS01140 SOTONK1_RS00445 -AQ199_RS01140 L3404_RS00445 -AQ199_RS01140 AKW53_RS01935 -AQ199_RS01140 AQ244_RS01545 -AQ199_RS01140 QSDFRQ_00087 -AQ199_RS01140 AQ193_RS03550 -AQ199_RS01140 IaCS19096_RS00445 -AQ199_RS01140 BKC03_RS00455 -AQ199_RS01140 DU10_RS00455 -AQ199_RS01140 C15_RS0100450 -AQ199_RS01140 7618817 -AQ199_RS01140 CTRC943_RS00445 -AQ199_RS01140 CTJTET1_RS00445 -AQ199_RS01140 O169_RS00445 -AQ199_RS01140 DU13_RS00460 -AQ199_RS01140 ECS88FINAL_RS0100455 -AQ199_RS01140 KW36_RS00445 -AQ199_RS01140 CBP48_RS01845 -AQ199_RS01140 KW39_RS00445 -AQ199_RS01140 SW2_RS00445 -AQ199_RS01140 BKB95_RS00455 -AQ199_RS01140 ECS102511_RS00445 -AQ199_RS01140 CTB_RS00445 -AQ199_RS01140 CTL2C_RS01810 -AQ199_RS01140 CBP42_RS01845 -AQ199_RS01140 BKB96_RS00455 -AQ199_RS01140 L1224_RS00445 -AQ199_RS01140 BKB99_RS00455 -AQ199_RS01140 BKB92_RS00455 -AQ199_RS01140 CTO_RS00445 -AQ199_RS01140 L1440_RS00445 -AQ199_RS01140 AOT15_RS00510 -AQ199_RS01140 SOTONIA3_RS00445 -AQ199_RS01140 E150_RS00445 -AQ199_RS01140 CBP44_RS01850 -AQ199_RS01140 120605 -AQ199_RS01140 L2BUCH2_RS00445 -AQ199_RS01140 BKB93_RS00455 -AQ199_RS01140 FCS84708_RS00445 -AQ199_RS01140 AP288_RS03515 -AQ199_RS04850 AQ199_RS04850 -AQ199_RS04850 AP288_RS04815 -AQ199_RS04850 AQ244_RS04865 -AQ199_RS04850 AQ193_RS04825 -AQ244_RS04925 AQ244_RS04925 -AQ244_RS04925 L1224_RS04760 -AQ244_RS04925 ECS102511_RS04770 -AQ244_RS04925 AP288_RS04880 -AQ244_RS04925 L2BUCH2_RS04760 -AQ244_RS04925 SOTONIA3_RS04795 -AQ244_RS04925 BBV13_RS04805 -AQ244_RS04925 CTO_RS04795 -AQ244_RS04925 L2BLST_RS04760 -AQ244_RS04925 BBV16_RS04810 -AQ244_RS04925 FCS84708_RS04765 -AQ244_RS04925 AQ193_RS04750 -AQ244_RS04925 gnl|Prokka|PADJNBJD_00936 -AQ244_RS04925 NILJEPDF_00936 -AQ244_RS04925 QSDFRQ_00936 -AQ244_RS04925 AQ199_RS04835 -AQ244_RS04925 A5291_RS04810 -AQ244_RS04925 SOTONK1_RS04780 -AQ244_RS04925 IaCS19096_RS04765 -BBV16_RS00775 BBV16_RS00775 -BBV16_RS00775 BKC02_RS00775 -BBV16_RS00775 gnl|Prokka|PADJNBJD_00151 -BBV16_RS00775 LJHENM_00755 -BBV16_RS00775 AKW53_RS02260 -BBV16_RS00775 BKC01_RS00775 -BBV16_RS00775 NILJEPDF_00151 -BBV16_RS00775 A5291_RS00770 -BBV16_RS00775 L3404_RS00765 -BBV16_RS00775 SOTONK1_RS00765 -BBV16_RS00775 JIEJKO_00760 -BBV16_RS00775 QSDFRQ_00151 -BBV16_RS00775 CTJTET1_RS00765 -BBV16_RS00775 IaCS19096_RS00765 -BBV16_RS00775 BKC03_RS00775 -BBV16_RS00775 C15_RS0100790 -BBV16_RS00775 CTRC943_RS00765 -BBV16_RS00775 ECS88FINAL_RS0100790 -BBV16_RS00775 KW39_RS00765 -BBV16_RS00775 DU10_RS00775 -BBV16_RS00775 O169_RS00765 -BBV16_RS00775 DU13_RS00780 -BBV16_RS00775 KW36_RS00765 -BBV16_RS00775 CBP48_RS02165 -BBV16_RS00775 SW2_RS00765 -BBV16_RS00775 BKB95_RS00775 -BBV16_RS00775 7618437 -BBV16_RS00775 AQ193_RS03230 -BBV16_RS00775 ECS102511_RS00765 -BBV16_RS00775 CTL2C_RS02130 -BBV16_RS00775 CTB_RS00770 -BBV16_RS00775 L1224_RS00765 -BBV16_RS00775 AQ244_RS02940 -BBV16_RS00775 BKB96_RS00775 -BBV16_RS00775 CBP42_RS02165 -BBV16_RS00775 BKB99_RS00775 -BBV16_RS00775 CTO_RS00770 -BBV16_RS00775 L1440_RS00765 -BBV16_RS00775 BKB92_RS00775 -BBV16_RS00775 SOTONIA3_RS00765 -BBV16_RS00775 E150_RS00765 -BBV16_RS00775 L2BUCH2_RS00765 -BBV16_RS00775 CBP44_RS02170 -BBV16_RS00775 FCS84708_RS00765 -BBV16_RS00775 AP288_RS03835 -BBV16_RS00775 BKB93_RS00775 -BBV16_RS00775 AOT15_RS00190 -BBV16_RS00775 119332 -BBV16_RS00775 AQ199_RS01460 -BBV16_RS00775 BBV13_RS00775 -BBV16_RS00775 G9768_RS00765 -BBV16_RS00775 L2BLST_RS00765 -BBV16_RS00775 BW688_RS02165 -BBV16_RS03185 BBV16_RS03185 -BBV16_RS03185 AQ199_RS03840 -BBV16_RS03185 BKB93_RS03175 -BBV16_RS03185 AQ244_RS04775 -BBV16_RS03185 G9768_RS03140 -BBV16_RS03185 L3404_RS03110 -BBV16_RS03185 gnl|Prokka|PADJNBJD_00618 -BBV16_RS03185 NILJEPDF_00618 -BBV16_RS03185 LJHENM_03105 -BBV16_RS03185 BKC02_RS03170 -BBV16_RS03185 AOT15_RS03940 -BBV16_RS03185 AP288_RS01510 -BBV16_RS03185 CTRC943_RS03115 -BBV16_RS03185 BKC01_RS03170 -BBV16_RS03185 QSDFRQ_00618 -BBV16_RS03185 AQ193_RS00845 -BBV16_RS03185 JIEJKO_03115 -BBV16_RS03185 SOTONK1_RS03140 -BBV16_RS03185 CTJTET1_RS03155 -BBV16_RS03185 BKC03_RS03170 -BBV16_RS03185 KW39_RS03155 -BBV16_RS03185 C15_RS0103205 -BBV16_RS03185 ECS88FINAL_RS0103205 -BBV16_RS03185 IaCS19096_RS03135 -BBV16_RS03185 DU10_RS03185 -BBV16_RS03185 A5291_RS03175 -BBV16_RS03185 O169_RS03150 -BBV16_RS03185 CTL2C_RS04485 -BBV16_RS03185 DU13_RS03180 -BBV16_RS03185 CBP48_RS04570 -BBV16_RS03185 L1224_RS03115 -BBV16_RS03185 KW36_RS03140 -BBV16_RS03185 BKB95_RS03180 -BBV16_RS03185 AKW53_RS04365 -BBV16_RS03185 BKB96_RS03175 -BBV16_RS03185 BKB99_RS03170 -BBV16_RS03185 7618637 -BBV16_RS03185 SW2_RS03145 -BBV16_RS03185 L1440_RS03115 -BBV16_RS03185 ECS102511_RS03140 -BBV16_RS03185 CBP42_RS04575 -BBV16_RS03185 L2BUCH2_RS03115 -BBV16_RS03185 CTB_RS03175 -BBV16_RS03185 SOTONIA3_RS03155 -BBV16_RS03185 BKB92_RS03170 -BBV16_RS03185 BW688_RS04565 -BBV16_RS03185 119649 -BBV16_RS03185 E150_RS03145 -BBV16_RS03185 CTO_RS03170 -BBV16_RS03185 L2BLST_RS03115 -BBV16_RS03185 CBP44_RS04570 -BBV16_RS03185 FCS84708_RS03140 -BBV16_RS03185 BBV13_RS03175 -BKC02_RS02470 BKC02_RS02470 -BKC02_RS02470 gnl|Prokka|PADJNBJD_00483 -BKC02_RS02470 BKC01_RS02470 -BKC02_RS02470 NILJEPDF_00483 -BKC02_RS02470 LJHENM_02435 -BKC02_RS02470 JIEJKO_02435 -BKC02_RS02470 QSDFRQ_00483 -BKC02_RS02470 BKC03_RS02470 -BKC02_RS02470 C15_RS0102510 -BKC02_RS02470 DU10_RS02490 -BKC02_RS02470 DU13_RS02485 -BKC02_RS02470 BKB96_RS02475 -BKC02_RS02470 BKB99_RS02470 -BKC02_RS02470 CBP48_RS03870 -BKC02_RS02470 BKB95_RS02485 -BKC02_RS02470 120269 -BKC02_RS02470 CBP42_RS03880 -BKC02_RS02470 BKB92_RS02475 -BKC02_RS02470 CBP44_RS03875 -BKC02_RS02470 BKB93_RS02480 -BKB95_RS01255 BKB95_RS01255 -BKB95_RS01255 SW2_RS01235 -BKB95_RS01255 CBP48_RS02630 -BKB95_RS01255 KW36_RS01240 -BKB95_RS01255 ECS102511_RS01235 -BKB95_RS01255 BKB96_RS01240 -BKB95_RS01255 CTL2C_RS02590 -BKB95_RS01255 BKB99_RS01240 -BKB95_RS01255 L1224_RS01220 -BKB95_RS01255 L1440_RS01220 -BKB95_RS01255 AQ244_RS03420 -BKB95_RS01255 BKB92_RS01240 -BKB95_RS01255 CBP42_RS02630 -BKB95_RS01255 SOTONIA3_RS01255 -BKB95_RS01255 CTB_RS01265 -BKB95_RS01255 E150_RS01235 -BKB95_RS01255 L2BUCH2_RS01225 -BKB95_RS01255 CTO_RS01265 -BKB95_RS01255 FCS84708_RS01235 -BKB95_RS01255 AOT15_RS01125 -BKB95_RS01255 AP288_RS04305 -BKB95_RS01255 BKB93_RS01240 -BKB95_RS01255 CBP44_RS02635 -BKB95_RS01255 AQ199_RS01930 -BKB95_RS01255 L2BLST_RS01225 -BKB95_RS01255 BW688_RS02635 -BKB95_RS01255 BBV13_RS01270 -BKB95_RS01255 G9768_RS01245 -BKB95_RS01255 BKC02_RS01240 -BKB95_RS01255 L3404_RS01220 -BKB95_RS01255 AKW53_RS02730 -BKB95_RS01255 BBV16_RS01270 -BKB95_RS01255 BKC01_RS01240 -BKB95_RS01255 gnl|Prokka|PADJNBJD_00243 -BKB95_RS01255 DU10_RS01250 -BKB95_RS01255 119399 -BKB95_RS01255 NILJEPDF_00243 -BKB95_RS01255 LJHENM_01220 -BKB95_RS01255 AQ193_RS02755 -BKB95_RS01255 BKC03_RS01240 -BKB95_RS01255 CTRC943_RS01225 -BKB95_RS01255 CTJTET1_RS01255 -BKB95_RS01255 KW39_RS01245 -BKB95_RS01255 JIEJKO_01220 -BKB95_RS01255 C15_RS0101275 -BKB95_RS01255 SOTONK1_RS01240 -BKB95_RS01255 ECS88FINAL_RS0101260 -BKB95_RS01255 QSDFRQ_00243 -BKB95_RS01255 A5291_RS01265 -BKB95_RS01255 IaCS19096_RS01240 -BKB95_RS01255 O169_RS01245 -BKB95_RS01255 DU13_RS01250 -BKB95_RS01255 7618477 -BKB95_RS01580 BKB95_RS01580 -BKB95_RS01580 SW2_RS01555 -BKB95_RS01580 CBP48_RS02955 -BKB95_RS01580 7618506 -BKB95_RS01580 KW36_RS01560 -BKB95_RS01580 ECS102511_RS01555 -BKB95_RS01580 AOT15_RS02560 -BKB95_RS01580 BKB96_RS01565 -BKB95_RS01580 CTL2C_RS02910 -BKB95_RS01580 BKB99_RS01565 -BKB95_RS01580 L1224_RS01540 -BKB95_RS01580 L1440_RS01540 -BKB95_RS01580 AQ244_RS03745 -BKB95_RS01580 CBP42_RS02955 -BKB95_RS01580 SOTONIA3_RS01575 -BKB95_RS01580 BKB92_RS01570 -BKB95_RS01580 CTB_RS01590 -BKB95_RS01580 E150_RS01560 -BKB95_RS01580 L2BUCH2_RS01545 -BKB95_RS01580 CTO_RS01585 -BKB95_RS01580 FCS84708_RS01555 -BKB95_RS01580 AP288_RS04625 -BKB95_RS01580 BKB93_RS01570 -BKB95_RS01580 CBP44_RS02960 -BKB95_RS01580 AQ199_RS02250 -BKB95_RS01580 L2BLST_RS01545 -BKB95_RS01580 BBV13_RS01595 -BKB95_RS01580 BW688_RS02965 -BKB95_RS01580 G9768_RS01565 -BKB95_RS01580 BKC02_RS01565 -BKB95_RS01580 AKW53_RS03055 -BKB95_RS01580 BBV16_RS01595 -BKB95_RS01580 L3404_RS01540 -BKB95_RS01580 BKC01_RS01570 -BKB95_RS01580 gnl|Prokka|PADJNBJD_00307 -BKB95_RS01580 AQ193_RS02430 -BKB95_RS01580 NILJEPDF_00307 -BKB95_RS01580 LJHENM_01545 -BKB95_RS01580 BKC03_RS01565 -BKB95_RS01580 DU10_RS01580 -BKB95_RS01580 CTRC943_RS01545 -BKB95_RS01580 CTJTET1_RS01575 -BKB95_RS01580 KW39_RS01565 -BKB95_RS01580 JIEJKO_01545 -BKB95_RS01580 C15_RS0101610 -BKB95_RS01580 SOTONK1_RS01565 -BKB95_RS01580 ECS88FINAL_RS0101590 -BKB95_RS01580 119444 -BKB95_RS01580 QSDFRQ_00307 -BKB95_RS01580 IaCS19096_RS01560 -BKB95_RS01580 A5291_RS01590 -BKB95_RS01580 O169_RS01570 -BKB95_RS01580 DU13_RS01575 -BKB95_RS01920 BKB95_RS01920 -BKB95_RS01920 120352 -BKB95_RS01920 7618190 -BKB95_RS01920 CBP48_RS03305 -BKB95_RS01920 CBP42_RS03315 -BKB95_RS01920 CBP44_RS03310 -BKB95_RS01920 DU10_RS01925 -BKB95_RS01920 DU13_RS01920 -BKB95_RS03965 BKB95_RS03965 -BKB95_RS03965 CBP42_RS00515 -BKB95_RS03965 CTL2C_RS00510 -BKB95_RS03965 L1224_RS03890 -BKB95_RS03965 SW2_RS03915 -BKB95_RS03965 L1440_RS03885 -BKB95_RS03965 ECS102511_RS03905 -BKB95_RS03965 BKB96_RS03950 -BKB95_RS03965 BKB99_RS03945 -BKB95_RS03965 CBP44_RS00515 -BKB95_RS03965 L2BUCH2_RS03890 -BKB95_RS03965 BKB92_RS03945 -BKB95_RS03965 CTB_RS03950 -BKB95_RS03965 SOTONIA3_RS03930 -BKB95_RS03965 E150_RS03915 -BKB95_RS03965 CTO_RS03945 -BKB95_RS03965 BBV13_RS03950 -BKB95_RS03965 FCS84708_RS03905 -BKB95_RS03965 L2BLST_RS03890 -BKB95_RS03965 BBV16_RS03960 -BKB95_RS03965 7618261 -BKB95_RS03965 119771 -BKB95_RS03965 BW688_RS00515 -BKB95_RS03965 AQ199_RS04605 -BKB95_RS03965 BKB93_RS03950 -BKB95_RS03965 G9768_RS03910 -BKB95_RS03965 gnl|Prokka|PADJNBJD_00769 -BKB95_RS03965 L3404_RS03885 -BKB95_RS03965 AQ244_RS04000 -BKB95_RS03965 NILJEPDF_00770 -BKB95_RS03965 BKC02_RS03945 -BKB95_RS03965 LJHENM_03875 -BKB95_RS03965 AOT15_RS04710 -BKB95_RS03965 AP288_RS02280 -BKB95_RS03965 JIEJKO_03875 -BKB95_RS03965 QSDFRQ_00770 -BKB95_RS03965 BKC01_RS03950 -BKB95_RS03965 CTRC943_RS03895 -BKB95_RS03965 AKW53_RS00650 -BKB95_RS03965 BKC03_RS03945 -BKB95_RS03965 CBP48_RS00515 -BKB95_RS03965 CTJTET1_RS03930 -BKB95_RS03965 KW39_RS03925 -BKB95_RS03965 DU10_RS03960 -BKB95_RS03965 A5291_RS03955 -BKB95_RS03965 SOTONK1_RS03910 -BKB95_RS03965 IaCS19096_RS03905 -BKB95_RS03965 DU13_RS03960 -BKB95_RS03965 C15_RS0104015 -BKB95_RS03965 ECS88FINAL_RS0104020 -BKB95_RS03965 O169_RS03920 -BKB95_RS03965 KW36_RS03910 -BKB95_RS03965 AQ193_RS00080 -BKB95_RS04160 BKB95_RS04160 -BKB95_RS04160 CBP42_RS00710 -BKB95_RS04160 CTL2C_RS00705 -BKB95_RS04160 L1224_RS04085 -BKB95_RS04160 BKB96_RS04145 -BKB95_RS04160 SW2_RS04110 -BKB95_RS04160 L1440_RS04080 -BKB95_RS04160 ECS102511_RS04100 -BKB95_RS04160 BKB99_RS04140 -BKB95_RS04160 CBP44_RS00710 -BKB95_RS04160 CTB_RS04140 -BKB95_RS04160 L2BUCH2_RS04085 -BKB95_RS04160 BKB92_RS04140 -BKB95_RS04160 SOTONIA3_RS04125 -BKB95_RS04160 CTO_RS04135 -BKB95_RS04160 AP288_RS02405 -BKB95_RS04160 E150_RS04110 -BKB95_RS04160 BBV13_RS04145 -BKB95_RS04160 119992 -BKB95_RS04160 FCS84708_RS04100 -BKB95_RS04160 AQ199_RS00030 -BKB95_RS04160 7618723 -BKB95_RS04160 L2BLST_RS04085 -BKB95_RS04160 BBV16_RS04155 -BKB95_RS04160 BW688_RS00710 -BKB95_RS04160 gnl|Prokka|PADJNBJD_00806 -BKB95_RS04160 BKB93_RS04145 -BKB95_RS04160 NILJEPDF_00807 -BKB95_RS04160 G9768_RS04105 -BKB95_RS04160 L3404_RS04080 -BKB95_RS04160 LJHENM_04060 -BKB95_RS04160 JIEJKO_04060 -BKB95_RS04160 BKC02_RS04140 -BKB95_RS04160 QSDFRQ_00807 -BKB95_RS04160 AKW53_RS00820 -BKB95_RS04160 BKC01_RS04145 -BKB95_RS04160 CTRC943_RS04090 -BKB95_RS04160 AOT15_RS01690 -BKB95_RS04160 CTJTET1_RS04280 -BKB95_RS04160 KW39_RS04120 -BKB95_RS04160 BKC03_RS04140 -BKB95_RS04160 CBP48_RS00710 -BKB95_RS04160 A5291_RS04145 -BKB95_RS04160 ECS88FINAL_RS0104190 -BKB95_RS04160 DU10_RS04155 -BKB95_RS04160 SOTONK1_RS04105 -BKB95_RS04160 IaCS19096_RS04100 -BKB95_RS04160 AQ193_RS04670 -BKB95_RS04160 DU13_RS04155 -BKB95_RS04160 C15_RS0104215 -BKB95_RS04160 O169_RS04115 -BKB95_RS04160 AQ244_RS02660 -BKB95_RS04160 KW36_RS04105 -BKB95_RS04330 BKB95_RS04330 -BKB95_RS04330 CBP42_RS00880 -BKB95_RS04330 CTL2C_RS00870 -BKB95_RS04330 L1224_RS04250 -BKB95_RS04330 BKB96_RS04315 -BKB95_RS04330 L1440_RS04245 -BKB95_RS04330 BKB99_RS04310 -BKB95_RS04330 SW2_RS04280 -BKB95_RS04330 ECS102511_RS04270 -BKB95_RS04330 CBP44_RS00880 -BKB95_RS04330 CTB_RS04305 -BKB95_RS04330 L2BUCH2_RS04250 -BKB95_RS04330 SOTONIA3_RS04290 -BKB95_RS04330 BKB92_RS04310 -BKB95_RS04330 CTO_RS04300 -BKB95_RS04330 AP288_RS02575 -BKB95_RS04330 BBV13_RS04315 -BKB95_RS04330 E150_RS04280 -BKB95_RS04330 L2BLST_RS04250 -BKB95_RS04330 FCS84708_RS04270 -BKB95_RS04330 AQ199_RS00200 -BKB95_RS04330 BBV16_RS04320 -BKB95_RS04330 119828 -BKB95_RS04330 gnl|Prokka|PADJNBJD_00838 -BKB95_RS04330 BW688_RS00880 -BKB95_RS04330 7618298 -BKB95_RS04330 NILJEPDF_00839 -BKB95_RS04330 G9768_RS04275 -BKB95_RS04330 LJHENM_04220 -BKB95_RS04330 L3404_RS04245 -BKB95_RS04330 BKB93_RS04315 -BKB95_RS04330 JIEJKO_04220 -BKB95_RS04330 QSDFRQ_00839 -BKB95_RS04330 BKC02_RS04310 -BKB95_RS04330 AKW53_RS00990 -BKB95_RS04330 BKC01_RS04315 -BKB95_RS04330 CTRC943_RS04255 -BKB95_RS04330 AOT15_RS01855 -BKB95_RS04330 CTJTET1_RS04445 -BKB95_RS04330 BKC03_RS04310 -BKB95_RS04330 CBP48_RS00880 -BKB95_RS04330 A5291_RS04310 -BKB95_RS04330 KW39_RS04290 -BKB95_RS04330 AQ193_RS04500 -BKB95_RS04330 SOTONK1_RS04275 -BKB95_RS04330 ECS88FINAL_RS0104365 -BKB95_RS04330 IaCS19096_RS04265 -BKB95_RS04330 DU10_RS04325 -BKB95_RS04330 C15_RS0104385 -BKB95_RS04330 DU13_RS04325 -BKB95_RS04330 O169_RS04285 -BKB95_RS04330 KW36_RS04270 -BKB95_RS04330 AQ244_RS02485 -BKB95_RS04500 BKB95_RS04500 -BKB95_RS04500 CBP42_RS01055 -BKB95_RS04500 CTL2C_RS01035 -BKB95_RS04500 L1224_RS04415 -BKB95_RS04500 BKB96_RS04485 -BKB95_RS04500 L1440_RS04410 -BKB95_RS04500 BKB99_RS04480 -BKB95_RS04500 SW2_RS04445 -BKB95_RS04500 ECS102511_RS04440 -BKB95_RS04500 CBP44_RS01055 -BKB95_RS04500 CTB_RS04465 -BKB95_RS04500 L2BUCH2_RS04415 -BKB95_RS04500 SOTONIA3_RS04450 -BKB95_RS04500 CTO_RS04460 -BKB95_RS04500 BKB92_RS04485 -BKB95_RS04500 AP288_RS02745 -BKB95_RS04500 BBV13_RS04475 -BKB95_RS04500 E150_RS04450 -BKB95_RS04500 gnl|Prokka|PADJNBJD_00869 -BKB95_RS04500 L2BLST_RS04415 -BKB95_RS04500 BBV16_RS04480 -BKB95_RS04500 FCS84708_RS04435 -BKB95_RS04500 AQ199_RS00370 -BKB95_RS04500 119857 -BKB95_RS04500 NILJEPDF_00870 -BKB95_RS04500 BW688_RS01055 -BKB95_RS04500 7618318 -BKB95_RS04500 LJHENM_04380 -BKB95_RS04500 JIEJKO_04375 -BKB95_RS04500 QSDFRQ_00870 -BKB95_RS04500 G9768_RS04435 -BKB95_RS04500 L3404_RS04410 -BKB95_RS04500 BKB93_RS04490 -BKB95_RS04500 BKC02_RS04480 -BKB95_RS04500 AKW53_RS01160 -BKB95_RS04500 BKC01_RS04485 -BKB95_RS04500 CTRC943_RS04420 -BKB95_RS04500 AOT15_RS02015 -BKB95_RS04500 CTJTET1_RS04605 -BKB95_RS04500 KW39_RS04455 -BKB95_RS04500 BKC03_RS04480 -BKB95_RS04500 CBP48_RS01055 -BKB95_RS04500 A5291_RS04470 -BKB95_RS04500 AQ193_RS04330 -BKB95_RS04500 SOTONK1_RS04435 -BKB95_RS04500 ECS88FINAL_RS0104530 -BKB95_RS04500 IaCS19096_RS04430 -BKB95_RS04500 C15_RS0104550 -BKB95_RS04500 AQ244_RS02315 -BKB95_RS04500 DU10_RS04500 -BKB95_RS04500 O169_RS04455 -BKB95_RS04500 KW36_RS04435 -BKB95_RS04500 DU13_RS04500 -BKB92_RS02540 BKB92_RS02540 -BKB92_RS02540 CBP42_RS03945 -BKB92_RS02540 L2BUCH2_RS02495 -BKB92_RS02540 CTB_RS02550 -BKB92_RS02540 SOTONIA3_RS02530 -BKB92_RS02540 AOT15_RS03580 -BKB92_RS02540 CTO_RS02550 -BKB92_RS02540 BW688_RS03935 -BKB92_RS02540 BBV13_RS02555 -BKB92_RS02540 L2BLST_RS02495 -BKB92_RS02540 CBP44_RS03940 -BKB92_RS02540 BBV16_RS02565 -BKB92_RS02540 BKB93_RS02545 -BKB92_RS02540 G9768_RS02515 -BKB92_RS02540 L3404_RS02490 -BKB92_RS02540 BKC02_RS02535 -BKB92_RS02540 gnl|Prokka|PADJNBJD_00496 -BKB92_RS02540 BKC01_RS02535 -BKB92_RS02540 NILJEPDF_00496 -BKB92_RS02540 LJHENM_02500 -BKB92_RS02540 CTRC943_RS02495 -BKB92_RS02540 JIEJKO_02500 -BKB92_RS02540 QSDFRQ_00496 -BKB92_RS02540 SOTONK1_RS02515 -BKB92_RS02540 CTJTET1_RS02525 -BKB92_RS02540 BKC03_RS02535 -BKB92_RS02540 C15_RS0102575 -BKB92_RS02540 IaCS19096_RS02510 -BKB92_RS02540 DU10_RS02555 -BKB92_RS02540 A5291_RS02550 -BKB92_RS02540 DU13_RS02550 -BKB92_RS02540 7618597 -BKB92_RS02540 AQ244_RS00595 -BKB92_RS02540 BKB96_RS02540 -BKB92_RS02540 BKB99_RS02535 -BKB92_RS02540 CBP48_RS03935 -BKB92_RS02540 CTL2C_RS03865 -BKB92_RS02540 KW36_RS02510 -BKB92_RS02540 BKB95_RS02550 -BKB92_RS02540 L1224_RS02495 -BKB92_RS02540 L1440_RS02495 -BKB92_RS02540 119587 -BKB92_RS04430 BKB92_RS04430 -BKB92_RS04430 SOTONIA3_RS04405 -BKB92_RS04430 CTO_RS04415 -BKB92_RS04430 L2BLST_RS04365 -BKB92_RS04430 BBV13_RS04430 -BKB92_RS04430 AP288_RS02695 -BKB92_RS04430 BBV16_RS04435 -BKB92_RS04430 E150_RS04400 -BKB92_RS04430 gnl|Prokka|PADJNBJD_00860 -BKB92_RS04430 AQ193_RS04380 -BKB92_RS04430 BW688_RS01000 -BKB92_RS04430 7618743 -BKB92_RS04430 119961 -BKB92_RS04430 FCS84708_RS04385 -BKB92_RS04430 AQ199_RS00320 -BKB92_RS04430 NILJEPDF_00861 -BKB92_RS04430 LJHENM_04330 -BKB92_RS04430 L3404_RS04360 -BKB92_RS04430 AQ244_RS02360 -BKB92_RS04430 G9768_RS04390 -BKB92_RS04430 JIEJKO_04330 -BKB92_RS04430 QSDFRQ_00861 -BKB92_RS04430 BKB93_RS04435 -BKB92_RS04430 BKC02_RS04430 -BKB92_RS04430 CTRC943_RS04370 -BKB92_RS04430 BKC01_RS04435 -BKB92_RS04430 AKW53_RS01110 -BKB92_RS04430 AOT15_RS01970 -BKB92_RS04430 CTJTET1_RS04560 -BKB92_RS04430 CBP48_RS01000 -BKB92_RS04430 BKC03_RS04430 -BKB92_RS04430 A5291_RS04425 -BKB92_RS04430 KW39_RS04405 -BKB92_RS04430 SOTONK1_RS04390 -BKB92_RS04430 IaCS19096_RS04385 -BKB92_RS04430 C15_RS0104500 -BKB92_RS04430 ECS88FINAL_RS0104480 -BKB92_RS04430 DU10_RS04445 -BKB92_RS04430 KW36_RS04390 -BKB92_RS04430 DU13_RS04445 -BKB92_RS04430 O169_RS04405 -BKB92_RS04430 CBP42_RS01000 -BKB92_RS04430 CTL2C_RS00985 -BKB92_RS04430 L1224_RS04365 -BKB92_RS04430 BKB95_RS04450 -BKB92_RS04430 L1440_RS04360 -BKB92_RS04430 BKB96_RS04435 -BKB92_RS04430 BKB99_RS04430 -BKB92_RS04430 SW2_RS04395 -BKB92_RS04430 ECS102511_RS04390 -BKB92_RS04430 CBP44_RS01000 -BKB92_RS04430 L2BUCH2_RS04365 -BKB92_RS04430 CTB_RS04420 -DU10_RS00940 DU10_RS00940 -DU10_RS00940 gnl|Prokka|PADJNBJD_00182 -DU10_RS00940 NILJEPDF_00182 -DU10_RS00940 LJHENM_00915 -DU10_RS00940 ECS88FINAL_RS0100950 -DU10_RS00940 JIEJKO_00915 -DU10_RS00940 QSDFRQ_00182 -DU10_RS00940 SW2_RS00925 -DU10_RS00940 ECS102511_RS00925 -DU10_RS00940 BKB92_RS00930 -DU10_RS00940 E150_RS00925 -DU10_RS00940 AQ193_RS03065 -DU10_RS00940 FCS84708_RS00925 -DU10_RS00940 AP288_RS03995 -DU10_RS00940 BKB93_RS00930 -DU10_RS00940 AKW53_RS02420 -CBP42_RS02240 CBP42_RS02240 -CBP42_RS02240 AQ244_RS03005 -CBP42_RS02240 BKB92_RS00840 -CBP42_RS02240 SOTONIA3_RS00835 -CBP42_RS02240 AQ193_RS03165 -CBP42_RS02240 E150_RS00830 -CBP42_RS02240 FCS84708_RS00830 -CBP42_RS02240 AP288_RS03900 -CBP42_RS02240 BKB93_RS00840 -CBP42_RS02240 CBP44_RS02245 -CBP42_RS02240 AQ199_RS01525 -CBP42_RS02240 G9768_RS00835 -CBP42_RS02240 120545 -CBP42_RS02240 AOT15_RS00125 -CBP42_RS02240 AKW53_RS02325 -CBP42_RS02240 BKC01_RS00840 -CBP42_RS02240 gnl|Prokka|PADJNBJD_00164 -CBP42_RS02240 NILJEPDF_00164 -CBP42_RS02240 LJHENM_00825 -CBP42_RS02240 SOTONK1_RS00830 -CBP42_RS02240 JIEJKO_00825 -CBP42_RS02240 CTJTET1_RS00835 -CBP42_RS02240 KW39_RS00830 -CBP42_RS02240 QSDFRQ_00164 -CBP42_RS02240 C15_RS0100860 -CBP42_RS02240 ECS88FINAL_RS0100855 -CBP42_RS02240 IaCS19096_RS00830 -CBP42_RS02240 O169_RS00830 -CBP42_RS02240 DU13_RS00845 -CBP42_RS02240 KW36_RS00830 -CBP42_RS02240 BKB95_RS00845 -CBP42_RS02240 7618851 -CBP42_RS02240 SW2_RS00830 -CBP42_RS02240 ECS102511_RS00830 -CBP42_RS02240 CBP48_RS02240 -CBP42_RS02240 BKB96_RS00840 -CBP42_RS02240 BKB99_RS00840 -CBP42_RS03275 CBP42_RS03275 -CBP42_RS03275 CTB_RS01885 -CBP42_RS03275 SOTONIA3_RS01870 -CBP42_RS03275 L2BUCH2_RS01835 -CBP42_RS03275 BKB92_RS01875 -CBP42_RS03275 CTO_RS01885 -CBP42_RS03275 E150_RS01865 -CBP42_RS03275 L2BLST_RS01835 -CBP42_RS03275 FCS84708_RS01855 -CBP42_RS03275 BW688_RS03265 -CBP42_RS03275 BKB93_RS01875 -CBP42_RS03275 CBP44_RS03270 -CBP42_RS03275 BBV13_RS01890 -CBP42_RS03275 AQ199_RS02555 -CBP42_RS03275 G9768_RS01860 -CBP42_RS03275 L3404_RS01835 -CBP42_RS03275 BBV16_RS01890 -CBP42_RS03275 BKC02_RS01865 -CBP42_RS03275 BKC01_RS01865 -CBP42_RS03275 AKW53_RS03360 -CBP42_RS03275 AP288_RS01220 -CBP42_RS03275 gnl|Prokka|PADJNBJD_00366 -CBP42_RS03275 NILJEPDF_00366 -CBP42_RS03275 CTRC943_RS01840 -CBP42_RS03275 LJHENM_01845 -CBP42_RS03275 JIEJKO_01840 -CBP42_RS03275 BKC03_RS01865 -CBP42_RS03275 CTJTET1_RS01870 -CBP42_RS03275 DU10_RS01885 -CBP42_RS03275 QSDFRQ_00366 -CBP42_RS03275 C15_RS0101900 -CBP42_RS03275 SOTONK1_RS01860 -CBP42_RS03275 AQ244_RS01250 -CBP42_RS03275 A5291_RS01885 -CBP42_RS03275 KW39_RS01870 -CBP42_RS03275 IaCS19096_RS01855 -CBP42_RS03275 ECS88FINAL_RS0101890 -CBP42_RS03275 DU13_RS01880 -CBP42_RS03275 119477 -CBP42_RS03275 O169_RS01870 -CBP42_RS03275 7618528 -CBP42_RS03275 CTL2C_RS03205 -CBP42_RS03275 BKB95_RS01880 -CBP42_RS03275 CBP48_RS03265 -CBP42_RS03275 L1224_RS01835 -CBP42_RS03275 KW36_RS01855 -CBP42_RS03275 AOT15_RS02855 -CBP42_RS03275 BKB96_RS01865 -CBP42_RS03275 SW2_RS01860 -CBP42_RS03275 BKB99_RS01865 -CBP42_RS03275 L1440_RS01835 -CBP42_RS03275 ECS102511_RS01860 -CBP42_RS03275 AQ193_RS02125 -CBP42_RS03780 CBP42_RS03780 -CBP42_RS03780 CTB_RS02380 -CBP42_RS03780 L2BUCH2_RS02325 -CBP42_RS03780 BKB92_RS02375 -CBP42_RS03780 SOTONIA3_RS02365 -CBP42_RS03780 CTO_RS02380 -CBP42_RS03780 E150_RS02355 -CBP42_RS03780 BW688_RS03765 -CBP42_RS03780 L2BLST_RS02330 -CBP42_RS03780 FCS84708_RS02345 -CBP42_RS03780 BBV13_RS02385 -CBP42_RS03780 CBP44_RS03775 -CBP42_RS03780 BKB93_RS02380 -CBP42_RS03780 AQ199_RS03045 -CBP42_RS03780 G9768_RS02350 -CBP42_RS03780 BBV16_RS02390 -CBP42_RS03780 L3404_RS02325 -CBP42_RS03780 BKC02_RS02365 -CBP42_RS03780 BKC01_RS02365 -CBP42_RS03780 gnl|Prokka|PADJNBJD_00464 -CBP42_RS03780 AP288_RS00730 -CBP42_RS03780 NILJEPDF_00464 -CBP42_RS03780 LJHENM_02340 -CBP42_RS03780 CTRC943_RS02330 -CBP42_RS03780 JIEJKO_02340 -CBP42_RS03780 BKC03_RS02365 -CBP42_RS03780 QSDFRQ_00464 -CBP42_RS03780 CTJTET1_RS02360 -CBP42_RS03780 C15_RS0102400 -CBP42_RS03780 SOTONK1_RS02350 -CBP42_RS03780 DU10_RS02390 -CBP42_RS03780 A5291_RS02380 -CBP42_RS03780 KW39_RS02360 -CBP42_RS03780 IaCS19096_RS02345 -CBP42_RS03780 AQ244_RS00760 -CBP42_RS03780 ECS88FINAL_RS0102400 -CBP42_RS03780 O169_RS02360 -CBP42_RS03780 DU13_RS02385 -CBP42_RS03780 7618578 -CBP42_RS03780 BKB96_RS02370 -CBP42_RS03780 BKB99_RS02365 -CBP42_RS03780 CBP48_RS03770 -CBP42_RS03780 119558 -CBP42_RS03780 CTL2C_RS03700 -CBP42_RS03780 KW36_RS02345 -CBP42_RS03780 AOT15_RS03345 -CBP42_RS03780 BKB95_RS02385 -CBP42_RS03780 L1224_RS02330 -CBP42_RS03780 SW2_RS02355 -CBP42_RS03780 ECS102511_RS02350 -CBP42_RS03780 L1440_RS02330 -CBP42_RS03780 AQ193_RS01635 -CBP42_RS04470 CBP42_RS04470 -CBP42_RS04470 L2BUCH2_RS03005 -CBP42_RS04470 CTB_RS03065 -CBP42_RS04470 SOTONIA3_RS03050 -CBP42_RS04470 BKB92_RS03065 -CBP42_RS04470 BW688_RS04460 -CBP42_RS04470 119635 -CBP42_RS04470 E150_RS03035 -CBP42_RS04470 CTO_RS03065 -CBP42_RS04470 L2BLST_RS03005 -CBP42_RS04470 CBP44_RS04465 -CBP42_RS04470 FCS84708_RS03030 -CBP42_RS04470 BBV13_RS03070 -CBP42_RS04470 AQ199_RS03730 -CBP42_RS04470 BBV16_RS03080 -CBP42_RS04470 BKB93_RS03070 -CBP42_RS04470 G9768_RS03035 -CBP42_RS04470 L3404_RS03000 -CBP42_RS04470 gnl|Prokka|PADJNBJD_00597 -CBP42_RS04470 AP288_RS00050 -CBP42_RS04470 NILJEPDF_00597 -CBP42_RS04470 LJHENM_03000 -CBP42_RS04470 BKC02_RS03065 -CBP42_RS04470 AOT15_RS03835 -CBP42_RS04470 CTRC943_RS03005 -CBP42_RS04470 BKC01_RS03065 -CBP42_RS04470 QSDFRQ_00597 -CBP42_RS04470 JIEJKO_03010 -CBP42_RS04470 AQ244_RS00075 -CBP42_RS04470 SOTONK1_RS03035 -CBP42_RS04470 CTJTET1_RS03045 -CBP42_RS04470 BKC03_RS03065 -CBP42_RS04470 KW39_RS03045 -CBP42_RS04470 C15_RS0103100 -CBP42_RS04470 ECS88FINAL_RS0103095 -CBP42_RS04470 IaCS19096_RS03030 -CBP42_RS04470 DU10_RS03080 -CBP42_RS04470 A5291_RS03065 -CBP42_RS04470 O169_RS03040 -CBP42_RS04470 CTL2C_RS04375 -CBP42_RS04470 DU13_RS03075 -CBP42_RS04470 CBP48_RS04465 -CBP42_RS04470 L1224_RS03005 -CBP42_RS04470 KW36_RS03030 -CBP42_RS04470 BKB95_RS03075 -CBP42_RS04470 AKW53_RS04260 -CBP42_RS04470 AQ193_RS00955 -CBP42_RS04470 BKB96_RS03070 -CBP42_RS04470 BKB99_RS03065 -CBP42_RS04470 7618628 -CBP42_RS04470 SW2_RS03035 -CBP42_RS04470 L1440_RS03005 -CBP42_RS04470 ECS102511_RS03030 -CBP44_RS00485 CBP44_RS00485 -CBP44_RS00485 L2BUCH2_RS03860 -CBP44_RS00485 BKB92_RS03915 -CBP44_RS00485 CTB_RS03920 -CBP44_RS00485 SOTONIA3_RS03900 -CBP44_RS00485 E150_RS03885 -CBP44_RS00485 CTO_RS03915 -CBP44_RS00485 BBV13_RS03920 -CBP44_RS00485 FCS84708_RS03875 -CBP44_RS00485 7618698 -CBP44_RS00485 L2BLST_RS03860 -CBP44_RS00485 BBV16_RS03930 -CBP44_RS00485 120031 -CBP44_RS00485 BW688_RS00485 -CBP44_RS00485 AQ199_RS04575 -CBP44_RS00485 BKB93_RS03920 -CBP44_RS00485 G9768_RS03880 -CBP44_RS00485 gnl|Prokka|PADJNBJD_00763 -CBP44_RS00485 L3404_RS03855 -CBP44_RS00485 NILJEPDF_00764 -CBP44_RS00485 BKC02_RS03915 -CBP44_RS00485 LJHENM_03845 -CBP44_RS00485 AOT15_RS04680 -CBP44_RS00485 AP288_RS02250 -CBP44_RS00485 JIEJKO_03845 -CBP44_RS00485 QSDFRQ_00764 -CBP44_RS00485 BKC01_RS03920 -CBP44_RS00485 CTRC943_RS03865 -CBP44_RS00485 AKW53_RS00620 -CBP44_RS00485 BKC03_RS03915 -CBP44_RS00485 CBP48_RS00485 -CBP44_RS00485 CTJTET1_RS03900 -CBP44_RS00485 KW39_RS03895 -CBP44_RS00485 DU10_RS03930 -CBP44_RS00485 A5291_RS03925 -CBP44_RS00485 SOTONK1_RS03880 -CBP44_RS00485 IaCS19096_RS03875 -CBP44_RS00485 DU13_RS03930 -CBP44_RS00485 C15_RS0103985 -CBP44_RS00485 ECS88FINAL_RS0103985 -CBP44_RS00485 O169_RS03890 -CBP44_RS00485 KW36_RS03880 -CBP44_RS00485 AQ244_RS04030 -CBP44_RS00485 BKB95_RS03935 -CBP44_RS00485 CBP42_RS00485 -CBP44_RS00485 CTL2C_RS00480 -CBP44_RS00485 L1224_RS03860 -CBP44_RS00485 SW2_RS03885 -CBP44_RS00485 L1440_RS03855 -CBP44_RS00485 ECS102511_RS03875 -CBP44_RS00485 BKB96_RS03920 -CBP44_RS00485 BKB99_RS03915 -CBP44_RS00485 AQ193_RS00110 -CBP44_RS01375 CBP44_RS01375 -CBP44_RS01375 BW688_RS01375 -CBP44_RS01375 7618349 -CBP44_RS01375 CTRC943_RS04730 -CBP44_RS01375 CBP48_RS01375 -CBP44_RS01375 CTL2C_RS01345 -CBP44_RS01375 CBP42_RS01375 -CBP44_RS01375 ECS102511_RS04750 -CBP44_RS01375 AQ193_RS04020 -CBP44_RS01375 BKB99_RS04800 -CBP44_RS01375 SW2_RS04755 -CBP44_RS01375 L2BUCH2_RS04725 -CBP44_RS01375 AQ244_RS02005 -CBP44_RS01375 CTB_RS04770 -CBP44_RS01375 SOTONIA3_RS04760 -CBP44_RS01375 BKB92_RS04800 -CBP44_RS01375 L2BLST_RS04725 -CBP44_RS01375 AP288_RS03055 -CBP44_RS01375 BBV13_RS04785 -CBP44_RS01375 gnl|Prokka|PADJNBJD_00931 -CBP44_RS01375 CTO_RS04765 -CBP44_RS01375 BBV16_RS04790 -CBP44_RS01375 E150_RS04760 -CBP44_RS01375 FCS84708_RS04745 -CBP44_RS01375 NILJEPDF_00932 -CBP44_RS01375 AQ199_RS00680 -CBP44_RS01375 119907 -CBP44_RS01375 L3404_RS04720 -CBP44_RS01375 JIEJKO_04685 -CBP44_RS01375 QSDFRQ_00932 -CBP44_RS01375 LJHENM_04695 -CBP44_RS01375 G9768_RS04745 -CBP44_RS01375 BKB93_RS04805 -CBP44_RS01375 BKC02_RS04800 -CBP44_RS01375 AOT15_RS00970 -CBP44_RS01375 BKC01_RS04805 -CBP44_RS01375 KW39_RS04765 -CBP44_RS01375 CTJTET1_RS04915 -CBP44_RS01375 BKC03_RS04800 -CBP44_RS01375 SOTONK1_RS04745 -CBP44_RS01375 ECS88FINAL_RS0104845 -CBP44_RS01375 DU10_RS04815 -CBP44_RS01375 A5291_RS04775 -CBP44_RS01375 O169_RS04765 -CBP44_RS01375 IaCS19096_RS04740 -CBP44_RS01375 C15_RS0104865 -CBP44_RS01375 DU13_RS04815 -CBP44_RS01375 KW36_RS04745 -CBP44_RS01375 L1224_RS04725 -CBP44_RS01375 L1440_RS04720 -CBP44_RS01375 BKB95_RS04820 -CBP44_RS01375 BKB96_RS04805 -7618168 7618168 -7618168 119188 -119298 119298 -119298 L2BUCH2_RS00625 -119298 CBP44_RS02030 -119298 FCS84708_RS00625 -119298 AP288_RS03695 -119298 BKB93_RS00635 -119298 AQ199_RS01320 -119298 BBV13_RS00635 -119298 G9768_RS00625 -119298 L2BLST_RS00625 -119298 BW688_RS02025 -119298 AQ193_RS03370 -119298 BBV16_RS00635 -119298 BKC02_RS00635 -119298 gnl|Prokka|PADJNBJD_00123 -119298 LJHENM_00615 -119298 AKW53_RS02120 -119298 BKC01_RS00635 -119298 NILJEPDF_00123 -119298 A5291_RS00630 -119298 L3404_RS00625 -119298 SOTONK1_RS00625 -119298 JIEJKO_00620 -119298 QSDFRQ_00123 -119298 IaCS19096_RS00625 -119298 BKC03_RS00635 -119298 C15_RS0100645 -119298 CTRC943_RS00625 -119298 CTJTET1_RS00625 -119298 KW39_RS00625 -119298 DU10_RS00635 -119298 ECS88FINAL_RS0100645 -119298 O169_RS00625 -119298 DU13_RS00640 -119298 7618415 -119298 KW36_RS00625 -119298 CBP48_RS02025 -119298 SW2_RS00625 -119298 BKB95_RS00635 -119298 ECS102511_RS00625 -119298 AOT15_RS00330 -119298 CTL2C_RS01990 -119298 CTB_RS00630 -119298 L1224_RS00625 -119298 AQ244_RS02800 -119298 BKB96_RS00635 -119298 CBP42_RS02025 -119298 BKB99_RS00635 -119298 L1440_RS00625 -119298 BKB92_RS00635 -119298 CTO_RS00630 -119298 SOTONIA3_RS00625 -119298 E150_RS00625 -119166 119166 -CTB_RS02055 CTB_RS02055 -CTB_RS02055 CBP42_RS03450 -CTB_RS02055 SOTONIA3_RS02040 -CTB_RS02055 L2BUCH2_RS02005 -CTB_RS02055 BKB92_RS02045 -CTB_RS02055 CTO_RS02055 -CTB_RS02055 E150_RS02035 -CTB_RS02055 L2BLST_RS02005 -CTB_RS02055 BW688_RS03435 -CTB_RS02055 FCS84708_RS02025 -CTB_RS02055 BBV13_RS02060 -CTB_RS02055 BKB93_RS02045 -CTB_RS02055 CBP44_RS03445 -CTB_RS02055 AQ199_RS02725 -CTB_RS02055 G9768_RS02030 -CTB_RS02055 BBV16_RS02060 -CTB_RS02055 L3404_RS02005 -CTB_RS02055 BKC02_RS02035 -CTB_RS02055 AP288_RS01050 -CTB_RS02055 BKC01_RS02035 -CTB_RS02055 AKW53_RS03530 -CTB_RS02055 gnl|Prokka|PADJNBJD_00400 -CTB_RS02055 NILJEPDF_00400 -CTB_RS02055 CTRC943_RS02010 -CTB_RS02055 LJHENM_02015 -CTB_RS02055 AQ244_RS01080 -CTB_RS02055 JIEJKO_02010 -CTB_RS02055 BKC03_RS02035 -CTB_RS02055 CTJTET1_RS02040 -CTB_RS02055 QSDFRQ_00400 -CTB_RS02055 C15_RS0102075 -CTB_RS02055 A5291_RS02055 -CTB_RS02055 SOTONK1_RS02030 -CTB_RS02055 DU10_RS02060 -CTB_RS02055 KW39_RS02040 -CTB_RS02055 IaCS19096_RS02025 -CTB_RS02055 ECS88FINAL_RS0102070 -CTB_RS02055 O169_RS02040 -CTB_RS02055 DU13_RS02055 -CTB_RS02055 7618979 -CTB_RS02055 CTL2C_RS03375 -CTB_RS02055 CBP48_RS03440 -CTB_RS02055 120330 -CTB_RS02055 L1224_RS02005 -CTB_RS02055 KW36_RS02025 -CTB_RS02055 AOT15_RS03025 -CTB_RS02055 BKB95_RS02055 -CTB_RS02055 BKB96_RS02035 -CTB_RS02055 SW2_RS02030 -CTB_RS02055 AQ193_RS01955 -CTB_RS02055 BKB99_RS02035 -CTB_RS02055 L1440_RS02005 -CTB_RS02055 ECS102511_RS02030 -CTB_RS03225 CTB_RS03225 -CTB_RS03225 SOTONIA3_RS03205 -CTB_RS03225 CTO_RS03220 -CTB_RS03225 120133 -CTB_RS03225 BBV13_RS03225 -CTB_RS03225 BBV16_RS03235 -CTB_RS03225 G9768_RS03185 -CTB_RS03225 BKC02_RS03215 -CTB_RS03225 AOT15_RS03985 -CTB_RS03225 BKC01_RS03215 -CTB_RS03225 BKC03_RS03215 -CTB_RS03225 CTJTET1_RS03200 -CTB_RS03225 SOTONK1_RS03185 -CTB_RS03225 IaCS19096_RS03180 -CTB_RS03225 C15_RS0103250 -CTB_RS03225 A5291_RS03225 -CTB_RS03225 AQ244_RS04730 -CTB_RS03225 KW36_RS03185 -CTB_RS03225 BKB95_RS03230 -CTB_RS03225 BKB96_RS03225 -CTB_RS03225 BKB99_RS03220 -CTB_RS04755 CTB_RS04755 -CTB_RS04755 AQ193_RS04035 -CTB_RS04755 SOTONIA3_RS04745 -CTB_RS04755 AP288_RS03040 -CTB_RS04755 BBV13_RS04770 -CTB_RS04755 gnl|Prokka|PADJNBJD_00928 -CTB_RS04755 CTO_RS04750 -CTB_RS04755 AQ244_RS02020 -CTB_RS04755 BBV16_RS04775 -CTB_RS04755 NILJEPDF_00929 -CTB_RS04755 AQ199_RS00665 -CTB_RS04755 119916 -CTB_RS04755 JIEJKO_04670 -CTB_RS04755 QSDFRQ_00929 -CTB_RS04755 BKC02_RS04785 -CTB_RS04755 AKW53_RS01455 -CTB_RS04755 BKC01_RS04790 -CTB_RS04755 CTJTET1_RS04900 -CTB_RS04755 KW39_RS04750 -CTB_RS04755 BKC03_RS04785 -CTB_RS04755 SOTONK1_RS04730 -CTB_RS04755 A5291_RS04760 -CTB_RS04755 IaCS19096_RS04725 -CTB_RS04755 C15_RS0104850 -CTB_RS04755 KW36_RS04730 -CTB_RS04755 BKB95_RS04805 -CTB_RS04755 BKB96_RS04790 -CTB_RS04755 BKB99_RS04785 -CTB_RS04755 SW2_RS04740 -CTB_RS04755 L2BUCH2_RS04710 -CTB_RS04755 L2BLST_RS04710 -CTB_RS04755 L1440_RS04705 -CTB_RS04755 BKB92_RS04785 -CTB_RS04755 FCS84708_RS04730 -CTB_RS04755 LJHENM_04680 -CTB_RS04755 BKB93_RS04790 -CTB_RS04755 ECS88FINAL_RS0104830 -CTB_RS04755 DU10_RS04800 -CTB_RS04755 O169_RS04750 -CTB_RS04755 DU13_RS04800 -CTB_RS04755 ECS102511_RS04735 -CTB_RS04755 E150_RS04745 -CTB_RS04755 BW688_RS01360 -CTB_RS04755 L3404_RS04705 -CTB_RS04755 7618774 -CTB_RS04755 CTRC943_RS04715 -CTB_RS04755 CBP48_RS01360 -CTB_RS04755 CTL2C_RS01330 -CTB_RS04755 CBP42_RS01360 -CTB_RS04755 L1224_RS04710 -CTB_RS04755 CBP44_RS01360 -CTB_RS04755 G9768_RS04730 -gnl|Prokka|PADJNBJD_00116 gnl|Prokka|PADJNBJD_00116 -gnl|Prokka|PADJNBJD_00116 BKC02_RS00600 -gnl|Prokka|PADJNBJD_00116 BBV16_RS00600 -gnl|Prokka|PADJNBJD_00116 LJHENM_00580 -gnl|Prokka|PADJNBJD_00116 AKW53_RS02085 -gnl|Prokka|PADJNBJD_00116 BKC01_RS00600 -gnl|Prokka|PADJNBJD_00116 NILJEPDF_00116 -gnl|Prokka|PADJNBJD_00116 A5291_RS00595 -gnl|Prokka|PADJNBJD_00116 SOTONK1_RS00590 -gnl|Prokka|PADJNBJD_00116 L3404_RS00590 -gnl|Prokka|PADJNBJD_00116 JIEJKO_00585 -gnl|Prokka|PADJNBJD_00116 QSDFRQ_00116 -gnl|Prokka|PADJNBJD_00116 IaCS19096_RS00590 -gnl|Prokka|PADJNBJD_00116 BKC03_RS00600 -gnl|Prokka|PADJNBJD_00116 C15_RS0100610 -gnl|Prokka|PADJNBJD_00116 CTJTET1_RS00590 -gnl|Prokka|PADJNBJD_00116 KW39_RS00590 -gnl|Prokka|PADJNBJD_00116 DU10_RS00600 -gnl|Prokka|PADJNBJD_00116 CTRC943_RS00590 -gnl|Prokka|PADJNBJD_00116 ECS88FINAL_RS0100610 -gnl|Prokka|PADJNBJD_00116 O169_RS00590 -gnl|Prokka|PADJNBJD_00116 DU13_RS00605 -gnl|Prokka|PADJNBJD_00116 7618410 -gnl|Prokka|PADJNBJD_00116 KW36_RS00590 -gnl|Prokka|PADJNBJD_00116 CBP48_RS01990 -gnl|Prokka|PADJNBJD_00116 SW2_RS00590 -gnl|Prokka|PADJNBJD_00116 BKB95_RS00600 -gnl|Prokka|PADJNBJD_00116 ECS102511_RS00590 -gnl|Prokka|PADJNBJD_00116 AQ193_RS03405 -gnl|Prokka|PADJNBJD_00116 CTL2C_RS01955 -gnl|Prokka|PADJNBJD_00116 CTB_RS00595 -gnl|Prokka|PADJNBJD_00116 AQ244_RS02765 -gnl|Prokka|PADJNBJD_00116 BKB96_RS00600 -gnl|Prokka|PADJNBJD_00116 CBP42_RS01990 -gnl|Prokka|PADJNBJD_00116 L1224_RS00590 -gnl|Prokka|PADJNBJD_00116 BKB99_RS00600 -gnl|Prokka|PADJNBJD_00116 BKB92_RS00600 -gnl|Prokka|PADJNBJD_00116 SOTONIA3_RS00590 -gnl|Prokka|PADJNBJD_00116 L1440_RS00590 -gnl|Prokka|PADJNBJD_00116 CTO_RS00595 -gnl|Prokka|PADJNBJD_00116 E150_RS00590 -gnl|Prokka|PADJNBJD_00116 CBP44_RS01995 -gnl|Prokka|PADJNBJD_00116 L2BUCH2_RS00590 -gnl|Prokka|PADJNBJD_00116 FCS84708_RS00590 -gnl|Prokka|PADJNBJD_00116 AP288_RS03660 -gnl|Prokka|PADJNBJD_00116 BKB93_RS00600 -gnl|Prokka|PADJNBJD_00116 119290 -gnl|Prokka|PADJNBJD_00116 AOT15_RS00365 -gnl|Prokka|PADJNBJD_00116 AQ199_RS01285 -gnl|Prokka|PADJNBJD_00116 BBV13_RS00600 -gnl|Prokka|PADJNBJD_00116 G9768_RS00590 -gnl|Prokka|PADJNBJD_00116 L2BLST_RS00590 -gnl|Prokka|PADJNBJD_00116 BW688_RS01990 -gnl|Prokka|PADJNBJD_00284 gnl|Prokka|PADJNBJD_00284 -gnl|Prokka|PADJNBJD_00284 L3404_RS01425 -gnl|Prokka|PADJNBJD_00284 BKC01_RS01455 -gnl|Prokka|PADJNBJD_00284 DU10_RS01460 -gnl|Prokka|PADJNBJD_00284 NILJEPDF_00284 -gnl|Prokka|PADJNBJD_00284 LJHENM_01430 -gnl|Prokka|PADJNBJD_00284 BKC03_RS01450 -gnl|Prokka|PADJNBJD_00284 CTRC943_RS01430 -gnl|Prokka|PADJNBJD_00284 CTJTET1_RS01460 -gnl|Prokka|PADJNBJD_00284 KW39_RS01450 -gnl|Prokka|PADJNBJD_00284 JIEJKO_01430 -gnl|Prokka|PADJNBJD_00284 119430 -gnl|Prokka|PADJNBJD_00284 C15_RS0101485 -gnl|Prokka|PADJNBJD_00284 SOTONK1_RS01450 -gnl|Prokka|PADJNBJD_00284 ECS88FINAL_RS0101470 -gnl|Prokka|PADJNBJD_00284 QSDFRQ_00284 -gnl|Prokka|PADJNBJD_00284 IaCS19096_RS01445 -gnl|Prokka|PADJNBJD_00284 A5291_RS01475 -gnl|Prokka|PADJNBJD_00284 O169_RS01455 -gnl|Prokka|PADJNBJD_00284 DU13_RS01460 -gnl|Prokka|PADJNBJD_00284 7618497 -gnl|Prokka|PADJNBJD_00284 SW2_RS01440 -gnl|Prokka|PADJNBJD_00284 BKB95_RS01465 -gnl|Prokka|PADJNBJD_00284 CBP48_RS02840 -gnl|Prokka|PADJNBJD_00284 KW36_RS01445 -gnl|Prokka|PADJNBJD_00284 ECS102511_RS01440 -gnl|Prokka|PADJNBJD_00284 AOT15_RS02445 -gnl|Prokka|PADJNBJD_00284 BKB96_RS01450 -gnl|Prokka|PADJNBJD_00284 CTL2C_RS02795 -gnl|Prokka|PADJNBJD_00284 BKB99_RS01450 -gnl|Prokka|PADJNBJD_00284 L1224_RS01425 -gnl|Prokka|PADJNBJD_00284 L1440_RS01425 -gnl|Prokka|PADJNBJD_00284 AQ193_RS02545 -gnl|Prokka|PADJNBJD_00284 AQ244_RS03630 -gnl|Prokka|PADJNBJD_00284 CBP42_RS02840 -gnl|Prokka|PADJNBJD_00284 SOTONIA3_RS01460 -gnl|Prokka|PADJNBJD_00284 BKB92_RS01455 -gnl|Prokka|PADJNBJD_00284 CTB_RS01475 -gnl|Prokka|PADJNBJD_00284 E150_RS01445 -gnl|Prokka|PADJNBJD_00284 L2BUCH2_RS01430 -gnl|Prokka|PADJNBJD_00284 CTO_RS01470 -gnl|Prokka|PADJNBJD_00284 FCS84708_RS01440 -gnl|Prokka|PADJNBJD_00284 AP288_RS04510 -gnl|Prokka|PADJNBJD_00284 BKB93_RS01455 -gnl|Prokka|PADJNBJD_00284 CBP44_RS02845 -gnl|Prokka|PADJNBJD_00284 AQ199_RS02135 -gnl|Prokka|PADJNBJD_00284 L2BLST_RS01430 -gnl|Prokka|PADJNBJD_00284 BBV13_RS01480 -gnl|Prokka|PADJNBJD_00284 BW688_RS02850 -gnl|Prokka|PADJNBJD_00284 G9768_RS01450 -gnl|Prokka|PADJNBJD_00284 BKC02_RS01450 -gnl|Prokka|PADJNBJD_00284 AKW53_RS02940 -gnl|Prokka|PADJNBJD_00284 BBV16_RS01480 -gnl|Prokka|PADJNBJD_00316 gnl|Prokka|PADJNBJD_00316 -gnl|Prokka|PADJNBJD_00316 BKC01_RS01615 -gnl|Prokka|PADJNBJD_00316 NILJEPDF_00316 -gnl|Prokka|PADJNBJD_00316 LJHENM_01590 -gnl|Prokka|PADJNBJD_00316 CTRC943_RS01590 -gnl|Prokka|PADJNBJD_00316 BKC03_RS01610 -gnl|Prokka|PADJNBJD_00316 DU10_RS01625 -gnl|Prokka|PADJNBJD_00316 CTJTET1_RS01620 -gnl|Prokka|PADJNBJD_00316 KW39_RS01610 -gnl|Prokka|PADJNBJD_00316 JIEJKO_01590 -gnl|Prokka|PADJNBJD_00316 C15_RS0101650 -gnl|Prokka|PADJNBJD_00316 SOTONK1_RS01610 -gnl|Prokka|PADJNBJD_00316 ECS88FINAL_RS0101630 -gnl|Prokka|PADJNBJD_00316 120415 -gnl|Prokka|PADJNBJD_00316 QSDFRQ_00316 -gnl|Prokka|PADJNBJD_00316 IaCS19096_RS01605 -gnl|Prokka|PADJNBJD_00316 A5291_RS01635 -gnl|Prokka|PADJNBJD_00316 O169_RS01615 -gnl|Prokka|PADJNBJD_00316 DU13_RS01620 -gnl|Prokka|PADJNBJD_00316 CBP48_RS03000 -gnl|Prokka|PADJNBJD_00316 7618933 -gnl|Prokka|PADJNBJD_00316 SW2_RS01600 -gnl|Prokka|PADJNBJD_00316 BKB95_RS01625 -gnl|Prokka|PADJNBJD_00316 CTL2C_RS02955 -gnl|Prokka|PADJNBJD_00316 KW36_RS01605 -gnl|Prokka|PADJNBJD_00316 ECS102511_RS01600 -gnl|Prokka|PADJNBJD_00316 AOT15_RS02605 -gnl|Prokka|PADJNBJD_00316 BKB96_RS01610 -gnl|Prokka|PADJNBJD_00316 L1224_RS01585 -gnl|Prokka|PADJNBJD_00316 BKB99_RS01610 -gnl|Prokka|PADJNBJD_00316 L1440_RS01585 -gnl|Prokka|PADJNBJD_00316 AQ193_RS02385 -gnl|Prokka|PADJNBJD_00316 CBP42_RS03000 -gnl|Prokka|PADJNBJD_00316 AQ244_RS03790 -gnl|Prokka|PADJNBJD_00316 SOTONIA3_RS01620 -gnl|Prokka|PADJNBJD_00316 BKB92_RS01615 -gnl|Prokka|PADJNBJD_00316 CTB_RS01635 -gnl|Prokka|PADJNBJD_00316 E150_RS01605 -gnl|Prokka|PADJNBJD_00316 L2BUCH2_RS01590 -gnl|Prokka|PADJNBJD_00316 CTO_RS01630 -gnl|Prokka|PADJNBJD_00316 FCS84708_RS01600 -gnl|Prokka|PADJNBJD_00316 AP288_RS04670 -gnl|Prokka|PADJNBJD_00316 CBP44_RS03005 -gnl|Prokka|PADJNBJD_00316 BKB93_RS01615 -gnl|Prokka|PADJNBJD_00316 L2BLST_RS01590 -gnl|Prokka|PADJNBJD_00316 AQ199_RS02295 -gnl|Prokka|PADJNBJD_00316 BW688_RS03010 -gnl|Prokka|PADJNBJD_00316 BBV13_RS01640 -gnl|Prokka|PADJNBJD_00316 G9768_RS01610 -gnl|Prokka|PADJNBJD_00316 BKC02_RS01610 -gnl|Prokka|PADJNBJD_00316 L3404_RS01585 -gnl|Prokka|PADJNBJD_00316 AKW53_RS03100 -gnl|Prokka|PADJNBJD_00316 BBV16_RS01640 -SOTONIA3_RS00840 SOTONIA3_RS00840 -SOTONIA3_RS00840 AQ193_RS03160 -SOTONIA3_RS00840 AQ244_RS03010 -SOTONIA3_RS00840 CTO_RS00840 -SOTONIA3_RS00840 BKB92_RS00845 -SOTONIA3_RS00840 E150_RS00835 -SOTONIA3_RS00840 FCS84708_RS00835 -SOTONIA3_RS00840 AP288_RS03905 -SOTONIA3_RS00840 BKB93_RS00845 -SOTONIA3_RS00840 AQ199_RS01530 -SOTONIA3_RS00840 BBV13_RS00845 -SOTONIA3_RS00840 G9768_RS00840 -SOTONIA3_RS00840 120544 -SOTONIA3_RS00840 AOT15_RS00120 -SOTONIA3_RS00840 BKC02_RS00845 -SOTONIA3_RS00840 BBV16_RS00845 -SOTONIA3_RS00840 AKW53_RS02330 -SOTONIA3_RS00840 BKC01_RS00845 -SOTONIA3_RS00840 gnl|Prokka|PADJNBJD_00165 -SOTONIA3_RS00840 A5291_RS00840 -SOTONIA3_RS00840 NILJEPDF_00165 -SOTONIA3_RS00840 LJHENM_00830 -SOTONIA3_RS00840 SOTONK1_RS00835 -SOTONIA3_RS00840 JIEJKO_00830 -SOTONIA3_RS00840 BKC03_RS00845 -SOTONIA3_RS00840 CTJTET1_RS00840 -SOTONIA3_RS00840 KW39_RS00835 -SOTONIA3_RS00840 QSDFRQ_00165 -SOTONIA3_RS00840 C15_RS01000000104905 -SOTONIA3_RS00840 ECS88FINAL_RS0100860 -SOTONIA3_RS00840 IaCS19096_RS00835 -SOTONIA3_RS00840 O169_RS00835 -SOTONIA3_RS00840 DU13_RS00850 -SOTONIA3_RS00840 KW36_RS00835 -SOTONIA3_RS00840 BKB95_RS00850 -SOTONIA3_RS00840 SW2_RS00835 -SOTONIA3_RS00840 ECS102511_RS00835 -SOTONIA3_RS00840 CTB_RS00840 -SOTONIA3_RS03200 SOTONIA3_RS03200 -SOTONIA3_RS03200 BKB95_RS03225 -SOTONIA3_RS03200 BKB96_RS03220 -SOTONIA3_RS03200 BKB99_RS03215 -L1224_RS00855 L1224_RS00855 -L1224_RS00855 CBP48_RS02265 F -L1224_RS00855 CTL2C_RS02225 F -L1224_RS00855 CBP42_RS02265 F -L1224_RS00855 CBP44_RS02270 F -L1224_RS00855 BW688_RS02265 F -L1224_RS00855 CTRC943_RS00860 F -L1224_RS00855 L1440_RS00855 -L1224_RS00855 CTB_RS00890 -L1224_RS00855 CTO_RS00890 -L1224_RS00855 L2BUCH2_RS00860 -L1224_RS00855 L2BLST_RS00860 -L1224_RS00855 BBV13_RS00895 -L1224_RS00855 119346 -L1224_RS00855 BBV16_RS00895 -L1224_RS00855 L3404_RS00855 -L1224_RS00855 gnl|Prokka|PADJNBJD_00170 -L1224_RS00855 NILJEPDF_00170 -L1224_RS00855 LJHENM_00855 -L1224_RS00855 JIEJKO_00855 -L1224_RS00855 QSDFRQ_00170 -L1224_RS00855 A5291_RS00890 -L2BUCH2_RS04825 L2BUCH2_RS04825 -L2BUCH2_RS04825 CBP44_RS02215 -L2BUCH2_RS04825 L2BLST_RS04825 -L2BUCH2_RS04825 BW688_RS02210 -L2BUCH2_RS04825 L3404_RS04825 -L2BUCH2_RS04825 CTRC943_RS04775 -L2BUCH2_RS04825 CBP48_RS02210 -L2BUCH2_RS04825 CTL2C_RS04805 -L2BUCH2_RS04825 L1224_RS04825 -L2BUCH2_RS04825 CBP42_RS02210 -L2BUCH2_RS04825 L1440_RS04770 -L2BUCH2_RS01495 L2BUCH2_RS01495 -L2BUCH2_RS01495 SOTONIA3_RS01525 -L2BUCH2_RS01495 BKB92_RS01520 -L2BUCH2_RS01495 CTB_RS01540 -L2BUCH2_RS01495 E150_RS01510 -L2BUCH2_RS01495 CTO_RS01535 -L2BUCH2_RS01495 FCS84708_RS01505 -L2BUCH2_RS01495 AQ193_RS02480 -L2BUCH2_RS01495 AP288_RS04575 -L2BUCH2_RS01495 BKB93_RS01520 -L2BUCH2_RS01495 CBP44_RS02910 -L2BUCH2_RS01495 AQ199_RS02200 -L2BUCH2_RS01495 L2BLST_RS01495 -L2BUCH2_RS01495 BBV13_RS01545 -L2BUCH2_RS01495 BW688_RS02915 -L2BUCH2_RS01495 G9768_RS01515 -L2BUCH2_RS01495 BKC02_RS01515 -L2BUCH2_RS01495 AKW53_RS03005 -L2BUCH2_RS01495 BBV16_RS01545 -L2BUCH2_RS01495 L3404_RS01490 -L2BUCH2_RS01495 BKC01_RS01520 -L2BUCH2_RS01495 gnl|Prokka|PADJNBJD_00297 -L2BUCH2_RS01495 NILJEPDF_00297 -L2BUCH2_RS01495 LJHENM_01495 -L2BUCH2_RS01495 BKC03_RS01515 -L2BUCH2_RS01495 DU10_RS01530 -L2BUCH2_RS01495 CTRC943_RS01495 -L2BUCH2_RS01495 CTJTET1_RS01525 -L2BUCH2_RS01495 KW39_RS01515 -L2BUCH2_RS01495 JIEJKO_01495 -L2BUCH2_RS01495 C15_RS0101560 -L2BUCH2_RS01495 SOTONK1_RS01515 -L2BUCH2_RS01495 ECS88FINAL_RS0101540 -L2BUCH2_RS01495 119440 -L2BUCH2_RS01495 QSDFRQ_00297 -L2BUCH2_RS01495 IaCS19096_RS01510 -L2BUCH2_RS01495 A5291_RS01540 -L2BUCH2_RS01495 O169_RS01520 -L2BUCH2_RS01495 DU13_RS01525 -L2BUCH2_RS01495 SW2_RS01505 -L2BUCH2_RS01495 BKB95_RS01530 -L2BUCH2_RS01495 CBP48_RS02905 -L2BUCH2_RS01495 7618504 -L2BUCH2_RS01495 KW36_RS01510 -L2BUCH2_RS01495 ECS102511_RS01505 -L2BUCH2_RS01495 AOT15_RS02510 -L2BUCH2_RS01495 BKB96_RS01515 -L2BUCH2_RS01495 CTL2C_RS02860 -L2BUCH2_RS01495 BKB99_RS01515 -L2BUCH2_RS01495 L1224_RS01490 -L2BUCH2_RS01495 L1440_RS01490 -L2BUCH2_RS01495 AQ244_RS03695 -L2BUCH2_RS01495 CBP42_RS02905 -L3404_RS01945 L3404_RS01945 -L3404_RS01945 AQ199_RS02665 -L3404_RS01945 AQ244_RS01140 -L3404_RS01945 G9768_RS01970 -L3404_RS01945 BBV16_RS02000 -L3404_RS01945 BKC02_RS01975 -L3404_RS01945 BKC01_RS01975 -L3404_RS01945 AKW53_RS03470 -L3404_RS01945 gnl|Prokka|PADJNBJD_00388 -L3404_RS01945 NILJEPDF_00388 -L3404_RS01945 CTRC943_RS01950 -L3404_RS01945 LJHENM_01955 -L3404_RS01945 JIEJKO_01950 -L3404_RS01945 BKC03_RS01975 -L3404_RS01945 CTJTET1_RS01980 -L3404_RS01945 AQ193_RS02015 -L3404_RS01945 QSDFRQ_00388 -L3404_RS01945 C15_RS0102015 -L3404_RS01945 SOTONK1_RS01970 -L3404_RS01945 DU10_RS02000 -L3404_RS01945 A5291_RS01995 -L3404_RS01945 KW39_RS01980 -L3404_RS01945 IaCS19096_RS01965 -L3404_RS01945 ECS88FINAL_RS0102005 -L3404_RS01945 O169_RS01980 -L3404_RS01945 DU13_RS01995 -L3404_RS01945 7618537 -L3404_RS01945 119493 -L3404_RS01945 CTL2C_RS03315 -L3404_RS01945 L1224_RS01945 -L3404_RS01945 KW36_RS01965 -L3404_RS01945 AOT15_RS02965 -L3404_RS01945 BKB95_RS01995 -L3404_RS01945 BKB96_RS01975 -L3404_RS01945 CBP48_RS03380 -L3404_RS01945 SW2_RS01970 -L3404_RS01945 BKB99_RS01975 -L3404_RS01945 L1440_RS01945 -L3404_RS01945 ECS102511_RS01970 -L3404_RS01945 CTB_RS01995 -L3404_RS01945 SOTONIA3_RS01980 -L3404_RS01945 L2BUCH2_RS01945 -L3404_RS01945 BKB92_RS01985 -L3404_RS01945 CBP42_RS03390 -L3404_RS01945 CTO_RS01995 -L3404_RS01945 E150_RS01975 -L3404_RS01945 AP288_RS01110 -L3404_RS01945 L2BLST_RS01945 -L3404_RS01945 BW688_RS03375 -L3404_RS01945 FCS84708_RS01965 -L3404_RS01945 BKB93_RS01985 -L3404_RS01945 BBV13_RS02000 -L3404_RS01945 CBP44_RS03385 -CTJTET1_RS05030 CTJTET1_RS05030 -ECS102511_RS00525 ECS102511_RS00525 -ECS102511_RS00525 CTB_RS00525 -ECS102511_RS00525 CTL2C_RS01890 -ECS102511_RS00525 CBP42_RS01925 -ECS102511_RS00525 L1224_RS00525 -ECS102511_RS00525 CTO_RS00525 -ECS102511_RS00525 L1440_RS00525 -ECS102511_RS00525 CBP44_RS01930 -ECS102511_RS00525 120585 -ECS102511_RS00525 L2BUCH2_RS00525 -ECS102511_RS00525 FCS84708_RS00525 -ECS102511_RS00525 BBV13_RS00530 -ECS102511_RS00525 L2BLST_RS00525 -ECS102511_RS00525 BW688_RS01925 -ECS102511_RS00525 BBV16_RS00530 -ECS102511_RS00525 gnl|Prokka|PADJNBJD_00103 -ECS102511_RS00525 A5291_RS00525 -ECS102511_RS00525 JIEJKO_00520 -ECS102511_RS00525 L3404_RS00525 -ECS102511_RS00525 DU10_RS00535 -ECS102511_RS00525 7618830 -ECS102511_RS00525 CTRC943_RS00525 -ECS102511_RS00525 ECS88FINAL_RS0100540 -ECS102511_RS00525 KW36_RS00525 -ECS102511_RS00525 CBP48_RS01925 -ECS102511_RS00525 LJHENM_00515 F -ECS102511_RS00525 NILJEPDF_00103 F -ECS102511_RS00525 QSDFRQ_00103 F -AKW53_RS01735 AKW53_RS01735 -AKW53_RS01735 CTL2C_RS01610 -AQ193_RS05040 AQ193_RS05040 -AQ199_RS05040 AQ199_RS05040 -AQ199_RS05040 AP288_RS05100 -AQ199_RS05040 AQ244_RS05300 -AQ199_RS05040 AQ193_RS04990 -BW688_RS04600 BW688_RS04600 -BW688_RS04600 120136 -BW688_RS04600 L2BLST_RS03150 -BW688_RS04600 CBP44_RS04605 -BW688_RS04600 L3404_RS03145 -BW688_RS04600 gnl|Prokka|PADJNBJD_00625 -BW688_RS04600 NILJEPDF_00625 -BW688_RS04600 LJHENM_03140 -BW688_RS04600 CTRC943_RS03150 -BW688_RS04600 BKC01_RS03205 -BW688_RS04600 QSDFRQ_00625 -BW688_RS04600 JIEJKO_03150 -BW688_RS04600 SOTONK1_RS03175 -BW688_RS04600 CTJTET1_RS03190 -BW688_RS04600 C15_RS0103240 -BW688_RS04600 CTL2C_RS04520 -BW688_RS04600 CBP48_RS04605 -BW688_RS04600 L1224_RS03150 -BW688_RS04600 KW36_RS03175 -BW688_RS04600 BKB95_RS03215 -BW688_RS04600 BKB96_RS03210 -BW688_RS04600 BKB99_RS03205 -BW688_RS04600 7619101 -BW688_RS04600 L1440_RS03150 -BW688_RS04600 AQ244_RS04740 -BW688_RS04600 CBP42_RS04610 -BW688_RS04600 L2BUCH2_RS03150 -BW688_RS04600 119169 F -BW688_RS04600 NILJEPDF_00626 F -BW688_RS04600 QSDFRQ_00626 F -BW688_RS04600 SOTONK1_RS04880 F -BW688_RS04600 AQ244_RS05225 F -CBP42_RS00350 CBP42_RS00350 -CBP42_RS00350 CTL2C_RS00345 -CBP42_RS00350 L1224_RS03725 -CBP42_RS00350 L1440_RS03725 -CBP42_RS00350 CBP44_RS00350 -CBP42_RS00350 L2BUCH2_RS03725 -CBP42_RS00350 L2BLST_RS03725 -CBP42_RS00350 BW688_RS00350 -CBP42_RS00350 7618248 -CBP42_RS00350 L3404_RS03720 -CBP42_RS00350 CBP48_RS00350 -CBP42_RS00350 KW36_RS03745 -CBP42_RS00350 BKB95_RS03800 -CBP42_RS00350 SW2_RS03750 -CBP42_RS00350 ECS102511_RS03740 -CBP42_RS00350 BKB96_RS03785 -CBP42_RS00350 BKB99_RS03780 -CBP42_RS00350 BKB92_RS03780 -CBP42_RS00350 CTB_RS03785 -CBP42_RS00350 SOTONIA3_RS03765 -CBP42_RS00350 E150_RS03750 -CBP42_RS00350 CTO_RS03780 -CBP42_RS00350 BBV13_RS03785 -CBP42_RS00350 FCS84708_RS03740 -CBP42_RS00350 BBV16_RS03795 -CBP42_RS00350 119751 -CBP42_RS00350 AQ199_RS04440 -CBP42_RS00350 BKB93_RS03785 -CBP42_RS00350 G9768_RS03745 -CBP42_RS00350 gnl|Prokka|PADJNBJD_00737 -CBP42_RS00350 AQ244_RS04165 -CBP42_RS00350 BKC02_RS03780 -CBP42_RS00350 NILJEPDF_00738 -CBP42_RS00350 LJHENM_03715 -CBP42_RS00350 AOT15_RS04545 -CBP42_RS00350 AP288_RS02115 -CBP42_RS00350 JIEJKO_03715 -CBP42_RS00350 BKC01_RS03785 -CBP42_RS00350 QSDFRQ_00738 -CBP42_RS00350 CTRC943_RS03730 -CBP42_RS00350 AQ193_RS00245 -CBP42_RS00350 AKW53_RS00485 -CBP42_RS00350 BKC03_RS03780 -CBP42_RS00350 CTJTET1_RS03765 -CBP42_RS00350 KW39_RS03760 -CBP42_RS00350 DU10_RS03795 -CBP42_RS00350 A5291_RS03790 -CBP42_RS00350 SOTONK1_RS03745 -CBP42_RS00350 IaCS19096_RS03740 -CBP42_RS00350 DU13_RS03795 -CBP42_RS00350 C15_RS0103850 -CBP42_RS00350 ECS88FINAL_RS0103850 -CBP42_RS00350 O169_RS03755 -CBP42_RS04800 CBP42_RS04800 -CBP42_RS04800 L2BUCH2_RS03345 -CBP42_RS04800 CTB_RS03400 -CBP42_RS04800 BKB92_RS03395 -CBP42_RS04800 SOTONIA3_RS03380 -CBP42_RS04800 E150_RS03370 -CBP42_RS04800 CTO_RS03395 -CBP42_RS04800 BBV13_RS03400 -CBP42_RS04800 BW688_RS04790 -CBP42_RS04800 FCS84708_RS03360 -CBP42_RS04800 L2BLST_RS03345 -CBP42_RS04800 CBP44_RS04795 -CBP42_RS04800 120101 -CBP42_RS04800 BBV16_RS03410 -CBP42_RS04800 AQ199_RS04060 -CBP42_RS04800 BKB93_RS03400 -CBP42_RS04800 G9768_RS03360 -CBP42_RS04800 gnl|Prokka|PADJNBJD_00661 -CBP42_RS04800 L3404_RS03340 -CBP42_RS04800 BKC02_RS03395 -CBP42_RS04800 NILJEPDF_00662 -CBP42_RS04800 LJHENM_03325 -CBP42_RS04800 AOT15_RS04160 -CBP42_RS04800 AP288_RS01730 -CBP42_RS04800 JIEJKO_03330 -CBP42_RS04800 BKC01_RS03395 -CBP42_RS04800 QSDFRQ_00662 -CBP42_RS04800 CTRC943_RS03345 -CBP42_RS04800 BKC03_RS03395 -CBP42_RS04800 CTJTET1_RS03380 -CBP42_RS04800 KW39_RS03380 -CBP42_RS04800 DU10_RS03410 -CBP42_RS04800 SOTONK1_RS03360 -CBP42_RS04800 ECS88FINAL_RS0103435 -CBP42_RS04800 IaCS19096_RS03355 -CBP42_RS04800 AQ244_RS04550 -CBP42_RS04800 C15_RS0103430 -CBP42_RS04800 A5291_RS03405 -CBP42_RS04800 O169_RS03375 -CBP42_RS04800 DU13_RS03410 -CBP42_RS04800 AKW53_RS00110 -CBP42_RS04800 KW36_RS03360 -CBP42_RS04800 CTL2C_RS04715 -CBP42_RS04800 BKB95_RS03415 -CBP42_RS04800 CBP48_RS04795 -CBP42_RS04800 7619122 -CBP42_RS04800 SW2_RS03370 -CBP42_RS04800 L1224_RS03345 -CBP42_RS04800 ECS102511_RS03360 -CBP42_RS04800 L1440_RS03345 -CBP42_RS04800 AQ193_RS00625 -CBP42_RS04800 BKB96_RS03405 -CBP42_RS04800 BKB99_RS03400 -CBP44_RS00140 CBP44_RS00140 -CBP44_RS00140 L2BUCH2_RS03520 -CBP44_RS00140 BKB92_RS03570 -CBP44_RS00140 CTB_RS03580 -CBP44_RS00140 SOTONIA3_RS03560 -CBP44_RS00140 E150_RS03545 -CBP44_RS00140 CTO_RS03575 -CBP44_RS00140 BBV13_RS03580 -CBP44_RS00140 FCS84708_RS03535 -CBP44_RS00140 L2BLST_RS03520 -CBP44_RS00140 BBV16_RS03590 -CBP44_RS00140 BW688_RS00140 -CBP44_RS00140 AQ199_RS04235 -CBP44_RS00140 BKB93_RS03575 -CBP44_RS00140 7618221 -CBP44_RS00140 119709 -CBP44_RS00140 G9768_RS03540 -CBP44_RS00140 L3404_RS03515 -CBP44_RS00140 BKC02_RS03570 -CBP44_RS00140 NILJEPDF_00697 -CBP44_RS00140 AOT15_RS04340 -CBP44_RS00140 AP288_RS01905 -CBP44_RS00140 BKC01_RS03570 -CBP44_RS00140 QSDFRQ_00697 -CBP44_RS00140 CTRC943_RS03525 -CBP44_RS00140 BKC03_RS03570 -CBP44_RS00140 CBP48_RS00140 -CBP44_RS00140 CTJTET1_RS03560 -CBP44_RS00140 KW39_RS03555 -CBP44_RS00140 DU10_RS03585 -CBP44_RS00140 SOTONK1_RS03540 -CBP44_RS00140 ECS88FINAL_RS01000000104980 -CBP44_RS00140 IaCS19096_RS03535 -CBP44_RS00140 AQ244_RS04370 -CBP44_RS00140 C15_RS01000000104965 -CBP44_RS00140 A5291_RS03585 -CBP44_RS00140 O169_RS03550 -CBP44_RS00140 DU13_RS03585 -CBP44_RS00140 KW36_RS03540 -CBP44_RS00140 AKW53_RS00285 -CBP44_RS00140 BKB95_RS03590 -CBP44_RS00140 CBP42_RS00140 -CBP44_RS00140 SW2_RS03545 -CBP44_RS00140 CTL2C_RS00140 -CBP44_RS00140 L1224_RS03520 -CBP44_RS00140 ECS102511_RS03535 -CBP44_RS00140 L1440_RS03520 -CBP44_RS00140 AQ193_RS00450 -CBP44_RS00140 BKB96_RS03580 -CBP44_RS00140 BKB99_RS03575 -CBP44_RS00140 gnl|Prokka|PADJNBJD_00696 F -CBP44_RS00140 LJHENM_03500 F -CBP44_RS00140 JIEJKO_03505 F -CBP44_RS00320 CBP44_RS00320 -CBP44_RS00320 L2BUCH2_RS03695 -CBP44_RS00320 BKB92_RS03750 -CBP44_RS00320 CTB_RS03755 -CBP44_RS00320 SOTONIA3_RS03735 -CBP44_RS00320 E150_RS03720 -CBP44_RS00320 CTO_RS03750 -CBP44_RS00320 BBV13_RS03755 -CBP44_RS00320 FCS84708_RS03710 -CBP44_RS00320 BBV16_RS03765 -CBP44_RS00320 L2BLST_RS03695 -CBP44_RS00320 119744 -CBP44_RS00320 BW688_RS00320 -CBP44_RS00320 7618244 -CBP44_RS00320 AQ199_RS04410 -CBP44_RS00320 BKB93_RS03755 -CBP44_RS00320 G9768_RS03715 -CBP44_RS00320 gnl|Prokka|PADJNBJD_00731 -CBP44_RS00320 L3404_RS03690 -CBP44_RS00320 BKC02_RS03750 -CBP44_RS00320 NILJEPDF_00732 -CBP44_RS00320 LJHENM_03685 -CBP44_RS00320 AOT15_RS04515 -CBP44_RS00320 AP288_RS02085 -CBP44_RS00320 JIEJKO_03685 -CBP44_RS00320 BKC01_RS03755 -CBP44_RS00320 QSDFRQ_00732 -CBP44_RS00320 CTRC943_RS03700 -CBP44_RS00320 AKW53_RS00455 -CBP44_RS00320 BKC03_RS03750 -CBP44_RS00320 CTJTET1_RS03735 -CBP44_RS00320 KW39_RS03730 -CBP44_RS00320 DU10_RS03765 -CBP44_RS00320 CBP48_RS00320 -CBP44_RS00320 A5291_RS03760 -CBP44_RS00320 SOTONK1_RS03715 -CBP44_RS00320 IaCS19096_RS03710 -CBP44_RS00320 DU13_RS03765 -CBP44_RS00320 C15_RS0103820 -CBP44_RS00320 ECS88FINAL_RS0103820 -CBP44_RS00320 O169_RS03725 -CBP44_RS00320 KW36_RS03715 -CBP44_RS00320 AQ244_RS04195 -CBP44_RS00320 BKB95_RS03770 -CBP44_RS00320 CBP42_RS00320 -CBP44_RS00320 SW2_RS03720 -CBP44_RS00320 CTL2C_RS00315 -CBP44_RS00320 L1224_RS03695 -CBP44_RS00320 ECS102511_RS03710 -CBP44_RS00320 BKB96_RS03755 -CBP44_RS00320 BKB99_RS03750 -CBP44_RS00320 L1440_RS03695 -CBP44_RS00320 AQ193_RS00275 -CBP44_RS00490 CBP44_RS00490 -CBP44_RS00490 L2BUCH2_RS03865 -CBP44_RS00490 BKB92_RS03920 -CBP44_RS00490 CTB_RS03925 -CBP44_RS00490 SOTONIA3_RS03905 -CBP44_RS00490 E150_RS03890 -CBP44_RS00490 CTO_RS03920 -CBP44_RS00490 BBV13_RS03925 -CBP44_RS00490 FCS84708_RS03880 -CBP44_RS00490 L2BLST_RS03865 -CBP44_RS00490 BBV16_RS03935 -CBP44_RS00490 7618699 -CBP44_RS00490 120029 -CBP44_RS00490 BW688_RS00490 -CBP44_RS00490 AQ199_RS04580 -CBP44_RS00490 BKB93_RS03925 -CBP44_RS00490 G9768_RS03885 -CBP44_RS00490 gnl|Prokka|PADJNBJD_00764 -CBP44_RS00490 L3404_RS03860 -CBP44_RS00490 NILJEPDF_00765 -CBP44_RS00490 BKC02_RS03920 -CBP44_RS00490 LJHENM_03850 -CBP44_RS00490 AOT15_RS04685 -CBP44_RS00490 AP288_RS02255 -CBP44_RS00490 JIEJKO_03850 -CBP44_RS00490 QSDFRQ_00765 -CBP44_RS00490 BKC01_RS03925 -CBP44_RS00490 CTRC943_RS03870 -CBP44_RS00490 AKW53_RS00625 -CBP44_RS00490 BKC03_RS03920 -CBP44_RS00490 CBP48_RS00490 -CBP44_RS00490 CTJTET1_RS03905 -CBP44_RS00490 KW39_RS03900 -CBP44_RS00490 DU10_RS03935 -CBP44_RS00490 A5291_RS03930 -CBP44_RS00490 SOTONK1_RS03885 -CBP44_RS00490 IaCS19096_RS03880 -CBP44_RS00490 DU13_RS03935 -CBP44_RS00490 C15_RS0103990 -CBP44_RS00490 ECS88FINAL_RS0103995 -CBP44_RS00490 O169_RS03895 -CBP44_RS00490 AQ244_RS04025 -CBP44_RS00490 KW36_RS03885 -CBP44_RS00490 BKB95_RS03940 -CBP44_RS00490 CBP42_RS00490 -CBP44_RS00490 CTL2C_RS00485 -CBP44_RS00490 L1224_RS03865 -CBP44_RS00490 AQ193_RS00105 -CBP44_RS00490 SW2_RS03890 -CBP44_RS00490 L1440_RS03860 -CBP44_RS00490 ECS102511_RS03880 -CBP44_RS00490 BKB96_RS03925 -CBP44_RS00490 BKB99_RS03920 -7618153 7618153 -7618191 7618191 -7618191 119151 -CTB_RS00870 CTB_RS00870 -CTB_RS00870 CTO_RS00870 -CTB_RS00870 BBV13_RS00880 -CTB_RS00870 BBV16_RS00880 -CTB_RS00870 A5291_RS00870 -CTB_RS01890 CTB_RS01890 -CTB_RS01890 CTO_RS01890 -CTB_RS01890 BBV13_RS01895 -CTB_RS01890 G9768_RS01865 -CTB_RS01890 BBV16_RS01895 -CTB_RS01890 BKC02_RS01870 -CTB_RS01890 gnl|Prokka|PADJNBJD_00367 -CTB_RS01890 NILJEPDF_00367 -CTB_RS01890 AQ244_RS01245 -CTB_RS01890 JIEJKO_01845 -CTB_RS01890 BKC03_RS01870 -CTB_RS01890 DU10_RS01890 -CTB_RS01890 QSDFRQ_00367 -CTB_RS01890 SOTONK1_RS01865 -CTB_RS01890 A5291_RS01890 -CTB_RS01890 IaCS19096_RS01860 -CTB_RS01890 DU13_RS01885 -CTB_RS01890 119479 -CTB_RS01890 KW36_RS01860 -CTB_RS01890 AOT15_RS02860 -CTB_RS01890 CBP42_RS03280 -CTB_RS01890 SOTONIA3_RS01875 -CTB_RS01890 L2BUCH2_RS01840 -CTB_RS01890 BKB92_RS01880 -CTB_RS01890 E150_RS01870 -CTB_RS01890 L2BLST_RS01840 -CTB_RS01890 FCS84708_RS01860 -CTB_RS01890 BW688_RS03270 -CTB_RS01890 BKB93_RS01880 -CTB_RS01890 CBP44_RS03275 -CTB_RS01890 AQ199_RS02560 -CTB_RS01890 L3404_RS01840 -CTB_RS01890 AP288_RS01215 -CTB_RS01890 BKC01_RS01870 -CTB_RS01890 AKW53_RS03365 -CTB_RS01890 CTRC943_RS01845 -CTB_RS01890 LJHENM_01850 -CTB_RS01890 CTJTET1_RS01875 -CTB_RS01890 C15_RS0101905 -CTB_RS01890 KW39_RS01875 -CTB_RS01890 ECS88FINAL_RS0101895 -CTB_RS01890 O169_RS01875 -CTB_RS01890 7618529 -CTB_RS01890 CTL2C_RS03210 -CTB_RS01890 BKB95_RS01885 -CTB_RS01890 CBP48_RS03270 -CTB_RS01890 L1224_RS01840 -CTB_RS01890 BKB96_RS01870 -CTB_RS01890 SW2_RS01865 -CTB_RS01890 AQ193_RS02120 -CTB_RS01890 BKB99_RS01870 -CTB_RS01890 L1440_RS01840 -CTB_RS01890 ECS102511_RS01865 -gnl|Prokka|PADJNBJD_00018 gnl|Prokka|PADJNBJD_00018 -gnl|Prokka|PADJNBJD_00018 L2BLST_RS00090 -gnl|Prokka|PADJNBJD_00018 BKC02_RS00090 -gnl|Prokka|PADJNBJD_00018 BBV16_RS00090 -gnl|Prokka|PADJNBJD_00018 BKC01_RS00090 -gnl|Prokka|PADJNBJD_00018 7618361 -gnl|Prokka|PADJNBJD_00018 LJHENM_00090 -gnl|Prokka|PADJNBJD_00018 A5291_RS00090 -gnl|Prokka|PADJNBJD_00018 SOTONK1_RS00090 -gnl|Prokka|PADJNBJD_00018 JIEJKO_00085 -gnl|Prokka|PADJNBJD_00018 NILJEPDF_00018 -gnl|Prokka|PADJNBJD_00018 L3404_RS00090 -gnl|Prokka|PADJNBJD_00018 IaCS19096_RS00090 -gnl|Prokka|PADJNBJD_00018 BKC03_RS00090 -gnl|Prokka|PADJNBJD_00018 C15_RS0100090 -gnl|Prokka|PADJNBJD_00018 AKW53_RS01575 -gnl|Prokka|PADJNBJD_00018 QSDFRQ_00018 -gnl|Prokka|PADJNBJD_00018 CTJTET1_RS00090 -gnl|Prokka|PADJNBJD_00018 DU10_RS00090 -gnl|Prokka|PADJNBJD_00018 CTRC943_RS00090 -gnl|Prokka|PADJNBJD_00018 O169_RS00090 -gnl|Prokka|PADJNBJD_00018 CBP48_RS01480 -gnl|Prokka|PADJNBJD_00018 ECS88FINAL_RS0100095 -gnl|Prokka|PADJNBJD_00018 DU13_RS00090 -gnl|Prokka|PADJNBJD_00018 KW39_RS00090 -gnl|Prokka|PADJNBJD_00018 AQ193_RS03915 -gnl|Prokka|PADJNBJD_00018 BKB95_RS00090 -gnl|Prokka|PADJNBJD_00018 KW36_RS00090 -gnl|Prokka|PADJNBJD_00018 SW2_RS00090 -gnl|Prokka|PADJNBJD_00018 AQ244_RS01900 -gnl|Prokka|PADJNBJD_00018 ECS102511_RS00090 -gnl|Prokka|PADJNBJD_00018 CTB_RS00090 -gnl|Prokka|PADJNBJD_00018 CTL2C_RS01455 -gnl|Prokka|PADJNBJD_00018 CBP42_RS01480 -gnl|Prokka|PADJNBJD_00018 L1224_RS00090 -gnl|Prokka|PADJNBJD_00018 BKB96_RS00090 -gnl|Prokka|PADJNBJD_00018 BKB99_RS00090 -gnl|Prokka|PADJNBJD_00018 CTO_RS00090 -gnl|Prokka|PADJNBJD_00018 SOTONIA3_RS00090 -gnl|Prokka|PADJNBJD_00018 L1440_RS00090 -gnl|Prokka|PADJNBJD_00018 BKB92_RS00090 -gnl|Prokka|PADJNBJD_00018 119214 -gnl|Prokka|PADJNBJD_00018 CBP44_RS01485 -gnl|Prokka|PADJNBJD_00018 E150_RS00090 -gnl|Prokka|PADJNBJD_00018 L2BUCH2_RS00090 -gnl|Prokka|PADJNBJD_00018 BKB93_RS00090 -gnl|Prokka|PADJNBJD_00018 FCS84708_RS00090 -gnl|Prokka|PADJNBJD_00018 AP288_RS03160 -gnl|Prokka|PADJNBJD_00018 AOT15_RS00865 -gnl|Prokka|PADJNBJD_00018 BBV13_RS00090 -gnl|Prokka|PADJNBJD_00018 G9768_RS00090 -gnl|Prokka|PADJNBJD_00018 AQ199_RS00785 -gnl|Prokka|PADJNBJD_00018 BW688_RS01480 -SW2_RS00895 SW2_RS00895 -SW2_RS00895 ECS102511_RS00895 -SW2_RS00895 BKB92_RS00900 -SW2_RS00895 E150_RS00895 -SW2_RS00895 AP288_RS03965 -SW2_RS00895 BKB93_RS00900 -SW2_RS00895 AQ199_RS01590 -SW2_RS00895 AKW53_RS02390 -SW2_RS00895 AQ193_RS03095 -SW2_RS00895 DU10_RS00910 -SW2_RS00895 ECS88FINAL_RS01000000104910 -SW2_RS00895 7618854 -SW2_RS00895 CBP48_RS02295 -SW2_RS00895 CTL2C_RS02255 -SW2_RS00895 L1440_RS00885 -SW2_RS00895 CBP42_RS02295 -SW2_RS00895 CBP44_RS02300 -SW2_RS00895 BW688_RS02295 -SW2_RS00895 CTRC943_RS00890 -SW2_RS00895 BKB95_RS00910 -SW2_RS00895 KW36_RS00895 -SW2_RS00895 AQ244_RS03075 -SW2_RS00895 BKC02_RS00895 -SW2_RS00895 120541 -SW2_RS00895 gnl|Prokka|PADJNBJD_00175 -SW2_RS00895 BKC03_RS00895 -SW2_RS00895 NILJEPDF_00175 -SW2_RS00895 SOTONK1_RS00895 -SW2_RS00895 JIEJKO_00880 -SW2_RS00895 QSDFRQ_00175 -SW2_RS00895 FCS84708_RS00895 -LJHENM_00260 LJHENM_00260 -LJHENM_00260 L2BLST_RS00260 -LJHENM_00260 BBV16_RS00265 -LJHENM_00260 gnl|Prokka|PADJNBJD_00051 -LJHENM_00260 JIEJKO_00250 -LJHENM_00260 BKC01_RS00265 -LJHENM_00260 A5291_RS00260 -LJHENM_00260 L3404_RS00260 -LJHENM_00260 7618383 -LJHENM_00260 AKW53_RS01750 -LJHENM_00260 IaCS19096_RS00260 -LJHENM_00260 DU10_RS00265 -LJHENM_00260 CTRC943_RS00260 -LJHENM_00260 O169_RS00260 -LJHENM_00260 CBP48_RS01655 -LJHENM_00260 ECS88FINAL_RS0100265 -LJHENM_00260 DU13_RS00265 -LJHENM_00260 KW39_RS00260 -LJHENM_00260 AQ193_RS03735 -LJHENM_00260 SW2_RS00260 -LJHENM_00260 ECS102511_RS00260 -LJHENM_00260 CTL2C_RS01625 -LJHENM_00260 CBP42_RS01655 -LJHENM_00260 CTB_RS00260 -LJHENM_00260 L1224_RS00260 -LJHENM_00260 L1440_RS00260 -LJHENM_00260 BKB92_RS00265 -LJHENM_00260 CTO_RS00260 -LJHENM_00260 119249 -LJHENM_00260 CBP44_RS01660 -LJHENM_00260 E150_RS00260 -LJHENM_00260 L2BUCH2_RS00260 -LJHENM_00260 BKB93_RS00265 -LJHENM_00260 FCS84708_RS00260 -LJHENM_00260 AP288_RS03330 -LJHENM_00260 AOT15_RS00695 -LJHENM_00260 BBV13_RS00265 -LJHENM_00260 AQ199_RS00955 -LJHENM_00260 BW688_RS01655 -LJHENM_00260 BKC02_RS00265 -LJHENM_00260 G9768_RS00260 -LJHENM_00260 NILJEPDF_00051 -LJHENM_00260 SOTONK1_RS00260 -LJHENM_00260 QSDFRQ_00051 -LJHENM_00260 BKC03_RS00265 -LJHENM_00260 C15_RS0100260 -LJHENM_00260 CTJTET1_RS00260 -LJHENM_00260 KW36_RS00260 -LJHENM_00260 AQ244_RS01730 -LJHENM_00260 BKB95_RS00265 -LJHENM_00260 SOTONIA3_RS00260 -LJHENM_04475 LJHENM_04475 -L2BLST_RS00620 L2BLST_RS00620 -L2BLST_RS00620 FCS84708_RS00620 -L2BLST_RS00620 AP288_RS03690 -L2BLST_RS00620 BKB93_RS00630 -L2BLST_RS00620 120572 -L2BLST_RS00620 AQ199_RS01315 -L2BLST_RS00620 BW688_RS02020 -L2BLST_RS00620 BKC02_RS00630 -L2BLST_RS00620 gnl|Prokka|PADJNBJD_00122 -L2BLST_RS00620 LJHENM_00610 -L2BLST_RS00620 AKW53_RS02115 -L2BLST_RS00620 AQ193_RS03375 -L2BLST_RS00620 BKC01_RS00630 -L2BLST_RS00620 NILJEPDF_00122 -L2BLST_RS00620 L3404_RS00620 -L2BLST_RS00620 SOTONK1_RS00620 -L2BLST_RS00620 JIEJKO_00615 -L2BLST_RS00620 QSDFRQ_00122 -L2BLST_RS00620 IaCS19096_RS00620 -L2BLST_RS00620 BKC03_RS00630 -L2BLST_RS00620 C15_RS0100640 -L2BLST_RS00620 CTRC943_RS00620 -L2BLST_RS00620 CTJTET1_RS00620 -L2BLST_RS00620 KW39_RS00620 -L2BLST_RS00620 DU10_RS00630 -L2BLST_RS00620 ECS88FINAL_RS0100640 -L2BLST_RS00620 O169_RS00620 -L2BLST_RS00620 DU13_RS00635 -L2BLST_RS00620 7618838 -L2BLST_RS00620 KW36_RS00620 -L2BLST_RS00620 CBP48_RS02020 -L2BLST_RS00620 SW2_RS00620 -L2BLST_RS00620 BKB95_RS00630 -L2BLST_RS00620 ECS102511_RS00620 -L2BLST_RS00620 CTL2C_RS01985 -L2BLST_RS00620 AOT15_RS00335 -L2BLST_RS00620 L1224_RS00620 -L2BLST_RS00620 AQ244_RS02795 -L2BLST_RS00620 BKB96_RS00630 -L2BLST_RS00620 CBP42_RS02020 -L2BLST_RS00620 BKB99_RS00630 -L2BLST_RS00620 L1440_RS00620 -L2BLST_RS00620 BKB92_RS00630 -L2BLST_RS00620 SOTONIA3_RS00620 -L2BLST_RS00620 E150_RS00620 -L2BLST_RS00620 L2BUCH2_RS00620 -L2BLST_RS00620 CBP44_RS02025 -CTJTET1_RS05035 CTJTET1_RS05035 -AQ193_RS04860 AQ193_RS04860 -AQ199_RS04960 AQ199_RS04960 -AQ199_RS04960 BKB93_RS03715 -AQ199_RS04960 AQ193_RS04885 -AQ199_RS04960 AOT15_RS04920 -AQ199_RS04960 AP288_RS04970 -AQ199_RS04960 AKW53_RS04795 -AQ199_RS04960 ECS88FINAL_RS1000000105085 -AQ199_RS04960 SW2_RS04850 -AQ199_RS04960 ECS102511_RS04865 -AQ199_RS04960 BKB92_RS03710 -AQ199_RS04960 CTB_RS04875 -AQ199_RS04960 E150_RS04855 -AQ199_RS04960 L2BLST_RS04880 -AQ199_RS04960 BW688_RS00280 -AQ199_RS04960 CBP48_RS00280 -AQ199_RS04960 CBP42_RS00280 -AQ199_RS04960 CTL2C_RS04765 -AQ199_RS04960 L1224_RS04880 -AQ199_RS04960 L1440_RS04825 -AQ199_RS04960 CBP44_RS00280 -AQ199_RS04960 L2BUCH2_RS04875 -AQ199_RS05045 AQ199_RS05045 -AQ199_RS05045 AP288_RS05105 -AQ199_RS05045 AQ193_RS04985 -AQ199_RS05045 AQ244_RS05305 -AQ244_RS03025 AQ244_RS03025 -AQ244_RS03025 BKB92_RS00860 -AQ244_RS03025 E150_RS00850 -AQ244_RS03025 FCS84708_RS00850 -AQ244_RS03025 AOT15_RS00105 -AQ244_RS03025 AP288_RS03920 -AQ244_RS03025 BKB93_RS00860 -AQ244_RS03025 AQ199_RS01545 -AQ244_RS03025 G9768_RS00855 -AQ244_RS03025 119341 -AQ244_RS03025 gnl|Prokka|PADJNBJD_00167 -AQ244_RS03025 AKW53_RS02345 -AQ244_RS03025 LJHENM_00840 -AQ244_RS03025 JIEJKO_00840 -AQ244_RS03025 SOTONK1_RS00850 -AQ244_RS03025 KW39_RS00850 -AQ244_RS03025 ECS88FINAL_RS0100870 -AQ244_RS03025 IaCS19096_RS00850 -AQ244_RS03025 O169_RS00850 -AQ244_RS03025 DU13_RS00865 -AQ244_RS03025 KW36_RS00850 -AQ244_RS03025 SW2_RS00850 -AQ244_RS03025 AQ193_RS03145 -AQ244_RS03025 ECS102511_RS00850 -AQ244_RS04955 AQ244_RS04955 -BW688_RS04605 BW688_RS04605 -BW688_RS04605 SOTONIA3_RS03195 F -BW688_RS04605 BKB95_RS03220 F -BW688_RS04605 BKB96_RS03215 F -BW688_RS04605 BKB99_RS03210 F -BW688_RS04605 L2BUCH2_RS03155 -BW688_RS04605 CTB_RS03220 -BW688_RS04605 AQ193_RS00805 -BW688_RS04605 BKB92_RS03210 -BW688_RS04605 E150_RS03185 -BW688_RS04605 CTO_RS03215 -BW688_RS04605 120135 -BW688_RS04605 L2BLST_RS03155 -BW688_RS04605 FCS84708_RS03180 -BW688_RS04605 BBV13_RS03220 -BW688_RS04605 CBP44_RS04610 -BW688_RS04605 AQ199_RS03880 -BW688_RS04605 BBV16_RS03230 -BW688_RS04605 BKB93_RS03215 -BW688_RS04605 G9768_RS03180 -BW688_RS04605 L3404_RS03150 -BW688_RS04605 gnl|Prokka|PADJNBJD_00626 -BW688_RS04605 BKC02_RS03210 -BW688_RS04605 AOT15_RS03980 -BW688_RS04605 AP288_RS01550 -BW688_RS04605 NILJEPDF_00627 -BW688_RS04605 LJHENM_03150 -BW688_RS04605 CTRC943_RS03155 -BW688_RS04605 BKC01_RS03210 -BW688_RS04605 JIEJKO_03155 -BW688_RS04605 QSDFRQ_00627 -BW688_RS04605 BKC03_RS03210 -BW688_RS04605 CTJTET1_RS03195 -BW688_RS04605 KW39_RS03195 -BW688_RS04605 SOTONK1_RS03180 -BW688_RS04605 ECS88FINAL_RS0103250 -BW688_RS04605 IaCS19096_RS03175 -BW688_RS04605 DU10_RS03225 -BW688_RS04605 C15_RS0103245 -BW688_RS04605 A5291_RS03220 -BW688_RS04605 O169_RS03190 -BW688_RS04605 DU13_RS03220 -BW688_RS04605 CTL2C_RS04525 -BW688_RS04605 CBP48_RS04610 -BW688_RS04605 L1224_RS03155 -BW688_RS04605 KW36_RS03180 -BW688_RS04605 AKW53_RS04405 -BW688_RS04605 AQ244_RS04735 -BW688_RS04605 SW2_RS03185 -BW688_RS04605 ECS102511_RS03180 -BW688_RS04605 L1440_RS03155 -BW688_RS04605 CBP42_RS04615 -BKB92_RS02210 BKB92_RS02210 -BKB92_RS02210 E150_RS02195 -BKB92_RS02210 FCS84708_RS02185 -BKB92_RS02210 BKB93_RS02210 -BKB92_RS02210 AQ199_RS02885 -BKB92_RS02210 AKW53_RS03690 -BKB92_RS02210 LJHENM_02180 -BKB92_RS02210 DU10_RS02225 -BKB92_RS02210 KW39_RS02200 -BKB92_RS02210 ECS88FINAL_RS0102230 -BKB92_RS02210 O169_RS02200 -BKB92_RS02210 DU13_RS02220 -BKB92_RS02210 SW2_RS02190 -BKB92_RS02210 AQ193_RS01795 -BKB92_RS02210 ECS102511_RS02190 -BKB92_RS02210 CTB_RS02215 -BKB92_RS02210 CTO_RS02215 -BKB92_RS02210 BBV13_RS02225 -BKB92_RS02210 BBV16_RS02225 -BKB92_RS02210 G9768_RS02190 -BKB92_RS02210 BKC02_RS02200 -BKB92_RS02210 BKC01_RS02200 -BKB92_RS02210 gnl|Prokka|PADJNBJD_00432 -BKB92_RS02210 NILJEPDF_00432 -BKB92_RS02210 CTRC943_RS02170 -BKB92_RS02210 JIEJKO_02175 -BKB92_RS02210 BKC03_RS02200 -BKB92_RS02210 CTJTET1_RS02200 -BKB92_RS02210 AQ244_RS00920 -BKB92_RS02210 QSDFRQ_00432 -BKB92_RS02210 C15_RS0102235 -BKB92_RS02210 A5291_RS02215 -BKB92_RS02210 SOTONK1_RS02190 -BKB92_RS02210 IaCS19096_RS02185 -BKB92_RS02210 KW36_RS02185 -BKB92_RS02210 119530 -BKB92_RS02210 CBP42_RS03615 -BKB92_RS02210 L2BUCH2_RS02165 -BKB92_RS02210 L2BLST_RS02165 -BKB92_RS02210 BW688_RS03600 -BKB92_RS02210 CBP44_RS03610 -BKB92_RS02210 L3404_RS02165 -BKB92_RS02210 7618560 -BKB92_RS02210 CTL2C_RS03535 -BKB92_RS02210 CBP48_RS03605 -BKB92_RS02210 L1224_RS02165 -BKB92_RS02210 L1440_RS02165 -BKB92_RS02210 AP288_RS00890 -BKB92_RS02210 AOT15_RS03185 -BKB92_RS02210 BKB95_RS02220 -BKB92_RS02210 SOTONIA3_RS02200 -CBP48_RS00045 CBP48_RS00045 -CBP48_RS00045 JIEJKO_03410 -CBP48_RS00045 BKC01_RS03475 -CBP48_RS00045 QSDFRQ_00678 -CBP48_RS00045 CTRC943_RS03425 -CBP48_RS00045 BKC03_RS03475 -CBP48_RS00045 CTJTET1_RS03460 -CBP48_RS00045 KW39_RS03460 -CBP48_RS00045 DU10_RS03490 -CBP48_RS00045 SOTONK1_RS03440 -CBP48_RS00045 ECS88FINAL_RS0103520 -CBP48_RS00045 IaCS19096_RS03435 -CBP48_RS00045 C15_RS0103515 -CBP48_RS00045 A5291_RS03485 -CBP48_RS00045 O169_RS03455 -CBP48_RS00045 DU13_RS03490 -CBP48_RS00045 KW36_RS03440 -CBP48_RS00045 AKW53_RS00190 -CBP48_RS00045 AQ244_RS04470 -CBP48_RS00045 BKB95_RS03495 -CBP48_RS00045 CBP42_RS00045 -CBP48_RS00045 SW2_RS03450 -CBP48_RS00045 CTL2C_RS00045 -CBP48_RS00045 L1224_RS03425 -CBP48_RS00045 ECS102511_RS03440 -CBP48_RS00045 L1440_RS03425 -CBP48_RS00045 BKB96_RS03485 -CBP48_RS00045 BKB99_RS03480 -CBP48_RS00045 AQ193_RS00545 -CBP48_RS00045 CBP44_RS00045 -CBP48_RS00045 L2BUCH2_RS03425 -CBP48_RS00045 BKB92_RS03475 -CBP48_RS00045 CTB_RS03480 -CBP48_RS00045 SOTONIA3_RS03460 -CBP48_RS00045 E150_RS03450 -CBP48_RS00045 CTO_RS03475 -CBP48_RS00045 BBV13_RS03480 -CBP48_RS00045 FCS84708_RS03440 -CBP48_RS00045 L2BLST_RS03425 -CBP48_RS00045 7618663 -CBP48_RS00045 BBV16_RS03490 -CBP48_RS00045 BW688_RS00045 -CBP48_RS00045 AQ199_RS04140 -CBP48_RS00045 BKB93_RS03480 -CBP48_RS00045 120087 -CBP48_RS00045 G9768_RS03440 -CBP48_RS00045 gnl|Prokka|PADJNBJD_00677 -CBP48_RS00045 L3404_RS03420 -CBP48_RS00045 BKC02_RS03475 -CBP48_RS00045 NILJEPDF_00678 -CBP48_RS00045 LJHENM_03405 -CBP48_RS00045 AOT15_RS04240 -CBP48_RS00045 AP288_RS01810 -CBP42_RS04305 CBP42_RS04305 -CBP42_RS04305 L1440_RS02850 -CBP42_RS04305 120173 -CBP42_RS04305 L2BUCH2_RS02850 -CBP42_RS04305 SOTONIA3_RS02885 -CBP42_RS04305 BKB92_RS02900 -CBP42_RS04305 CTB_RS02905 -CBP42_RS04305 E150_RS02875 -CBP42_RS04305 BW688_RS04295 -CBP42_RS04305 CTO_RS02905 -CBP42_RS04305 FCS84708_RS02865 -CBP42_RS04305 L2BLST_RS02850 -CBP42_RS04305 BBV13_RS02910 -CBP42_RS04305 CBP44_RS04300 -CBP42_RS04305 AQ199_RS03565 -CBP42_RS04305 BKB93_RS02905 -CBP42_RS04305 BBV16_RS02920 -CBP42_RS04305 G9768_RS02870 -CBP42_RS04305 AP288_RS00210 -CBP42_RS04305 L3404_RS02845 -CBP42_RS04305 BKC02_RS02895 -CBP42_RS04305 gnl|Prokka|PADJNBJD_00566 -CBP42_RS04305 AOT15_RS03670 -CBP42_RS04305 NILJEPDF_00566 -CBP42_RS04305 BKC01_RS02895 -CBP42_RS04305 LJHENM_02850 -CBP42_RS04305 CTRC943_RS02850 -CBP42_RS04305 AQ244_RS00240 -CBP42_RS04305 QSDFRQ_00566 -CBP42_RS04305 JIEJKO_02855 -CBP42_RS04305 SOTONK1_RS02870 -CBP42_RS04305 CTJTET1_RS02880 -CBP42_RS04305 BKC03_RS02895 -CBP42_RS04305 KW39_RS02880 -CBP42_RS04305 C15_RS0102940 -CBP42_RS04305 ECS88FINAL_RS0102935 -CBP42_RS04305 IaCS19096_RS02865 -CBP42_RS04305 DU10_RS02915 -CBP42_RS04305 O169_RS02880 -CBP42_RS04305 A5291_RS02905 -CBP42_RS04305 DU13_RS02910 -CBP42_RS04305 CBP48_RS04295 -CBP42_RS04305 CTL2C_RS04220 -CBP42_RS04305 KW36_RS02865 -CBP42_RS04305 AKW53_RS04095 -CBP42_RS04305 AQ193_RS01115 -CBP42_RS04305 BKB95_RS02910 -CBP42_RS04305 BKB96_RS02900 -CBP42_RS04305 BKB99_RS02895 -CBP42_RS04305 7619077 -CBP42_RS04305 SW2_RS02875 -CBP42_RS04305 L1224_RS02850 -CBP42_RS04305 ECS102511_RS02870 -CBP44_RS00325 CBP44_RS00325 -CBP44_RS00325 L1440_RS03700 -CBP44_RS00325 L2BUCH2_RS03700 -CBP44_RS00325 BKB92_RS03755 -CBP44_RS00325 CTB_RS03760 -CBP44_RS00325 SOTONIA3_RS03740 -CBP44_RS00325 E150_RS03725 -CBP44_RS00325 CTO_RS03755 -CBP44_RS00325 BBV13_RS03760 -CBP44_RS00325 FCS84708_RS03715 -CBP44_RS00325 BBV16_RS03770 -CBP44_RS00325 L2BLST_RS03700 -CBP44_RS00325 120057 -CBP44_RS00325 BW688_RS00325 -CBP44_RS00325 7618682 -CBP44_RS00325 AQ199_RS04415 -CBP44_RS00325 BKB93_RS03760 -CBP44_RS00325 G9768_RS03720 -CBP44_RS00325 gnl|Prokka|PADJNBJD_00732 -CBP44_RS00325 L3404_RS03695 -CBP44_RS00325 BKC02_RS03755 -CBP44_RS00325 NILJEPDF_00733 -CBP44_RS00325 LJHENM_03690 -CBP44_RS00325 AOT15_RS04520 -CBP44_RS00325 AP288_RS02090 -CBP44_RS00325 JIEJKO_03690 -CBP44_RS00325 BKC01_RS03760 -CBP44_RS00325 QSDFRQ_00733 -CBP44_RS00325 CTRC943_RS03705 -CBP44_RS00325 AKW53_RS00460 -CBP44_RS00325 BKC03_RS03755 -CBP44_RS00325 CTJTET1_RS03740 -CBP44_RS00325 KW39_RS03735 -CBP44_RS00325 DU10_RS03770 -CBP44_RS00325 CBP48_RS00325 -CBP44_RS00325 A5291_RS03765 -CBP44_RS00325 SOTONK1_RS03720 -CBP44_RS00325 IaCS19096_RS03715 -CBP44_RS00325 DU13_RS03770 -CBP44_RS00325 C15_RS0103825 -CBP44_RS00325 ECS88FINAL_RS0103825 -CBP44_RS00325 O169_RS03730 -CBP44_RS00325 AQ244_RS04190 -CBP44_RS00325 KW36_RS03720 -CBP44_RS00325 BKB95_RS03775 -CBP44_RS00325 AQ193_RS00270 -CBP44_RS00325 CBP42_RS00325 -CBP44_RS00325 SW2_RS03725 -CBP44_RS00325 CTL2C_RS00320 -CBP44_RS00325 L1224_RS03700 -CBP44_RS00325 ECS102511_RS03715 -CBP44_RS00325 BKB96_RS03760 -CBP44_RS00325 BKB99_RS03755 -119137 119137 -119154 119154 -119154 7618193 -CTB_RS04825 CTB_RS04825 -CTB_RS04825 CTO_RS04860 -CTB_RS04825 A5291_RS04885 -G9768_RS00285 G9768_RS00285 -G9768_RS00285 BKC02_RS00290 -G9768_RS00285 gnl|Prokka|PADJNBJD_00056 -G9768_RS00285 AQ244_RS01705 -G9768_RS00285 NILJEPDF_00056 -G9768_RS00285 BKC01_RS00290 -G9768_RS00285 SOTONK1_RS00285 -G9768_RS00285 QSDFRQ_00056 -G9768_RS00285 IaCS19096_RS00285 -G9768_RS00285 BKC03_RS00290 -G9768_RS00285 C15_RS0100290 -G9768_RS00285 DU10_RS00290 -G9768_RS00285 CTJTET1_RS00285 -G9768_RS00285 KW36_RS00285 -G9768_RS00285 BKB95_RS00290 -G9768_RS00285 BKB96_RS00290 -G9768_RS00285 AOT15_RS00670 -G9768_RS00285 BKB99_RS00290 -G9768_RS00285 SOTONIA3_RS00285 -G9768_RS00285 119250 -G9768_RS00285 BKB93_RS00290 -G9768_RS00285 FCS84708_RS00285 -G9768_RS00285 AP288_RS03355 -G9768_RS00285 AQ199_RS00980 -G9768_RS00285 BW688_RS01680 -G9768_RS00285 L2BLST_RS00285 -G9768_RS00285 AQ193_RS03710 -G9768_RS00285 LJHENM_00285 -G9768_RS00285 L3404_RS00285 -G9768_RS00285 AKW53_RS01775 -G9768_RS00285 7618384 -G9768_RS00285 CTRC943_RS00285 -G9768_RS00285 O169_RS00285 -G9768_RS00285 DU13_RS00295 -G9768_RS00285 CBP48_RS01680 -G9768_RS00285 ECS88FINAL_RS0100295 -G9768_RS00285 KW39_RS00285 -G9768_RS00285 SW2_RS00285 -G9768_RS00285 ECS102511_RS00285 -G9768_RS00285 CTL2C_RS01650 -G9768_RS00285 CBP42_RS01680 -G9768_RS00285 L1224_RS00285 -G9768_RS00285 L1440_RS00285 -G9768_RS00285 BKB92_RS00290 -G9768_RS00285 CBP44_RS01685 -G9768_RS00285 E150_RS00285 -G9768_RS00285 L2BUCH2_RS00285 -G9768_RS00285 BBV13_RS00290 -G9768_RS00285 BBV16_RS00290 -G9768_RS00285 A5291_RS00285 -G9768_RS00285 CTB_RS00285 -G9768_RS00285 CTO_RS00285 -G9768_RS00285 JIEJKO_00280 F -G9768_RS00285 JIEJKO_00285 F -gnl|Prokka|PADJNBJD_00019 gnl|Prokka|PADJNBJD_00019 -gnl|Prokka|PADJNBJD_00019 G9768_RS00095 -gnl|Prokka|PADJNBJD_00019 AQ199_RS00790 -gnl|Prokka|PADJNBJD_00019 BW688_RS01485 -gnl|Prokka|PADJNBJD_00019 L2BLST_RS00095 -gnl|Prokka|PADJNBJD_00019 BKC02_RS00095 -gnl|Prokka|PADJNBJD_00019 BBV16_RS00095 -gnl|Prokka|PADJNBJD_00019 BKC01_RS00095 -gnl|Prokka|PADJNBJD_00019 7618786 -gnl|Prokka|PADJNBJD_00019 LJHENM_00095 -gnl|Prokka|PADJNBJD_00019 A5291_RS00095 -gnl|Prokka|PADJNBJD_00019 SOTONK1_RS00095 -gnl|Prokka|PADJNBJD_00019 JIEJKO_00090 -gnl|Prokka|PADJNBJD_00019 NILJEPDF_00019 -gnl|Prokka|PADJNBJD_00019 L3404_RS00095 -gnl|Prokka|PADJNBJD_00019 IaCS19096_RS00095 -gnl|Prokka|PADJNBJD_00019 BKC03_RS00095 -gnl|Prokka|PADJNBJD_00019 C15_RS0100095 -gnl|Prokka|PADJNBJD_00019 AKW53_RS01580 -gnl|Prokka|PADJNBJD_00019 QSDFRQ_00019 -gnl|Prokka|PADJNBJD_00019 CTJTET1_RS00095 -gnl|Prokka|PADJNBJD_00019 DU10_RS00095 -gnl|Prokka|PADJNBJD_00019 CTRC943_RS00095 -gnl|Prokka|PADJNBJD_00019 O169_RS00095 -gnl|Prokka|PADJNBJD_00019 AQ193_RS03910 -gnl|Prokka|PADJNBJD_00019 CBP48_RS01485 -gnl|Prokka|PADJNBJD_00019 ECS88FINAL_RS0100100 -gnl|Prokka|PADJNBJD_00019 DU13_RS00095 -gnl|Prokka|PADJNBJD_00019 KW39_RS00095 -gnl|Prokka|PADJNBJD_00019 AQ244_RS01895 -gnl|Prokka|PADJNBJD_00019 BKB95_RS00095 -gnl|Prokka|PADJNBJD_00019 KW36_RS00095 -gnl|Prokka|PADJNBJD_00019 SW2_RS00095 -gnl|Prokka|PADJNBJD_00019 ECS102511_RS00095 -gnl|Prokka|PADJNBJD_00019 CTB_RS00095 -gnl|Prokka|PADJNBJD_00019 CTL2C_RS01460 -gnl|Prokka|PADJNBJD_00019 CBP42_RS01485 -gnl|Prokka|PADJNBJD_00019 L1224_RS00095 -gnl|Prokka|PADJNBJD_00019 BKB96_RS00095 -gnl|Prokka|PADJNBJD_00019 BKB99_RS00095 -gnl|Prokka|PADJNBJD_00019 CTO_RS00095 -gnl|Prokka|PADJNBJD_00019 SOTONIA3_RS00095 -gnl|Prokka|PADJNBJD_00019 L1440_RS00095 -gnl|Prokka|PADJNBJD_00019 BKB92_RS00095 -gnl|Prokka|PADJNBJD_00019 120653 -gnl|Prokka|PADJNBJD_00019 CBP44_RS01490 -gnl|Prokka|PADJNBJD_00019 E150_RS00095 -gnl|Prokka|PADJNBJD_00019 L2BUCH2_RS00095 -gnl|Prokka|PADJNBJD_00019 AOT15_RS00860 -gnl|Prokka|PADJNBJD_00019 BKB93_RS00095 -gnl|Prokka|PADJNBJD_00019 FCS84708_RS00095 -gnl|Prokka|PADJNBJD_00019 AP288_RS03165 -gnl|Prokka|PADJNBJD_00019 BBV13_RS00095 -CTJTET1_RS04160 CTJTET1_RS04160 -KW39_RS03625 KW39_RS03625 -KW39_RS03625 DU10_RS03655 -KW39_RS03625 ECS88FINAL_RS0103700 -KW39_RS03625 O169_RS03620 -KW39_RS03625 DU13_RS03655 -KW39_RS03625 AKW53_RS00355 -KW39_RS03625 SW2_RS03615 -KW39_RS03625 ECS102511_RS03605 -KW39_RS03625 AQ193_RS00380 -KW39_RS03625 BKB92_RS03640 -KW39_RS03625 E150_RS03615 -KW39_RS03625 FCS84708_RS03605 -KW39_RS03625 AQ199_RS04305 -KW39_RS03625 BKB93_RS03645 -KW39_RS03625 LJHENM_03570 -KW39_RS03625 AP288_RS01975 -KW39_RS03625 JIEJKO_03575 -KW39_RS03625 BKC01_RS03640 -KW39_RS03625 QSDFRQ_00711 -KW39_RS03625 CTRC943_RS03595 -KW39_RS03625 BKC03_RS03640 -KW39_RS03625 CBP48_RS00210 -KW39_RS03625 CTJTET1_RS03630 -KW39_RS03625 SOTONK1_RS03610 -KW39_RS03625 IaCS19096_RS03605 -KW39_RS03625 C15_RS0103690 -KW39_RS03625 A5291_RS03655 -KW39_RS03625 KW36_RS03610 -KW39_RS03625 AQ244_RS04300 -KW39_RS03625 BKB95_RS03660 -KW39_RS03625 CBP42_RS00210 -KW39_RS03625 CTL2C_RS00210 -KW39_RS03625 L1224_RS03590 -KW39_RS03625 L1440_RS03590 -KW39_RS03625 BKB96_RS03650 -KW39_RS03625 BKB99_RS03645 -KW39_RS03625 CBP44_RS00210 -KW39_RS03625 L2BUCH2_RS03590 -KW39_RS03625 CTB_RS03650 -KW39_RS03625 SOTONIA3_RS03630 -KW39_RS03625 CTO_RS03645 -KW39_RS03625 BBV13_RS03650 -KW39_RS03625 L2BLST_RS03590 -KW39_RS03625 BBV16_RS03660 -KW39_RS03625 BW688_RS00210 -KW39_RS03625 7618233 -KW39_RS03625 119728 -KW39_RS03625 G9768_RS03610 -KW39_RS03625 gnl|Prokka|PADJNBJD_00710 -KW39_RS03625 L3404_RS03585 -KW39_RS03625 BKC02_RS03640 -KW39_RS03625 NILJEPDF_00711 -KW39_RS03625 AOT15_RS04410 -AP288_RS04890 AP288_RS04890 -AQ193_RS05045 AQ193_RS05045 -AQ199_RS05050 AQ199_RS05050 -AQ199_RS05050 AQ193_RS04980 -AQ199_RS05050 AP288_RS05110 -AQ199_RS05050 AQ244_RS05310 -AQ244_RS04970 AQ244_RS04970 -BKB92_RS04450 BKB92_RS04450 -BKB92_RS04450 LJHENM_04345 -BKB92_RS04450 BKB93_RS04455 -BKB92_RS04450 DU10_RS04465 -BKB92_RS04450 DU13_RS04465 -7618169 7618169 -7618171 7618171 -7618177 7618177 -CTJTET1_RS04165 CTJTET1_RS04165 -AP288_RS05120 AP288_RS05120 -AP288_RS05120 AP288_RS04885 F -AQ193_RS04865 AQ193_RS04865 -AQ199_RS04865 AQ199_RS04865 -AQ199_RS04865 AQ193_RS04810 -AQ199_RS04865 AP288_RS04830 -AQ199_RS04865 AQ244_RS04880 -AQ244_RS04985 AQ244_RS04985 -119155 119155 -119171 119171 -CTB_RS04775 CTB_RS04775 -CTB_RS04775 BBV13_RS04790 -CTB_RS04775 CTO_RS04770 -CTB_RS04775 BBV16_RS04795 -CTB_RS04775 A5291_RS04780 -CTB_RS04775 BKB96_RS04810 -CTB_RS04775 BKB99_RS04805 -CTB_RS04775 AQ244_RS02000 -CTB_RS04775 SOTONIA3_RS04765 -CTB_RS04775 gnl|Prokka|PADJNBJD_00932 -CTB_RS04775 NILJEPDF_00933 -CTB_RS04775 AQ199_RS00685 -CTB_RS04775 119908 -CTB_RS04775 JIEJKO_04690 -CTB_RS04775 QSDFRQ_00933 -CTB_RS04775 AOT15_RS00965 -CTB_RS04775 BKC02_RS04805 -CTB_RS04775 BKC01_RS04810 -CTB_RS04775 BKC03_RS04805 -CTB_RS04775 SOTONK1_RS04750 -CTB_RS04775 IaCS19096_RS04745 -CTB_RS04775 KW36_RS04750 -CTB_RS04775 BKB95_RS04825 -CTB_RS04775 ECS102511_RS04755 -CTB_RS04775 BKB92_RS04805 -CTB_RS04775 FCS84708_RS04750 -CTB_RS04775 LJHENM_04700 -CTB_RS04775 BKB93_RS04810 -CTB_RS04775 KW39_RS04770 -CTB_RS04775 ECS88FINAL_RS0104850 -CTB_RS04775 DU10_RS04820 -CTB_RS04775 O169_RS04770 -CTB_RS04775 DU13_RS04820 -CTB_RS04775 SW2_RS04760 -CTB_RS04775 AP288_RS03060 -CTB_RS04775 E150_RS04765 -CTB_RS04775 AKW53_RS01475 -CTB_RS04775 AQ193_RS04015 -CTB_RS04775 CBP44_RS01380 -CTB_RS04775 BW688_RS01380 -CTB_RS04775 7618350 -CTB_RS04775 G9768_RS04750 -CTB_RS04775 CTRC943_RS04735 -CTB_RS04775 CBP48_RS01380 -CTB_RS04775 CTL2C_RS01350 -CTB_RS04775 CBP42_RS01380 -CTB_RS04775 L2BLST_RS04730 -CTB_RS04775 L2BUCH2_RS04730 -CTB_RS04775 L3404_RS04725 -CTB_RS04775 L1224_RS04730 -CTB_RS04775 L1440_RS04725 -CTB_RS04775 C15_RS0104870 -CTB_RS04775 CTJTET1_RS04920 -CTJTET1_RS04945 CTJTET1_RS04945 -AP288_RS04900 AP288_RS04900 -AQ193_RS05050 AQ193_RS05050 -AQ193_RS05050 AP288_RS05075 -AQ193_RS05050 AQ244_RS05275 -AQ193_RS05050 AQ199_RS05015 -AQ199_RS04870 AQ199_RS04870 -AQ199_RS04870 AQ193_RS04805 -AQ199_RS04870 AQ244_RS04885 -AQ199_RS04870 AP288_RS04835 F -AQ244_RS05010 AQ244_RS05010 -AQ244_RS05010 AQ244_RS05320 -7618163 7618163 -7618163 119183 -7618173 7618173 -7618178 7618178 -7618198 7618198 -7618198 119160 -119170 119170 -G9768_RS00815 G9768_RS00815 -G9768_RS00815 E150_RS00810 -G9768_RS00815 FCS84708_RS00810 -G9768_RS00815 AP288_RS03880 -G9768_RS00815 BKB93_RS00820 -G9768_RS00815 L2BUCH2_RS00815 -G9768_RS00815 AQ193_RS03185 -G9768_RS00815 CBP44_RS02225 -G9768_RS00815 AQ199_RS01505 -G9768_RS00815 BBV13_RS00820 -G9768_RS00815 120552 -G9768_RS00815 L2BLST_RS00815 -G9768_RS00815 BW688_RS02220 -G9768_RS00815 BBV16_RS00820 -G9768_RS00815 BKC02_RS00820 -G9768_RS00815 gnl|Prokka|PADJNBJD_00160 -G9768_RS00815 AKW53_RS02305 -G9768_RS00815 BKC01_RS00820 -G9768_RS00815 NILJEPDF_00160 -G9768_RS00815 SOTONK1_RS00810 -G9768_RS00815 JIEJKO_00805 -G9768_RS00815 L3404_RS00815 -G9768_RS00815 QSDFRQ_00160 -G9768_RS00815 CTJTET1_RS00815 -G9768_RS00815 IaCS19096_RS00810 -G9768_RS00815 BKC03_RS00820 -G9768_RS00815 C15_RS0100840 -G9768_RS00815 ECS88FINAL_RS0100835 -G9768_RS00815 DU10_RS00825 -G9768_RS00815 AOT15_RS00145 -G9768_RS00815 DU13_RS00825 -G9768_RS00815 CTRC943_RS00815 -G9768_RS00815 KW36_RS00810 -G9768_RS00815 SW2_RS00810 -G9768_RS00815 BKB95_RS00825 -G9768_RS00815 CBP48_RS02220 -G9768_RS00815 7618849 -G9768_RS00815 ECS102511_RS00810 -G9768_RS00815 CTB_RS00815 -G9768_RS00815 CTL2C_RS02180 -G9768_RS00815 AQ244_RS02985 -G9768_RS00815 L1224_RS00815 -G9768_RS00815 BKB92_RS00820 -G9768_RS00815 CBP42_RS02220 -G9768_RS00815 SOTONIA3_RS00815 -G9768_RS00815 LJHENM_00800 F -G9768_RS00815 A5291_RS00815 F -G9768_RS00815 KW39_RS00810 F -G9768_RS00815 O169_RS00810 F -G9768_RS00815 CTO_RS00815 F -G9768_RS00815 L1440_RS00815 F -A5291_RS04975 A5291_RS04975 -A5291_RS04975 CTB_RS04915 -A5291_RS04975 CTO_RS04955 -A5291_RS04975 BBV13_RS04920 -A5291_RS04975 BBV16_RS04925 -L1224_RS00880 L1224_RS00880 -L1224_RS00880 BKB95_RS00905 -L1224_RS00880 KW36_RS00890 -L1224_RS00880 BKB96_RS00890 -L1224_RS00880 BKB99_RS00890 -L1224_RS00880 AOT15_RS00065 -L1224_RS00880 AQ244_RS03070 -L1224_RS00880 SOTONIA3_RS00905 -L1224_RS00880 G9768_RS00895 -L1224_RS00880 BKC02_RS00890 -L1224_RS00880 120542 -L1224_RS00880 BKC01_RS00890 -L1224_RS00880 L3404_RS00880 -L1224_RS00880 gnl|Prokka|PADJNBJD_00174 -L1224_RS00880 BKC03_RS00890 -L1224_RS00880 NILJEPDF_00174 -L1224_RS00880 LJHENM_00875 -L1224_RS00880 CTJTET1_RS00905 -L1224_RS00880 C15_RS0100925 -L1224_RS00880 SOTONK1_RS00890 -L1224_RS00880 JIEJKO_00875 -L1224_RS00880 KW39_RS00895 -L1224_RS00880 IaCS19096_RS00890 -L1224_RS00880 QSDFRQ_00174 -L1224_RS00880 O169_RS00895 -L1224_RS00880 DU13_RS00900 -L1224_RS00880 7618853 -CTJTET1_RS04175 CTJTET1_RS04175 -AP288_RS04915 AP288_RS04915 -AQ193_RS05060 AQ193_RS05060 -AQ193_RS05060 AP288_RS05080 -AQ193_RS05060 AQ244_RS05280 -AQ193_RS05060 AQ199_RS05020 -7618176 7618176 -7618176 119133 F -7618185 7618185 -7618185 119144 -gnl|Prokka|PADJNBJD_00390 gnl|Prokka|PADJNBJD_00390 -gnl|Prokka|PADJNBJD_00390 FCS84708_RS01975 -gnl|Prokka|PADJNBJD_00390 BKB93_RS01995 -gnl|Prokka|PADJNBJD_00390 BBV13_RS02010 -gnl|Prokka|PADJNBJD_00390 CBP44_RS03395 -gnl|Prokka|PADJNBJD_00390 AQ199_RS02675 -gnl|Prokka|PADJNBJD_00390 G9768_RS01980 -gnl|Prokka|PADJNBJD_00390 L3404_RS01955 -gnl|Prokka|PADJNBJD_00390 BBV16_RS02010 -gnl|Prokka|PADJNBJD_00390 BKC02_RS01985 -gnl|Prokka|PADJNBJD_00390 BKC01_RS01985 -gnl|Prokka|PADJNBJD_00390 AKW53_RS03480 -gnl|Prokka|PADJNBJD_00390 AQ193_RS02005 -gnl|Prokka|PADJNBJD_00390 NILJEPDF_00390 -gnl|Prokka|PADJNBJD_00390 CTRC943_RS01960 -gnl|Prokka|PADJNBJD_00390 LJHENM_01965 -gnl|Prokka|PADJNBJD_00390 JIEJKO_01960 -gnl|Prokka|PADJNBJD_00390 BKC03_RS01985 -gnl|Prokka|PADJNBJD_00390 CTJTET1_RS01990 -gnl|Prokka|PADJNBJD_00390 QSDFRQ_00390 -gnl|Prokka|PADJNBJD_00390 C15_RS0102025 -gnl|Prokka|PADJNBJD_00390 SOTONK1_RS01980 -gnl|Prokka|PADJNBJD_00390 DU10_RS02010 -gnl|Prokka|PADJNBJD_00390 A5291_RS02005 -gnl|Prokka|PADJNBJD_00390 KW39_RS01990 -gnl|Prokka|PADJNBJD_00390 IaCS19096_RS01975 -gnl|Prokka|PADJNBJD_00390 ECS88FINAL_RS0102015 -gnl|Prokka|PADJNBJD_00390 O169_RS01990 -gnl|Prokka|PADJNBJD_00390 DU13_RS02005 -gnl|Prokka|PADJNBJD_00390 7618539 -gnl|Prokka|PADJNBJD_00390 119496 -gnl|Prokka|PADJNBJD_00390 CTL2C_RS03325 -gnl|Prokka|PADJNBJD_00390 L1224_RS01955 -gnl|Prokka|PADJNBJD_00390 KW36_RS01975 -gnl|Prokka|PADJNBJD_00390 AOT15_RS02975 -gnl|Prokka|PADJNBJD_00390 BKB95_RS02005 -gnl|Prokka|PADJNBJD_00390 BKB96_RS01985 -gnl|Prokka|PADJNBJD_00390 CBP48_RS03390 -gnl|Prokka|PADJNBJD_00390 SW2_RS01980 -gnl|Prokka|PADJNBJD_00390 BKB99_RS01985 -gnl|Prokka|PADJNBJD_00390 L1440_RS01955 -gnl|Prokka|PADJNBJD_00390 ECS102511_RS01980 -gnl|Prokka|PADJNBJD_00390 CTB_RS02005 -gnl|Prokka|PADJNBJD_00390 SOTONIA3_RS01990 -gnl|Prokka|PADJNBJD_00390 L2BUCH2_RS01955 -gnl|Prokka|PADJNBJD_00390 AP288_RS01100 -gnl|Prokka|PADJNBJD_00390 BKB92_RS01995 -gnl|Prokka|PADJNBJD_00390 CBP42_RS03400 -gnl|Prokka|PADJNBJD_00390 CTO_RS02005 -gnl|Prokka|PADJNBJD_00390 E150_RS01985 -gnl|Prokka|PADJNBJD_00390 L2BLST_RS01955 -gnl|Prokka|PADJNBJD_00390 AQ244_RS01130 -gnl|Prokka|PADJNBJD_00390 BW688_RS03385 -LJHENM_03645 LJHENM_03645 -LJHENM_03990 LJHENM_03990 -LJHENM_03990 E150_RS04035 -LJHENM_03990 CTO_RS04065 -LJHENM_03990 BBV13_RS04070 -LJHENM_03990 FCS84708_RS04025 -LJHENM_03990 119786 -LJHENM_03990 L2BLST_RS04010 -LJHENM_03990 AP288_RS04735 -LJHENM_03990 BBV16_RS04080 -LJHENM_03990 7618271 -LJHENM_03990 BW688_RS00635 -LJHENM_03990 gnl|Prokka|PADJNBJD_00792 -LJHENM_03990 AQ199_RS04725 -LJHENM_03990 BKB93_RS04070 -LJHENM_03990 G9768_RS04030 -LJHENM_03990 L3404_RS04005 -LJHENM_03990 AQ193_RS04720 -LJHENM_03990 NILJEPDF_00793 -LJHENM_03990 BKC02_RS04065 -LJHENM_03990 JIEJKO_03990 -LJHENM_03990 QSDFRQ_00793 -LJHENM_03990 BKC01_RS04070 -LJHENM_03990 CTRC943_RS04015 -LJHENM_03990 AKW53_RS00765 -LJHENM_03990 KW39_RS04045 -LJHENM_03990 BKC03_RS04065 -LJHENM_03990 CBP48_RS00635 -LJHENM_03990 CTJTET1_RS04050 -LJHENM_03990 DU10_RS04080 -LJHENM_03990 A5291_RS04075 -LJHENM_03990 SOTONK1_RS04030 -LJHENM_03990 ECS88FINAL_RS0104130 -LJHENM_03990 IaCS19096_RS04025 -LJHENM_03990 DU13_RS04080 -LJHENM_03990 C15_RS0104135 -LJHENM_03990 O169_RS04040 -LJHENM_03990 KW36_RS04030 -LJHENM_03990 AOT15_RS02335 -LJHENM_03990 BKB95_RS04085 -LJHENM_03990 CBP42_RS00635 -LJHENM_03990 CTL2C_RS00630 -LJHENM_03990 L1224_RS04010 -LJHENM_03990 BKB96_RS04070 -LJHENM_03990 SW2_RS04035 -LJHENM_03990 L1440_RS04005 -LJHENM_03990 ECS102511_RS04025 -LJHENM_03990 BKB99_RS04065 -LJHENM_03990 CBP44_RS00635 -LJHENM_03990 L2BUCH2_RS04010 -LJHENM_03990 AQ244_RS03855 -LJHENM_03990 CTB_RS04070 -LJHENM_03990 BKB92_RS04065 -LJHENM_03990 SOTONIA3_RS04050 -CTJTET1_RS04180 CTJTET1_RS04180 -AKW53_RS00740 AKW53_RS00740 -AP288_RS04775 AP288_RS04775 -AP288_RS04775 AQ244_RS04825 -AP288_RS04775 AQ199_RS04785 -AP288_RS04920 AP288_RS04920 -AQ244_RS05030 AQ244_RS05030 -7618155 7618155 -7618174 7618174 -119146 119146 -G9768_RS00825 G9768_RS00825 -G9768_RS00825 L1224_RS00825 F -G9768_RS00825 CBP42_RS02230 F -G9768_RS00825 L1440_RS00825 F -G9768_RS00825 L2BUCH2_RS00825 F -G9768_RS00825 CBP44_RS02235 F -G9768_RS00825 L2BLST_RS00825 F -G9768_RS00825 BW688_RS02230 F -G9768_RS00825 L3404_RS00825 F -G9768_RS00825 DU10_RS00835 F -G9768_RS00825 CTRC943_RS00825 F -G9768_RS00825 7618181 F -G9768_RS00825 CBP48_RS02230 F -G9768_RS00825 CTL2C_RS02190 F -G9768_RS00825 CTO_RS00825 -G9768_RS00825 SOTONIA3_RS00825 -G9768_RS00825 E150_RS00820 -G9768_RS00825 AQ193_RS03175 -G9768_RS00825 FCS84708_RS00820 -G9768_RS00825 AP288_RS03890 -G9768_RS00825 BKB93_RS00830 -G9768_RS00825 AQ199_RS01515 -G9768_RS00825 BBV13_RS00830 -G9768_RS00825 120548 -G9768_RS00825 BKC02_RS00830 -G9768_RS00825 BBV16_RS00830 -G9768_RS00825 AKW53_RS02315 -G9768_RS00825 BKC01_RS00830 -G9768_RS00825 gnl|Prokka|PADJNBJD_00162 -G9768_RS00825 NILJEPDF_00162 -G9768_RS00825 LJHENM_00815 -G9768_RS00825 A5291_RS00825 -G9768_RS00825 SOTONK1_RS00820 -G9768_RS00825 AOT15_RS00135 -G9768_RS00825 JIEJKO_00815 -G9768_RS00825 CTJTET1_RS00825 -G9768_RS00825 BKC03_RS00830 -G9768_RS00825 QSDFRQ_00162 -G9768_RS00825 C15_RS0100850 -G9768_RS00825 ECS88FINAL_RS0100845 -G9768_RS00825 KW39_RS00820 -G9768_RS00825 IaCS19096_RS00820 -G9768_RS00825 O169_RS00820 -G9768_RS00825 DU13_RS00835 -G9768_RS00825 KW36_RS00820 -G9768_RS00825 BKB95_RS00835 -G9768_RS00825 SW2_RS00820 -G9768_RS00825 ECS102511_RS00820 -G9768_RS00825 CTB_RS00825 -G9768_RS00825 AQ244_RS02995 -G9768_RS00825 BKB92_RS00830 -AP288_RS05035 AP288_RS05035 -AP288_RS05035 AQ244_RS05235 -AP288_RS05035 AQ199_RS05005 -AP288_RS05035 AQ193_RS05010 -AP288_RS04925 AP288_RS04925 -AQ244_RS05045 AQ244_RS05045 -7618154 7618154 -CTB_RS04855 CTB_RS04855 -CTB_RS04855 CTO_RS04890 -CTB_RS04855 A5291_RS04915 -gnl|Prokka|PADJNBJD_00797 gnl|Prokka|PADJNBJD_00797 -gnl|Prokka|PADJNBJD_00797 CBP44_RS00660 -gnl|Prokka|PADJNBJD_00797 L2BUCH2_RS04035 -gnl|Prokka|PADJNBJD_00797 CTB_RS04095 -gnl|Prokka|PADJNBJD_00797 BKB92_RS04090 -gnl|Prokka|PADJNBJD_00797 SOTONIA3_RS04075 -gnl|Prokka|PADJNBJD_00797 E150_RS04060 -gnl|Prokka|PADJNBJD_00797 CTO_RS04090 -gnl|Prokka|PADJNBJD_00797 BBV13_RS04095 -gnl|Prokka|PADJNBJD_00797 FCS84708_RS04050 -gnl|Prokka|PADJNBJD_00797 119998 -gnl|Prokka|PADJNBJD_00797 L2BLST_RS04035 -gnl|Prokka|PADJNBJD_00797 AP288_RS04760 -gnl|Prokka|PADJNBJD_00797 BBV16_RS04105 -gnl|Prokka|PADJNBJD_00797 7618719 -gnl|Prokka|PADJNBJD_00797 BW688_RS00660 -gnl|Prokka|PADJNBJD_00797 AQ199_RS04750 -gnl|Prokka|PADJNBJD_00797 BKB93_RS04095 -gnl|Prokka|PADJNBJD_00797 G9768_RS04055 -gnl|Prokka|PADJNBJD_00797 L3404_RS04030 -gnl|Prokka|PADJNBJD_00797 AQ193_RS04745 -gnl|Prokka|PADJNBJD_00797 NILJEPDF_00798 -gnl|Prokka|PADJNBJD_00797 LJHENM_04015 -gnl|Prokka|PADJNBJD_00797 BKC02_RS04090 -gnl|Prokka|PADJNBJD_00797 JIEJKO_04015 -gnl|Prokka|PADJNBJD_00797 QSDFRQ_00798 -gnl|Prokka|PADJNBJD_00797 BKC01_RS04095 -gnl|Prokka|PADJNBJD_00797 CTRC943_RS04040 -gnl|Prokka|PADJNBJD_00797 CTJTET1_RS04230 -gnl|Prokka|PADJNBJD_00797 KW39_RS04070 -gnl|Prokka|PADJNBJD_00797 BKC03_RS04090 -gnl|Prokka|PADJNBJD_00797 CBP48_RS00660 -gnl|Prokka|PADJNBJD_00797 CTJTET1_RS04075 -gnl|Prokka|PADJNBJD_00797 DU10_RS04105 -gnl|Prokka|PADJNBJD_00797 A5291_RS04100 -gnl|Prokka|PADJNBJD_00797 SOTONK1_RS04055 -gnl|Prokka|PADJNBJD_00797 ECS88FINAL_RS0104155 -gnl|Prokka|PADJNBJD_00797 IaCS19096_RS04050 -gnl|Prokka|PADJNBJD_00797 DU13_RS04105 -gnl|Prokka|PADJNBJD_00797 C15_RS0104160 -gnl|Prokka|PADJNBJD_00797 O169_RS04065 -gnl|Prokka|PADJNBJD_00797 KW36_RS04055 -gnl|Prokka|PADJNBJD_00797 AOT15_RS02360 -gnl|Prokka|PADJNBJD_00797 BKB95_RS04110 -gnl|Prokka|PADJNBJD_00797 CBP42_RS00660 -gnl|Prokka|PADJNBJD_00797 CTL2C_RS00655 -gnl|Prokka|PADJNBJD_00797 L1224_RS04035 -gnl|Prokka|PADJNBJD_00797 BKB96_RS04095 -gnl|Prokka|PADJNBJD_00797 SW2_RS04060 -gnl|Prokka|PADJNBJD_00797 L1440_RS04030 -gnl|Prokka|PADJNBJD_00797 ECS102511_RS04050 -gnl|Prokka|PADJNBJD_00797 BKB99_RS04090 -AP288_RS05045 AP288_RS05045 -AP288_RS05045 AQ244_RS05245 -AP288_RS05045 AQ199_RS04995 -AP288_RS05045 AQ193_RS05020 -AQ244_RS05090 AQ244_RS05090 -7618411 7618411 -7618411 G9768_RS00595 -7618411 BKC02_RS00605 -7618411 BBV16_RS00605 -7618411 gnl|Prokka|PADJNBJD_00117 -7618411 LJHENM_00585 -7618411 AKW53_RS02090 -7618411 BKC01_RS00605 -7618411 NILJEPDF_00117 -7618411 A5291_RS00600 -7618411 SOTONK1_RS00595 -7618411 JIEJKO_00590 -7618411 QSDFRQ_00117 -7618411 IaCS19096_RS00595 -7618411 BKC03_RS00605 -7618411 C15_RS0100615 -7618411 CTJTET1_RS00595 -7618411 KW39_RS00595 -7618411 DU10_RS00605 -7618411 ECS88FINAL_RS0100615 -7618411 O169_RS00595 -7618411 DU13_RS00610 -7618411 KW36_RS00595 -7618411 CBP48_RS01995 -7618411 SW2_RS00595 -7618411 AQ193_RS03400 -7618411 ECS102511_RS00595 -7618411 CTB_RS00600 -7618411 AQ244_RS02770 -7618411 BKB96_RS00605 -7618411 CBP42_RS01995 -7618411 BKB99_RS00605 -7618411 BKB92_RS00605 -7618411 SOTONIA3_RS00595 -7618411 CTO_RS00600 -7618411 E150_RS00595 -7618411 CBP44_RS02000 -7618411 FCS84708_RS00595 -7618411 AP288_RS03665 -7618411 BKB93_RS00605 -7618411 AOT15_RS00360 -7618411 119292 -7618411 AQ199_RS01290 -7618411 BBV13_RS00605 -119159 119159 -119159 7618197 F -119159 gnl|Prokka|PADJNBJD_00510 -119159 NILJEPDF_00510 -119159 LJHENM_02565 -119159 JIEJKO_02570 -119159 QSDFRQ_00510 -119186 119186 -CTB_RS00910 CTB_RS00910 -CTB_RS00910 BKB95_RS00900 -CTB_RS00910 KW36_RS00885 -CTB_RS00910 BKB96_RS00885 -CTB_RS00910 SW2_RS00885 -CTB_RS00910 BKB99_RS00885 -CTB_RS00910 ECS102511_RS00885 -CTB_RS00910 CBP48_RS02285 -CTB_RS00910 CTL2C_RS02245 -CTB_RS00910 L1224_RS00875 -CTB_RS00910 AOT15_RS00070 -CTB_RS00910 AQ244_RS03065 -CTB_RS00910 SOTONIA3_RS00900 -CTB_RS00910 L1440_RS00875 -CTB_RS00910 BKB92_RS00890 -CTB_RS00910 CBP42_RS02285 -CTB_RS00910 E150_RS00885 -CTB_RS00910 L2BUCH2_RS00880 -CTB_RS00910 FCS84708_RS00885 -CTB_RS00910 AP288_RS03955 -CTB_RS00910 BKB93_RS00890 -CTB_RS00910 AQ199_RS01580 -CTB_RS00910 CBP44_RS02290 -CTB_RS00910 G9768_RS00890 -CTB_RS00910 L2BLST_RS00880 -CTB_RS00910 BW688_RS02285 -CTB_RS00910 BKC02_RS00885 -CTB_RS00910 119351 -CTB_RS00910 BKC01_RS00885 -CTB_RS00910 AKW53_RS02380 -CTB_RS00910 L3404_RS00875 -CTB_RS00910 gnl|Prokka|PADJNBJD_00173 -CTB_RS00910 AQ193_RS03105 -CTB_RS00910 BKC03_RS00885 -CTB_RS00910 NILJEPDF_00173 -CTB_RS00910 LJHENM_00870 -CTB_RS00910 CTJTET1_RS00900 -CTB_RS00910 DU10_RS00900 -CTB_RS00910 C15_RS0100920 -CTB_RS00910 SOTONK1_RS00885 -CTB_RS00910 JIEJKO_00870 -CTB_RS00910 KW39_RS00890 -CTB_RS00910 IaCS19096_RS00885 -CTB_RS00910 QSDFRQ_00173 -CTB_RS00910 CTRC943_RS00880 -CTB_RS00910 ECS88FINAL_RS0100905 -CTB_RS00910 O169_RS00890 -CTB_RS00910 DU13_RS00895 -CTB_RS00910 7618446 -AQ199_RS04970 AQ199_RS04970 -AQ244_RS05095 AQ244_RS05095 -DU10_RS02850 DU10_RS02850 -DU10_RS02850 AQ199_RS03500 -DU10_RS02850 BKB93_RS02840 -DU10_RS02850 BBV16_RS02855 -DU10_RS02850 G9768_RS02805 -DU10_RS02850 AQ244_RS00305 -DU10_RS02850 L3404_RS02780 -DU10_RS02850 BKC02_RS02830 -DU10_RS02850 gnl|Prokka|PADJNBJD_00553 -DU10_RS02850 NILJEPDF_00553 -DU10_RS02850 BKC01_RS02830 -DU10_RS02850 LJHENM_02785 -DU10_RS02850 CTRC943_RS02785 -DU10_RS02850 AOT15_RS01605 -DU10_RS02850 QSDFRQ_00553 -DU10_RS02850 JIEJKO_02790 -DU10_RS02850 SOTONK1_RS02805 -DU10_RS02850 CTJTET1_RS02815 -DU10_RS02850 BKC03_RS02830 -DU10_RS02850 KW39_RS02815 -DU10_RS02850 AQ193_RS01180 -DU10_RS02850 C15_RS0102875 -DU10_RS02850 ECS88FINAL_RS0102870 -DU10_RS02850 IaCS19096_RS02800 -DU10_RS02850 O169_RS02815 -DU10_RS02850 A5291_RS02840 -DU10_RS02850 DU13_RS02845 -DU10_RS02850 CBP48_RS04230 -DU10_RS02850 7619064 -DU10_RS02850 CTL2C_RS04155 -DU10_RS02850 KW36_RS02800 -DU10_RS02850 AKW53_RS04030 -DU10_RS02850 BKB95_RS02845 -DU10_RS02850 BKB96_RS02835 -DU10_RS02850 BKB99_RS02830 -DU10_RS02850 SW2_RS02810 -DU10_RS02850 L1224_RS02785 -DU10_RS02850 ECS102511_RS02805 -DU10_RS02850 L1440_RS02785 -DU10_RS02850 120194 -DU10_RS02850 CBP42_RS04240 -DU10_RS02850 L2BUCH2_RS02785 -DU10_RS02850 SOTONIA3_RS02820 -DU10_RS02850 BKB92_RS02835 -DU10_RS02850 CTB_RS02840 -DU10_RS02850 E150_RS02810 -DU10_RS02850 BW688_RS04230 -DU10_RS02850 CTO_RS02840 -DU10_RS02850 FCS84708_RS02800 -DU10_RS02850 AP288_RS00275 -DU10_RS02850 L2BLST_RS02785 -DU10_RS02850 BBV13_RS02845 -DU10_RS02850 CBP44_RS04235 -7618166 7618166 -CTB_RS00920 CTB_RS00920 -CTB_RS00920 CTO_RS00920 -CTB_RS00920 L2BUCH2_RS00890 -CTB_RS00920 L2BLST_RS00890 -CTB_RS00920 BBV13_RS00925 -CTB_RS00920 G9768_RS00900 -CTB_RS00920 BBV16_RS00925 -CTB_RS00920 BKC01_RS00895 -CTB_RS00920 CTJTET1_RS00910 -CTB_RS00920 C15_RS0100930 -CTB_RS00920 IaCS19096_RS00895 -gnl|Prokka|PADJNBJD_00935 gnl|Prokka|PADJNBJD_00935 -L2BLST_RS00830 L2BLST_RS00830 -L2BLST_RS00830 L2BUCH2_RS00830 -ECS88FINAL_RS0100275 ECS88FINAL_RS0100275 -AQ199_RS04975 AQ199_RS04975 -AQ199_RS04975 AP288_RS05065 -AQ199_RS04975 AQ244_RS05265 -CBP48_RS04385 CBP48_RS04385 -CBP48_RS04385 CBP42_RS03180 -CBP48_RS04385 CBP44_RS01470 -7618186 7618186 -7618186 119145 -119162 119162 -119162 7618200 -119958 119958 -119191 119191 -gnl|Prokka|PADJNBJD_00095 gnl|Prokka|PADJNBJD_00095 -gnl|Prokka|PADJNBJD_00095 BKB92_RS00495 -gnl|Prokka|PADJNBJD_00095 CTO_RS00485 -gnl|Prokka|PADJNBJD_00095 L1440_RS00485 -gnl|Prokka|PADJNBJD_00095 AQ244_RS01505 -gnl|Prokka|PADJNBJD_00095 SOTONIA3_RS00485 -gnl|Prokka|PADJNBJD_00095 AQ193_RS03510 -gnl|Prokka|PADJNBJD_00095 E150_RS00485 -gnl|Prokka|PADJNBJD_00095 CBP44_RS01890 -gnl|Prokka|PADJNBJD_00095 120594 -gnl|Prokka|PADJNBJD_00095 L2BUCH2_RS00485 -gnl|Prokka|PADJNBJD_00095 BKB93_RS00495 -gnl|Prokka|PADJNBJD_00095 FCS84708_RS00485 -gnl|Prokka|PADJNBJD_00095 AP288_RS03555 -gnl|Prokka|PADJNBJD_00095 AQ199_RS01180 -gnl|Prokka|PADJNBJD_00095 BBV13_RS00490 -gnl|Prokka|PADJNBJD_00095 L2BLST_RS00485 -gnl|Prokka|PADJNBJD_00095 BW688_RS01885 -gnl|Prokka|PADJNBJD_00095 G9768_RS00485 -gnl|Prokka|PADJNBJD_00095 BKC02_RS00495 -gnl|Prokka|PADJNBJD_00095 LJHENM_00475 -gnl|Prokka|PADJNBJD_00095 BBV16_RS00490 -gnl|Prokka|PADJNBJD_00095 NILJEPDF_00095 -gnl|Prokka|PADJNBJD_00095 BKC01_RS00495 -gnl|Prokka|PADJNBJD_00095 A5291_RS00485 -gnl|Prokka|PADJNBJD_00095 JIEJKO_00480 -gnl|Prokka|PADJNBJD_00095 SOTONK1_RS00485 -gnl|Prokka|PADJNBJD_00095 L3404_RS00485 -gnl|Prokka|PADJNBJD_00095 AKW53_RS01975 -gnl|Prokka|PADJNBJD_00095 AOT15_RS00470 -gnl|Prokka|PADJNBJD_00095 QSDFRQ_00095 -gnl|Prokka|PADJNBJD_00095 IaCS19096_RS00485 -gnl|Prokka|PADJNBJD_00095 BKC03_RS00495 -gnl|Prokka|PADJNBJD_00095 DU10_RS00495 -gnl|Prokka|PADJNBJD_00095 C15_RS0100495 -gnl|Prokka|PADJNBJD_00095 7618824 -gnl|Prokka|PADJNBJD_00095 CTRC943_RS00485 -gnl|Prokka|PADJNBJD_00095 CTJTET1_RS00485 -gnl|Prokka|PADJNBJD_00095 O169_RS00485 -gnl|Prokka|PADJNBJD_00095 DU13_RS00500 -gnl|Prokka|PADJNBJD_00095 ECS88FINAL_RS0100500 -gnl|Prokka|PADJNBJD_00095 KW39_RS00485 -gnl|Prokka|PADJNBJD_00095 KW36_RS00485 -gnl|Prokka|PADJNBJD_00095 CBP48_RS01885 -gnl|Prokka|PADJNBJD_00095 SW2_RS00485 -gnl|Prokka|PADJNBJD_00095 BKB95_RS00495 -gnl|Prokka|PADJNBJD_00095 ECS102511_RS00485 -gnl|Prokka|PADJNBJD_00095 CTB_RS00485 -gnl|Prokka|PADJNBJD_00095 CTL2C_RS01850 -gnl|Prokka|PADJNBJD_00095 CBP42_RS01885 -gnl|Prokka|PADJNBJD_00095 BKB96_RS00495 -gnl|Prokka|PADJNBJD_00095 L1224_RS00485 -gnl|Prokka|PADJNBJD_00095 BKB99_RS00495 -LJHENM_00805 LJHENM_00805 -LJHENM_03145 LJHENM_03145 -CTJTET1_RS04205 CTJTET1_RS04205 -7618164 7618164 -7618164 119184 -LJHENM_00810 LJHENM_00810 -gnl|Prokka|PADJNBJD_00871 gnl|Prokka|PADJNBJD_00871 -gnl|Prokka|PADJNBJD_00871 C15_RS0104560 -gnl|Prokka|PADJNBJD_00871 DU10_RS04510 -gnl|Prokka|PADJNBJD_00871 O169_RS04465 -gnl|Prokka|PADJNBJD_00871 KW36_RS04445 -gnl|Prokka|PADJNBJD_00871 DU13_RS04510 -gnl|Prokka|PADJNBJD_00871 BKB95_RS04510 -gnl|Prokka|PADJNBJD_00871 CBP42_RS01065 -gnl|Prokka|PADJNBJD_00871 CTL2C_RS01045 -gnl|Prokka|PADJNBJD_00871 L1224_RS04425 -gnl|Prokka|PADJNBJD_00871 BKB96_RS04495 -gnl|Prokka|PADJNBJD_00871 L1440_RS04420 -gnl|Prokka|PADJNBJD_00871 BKB99_RS04490 -gnl|Prokka|PADJNBJD_00871 SW2_RS04455 -gnl|Prokka|PADJNBJD_00871 ECS102511_RS04450 -gnl|Prokka|PADJNBJD_00871 CBP44_RS01065 -gnl|Prokka|PADJNBJD_00871 CTB_RS04475 -gnl|Prokka|PADJNBJD_00871 L2BUCH2_RS04425 -gnl|Prokka|PADJNBJD_00871 SOTONIA3_RS04460 -gnl|Prokka|PADJNBJD_00871 CTO_RS04470 -gnl|Prokka|PADJNBJD_00871 BKB92_RS04495 -gnl|Prokka|PADJNBJD_00871 AP288_RS02755 -gnl|Prokka|PADJNBJD_00871 BBV13_RS04485 -gnl|Prokka|PADJNBJD_00871 E150_RS04460 -gnl|Prokka|PADJNBJD_00871 L2BLST_RS04425 -gnl|Prokka|PADJNBJD_00871 BBV16_RS04490 -gnl|Prokka|PADJNBJD_00871 FCS84708_RS04445 -gnl|Prokka|PADJNBJD_00871 AQ199_RS00380 -gnl|Prokka|PADJNBJD_00871 119860 -gnl|Prokka|PADJNBJD_00871 NILJEPDF_00872 -gnl|Prokka|PADJNBJD_00871 BW688_RS01065 -gnl|Prokka|PADJNBJD_00871 7618320 -gnl|Prokka|PADJNBJD_00871 LJHENM_04390 -gnl|Prokka|PADJNBJD_00871 JIEJKO_04385 -gnl|Prokka|PADJNBJD_00871 QSDFRQ_00872 -gnl|Prokka|PADJNBJD_00871 G9768_RS04445 -gnl|Prokka|PADJNBJD_00871 L3404_RS04420 -gnl|Prokka|PADJNBJD_00871 BKB93_RS04500 -gnl|Prokka|PADJNBJD_00871 BKC02_RS04490 -gnl|Prokka|PADJNBJD_00871 AKW53_RS01170 -gnl|Prokka|PADJNBJD_00871 AQ193_RS04320 -gnl|Prokka|PADJNBJD_00871 BKC01_RS04495 -gnl|Prokka|PADJNBJD_00871 CTRC943_RS04430 -gnl|Prokka|PADJNBJD_00871 AOT15_RS02025 -gnl|Prokka|PADJNBJD_00871 CTJTET1_RS04615 -gnl|Prokka|PADJNBJD_00871 AQ244_RS02305 -gnl|Prokka|PADJNBJD_00871 KW39_RS04465 -gnl|Prokka|PADJNBJD_00871 BKC03_RS04490 -gnl|Prokka|PADJNBJD_00871 CBP48_RS01065 -gnl|Prokka|PADJNBJD_00871 A5291_RS04480 -gnl|Prokka|PADJNBJD_00871 SOTONK1_RS04445 -gnl|Prokka|PADJNBJD_00871 ECS88FINAL_RS0104540 -gnl|Prokka|PADJNBJD_00871 IaCS19096_RS04440 -DU10_RS01525 DU10_RS01525 -gnl|Prokka|PADJNBJD_00872 gnl|Prokka|PADJNBJD_00872 -gnl|Prokka|PADJNBJD_00872 119187 -gnl|Prokka|PADJNBJD_00872 NILJEPDF_00873 -gnl|Prokka|PADJNBJD_00872 7618167 -gnl|Prokka|PADJNBJD_00872 LJHENM_04395 -gnl|Prokka|PADJNBJD_00872 JIEJKO_04390 -gnl|Prokka|PADJNBJD_00872 QSDFRQ_00873 -LJHENM_04710 LJHENM_04710 -DU10_RS00820 DU10_RS00820 -DU10_RS00820 120553 -119156 119156 -119156 7618194 -119172 119172 -119172 7618204 -119193 119193 -gnl|Prokka|PADJNBJD_00199 gnl|Prokka|PADJNBJD_00199 -gnl|Prokka|PADJNBJD_00199 AQ244_RS03195 -gnl|Prokka|PADJNBJD_00199 BKB92_RS01015 -gnl|Prokka|PADJNBJD_00199 CBP42_RS02405 -gnl|Prokka|PADJNBJD_00199 SOTONIA3_RS01030 -gnl|Prokka|PADJNBJD_00199 E150_RS01010 -gnl|Prokka|PADJNBJD_00199 CTB_RS01040 -gnl|Prokka|PADJNBJD_00199 L2BUCH2_RS01000 -gnl|Prokka|PADJNBJD_00199 AQ193_RS02980 -gnl|Prokka|PADJNBJD_00199 CTO_RS01040 -gnl|Prokka|PADJNBJD_00199 FCS84708_RS01010 -gnl|Prokka|PADJNBJD_00199 AP288_RS04080 -gnl|Prokka|PADJNBJD_00199 BKB93_RS01015 -gnl|Prokka|PADJNBJD_00199 CBP44_RS02410 -gnl|Prokka|PADJNBJD_00199 AQ199_RS01705 -gnl|Prokka|PADJNBJD_00199 L2BLST_RS01000 -gnl|Prokka|PADJNBJD_00199 BW688_RS02410 -gnl|Prokka|PADJNBJD_00199 BBV13_RS01045 -gnl|Prokka|PADJNBJD_00199 G9768_RS01020 -gnl|Prokka|PADJNBJD_00199 BKC02_RS01015 -gnl|Prokka|PADJNBJD_00199 L3404_RS00995 -gnl|Prokka|PADJNBJD_00199 AKW53_RS02505 -gnl|Prokka|PADJNBJD_00199 BBV16_RS01045 -gnl|Prokka|PADJNBJD_00199 BKC01_RS01015 -gnl|Prokka|PADJNBJD_00199 120514 -gnl|Prokka|PADJNBJD_00199 DU10_RS01025 -gnl|Prokka|PADJNBJD_00199 BKC03_RS01015 -gnl|Prokka|PADJNBJD_00199 NILJEPDF_00199 -gnl|Prokka|PADJNBJD_00199 LJHENM_01000 -gnl|Prokka|PADJNBJD_00199 CTRC943_RS01000 -gnl|Prokka|PADJNBJD_00199 CTJTET1_RS01030 -gnl|Prokka|PADJNBJD_00199 C15_RS0101050 -gnl|Prokka|PADJNBJD_00199 SOTONK1_RS01015 -gnl|Prokka|PADJNBJD_00199 ECS88FINAL_RS0101035 -gnl|Prokka|PADJNBJD_00199 KW39_RS01020 -gnl|Prokka|PADJNBJD_00199 JIEJKO_01000 -gnl|Prokka|PADJNBJD_00199 A5291_RS01040 -gnl|Prokka|PADJNBJD_00199 IaCS19096_RS01015 -gnl|Prokka|PADJNBJD_00199 7618870 -gnl|Prokka|PADJNBJD_00199 QSDFRQ_00199 -gnl|Prokka|PADJNBJD_00199 O169_RS01020 -gnl|Prokka|PADJNBJD_00199 DU13_RS01025 -gnl|Prokka|PADJNBJD_00199 AOT15_RS01350 -gnl|Prokka|PADJNBJD_00199 SW2_RS01010 -gnl|Prokka|PADJNBJD_00199 BKB95_RS01030 -gnl|Prokka|PADJNBJD_00199 CBP48_RS02405 -gnl|Prokka|PADJNBJD_00199 KW36_RS01015 -gnl|Prokka|PADJNBJD_00199 ECS102511_RS01010 -gnl|Prokka|PADJNBJD_00199 BKB96_RS01015 -gnl|Prokka|PADJNBJD_00199 CTL2C_RS02365 -gnl|Prokka|PADJNBJD_00199 BKB99_RS01015 -gnl|Prokka|PADJNBJD_00199 L1224_RS00995 -gnl|Prokka|PADJNBJD_00199 L1440_RS00995 -AP288_RS05085 AP288_RS05085 -AP288_RS05085 AQ244_RS05285 -AP288_RS05085 AQ199_RS05025 -BKC01_RS01375 BKC01_RS01375 -BKC01_RS01375 AQ193_RS02625 -BKC01_RS01375 BKB92_RS01375 -BKC01_RS01375 E150_RS01365 -BKC01_RS01375 BKB93_RS01375 -BKC01_RS01375 A5291_RS01395 -BKC01_RS01375 O169_RS01375 -7618182 7618182 -7618182 119140 -119344 119344 -119344 CTB_RS04830 F -119344 CTO_RS04865 F -119344 A5291_RS04890 F -119344 CTB_RS00885 F -119344 CTO_RS00885 F -119344 A5291_RS00885 F -119344 gnl|Prokka|PADJNBJD_00169 -119344 NILJEPDF_00169 -119344 LJHENM_00850 -119344 JIEJKO_00850 -119344 QSDFRQ_00169 -119344 BKB95_RS00875 F -119194 119194 -NILJEPDF_00735 NILJEPDF_00735 -NILJEPDF_00735 CBP42_RS00335 -NILJEPDF_00735 SW2_RS03735 -NILJEPDF_00735 CTL2C_RS00330 -NILJEPDF_00735 L1224_RS03710 -NILJEPDF_00735 ECS102511_RS03725 -NILJEPDF_00735 BKB96_RS03770 -NILJEPDF_00735 BKB99_RS03765 -NILJEPDF_00735 L1440_RS03710 -NILJEPDF_00735 CBP44_RS00335 -NILJEPDF_00735 L2BUCH2_RS03710 -NILJEPDF_00735 BKB92_RS03765 -NILJEPDF_00735 CTB_RS03770 -NILJEPDF_00735 SOTONIA3_RS03750 -NILJEPDF_00735 E150_RS03735 -NILJEPDF_00735 CTO_RS03765 -NILJEPDF_00735 BBV13_RS03770 -NILJEPDF_00735 FCS84708_RS03725 -NILJEPDF_00735 BBV16_RS03780 -NILJEPDF_00735 L2BLST_RS03710 -NILJEPDF_00735 119746 -NILJEPDF_00735 BW688_RS00335 -NILJEPDF_00735 7618245 -NILJEPDF_00735 AQ199_RS04425 -NILJEPDF_00735 BKB93_RS03770 -NILJEPDF_00735 G9768_RS03730 -NILJEPDF_00735 gnl|Prokka|PADJNBJD_00734 -NILJEPDF_00735 L3404_RS03705 -NILJEPDF_00735 BKC02_RS03765 -NILJEPDF_00735 LJHENM_03700 -NILJEPDF_00735 AOT15_RS04530 -NILJEPDF_00735 AP288_RS02100 -NILJEPDF_00735 JIEJKO_03700 -NILJEPDF_00735 BKC01_RS03770 -NILJEPDF_00735 QSDFRQ_00735 -NILJEPDF_00735 CTRC943_RS03715 -NILJEPDF_00735 AQ244_RS04180 -NILJEPDF_00735 AKW53_RS00470 -NILJEPDF_00735 BKC03_RS03765 -NILJEPDF_00735 CTJTET1_RS03750 -NILJEPDF_00735 KW39_RS03745 -NILJEPDF_00735 DU10_RS03780 -NILJEPDF_00735 CBP48_RS00335 -NILJEPDF_00735 A5291_RS03775 -NILJEPDF_00735 SOTONK1_RS03730 -NILJEPDF_00735 IaCS19096_RS03725 -NILJEPDF_00735 DU13_RS03780 -NILJEPDF_00735 C15_RS0103835 -NILJEPDF_00735 ECS88FINAL_RS0103835 -NILJEPDF_00735 O169_RS03740 -NILJEPDF_00735 AQ193_RS00260 -NILJEPDF_00735 KW36_RS03730 -NILJEPDF_00735 BKB95_RS03785 -AP288_RS05090 AP288_RS05090 -AP288_RS05090 AQ244_RS05290 -AP288_RS05090 AQ193_RS05000 -AP288_RS05090 AQ199_RS05030 -BBV16_RS00875 BBV16_RS00875 -BBV16_RS00875 BBV13_RS00875 -7618187 7618187 -7618187 119147 -7618189 7618189 -7618189 119150 -7618203 7618203 -119141 119141 -119141 7618183 F -gnl|Prokka|PADJNBJD_00701 gnl|Prokka|PADJNBJD_00701 -gnl|Prokka|PADJNBJD_00701 KW36_RS03565 -gnl|Prokka|PADJNBJD_00701 AKW53_RS00310 -gnl|Prokka|PADJNBJD_00701 BKB95_RS03615 -gnl|Prokka|PADJNBJD_00701 CBP42_RS00165 -gnl|Prokka|PADJNBJD_00701 SW2_RS03570 -gnl|Prokka|PADJNBJD_00701 CTL2C_RS00165 -gnl|Prokka|PADJNBJD_00701 L1224_RS03545 -gnl|Prokka|PADJNBJD_00701 ECS102511_RS03560 -gnl|Prokka|PADJNBJD_00701 L1440_RS03545 -gnl|Prokka|PADJNBJD_00701 BKB96_RS03605 -gnl|Prokka|PADJNBJD_00701 BKB99_RS03600 -gnl|Prokka|PADJNBJD_00701 CBP44_RS00165 -gnl|Prokka|PADJNBJD_00701 L2BUCH2_RS03545 -gnl|Prokka|PADJNBJD_00701 BKB92_RS03595 -gnl|Prokka|PADJNBJD_00701 CTB_RS03605 -gnl|Prokka|PADJNBJD_00701 SOTONIA3_RS03585 -gnl|Prokka|PADJNBJD_00701 E150_RS03570 -gnl|Prokka|PADJNBJD_00701 CTO_RS03600 -gnl|Prokka|PADJNBJD_00701 BBV13_RS03605 -gnl|Prokka|PADJNBJD_00701 FCS84708_RS03560 -gnl|Prokka|PADJNBJD_00701 L2BLST_RS03545 -gnl|Prokka|PADJNBJD_00701 BBV16_RS03615 -gnl|Prokka|PADJNBJD_00701 BW688_RS00165 -gnl|Prokka|PADJNBJD_00701 AQ199_RS04260 -gnl|Prokka|PADJNBJD_00701 BKB93_RS03600 -gnl|Prokka|PADJNBJD_00701 7618224 -gnl|Prokka|PADJNBJD_00701 119714 -gnl|Prokka|PADJNBJD_00701 G9768_RS03565 -gnl|Prokka|PADJNBJD_00701 AQ244_RS04345 -gnl|Prokka|PADJNBJD_00701 L3404_RS03540 -gnl|Prokka|PADJNBJD_00701 BKC02_RS03595 -gnl|Prokka|PADJNBJD_00701 NILJEPDF_00702 -gnl|Prokka|PADJNBJD_00701 LJHENM_03525 -gnl|Prokka|PADJNBJD_00701 AOT15_RS04365 -gnl|Prokka|PADJNBJD_00701 AP288_RS01930 -gnl|Prokka|PADJNBJD_00701 JIEJKO_03530 -gnl|Prokka|PADJNBJD_00701 BKC01_RS03595 -gnl|Prokka|PADJNBJD_00701 QSDFRQ_00702 -gnl|Prokka|PADJNBJD_00701 CTRC943_RS03550 -gnl|Prokka|PADJNBJD_00701 AQ193_RS00425 -gnl|Prokka|PADJNBJD_00701 BKC03_RS03595 -gnl|Prokka|PADJNBJD_00701 CBP48_RS00165 -gnl|Prokka|PADJNBJD_00701 CTJTET1_RS03585 -gnl|Prokka|PADJNBJD_00701 KW39_RS03580 -gnl|Prokka|PADJNBJD_00701 DU10_RS03610 -gnl|Prokka|PADJNBJD_00701 SOTONK1_RS03565 -gnl|Prokka|PADJNBJD_00701 ECS88FINAL_RS0103650 -gnl|Prokka|PADJNBJD_00701 IaCS19096_RS03560 -gnl|Prokka|PADJNBJD_00701 C15_RS0103640 -gnl|Prokka|PADJNBJD_00701 A5291_RS03610 -gnl|Prokka|PADJNBJD_00701 O169_RS03575 -gnl|Prokka|PADJNBJD_00701 DU13_RS03610 -SOTONIA3_RS02630 SOTONIA3_RS02630 -SOTONIA3_RS02630 BKC01_RS02635 -SOTONIA3_RS02630 gnl|Prokka|PADJNBJD_00516 -SOTONIA3_RS02630 AP288_RS00465 -SOTONIA3_RS02630 NILJEPDF_00516 -SOTONIA3_RS02630 LJHENM_02595 -SOTONIA3_RS02630 CTRC943_RS02595 -SOTONIA3_RS02630 SOTONK1_RS02615 -SOTONIA3_RS02630 CTJTET1_RS02625 -SOTONIA3_RS02630 JIEJKO_02600 -SOTONIA3_RS02630 BKC03_RS02635 -SOTONIA3_RS02630 QSDFRQ_00516 -SOTONIA3_RS02630 KW39_RS02625 -SOTONIA3_RS02630 C15_RS0102680 -SOTONIA3_RS02630 ECS88FINAL_RS0102675 -SOTONIA3_RS02630 IaCS19096_RS02610 -SOTONIA3_RS02630 AQ244_RS00495 -SOTONIA3_RS02630 DU10_RS02655 -SOTONIA3_RS02630 O169_RS02625 -SOTONIA3_RS02630 A5291_RS02650 -SOTONIA3_RS02630 DU13_RS02650 -SOTONIA3_RS02630 CBP48_RS04035 -SOTONIA3_RS02630 CTL2C_RS03965 -SOTONIA3_RS02630 KW36_RS02610 -SOTONIA3_RS02630 BKB95_RS02650 -SOTONIA3_RS02630 BKB96_RS02640 -SOTONIA3_RS02630 BKB99_RS02635 -SOTONIA3_RS02630 7619030 -SOTONIA3_RS02630 SW2_RS02620 -SOTONIA3_RS02630 L1224_RS02595 -SOTONIA3_RS02630 ECS102511_RS02615 -SOTONIA3_RS02630 L1440_RS02595 -SOTONIA3_RS02630 AQ193_RS01370 -SOTONIA3_RS02630 AOT15_RS03480 -SOTONIA3_RS02630 CBP42_RS04045 -SOTONIA3_RS02630 120247 -SOTONIA3_RS02630 L2BUCH2_RS02595 -SOTONIA3_RS02630 BKB92_RS02640 -SOTONIA3_RS02630 CTB_RS02650 -SOTONIA3_RS02630 E150_RS02620 -SOTONIA3_RS02630 BW688_RS04035 -SOTONIA3_RS02630 CTO_RS02650 -SOTONIA3_RS02630 FCS84708_RS02610 -SOTONIA3_RS02630 L2BLST_RS02595 -SOTONIA3_RS02630 BBV13_RS02655 -SOTONIA3_RS02630 CBP44_RS04040 -SOTONIA3_RS02630 AQ199_RS03310 -SOTONIA3_RS02630 BKB93_RS02645 -SOTONIA3_RS02630 BBV16_RS02665 -SOTONIA3_RS02630 G9768_RS02615 -SOTONIA3_RS02630 AKW53_RS04600 -SOTONIA3_RS02630 L3404_RS02590 -SOTONIA3_RS02630 BKC02_RS02635 -CTJTET1_RS04235 CTJTET1_RS04235 -7618179 7618179 -CTB_RS02470 CTB_RS02470 -CTB_RS02470 A5291_RS02470 -CTB_RS02470 CTO_RS02470 -CTB_RS02470 BBV13_RS02475 -CTB_RS02470 BBV16_RS02480 -CTB_RS02470 gnl|Prokka|PADJNBJD_00480 -CTB_RS02470 AP288_RS00645 -CTB_RS02470 AKW53_RS03935 -CTB_RS02470 BKC01_RS02455 -CTB_RS02470 NILJEPDF_00480 -CTB_RS02470 JIEJKO_02420 -CTB_RS02470 QSDFRQ_00480 -CTB_RS02470 BKC03_RS02455 -CTB_RS02470 AQ244_RS00675 -CTB_RS02470 KW39_RS02445 -CTB_RS02470 IaCS19096_RS02430 -CTB_RS02470 ECS88FINAL_RS0102490 -CTB_RS02470 O169_RS02445 -CTB_RS02470 KW36_RS02430 -CTB_RS02470 119568 -CTB_RS02470 AQ193_RS01550 -CTB_RS02470 SW2_RS02440 -CTB_RS02470 ECS102511_RS02435 -CTB_RS02470 SOTONIA3_RS02450 -CTB_RS02470 E150_RS02440 -CTB_RS02470 FCS84708_RS02430 -CTB_RS02470 AQ199_RS03130 -CTB_RS02470 BKC02_RS02455 -CTB_RS02470 LJHENM_02420 -CTB_RS02470 CTRC943_RS02415 -CTB_RS02470 CTJTET1_RS02445 -CTB_RS02470 C15_RS0102495 -CTB_RS02470 DU10_RS02475 -CTB_RS02470 7618585 -CTB_RS02470 CBP48_RS03855 -CTB_RS02470 CBP44_RS03860 -CTB_RS02470 L2BLST_RS02415 -CTB_RS02470 DU13_RS02470 -CTB_RS02470 BKB95_RS02470 -CTB_RS02470 CTL2C_RS03785 -CTB_RS02470 L1224_RS02415 -CTB_RS02470 L1440_RS02415 -CTB_RS02470 CBP42_RS03865 -CTB_RS02470 L2BUCH2_RS02410 -CTB_RS02470 BKB93_RS02465 -CTB_RS02470 BKB92_RS02460 -CTB_RS02470 G9768_RS02435 -CTB_RS02470 L3404_RS02410 -gnl|Prokka|PADJNBJD_00071 gnl|Prokka|PADJNBJD_00071 -gnl|Prokka|PADJNBJD_00071 BKB95_RS00370 -gnl|Prokka|PADJNBJD_00071 SW2_RS00360 -gnl|Prokka|PADJNBJD_00071 ECS102511_RS00360 -gnl|Prokka|PADJNBJD_00071 CTB_RS00360 -gnl|Prokka|PADJNBJD_00071 CTL2C_RS01725 -gnl|Prokka|PADJNBJD_00071 CBP42_RS01760 -gnl|Prokka|PADJNBJD_00071 BKB96_RS00370 -gnl|Prokka|PADJNBJD_00071 L1224_RS00360 -gnl|Prokka|PADJNBJD_00071 BKB99_RS00370 -gnl|Prokka|PADJNBJD_00071 CTO_RS00360 -gnl|Prokka|PADJNBJD_00071 L1440_RS00360 -gnl|Prokka|PADJNBJD_00071 BKB92_RS00370 -gnl|Prokka|PADJNBJD_00071 SOTONIA3_RS00360 -gnl|Prokka|PADJNBJD_00071 AOT15_RS00595 -gnl|Prokka|PADJNBJD_00071 CBP44_RS01765 -gnl|Prokka|PADJNBJD_00071 119261 -gnl|Prokka|PADJNBJD_00071 E150_RS00360 -gnl|Prokka|PADJNBJD_00071 L2BUCH2_RS00360 -gnl|Prokka|PADJNBJD_00071 BKB93_RS00370 -gnl|Prokka|PADJNBJD_00071 FCS84708_RS00360 -gnl|Prokka|PADJNBJD_00071 AP288_RS03430 -gnl|Prokka|PADJNBJD_00071 BBV13_RS00365 -gnl|Prokka|PADJNBJD_00071 AQ199_RS01055 -gnl|Prokka|PADJNBJD_00071 BW688_RS01760 -gnl|Prokka|PADJNBJD_00071 G9768_RS00360 -gnl|Prokka|PADJNBJD_00071 L2BLST_RS00360 -gnl|Prokka|PADJNBJD_00071 BKC02_RS00370 -gnl|Prokka|PADJNBJD_00071 BBV16_RS00365 -gnl|Prokka|PADJNBJD_00071 NILJEPDF_00071 -gnl|Prokka|PADJNBJD_00071 LJHENM_00360 -gnl|Prokka|PADJNBJD_00071 A5291_RS00360 -gnl|Prokka|PADJNBJD_00071 BKC01_RS00370 -gnl|Prokka|PADJNBJD_00071 SOTONK1_RS00360 -gnl|Prokka|PADJNBJD_00071 L3404_RS00360 -gnl|Prokka|PADJNBJD_00071 JIEJKO_00360 -gnl|Prokka|PADJNBJD_00071 AKW53_RS01850 -gnl|Prokka|PADJNBJD_00071 QSDFRQ_00071 -gnl|Prokka|PADJNBJD_00071 IaCS19096_RS00360 -gnl|Prokka|PADJNBJD_00071 AQ193_RS03635 -gnl|Prokka|PADJNBJD_00071 AQ244_RS01630 -gnl|Prokka|PADJNBJD_00071 BKC03_RS00370 -gnl|Prokka|PADJNBJD_00071 C15_RS0100370 -gnl|Prokka|PADJNBJD_00071 DU10_RS00370 -gnl|Prokka|PADJNBJD_00071 7618391 -gnl|Prokka|PADJNBJD_00071 CTRC943_RS00360 -gnl|Prokka|PADJNBJD_00071 CTJTET1_RS00360 -gnl|Prokka|PADJNBJD_00071 O169_RS00360 -gnl|Prokka|PADJNBJD_00071 KW36_RS00360 -gnl|Prokka|PADJNBJD_00071 DU13_RS00375 -gnl|Prokka|PADJNBJD_00071 CBP48_RS01760 -gnl|Prokka|PADJNBJD_00071 ECS88FINAL_RS0100375 -gnl|Prokka|PADJNBJD_00071 KW39_RS00360 -7618180 7618180 -7618180 119138 -7618195 7618195 -7618195 119157 -119152 119152 -119163 119163 -CTJTET1_RS04100 CTJTET1_RS04100 -BKB96_RS01340 BKB96_RS01340 -BKB96_RS01340 L2BUCH2_RS01325 -BKB96_RS01340 CTO_RS01365 -BKB96_RS01340 FCS84708_RS01335 -BKB96_RS01340 AP288_RS04405 -BKB96_RS01340 BKB93_RS01340 -BKB96_RS01340 CBP44_RS02735 -BKB96_RS01340 AQ199_RS02030 -BKB96_RS01340 L2BLST_RS01325 -BKB96_RS01340 BBV13_RS01370 -BKB96_RS01340 BW688_RS02735 -BKB96_RS01340 AQ193_RS02655 -BKB96_RS01340 G9768_RS01345 -BKB96_RS01340 BKC02_RS01340 -BKB96_RS01340 BBV16_RS01370 -BKB96_RS01340 L3404_RS01320 -BKB96_RS01340 AKW53_RS02830 -BKB96_RS01340 BKC01_RS01340 -BKB96_RS01340 gnl|Prokka|PADJNBJD_00263 -BKB96_RS01340 DU10_RS01350 -BKB96_RS01340 NILJEPDF_00263 -BKB96_RS01340 LJHENM_01320 -BKB96_RS01340 BKC03_RS01340 -BKB96_RS01340 CTRC943_RS01325 -BKB96_RS01340 CTJTET1_RS01355 -BKB96_RS01340 KW39_RS01345 -BKB96_RS01340 JIEJKO_01320 -BKB96_RS01340 119416 -BKB96_RS01340 C15_RS0101375 -BKB96_RS01340 SOTONK1_RS01340 -BKB96_RS01340 ECS88FINAL_RS0101360 -BKB96_RS01340 QSDFRQ_00263 -BKB96_RS01340 A5291_RS01365 -BKB96_RS01340 O169_RS01345 -BKB96_RS01340 IaCS19096_RS01340 -BKB96_RS01340 DU13_RS01350 -BKB96_RS01340 7618488 -BKB96_RS01340 SW2_RS01335 -BKB96_RS01340 BKB95_RS01355 -BKB96_RS01340 CBP48_RS02730 -BKB96_RS01340 KW36_RS01340 -BKB96_RS01340 ECS102511_RS01335 -BKB96_RS01340 CTL2C_RS02690 -BKB96_RS01340 BKB99_RS01340 -BKB96_RS01340 L1224_RS01320 -BKB96_RS01340 AOT15_RS01025 -BKB96_RS01340 L1440_RS01320 -BKB96_RS01340 AQ244_RS03520 -BKB96_RS01340 BKB92_RS01340 -BKB96_RS01340 CBP42_RS02730 -BKB96_RS01340 SOTONIA3_RS01355 -BKB96_RS01340 CTB_RS01365 -BKB96_RS01340 E150_RS01335 -7618199 7618199 -119758 119758 -119758 CTRC943_RS03765 -119758 AKW53_RS00520 -119758 BKC03_RS03815 -119758 CTJTET1_RS03800 -119758 KW39_RS03795 -119758 DU10_RS03830 -119758 CBP48_RS00385 -119758 A5291_RS03825 -119758 SOTONK1_RS03780 -119758 IaCS19096_RS03775 -119758 DU13_RS03830 -119758 C15_RS0103885 -119758 ECS88FINAL_RS0103885 -119758 O169_RS03790 -119758 KW36_RS03780 -119758 BKB95_RS03835 -119758 CBP42_RS00385 -119758 SW2_RS03785 -119758 CTL2C_RS00380 -119758 L1224_RS03760 -119758 ECS102511_RS03775 -119758 BKB96_RS03820 -119758 BKB99_RS03815 -119758 L1440_RS03760 -119758 AQ244_RS04130 -119758 CBP44_RS00385 -119758 L2BUCH2_RS03760 -119758 BKB92_RS03815 -119758 CTB_RS03820 -119758 SOTONIA3_RS03800 -119758 AQ193_RS00210 -119758 E150_RS03785 -119758 CTO_RS03815 -119758 BBV13_RS03820 -119758 FCS84708_RS03775 -119758 BBV16_RS03830 -119758 L2BLST_RS03760 -119758 7618253 -119758 BW688_RS00385 -119758 AQ199_RS04475 -119758 BKB93_RS03820 -119758 G9768_RS03780 -119758 gnl|Prokka|PADJNBJD_00744 -119758 L3404_RS03755 -119758 BKC02_RS03815 -119758 NILJEPDF_00745 -119758 LJHENM_03750 -119758 AOT15_RS04580 -119758 AP288_RS02150 -119758 JIEJKO_03750 -119758 BKC01_RS03820 -119758 QSDFRQ_00745 -QSDFRQ_00167 QSDFRQ_00167 -QSDFRQ_00167 NILJEPDF_00167 -gnl|Prokka|PADJNBJD_00372 gnl|Prokka|PADJNBJD_00372 -gnl|Prokka|PADJNBJD_00372 7618965 -gnl|Prokka|PADJNBJD_00372 CTL2C_RS03235 -gnl|Prokka|PADJNBJD_00372 BKB95_RS01910 -gnl|Prokka|PADJNBJD_00372 CBP48_RS03295 -gnl|Prokka|PADJNBJD_00372 L1224_RS01865 -gnl|Prokka|PADJNBJD_00372 KW36_RS01885 -gnl|Prokka|PADJNBJD_00372 AOT15_RS02885 -gnl|Prokka|PADJNBJD_00372 BKB96_RS01895 -gnl|Prokka|PADJNBJD_00372 SW2_RS01890 -gnl|Prokka|PADJNBJD_00372 BKB99_RS01895 -gnl|Prokka|PADJNBJD_00372 L1440_RS01865 -gnl|Prokka|PADJNBJD_00372 ECS102511_RS01890 -gnl|Prokka|PADJNBJD_00372 CBP42_RS03305 -gnl|Prokka|PADJNBJD_00372 CTB_RS01915 -gnl|Prokka|PADJNBJD_00372 SOTONIA3_RS01900 -gnl|Prokka|PADJNBJD_00372 L2BUCH2_RS01865 -gnl|Prokka|PADJNBJD_00372 BKB92_RS01905 -gnl|Prokka|PADJNBJD_00372 AP288_RS01190 -gnl|Prokka|PADJNBJD_00372 CTO_RS01915 -gnl|Prokka|PADJNBJD_00372 E150_RS01895 -gnl|Prokka|PADJNBJD_00372 L2BLST_RS01865 -gnl|Prokka|PADJNBJD_00372 FCS84708_RS01885 -gnl|Prokka|PADJNBJD_00372 BW688_RS03295 -gnl|Prokka|PADJNBJD_00372 BKB93_RS01905 -gnl|Prokka|PADJNBJD_00372 CBP44_RS03300 -gnl|Prokka|PADJNBJD_00372 AQ244_RS01220 -gnl|Prokka|PADJNBJD_00372 BBV13_RS01920 -gnl|Prokka|PADJNBJD_00372 AQ199_RS02585 -gnl|Prokka|PADJNBJD_00372 G9768_RS01890 -gnl|Prokka|PADJNBJD_00372 L3404_RS01865 -gnl|Prokka|PADJNBJD_00372 BBV16_RS01920 -gnl|Prokka|PADJNBJD_00372 BKC02_RS01895 -gnl|Prokka|PADJNBJD_00372 BKC01_RS01895 -gnl|Prokka|PADJNBJD_00372 AKW53_RS03390 -gnl|Prokka|PADJNBJD_00372 NILJEPDF_00372 -gnl|Prokka|PADJNBJD_00372 CTRC943_RS01870 -gnl|Prokka|PADJNBJD_00372 AQ193_RS02095 -gnl|Prokka|PADJNBJD_00372 LJHENM_01875 -gnl|Prokka|PADJNBJD_00372 JIEJKO_01870 -gnl|Prokka|PADJNBJD_00372 BKC03_RS01895 -gnl|Prokka|PADJNBJD_00372 CTJTET1_RS01900 -gnl|Prokka|PADJNBJD_00372 DU10_RS01915 -gnl|Prokka|PADJNBJD_00372 QSDFRQ_00372 -gnl|Prokka|PADJNBJD_00372 C15_RS0101935 -gnl|Prokka|PADJNBJD_00372 SOTONK1_RS01890 -gnl|Prokka|PADJNBJD_00372 A5291_RS01915 -gnl|Prokka|PADJNBJD_00372 KW39_RS01900 -gnl|Prokka|PADJNBJD_00372 IaCS19096_RS01885 -gnl|Prokka|PADJNBJD_00372 ECS88FINAL_RS0101925 -gnl|Prokka|PADJNBJD_00372 DU13_RS01910 -gnl|Prokka|PADJNBJD_00372 O169_RS01900 -gnl|Prokka|PADJNBJD_00372 120353 -LJHENM_00195 LJHENM_00195 -LJHENM_03720 LJHENM_03720 -LJHENM_03720 KW36_RS03750 -LJHENM_03720 BKB95_RS03805 -LJHENM_03720 CBP42_RS00355 -LJHENM_03720 SW2_RS03755 -LJHENM_03720 CTL2C_RS00350 -LJHENM_03720 L1224_RS03730 -LJHENM_03720 ECS102511_RS03745 -LJHENM_03720 BKB96_RS03790 -LJHENM_03720 BKB99_RS03785 -LJHENM_03720 L1440_RS03730 -LJHENM_03720 CBP44_RS00355 -LJHENM_03720 L2BUCH2_RS03730 -LJHENM_03720 BKB92_RS03785 -LJHENM_03720 CTB_RS03790 -LJHENM_03720 SOTONIA3_RS03770 -LJHENM_03720 E150_RS03755 -LJHENM_03720 CTO_RS03785 -LJHENM_03720 BBV13_RS03790 -LJHENM_03720 FCS84708_RS03745 -LJHENM_03720 BBV16_RS03800 -LJHENM_03720 L2BLST_RS03730 -LJHENM_03720 119752 -LJHENM_03720 BW688_RS00355 -LJHENM_03720 7618249 -LJHENM_03720 AQ199_RS04445 -LJHENM_03720 AQ244_RS04160 -LJHENM_03720 BKB93_RS03790 -LJHENM_03720 G9768_RS03750 -LJHENM_03720 gnl|Prokka|PADJNBJD_00738 -LJHENM_03720 L3404_RS03725 -LJHENM_03720 BKC02_RS03785 -LJHENM_03720 NILJEPDF_00739 -LJHENM_03720 AOT15_RS04550 -LJHENM_03720 AP288_RS02120 -LJHENM_03720 AQ193_RS00240 -LJHENM_03720 JIEJKO_03720 -LJHENM_03720 BKC01_RS03790 -LJHENM_03720 QSDFRQ_00739 -LJHENM_03720 CTRC943_RS03735 -LJHENM_03720 AKW53_RS00490 -LJHENM_03720 BKC03_RS03785 -LJHENM_03720 CTJTET1_RS03770 -LJHENM_03720 KW39_RS03765 -LJHENM_03720 DU10_RS03800 -LJHENM_03720 CBP48_RS00355 -LJHENM_03720 A5291_RS03795 -LJHENM_03720 SOTONK1_RS03750 -LJHENM_03720 IaCS19096_RS03745 -LJHENM_03720 DU13_RS03800 -LJHENM_03720 C15_RS0103855 -LJHENM_03720 ECS88FINAL_RS0103855 -LJHENM_03720 O169_RS03760 -CTJTET1_RS05025 CTJTET1_RS05025 -119374 119374 -119374 SW2_RS01055 -119374 BKB95_RS01075 -119374 CBP48_RS02450 -119374 KW36_RS01060 -119374 ECS102511_RS01055 -119374 BKB96_RS01060 -119374 CTL2C_RS02410 -119374 BKB99_RS01060 -119374 L1224_RS01040 -119374 L1440_RS01040 -119374 AQ244_RS03240 -119374 BKB92_RS01060 -119374 CBP42_RS02450 -119374 SOTONIA3_RS01075 -119374 E150_RS01055 -119374 CTB_RS01085 -119374 L2BUCH2_RS01045 -119374 CTO_RS01085 -119374 FCS84708_RS01055 -119374 AOT15_RS01305 -119374 AP288_RS04125 -119374 BKB93_RS01060 -119374 CBP44_RS02455 -119374 AQ199_RS01750 -119374 L2BLST_RS01045 -119374 BW688_RS02455 -119374 BBV13_RS01090 -119374 G9768_RS01065 -119374 BKC02_RS01060 -119374 L3404_RS01040 -119374 AKW53_RS02550 -119374 BBV16_RS01090 -119374 BKC01_RS01060 -119374 DU10_RS01070 -119374 gnl|Prokka|PADJNBJD_00208 -119374 AQ193_RS02935 -119374 BKC03_RS01060 -119374 NILJEPDF_00208 -119374 LJHENM_01045 -119374 CTRC943_RS01045 -119374 CTJTET1_RS01075 -119374 C15_RS0101095 -119374 SOTONK1_RS01060 -119374 ECS88FINAL_RS0101080 -119374 KW39_RS01065 -119374 JIEJKO_01045 -119374 A5291_RS01085 -119374 IaCS19096_RS01060 -119374 7618461 -119374 QSDFRQ_00208 -119374 O169_RS01065 -119374 DU13_RS01070 -119142 119142 -gnl|Prokka|PADJNBJD_00138 gnl|Prokka|PADJNBJD_00138 -gnl|Prokka|PADJNBJD_00138 7618425 -gnl|Prokka|PADJNBJD_00138 KW36_RS00700 -gnl|Prokka|PADJNBJD_00138 CBP48_RS02100 -gnl|Prokka|PADJNBJD_00138 SW2_RS00700 -gnl|Prokka|PADJNBJD_00138 BKB95_RS00710 -gnl|Prokka|PADJNBJD_00138 ECS102511_RS00700 -gnl|Prokka|PADJNBJD_00138 CTL2C_RS02065 -gnl|Prokka|PADJNBJD_00138 CTB_RS00705 -gnl|Prokka|PADJNBJD_00138 AOT15_RS00255 -gnl|Prokka|PADJNBJD_00138 L1224_RS00700 -gnl|Prokka|PADJNBJD_00138 AQ244_RS02875 -gnl|Prokka|PADJNBJD_00138 BKB96_RS00710 -gnl|Prokka|PADJNBJD_00138 CBP42_RS02100 -gnl|Prokka|PADJNBJD_00138 BKB99_RS00710 -gnl|Prokka|PADJNBJD_00138 CTO_RS00705 -gnl|Prokka|PADJNBJD_00138 L1440_RS00700 -gnl|Prokka|PADJNBJD_00138 BKB92_RS00710 -gnl|Prokka|PADJNBJD_00138 SOTONIA3_RS00700 -gnl|Prokka|PADJNBJD_00138 E150_RS00700 -gnl|Prokka|PADJNBJD_00138 L2BUCH2_RS00700 -gnl|Prokka|PADJNBJD_00138 CBP44_RS02105 -gnl|Prokka|PADJNBJD_00138 FCS84708_RS00700 -gnl|Prokka|PADJNBJD_00138 AP288_RS03770 -gnl|Prokka|PADJNBJD_00138 BKB93_RS00710 -gnl|Prokka|PADJNBJD_00138 119313 -gnl|Prokka|PADJNBJD_00138 AQ199_RS01395 -gnl|Prokka|PADJNBJD_00138 BBV13_RS00710 -gnl|Prokka|PADJNBJD_00138 G9768_RS00700 -gnl|Prokka|PADJNBJD_00138 L2BLST_RS00700 -gnl|Prokka|PADJNBJD_00138 BW688_RS02100 -gnl|Prokka|PADJNBJD_00138 BBV16_RS00710 -gnl|Prokka|PADJNBJD_00138 BKC02_RS00710 -gnl|Prokka|PADJNBJD_00138 LJHENM_00690 -gnl|Prokka|PADJNBJD_00138 AKW53_RS02195 -gnl|Prokka|PADJNBJD_00138 AQ193_RS03295 -gnl|Prokka|PADJNBJD_00138 BKC01_RS00710 -gnl|Prokka|PADJNBJD_00138 NILJEPDF_00138 -gnl|Prokka|PADJNBJD_00138 A5291_RS00705 -gnl|Prokka|PADJNBJD_00138 L3404_RS00700 -gnl|Prokka|PADJNBJD_00138 SOTONK1_RS00700 -gnl|Prokka|PADJNBJD_00138 JIEJKO_00695 -gnl|Prokka|PADJNBJD_00138 QSDFRQ_00138 -gnl|Prokka|PADJNBJD_00138 CTJTET1_RS00700 -gnl|Prokka|PADJNBJD_00138 IaCS19096_RS00700 -gnl|Prokka|PADJNBJD_00138 BKC03_RS00710 -gnl|Prokka|PADJNBJD_00138 C15_RS0100725 -gnl|Prokka|PADJNBJD_00138 CTRC943_RS00700 -gnl|Prokka|PADJNBJD_00138 ECS88FINAL_RS0100725 -gnl|Prokka|PADJNBJD_00138 KW39_RS00700 -gnl|Prokka|PADJNBJD_00138 DU10_RS00710 -gnl|Prokka|PADJNBJD_00138 O169_RS00700 -gnl|Prokka|PADJNBJD_00138 DU13_RS00715 -CTJTET1_RS04110 CTJTET1_RS04110 -KW39_RS00855 KW39_RS00855 -KW39_RS00855 CTB_RS00865 F -KW39_RS00855 CTO_RS00865 F -KW39_RS00855 BBV13_RS00870 F -KW39_RS00855 BBV16_RS00870 F -KW39_RS00855 A5291_RS00865 F -KW39_RS00855 ECS102511_RS00855 -KW39_RS00855 BKB92_RS00865 -KW39_RS00855 E150_RS00855 -KW39_RS00855 AP288_RS03925 -KW39_RS00855 BKB93_RS00865 -KW39_RS00855 119343 -KW39_RS00855 gnl|Prokka|PADJNBJD_00168 -KW39_RS00855 NILJEPDF_00168 -KW39_RS00855 LJHENM_00845 -KW39_RS00855 JIEJKO_00845 -KW39_RS00855 SOTONK1_RS00855 -KW39_RS00855 QSDFRQ_00168 -KW39_RS00855 ECS88FINAL_RS0100875 -KW39_RS00855 KW36_RS00855 -KW39_RS00855 SW2_RS00855 -AKW53_RS04770 AKW53_RS04770 -BKB95_RS02200 BKB95_RS02200 -BKB95_RS02200 SOTONIA3_RS02180 -BKB95_RS02200 L2BUCH2_RS02145 -BKB95_RS02200 BKB92_RS02190 -BKB95_RS02200 CTO_RS02195 -BKB95_RS02200 AQ193_RS01815 -BKB95_RS02200 E150_RS02175 -BKB95_RS02200 L2BLST_RS02145 -BKB95_RS02200 BBV13_RS02205 -BKB95_RS02200 BW688_RS03580 -BKB95_RS02200 FCS84708_RS02165 -BKB95_RS02200 BKB93_RS02190 -BKB95_RS02200 CBP44_RS03590 -BKB95_RS02200 AQ199_RS02865 -BKB95_RS02200 BBV16_RS02205 -BKB95_RS02200 G9768_RS02170 -BKB95_RS02200 L3404_RS02145 -BKB95_RS02200 BKC02_RS02180 -BKB95_RS02200 BKC01_RS02180 -BKB95_RS02200 AKW53_RS03670 -BKB95_RS02200 gnl|Prokka|PADJNBJD_00428 -BKB95_RS02200 NILJEPDF_00428 -BKB95_RS02200 CTRC943_RS02150 -BKB95_RS02200 LJHENM_02160 -BKB95_RS02200 JIEJKO_02155 -BKB95_RS02200 BKC03_RS02180 -BKB95_RS02200 CTJTET1_RS02180 -BKB95_RS02200 QSDFRQ_00428 -BKB95_RS02200 C15_RS0102215 -BKB95_RS02200 A5291_RS02195 -BKB95_RS02200 SOTONK1_RS02170 -BKB95_RS02200 DU10_RS02205 -BKB95_RS02200 KW39_RS02180 -BKB95_RS02200 IaCS19096_RS02165 -BKB95_RS02200 AP288_RS00910 -BKB95_RS02200 ECS88FINAL_RS0102210 -BKB95_RS02200 O169_RS02180 -BKB95_RS02200 DU13_RS02200 -BKB95_RS02200 7618556 -BKB95_RS02200 CTL2C_RS03515 -BKB95_RS02200 CBP48_RS03585 -BKB95_RS02200 119524 -BKB95_RS02200 L1224_RS02145 -BKB95_RS02200 KW36_RS02165 -BKB95_RS02200 AOT15_RS03165 -BKB95_RS02200 SW2_RS02170 -BKB95_RS02200 AQ244_RS00940 -BKB95_RS02200 L1440_RS02145 -BKB95_RS02200 ECS102511_RS02170 -BKB95_RS02200 CTB_RS02195 -BKB95_RS02200 CBP42_RS03595 -119134 119134 -CTJTET1_RS04115 CTJTET1_RS04115 -AKW53_RS04780 AKW53_RS04780 -119185 119185 -CTJTET1_RS04120 CTJTET1_RS04120 -BKB99_RS00810 BKB99_RS00810 -BKB99_RS00810 BKB96_RS00810 -119481 119481 -CTJTET1_RS04125 CTJTET1_RS04125 -7618766 7618766 -119132 119132 -119132 7618175 -119153 119153 -119153 7618192 -119165 119165 -119165 7618201 -CTJTET1_RS04130 CTJTET1_RS04130 -119143 119143 -119143 7618184 -CTJTET1_RS04135 CTJTET1_RS04135 -KW39_RS04300 KW39_RS04300 -KW39_RS04300 gnl|Prokka|PADJNBJD_00840 F -KW39_RS04300 NILJEPDF_00841 F -KW39_RS04300 LJHENM_04230 F -KW39_RS04300 JIEJKO_04230 F -KW39_RS04300 QSDFRQ_00841 F -KW39_RS04300 C15_RS0104395 -KW39_RS04300 DU13_RS04335 -KW39_RS04300 O169_RS04295 -KW39_RS04300 KW36_RS04280 -KW39_RS04300 BKB95_RS04340 -KW39_RS04300 CBP42_RS00890 -KW39_RS04300 CTL2C_RS00880 -KW39_RS04300 L1224_RS04260 -KW39_RS04300 BKB96_RS04325 -KW39_RS04300 L1440_RS04255 -KW39_RS04300 BKB99_RS04320 -KW39_RS04300 SW2_RS04290 -KW39_RS04300 ECS102511_RS04280 -KW39_RS04300 CBP44_RS00890 -KW39_RS04300 CTB_RS04315 -KW39_RS04300 L2BUCH2_RS04260 -KW39_RS04300 SOTONIA3_RS04300 -KW39_RS04300 BKB92_RS04320 -KW39_RS04300 CTO_RS04310 -KW39_RS04300 AP288_RS02585 -KW39_RS04300 BBV13_RS04325 -KW39_RS04300 E150_RS04290 -KW39_RS04300 L2BLST_RS04260 -KW39_RS04300 FCS84708_RS04280 -KW39_RS04300 AQ199_RS00210 -KW39_RS04300 BBV16_RS04330 -KW39_RS04300 119972 -KW39_RS04300 BW688_RS00890 -KW39_RS04300 7618736 -KW39_RS04300 G9768_RS04285 -KW39_RS04300 L3404_RS04255 -KW39_RS04300 BKB93_RS04325 -KW39_RS04300 BKC02_RS04320 -KW39_RS04300 AKW53_RS01000 -KW39_RS04300 AQ193_RS04490 -KW39_RS04300 BKC01_RS04325 -KW39_RS04300 CTRC943_RS04265 -KW39_RS04300 AOT15_RS01865 -KW39_RS04300 CTJTET1_RS04455 -KW39_RS04300 AQ244_RS02475 -KW39_RS04300 BKC03_RS04320 -KW39_RS04300 CBP48_RS00890 -KW39_RS04300 A5291_RS04320 -KW39_RS04300 SOTONK1_RS04285 -KW39_RS04300 ECS88FINAL_RS0104375 -KW39_RS04300 IaCS19096_RS04275 -KW39_RS04300 DU10_RS04335 -7618156 7618156 -119161 119161 -NILJEPDF_00747 NILJEPDF_00747 -NILJEPDF_00747 QSDFRQ_00747 -NILJEPDF_00747 LJHENM_03760 -NILJEPDF_00747 AOT15_RS04590 -NILJEPDF_00747 AP288_RS02160 -NILJEPDF_00747 JIEJKO_03760 -NILJEPDF_00747 BKC01_RS03830 -NILJEPDF_00747 CTRC943_RS03775 -NILJEPDF_00747 AKW53_RS00530 -NILJEPDF_00747 BKC03_RS03825 -NILJEPDF_00747 CTJTET1_RS03810 -NILJEPDF_00747 KW39_RS03805 -NILJEPDF_00747 DU10_RS03840 -NILJEPDF_00747 CBP48_RS00395 -NILJEPDF_00747 A5291_RS03835 -NILJEPDF_00747 SOTONK1_RS03790 -NILJEPDF_00747 IaCS19096_RS03785 -NILJEPDF_00747 DU13_RS03840 -NILJEPDF_00747 C15_RS0103895 -NILJEPDF_00747 ECS88FINAL_RS0103895 -NILJEPDF_00747 O169_RS03800 -NILJEPDF_00747 KW36_RS03790 -NILJEPDF_00747 AQ244_RS04120 -NILJEPDF_00747 BKB95_RS03845 -NILJEPDF_00747 CBP42_RS00395 -NILJEPDF_00747 SW2_RS03795 -NILJEPDF_00747 CTL2C_RS00390 -NILJEPDF_00747 L1224_RS03770 -NILJEPDF_00747 ECS102511_RS03785 -NILJEPDF_00747 BKB96_RS03830 -NILJEPDF_00747 BKB99_RS03825 -NILJEPDF_00747 L1440_RS03770 -NILJEPDF_00747 AQ193_RS00200 -NILJEPDF_00747 CBP44_RS00395 -NILJEPDF_00747 L2BUCH2_RS03770 -NILJEPDF_00747 BKB92_RS03825 -NILJEPDF_00747 CTB_RS03830 -NILJEPDF_00747 SOTONIA3_RS03810 -NILJEPDF_00747 E150_RS03795 -NILJEPDF_00747 CTO_RS03825 -NILJEPDF_00747 BBV13_RS03830 -NILJEPDF_00747 FCS84708_RS03785 -NILJEPDF_00747 BBV16_RS03840 -NILJEPDF_00747 L2BLST_RS03770 -NILJEPDF_00747 7618687 -NILJEPDF_00747 120049 -NILJEPDF_00747 BW688_RS00395 -NILJEPDF_00747 AQ199_RS04485 -NILJEPDF_00747 BKB93_RS03830 -NILJEPDF_00747 G9768_RS03790 -NILJEPDF_00747 gnl|Prokka|PADJNBJD_00746 -NILJEPDF_00747 L3404_RS03765 -NILJEPDF_00747 BKC02_RS03825 -CTJTET1_RS04140 CTJTET1_RS04140 -7618188 7618188 -119158 119158 From a9a251fc214e6cf916dad26d51c97876843689bb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Arnoux?= Date: Fri, 18 Oct 2024 10:22:22 +0200 Subject: [PATCH 38/52] Fix how frame getter/setter attribute is handled --- ppanggolin/genome.py | 56 +++++++++++++++++++++++++++----------------- tests/test_genome.py | 50 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 84 insertions(+), 22 deletions(-) diff --git a/ppanggolin/genome.py b/ppanggolin/genome.py index eba6e423..83bf971c 100644 --- a/ppanggolin/genome.py +++ b/ppanggolin/genome.py @@ -12,6 +12,7 @@ from ppanggolin.metadata import MetaFeatures from ppanggolin.utils import get_consecutive_region_positions + class Feature(MetaFeatures): """This is a general class representation of Gene, RNA @@ -74,9 +75,10 @@ def __len__(self) -> int: """ try: - return sum([(stop - start +1) for start, stop in self.coordinates ]) + return sum([(stop - start + 1) for start, stop in self.coordinates]) except TypeError: - raise ValueError(f"Coordinates of gene {self} have not been defined. Getting its length is then impossible.") + raise ValueError( + f"Coordinates of gene {self} have not been defined. Getting its length is then impossible.") @property def has_joined_coordinates(self) -> bool: @@ -141,7 +143,7 @@ def contig(self, contig: Contig): self._contig = contig def fill_annotations(self, start: int, stop: int, strand: str, gene_type: str = "", name: str = "", - product: str = "", local_identifier: str = "", coordinates: List[Tuple[int]] = None): + product: str = "", local_identifier: str = "", coordinates: List[Tuple[int, int]] = None): """ Fill general annotation for child classes @@ -173,11 +175,13 @@ def fill_annotations(self, start: int, stop: int, strand: str, gene_type: str = if not isinstance(product, str): raise TypeError(f"Product should be str. Got {type(product)} instead in {self} from {self.organism}.") if not isinstance(local_identifier, str): - raise TypeError(f"Local identifier should be str. Got {type(local_identifier)} instead in {self} from {self.organism}.") + raise TypeError( + f"Local identifier should be str. Got {type(local_identifier)} instead in {self} from {self.organism}.") if strand not in ["+", "-"]: raise ValueError(f"Strand should be '+' or '-'. Got {strand} instead in {self} from {self.organism}.") if not isinstance(coordinates, list): - raise TypeError(f"Coordinates should be of type list. Got {type(coordinates)} instead in {self} from {self.organism}.") + raise TypeError( + f"Coordinates should be of type list. Got {type(coordinates)} instead in {self} from {self.organism}.") for start_i, stop_i in coordinates: if not isinstance(start_i, int): @@ -185,9 +189,11 @@ def fill_annotations(self, start: int, stop: int, strand: str, gene_type: str = if not isinstance(stop_i, int): raise TypeError(f"Stop should be int. Got {type(stop_i)} instead in {self} from {self.organism}.") if stop_i < start_i: - raise ValueError(f"Wrong coordinates: {coordinates}. Start ({start_i}) should not be greater than stop ({stop_i}) in {self} from {self.organism}.") + raise ValueError( + f"Wrong coordinates: {coordinates}. Start ({start_i}) should not be greater than stop ({stop_i}) in {self} from {self.organism}.") if start_i < 1 or stop_i < 1: - raise ValueError(f"Wrong coordinates: {coordinates}. Start ({start_i}) and stop ({stop_i}) should be greater than 0 in {self} from {self.organism}.") + raise ValueError( + f"Wrong coordinates: {coordinates}. Start ({start_i}) and stop ({stop_i}) should be greater than 0 in {self} from {self.organism}.") self.start = start self.stop = stop @@ -222,7 +228,8 @@ def add_sequence(self, sequence): :raise AssertionError: Sequence must be a string """ - assert isinstance(sequence, str), f"'str' type was expected for dna sequence but you provided a '{type(sequence)}' type object" + assert isinstance(sequence, + str), f"'str' type was expected for dna sequence but you provided a '{type(sequence)}' type object" self.dna = sequence @@ -249,6 +256,7 @@ def stop_relative_to(self, gene): if gene.start > self.stop: return self.stop + self.contig.length + class RNA(Feature): """Save RNA from genome as an Object with some information for Pangenome @@ -286,8 +294,8 @@ def __init__(self, gene_id: str): self._RGP = None self.genetic_code = None self.protein = None - self.is_partial = False # is the gene a partial gene ? - self.frame = 0 # One of '0', '1' or '2'. '0' indicates that the first base of the feature is the first base of a codon, '1' that the second base is the first base of a codon, and so on.. + self.is_partial = False # is the gene a partial gene ? + self._frame = None # One of '0', '1' or '2'. '0' indicates that the first base of the feature is the first base of a codon, '1' that the second base is the first base of a codon, and so on.. @property def family(self): @@ -351,7 +359,8 @@ def module(self): """ return self.family.module - def fill_annotations(self, position: int = None, genetic_code: int = 11, is_partial:bool = False, frame:int = 0, **kwargs): + def fill_annotations(self, position: int = None, genetic_code: int = 11, is_partial: bool = False, frame: int = 0, + **kwargs): """Fill Gene annotation provide by PPanGGOLiN dependencies :param position: Gene localization in genome @@ -368,17 +377,14 @@ def fill_annotations(self, position: int = None, genetic_code: int = 11, is_part raise TypeError("position should be an integer") if not isinstance(genetic_code, int): raise TypeError("Genetic code should be an integer") - - if frame not in [0,1,2]: - raise ValueError("Frame should be equal to 0, 1 or 2.") - + if not isinstance(is_partial, bool): raise TypeError("partial code should be an boolean") - + self.position = position self.genetic_code = genetic_code self.is_partial = is_partial - self._frame = frame + self.frame = frame def add_protein(self, protein: str): """Add a protein sequence corresponding to translated gene @@ -397,6 +403,7 @@ def frame(self) -> int: Get the frame of the gene """ + assert self._frame is not None, "frame is already set and should not be set another time." return self._frame @@ -406,11 +413,14 @@ def frame(self, frame: int): :param contig_len: length of the contig """ - if frame not in [0,1,2]: + assert self._frame is None, "frame is already set and should not be set another time." + + if frame not in [0, 1, 2]: raise ValueError("Frame should be equal to 0, 1 or 2.") - + self._frame = frame + class Contig(MetaFeatures): """ Describe the contig content and some information @@ -776,7 +786,6 @@ def modules(self): modules.add(module) yield from modules - def get_ordered_consecutive_genes(self, genes: Iterable[Gene]) -> List[List[Gene]]: """ Order the given genes considering the circularity of the contig. @@ -787,12 +796,15 @@ def get_ordered_consecutive_genes(self, genes: Iterable[Gene]) -> List[List[Gene gene_positions = [gene.position for gene in genes] # Determine consecutive region positions - consecutive_region_positions = get_consecutive_region_positions(region_positions=gene_positions, contig_gene_count=self.number_of_genes) + consecutive_region_positions = get_consecutive_region_positions(region_positions=gene_positions, + contig_gene_count=self.number_of_genes) - consecutive_genes_lists = [[self[position] for position in consecutive_positions] for consecutive_positions in consecutive_region_positions] + consecutive_genes_lists = [[self[position] for position in consecutive_positions] for consecutive_positions in + consecutive_region_positions] return consecutive_genes_lists + class Organism(MetaFeatures): """ Describe the Genome content and some information diff --git a/tests/test_genome.py b/tests/test_genome.py index 6f519a74..9e29133f 100644 --- a/tests/test_genome.py +++ b/tests/test_genome.py @@ -222,6 +222,8 @@ def test_create_gene_object(self, gene): assert gene._RGP is None assert gene.genetic_code is None assert gene.protein is None + assert gene.is_partial is False + assert gene._frame is None def test_fill_annotations(self, gene): """Tests that Gene annotations can be filled with valid parameters @@ -238,6 +240,54 @@ def test_fill_annotations_type_error(self, gene): with pytest.raises(TypeError): gene.fill_annotations(start=1, stop=10, strand='+', position=10, genetic_code="4") + @pytest.mark.parametrize("frame", [0, 1, 2]) + def test_set_frame(self, frame): + """Tests that frame can be set + """ + gene = Gene('gene') + gene.frame = frame + assert gene._frame == frame + + @pytest.mark.parametrize("frame", [0, 1, 2]) + def test_get_frame(self, frame): + """Tests that frame can be getting + """ + gene = Gene('gene') + gene.frame = frame + assert gene.frame == frame + + def test_raise_assertion_error_if_frame_not_set(self): + """Tests that frame cannot be return if it has not been set + """ + gene = Gene('gene') + with pytest.raises(AssertionError): + _ = gene.frame + + def test_raise_assertion_error_if_frame_already_set(self): + """Tests that frame cannot be set if it has already been set + """ + gene = Gene('gene') + gene.frame = 1 + with pytest.raises(AssertionError): + gene.frame = 2 + + @pytest.mark.parametrize("frame", [3, "1", 1.5]) + def test_raise_value_error_if_frame_not_0_1_or_2(self, frame): + """Tests that frame cannot be set with value different from 0, 1 or 2 + """ + gene = Gene('gene') + with pytest.raises(ValueError): + gene.frame = frame + + @pytest.mark.parametrize("frame", [0, 1, 2]) + def test_fill_partial_gene(self, frame): + """Tests that Gene annotations can be filled with partial genes + """ + gene = Gene('gene') + gene.fill_annotations(start=1, stop=10, strand='+', is_partial=True, frame=frame) + assert gene.is_partial is True + assert gene.frame == frame + def test_add_protein(self, gene): """Tests that a protein sequence can be added to a Gene object """ From 69402530be81da5ceda58496cdfa0f7ba19ceb1a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Arnoux?= Date: Fri, 18 Oct 2024 12:12:34 +0200 Subject: [PATCH 39/52] Update docstring and typing --- ppanggolin/annotate/annotate.py | 176 +++++++++++++++----------------- tests/annotate/test_annotate.py | 132 ++++++++++++------------ 2 files changed, 152 insertions(+), 156 deletions(-) diff --git a/ppanggolin/annotate/annotate.py b/ppanggolin/annotate/annotate.py index f3f79756..69420cff 100644 --- a/ppanggolin/annotate/annotate.py +++ b/ppanggolin/annotate/annotate.py @@ -4,13 +4,13 @@ import argparse import logging from concurrent.futures import ProcessPoolExecutor -from math import e + from multiprocessing import get_context import os from pathlib import Path import tempfile import time -from typing import List, Set, Tuple, Iterable, Dict, Generator +from typing import List, Set, Tuple, Iterable, Dict, Generator, Union import re from collections import defaultdict import warnings @@ -54,8 +54,8 @@ def check_annotate_args(args: argparse.Namespace): def create_gene(org: Organism, contig: Contig, gene_counter: int, rna_counter: int, gene_id: str, dbxrefs: Set[str], - coordinates: List[Tuple[int]], strand: str, gene_type: str, position: int = None, gene_name: str = "", - product: str = "", genetic_code: int = 11, protein_id: str = "") -> Gene: + coordinates: List[Tuple[int, int]], strand: str, gene_type: str, position: int = None, + gene_name: str = "", product: str = "", genetic_code: int = 11, protein_id: str = "") -> Gene: """ Create a Gene object and associate to contig and Organism @@ -64,7 +64,7 @@ def create_gene(org: Organism, contig: Contig, gene_counter: int, rna_counter: i :param gene_counter: Gene counter to name gene :param rna_counter: RNA counter to name RNA :param gene_id: local identifier - :param dbxref: cross-reference to external DB + :param dbxrefs: cross-reference to external DB :param coordinates: Gene start and stop positions :param strand: gene strand association :param gene_type: gene type @@ -112,7 +112,7 @@ def create_gene(org: Organism, contig: Contig, gene_counter: int, rna_counter: i return new_gene -def extract_positions(string: str) -> Tuple[List[Tuple[int, int]], bool, bool]: +def extract_positions(string: str) -> Tuple[List[Tuple[int, int]], bool, bool, bool]: """ Extracts start and stop positions from a string and determines whether it is complement and pseudogene. @@ -158,7 +158,6 @@ def extract_positions(string: str) -> Tuple[List[Tuple[int, int]], bool, bool]: else: positions = string.rstrip() - # Check if '>' or '<' exists in the positions to identify partial genes if '>' in positions or '<' in positions: @@ -167,12 +166,12 @@ def extract_positions(string: str) -> Tuple[List[Tuple[int, int]], bool, bool]: if ">" in positions.split(',')[-1]: has_partial_end = True - + inner_positions = ','.join(positions.split(',')[1:-1]) - if '>' in inner_positions or '<' in inner_positions or (not has_partial_end and not has_partial_start): + if '>' in inner_positions or '<' in inner_positions or (not has_partial_end and not has_partial_start): raise ValueError(f"Error parsing positions '{positions}' extracted from GBFF string '{string}'. " - f"Chevrons are found in the inner position. This case is unexpected and not handle.") + f"Chevrons are found in the inner position. This case is unexpected and not handle.") for position in positions.split(','): @@ -194,7 +193,9 @@ def extract_positions(string: str) -> Tuple[List[Tuple[int, int]], bool, bool]: return coordinates, complement, has_partial_start, has_partial_end -def parse_gbff_by_contig(gbff_file_path: Path) -> Generator[Tuple[List[str], List[str], List[str]], None, None]: +def parse_gbff_by_contig(gbff_file_path: Path + ) -> Generator[Tuple[Dict[str, str], Generator[Dict[str, Union[str, Set[str]]], None, None], str], + None, None]: """ Parse a GBFF file by contig and yield tuples containing header, feature, and sequence info for each contig. @@ -234,8 +235,8 @@ def parse_gbff_by_contig(gbff_file_path: Path) -> Generator[Tuple[List[str], Lis f"{len(header_lines)} feature lines, " f"and {len(sequence_lines)} sequence lines." ) - yield parse_contig_header_lines(header_lines), parse_feature_lines(feature_lines), parse_dna_seq_lines( - sequence_lines) + yield (parse_contig_header_lines(header_lines), parse_feature_lines(feature_lines), + parse_dna_seq_lines(sequence_lines)) header_lines = [] feature_lines = [] @@ -257,8 +258,8 @@ def parse_gbff_by_contig(gbff_file_path: Path) -> Generator[Tuple[List[str], Lis # In case the last // is missing, return the last contig if header_lines or feature_lines or sequence_lines: - return parse_contig_header_lines(header_lines), parse_feature_lines(feature_lines), parse_dna_seq_lines( - sequence_lines) + yield (parse_contig_header_lines(header_lines), parse_feature_lines(feature_lines), + parse_dna_seq_lines(sequence_lines)) def parse_contig_header_lines(header_lines: List[str]) -> Dict[str, str]: @@ -282,7 +283,8 @@ def parse_contig_header_lines(header_lines: List[str]) -> Dict[str, str]: return {field: '\n'.join(value) for field, value in field_to_value.items()} -def parse_feature_lines(feature_lines: List[str]) -> Generator[Dict[str, str], None, None]: + +def parse_feature_lines(feature_lines: List[str]) -> Generator[Dict[str, Union[str, Set[str]]], None, None]: """ Parse feature lines from a GBFF file and yield dictionaries representing each feature. @@ -290,19 +292,19 @@ def parse_feature_lines(feature_lines: List[str]) -> Generator[Dict[str, str], N :return: A generator that yields dictionaries, each representing a feature with its type, location, and qualifiers. """ - def stringify_feature_values(feature:Dict[str,List[str]]) -> Dict[str, str]: + def stringify_feature_values(feature: Dict[str, List[str]]) -> Dict[str, Union[str, Set[str]]]: """ All value of the returned dict are str except for db_xref that is a list. When multiple values exist for the same tag only the first one is kept. """ stringify_feature = {} - for tag, value in feature.items(): + for tag, val in feature.items(): if tag == "db_xref": - stringify_feature[tag] = value - elif isinstance(value, list): - stringify_feature[tag] = value[0] + stringify_feature[tag] = set(val) + elif isinstance(val, list): + stringify_feature[tag] = val[0] else: - stringify_feature[tag] = value + stringify_feature[tag] = val return defaultdict(str, stringify_feature) current_feature = {} @@ -316,13 +318,13 @@ def stringify_feature_values(feature:Dict[str,List[str]]) -> Dict[str, str]: yield stringify_feature_values(current_feature) current_feature = { - "feature_type" : line[:21].strip(), - "location" : [line[21:].strip()], + "feature_type": line[:21].strip(), + "location": [line[21:].strip()], } current_qualifier = "location" elif line.strip().startswith('/'): - qualifier_line = line.strip()[1:] # [1:] used to remove / + qualifier_line = line.strip()[1:] # [1:] used to remove / if "=" in qualifier_line: current_qualifier, value = qualifier_line.split('=', 1) @@ -339,7 +341,7 @@ def stringify_feature_values(feature:Dict[str,List[str]]) -> Dict[str, str]: current_feature[current_qualifier] = [value] else: - # the line does not start a qualifier so its the continuation of the last qualifier value. + # the line does not start a qualifier so it's the continuation of the last qualifier value. value = line.strip() value = value[:-1] if value.endswith('"') else value current_feature[current_qualifier][-1] += f" {value}" @@ -349,7 +351,7 @@ def stringify_feature_values(feature:Dict[str,List[str]]) -> Dict[str, str]: yield stringify_feature_values(current_feature) -def parse_dna_seq_lines(sequence_lines: List[str]) -> Generator[Dict[str, str], None, None]: +def parse_dna_seq_lines(sequence_lines: List[str]) -> str: """ Parse sequence_lines from a GBFF file and return dna sequence @@ -362,8 +364,8 @@ def parse_dna_seq_lines(sequence_lines: List[str]) -> Generator[Dict[str, str], return sequence -def combine_contigs_metadata(contig_to_metadata: Dict[str, Dict[str, str]]) -> Tuple[ - Dict[str, str], Dict[str, Dict[str, str]]]: +def combine_contigs_metadata(contig_to_metadata: Dict[Contig, Dict[str, str]] + ) -> Tuple[Dict[str, str], Dict[Contig, Dict[str, str]]]: """ Combine contig metadata to identify shared and unique metadata tags and values. @@ -469,7 +471,8 @@ def shift_start_coordinates(coordinates: List[Tuple[int, int]], shift: int) -> L raise ValueError(f'Shifting the start resulted in a gene with null or negative size. ' f'Coordinates: {coordinates}, Shift: {shift}') else: - logging.getLogger("PPanGGOLiN").warning(f'Coordinate part {new_coordinates[0]} resulted in a non-positive length after shift. Removing it.') + logging.getLogger("PPanGGOLiN").warning( + f'Coordinate part {new_coordinates[0]} resulted in a non-positive length after shift. Removing it.') new_coordinates = new_coordinates[1:] # If length is negative, propagate the shift to the next coordinate @@ -480,24 +483,22 @@ def shift_start_coordinates(coordinates: List[Tuple[int, int]], shift: int) -> L return new_coordinates - - def fix_partial_gene_coordinates( - coordinates: List[Tuple[int, int]], - is_complement: bool, - start_shift: int, - ensure_codon_multiple:bool = True + coordinates: List[Tuple[int, int]], + is_complement: bool, + start_shift: int, + ensure_codon_multiple: bool = True ) -> List[Tuple[int, int]]: """ Adjusts gene coordinates if they have partial starts or ends, ensuring the gene length is a multiple of 3. If the gene is on the complement strand, the adjustments will be reversed (i.e., applied to the opposite ends). - - :param has_partial_start: Flag indicating if the gene has a partial start. - :param has_partial_end: Flag indicating if the gene has a partial end. + :param coordinates: List of coordinate tuples (start, stop) for the gene. :param is_complement: Flag indicating if the gene is on the complement strand. :param start_shift: The value by which the start coordinate should be shifted. + :param ensure_codon_multiple: Flag to check that gene length is a multiple of 3. + :return: A new list of adjusted coordinate tuples. """ @@ -532,7 +533,8 @@ def fix_partial_gene_coordinates( gene_length = sum([(stop - start + 1) for start, stop in coordinates]) if gene_length % 3 != 0: - logging.getLogger("PPanGGOLiN").warning(f'Gene with coordinates: {coordinates} has a length that is not a multiple of 3 after adjusting for partiality with new cordinates ({coordinates}): {gene_length}') + logging.getLogger("PPanGGOLiN").warning( + f'Gene with coordinates: {coordinates} has a length that is not a multiple of 3 after adjusting for partiality with new cordinates ({coordinates}): {gene_length}') return coordinates @@ -545,7 +547,7 @@ def read_org_gbff(organism_name: str, gbff_file_path: Path, circular_contigs: Li :param organism_name: Organism name :param gbff_file_path: Path to corresponding GBFF file :param circular_contigs: list of contigs - :param pseudo: Allow to read pseudogenes + :param use_pseudogenes: Allow to read pseudogenes :param translation_table: Translation table (genetic code) to use when /transl_table is missing from CDS tags. @@ -562,10 +564,6 @@ def read_org_gbff(organism_name: str, gbff_file_path: Path, circular_contigs: Li contig_to_metadata = {} for header, features, sequence in parse_gbff_by_contig(gbff_file_path): - - contig_id = None - contig_len = None - if "LOCUS" not in header: raise ValueError('Missing LOCUS line in GBFF header.') @@ -620,26 +618,26 @@ def read_org_gbff(organism_name: str, gbff_file_path: Path, circular_contigs: Li f"db_xref values does not have the expected format. Expect 'db_xref=:' " f"but got {feature['db_xref']} in file {gbff_file_path}. " "db_xref tags is therefore not retrieved in contig/genomes metadata.") - - contig_to_metadata[contig].update(db_xref_for_metadata) + else: + contig_to_metadata[contig].update(db_xref_for_metadata) genetic_code = '' if feature['feature_type'] not in ['CDS', 'rRNA', 'tRNA']: continue - coordinates, is_complement, has_partial_start, has_partial_end = extract_positions(''.join(feature['location'])) + coordinates, is_complement, has_partial_start, has_partial_end = extract_positions( + ''.join(feature['location'])) - if "pseudo" in feature and not use_pseudogenes: continue - + elif "transl_except" in feature and not use_pseudogenes: - # that's probably a 'stop' codon into selenocystein. + # that's probably a 'stop' codon into selenocystein. logging.getLogger("PPanGGOLiN").info( f"CDS '{feature['locus_tag']}' contains a 'transl_except' annotation ({feature['transl_except']}) " f"in contig '{contig}' in file '{gbff_file_path}'. " f"PPanGGOLiN does not handle 'transl_except' annotations. This gene's protein sequence " "will likely contain an internal stop codon when translated with PPanGGOLiN." ) - + if feature['feature_type'] == 'CDS': if feature['transl_table'] == "": used_transl_table_arg += 1 @@ -647,12 +645,12 @@ def read_org_gbff(organism_name: str, gbff_file_path: Path, circular_contigs: Li else: genetic_code = int(feature["transl_table"]) - if has_partial_start or has_partial_end: + start_shift = 0 if 'codon_start' not in feature else int( + feature['codon_start']) - 1 # -1 is to be in zero based index. - start_shift = 0 if 'codon_start' not in feature else int(feature['codon_start']) -1 # -1 is to be in zero based index. - - coordinates = fix_partial_gene_coordinates(coordinates, is_complement=is_complement, start_shift=start_shift) + coordinates = fix_partial_gene_coordinates(coordinates, is_complement=is_complement, + start_shift=start_shift) strand = "-" if is_complement else "+" @@ -773,7 +771,6 @@ def get_id_attribute(attributes_dict: dict) -> str: f"Not the case for file: {gff_file_path}") return element_id - def check_chevrons_in_start_and_stop(start: str, stop: str) -> Tuple[int, int, bool]: """ Checks for the presence of chevrons ('<' or '>') in the start and stop strings, removes them if present, @@ -795,7 +792,6 @@ def check_chevrons_in_start_and_stop(start: str, stop: str) -> Tuple[int, int, b return start, stop, chevrons_present - contig = None # initialize contig has_fasta = False fasta_string = "" @@ -811,7 +807,6 @@ def check_chevrons_in_start_and_stop(start: str, stop: str) -> Tuple[int, int, b for line in gff_file: if has_fasta: fasta_string += line - continue elif line.startswith('##', 0, 2): if line.startswith('FASTA', 2, 7): @@ -843,7 +838,8 @@ def check_chevrons_in_start_and_stop(start: str, stop: str) -> Tuple[int, int, b pseudogene = False - start, stop, has_chevron = check_chevrons_in_start_and_stop(start=fields_gff[gff_start], stop=fields_gff[gff_end]) + gene_start, gene_stop, has_chevron = check_chevrons_in_start_and_stop(start=fields_gff[gff_start], + stop=fields_gff[gff_end]) if fields_gff[gff_type] == 'region': # keep region attributes to add them as metadata of genome and contigs @@ -862,7 +858,7 @@ def check_chevrons_in_start_and_stop(start: str, stop: str) -> Tuple[int, int, b if fields_gff[gff_seqname] in circular_contigs or ('IS_CIRCULAR' in attributes and attributes['IS_CIRCULAR'] == "true"): # WARNING: In case we have prodigal gff with is_circular attributes. - # This would fail as contig is not defined. However is_circular should not be found in prodigal gff + # This would fail as contig is not defined. However, is_circular should not be found in prodigal gff logging.getLogger("PPanGGOLiN").debug(f"Contig {contig.name} is circular.") contig.is_circular = True assert contig.name == fields_gff[gff_seqname] @@ -872,7 +868,7 @@ def check_chevrons_in_start_and_stop(start: str, stop: str) -> Tuple[int, int, b id_attribute = get_id_attribute(attributes) locus_tag = attributes.get("LOCUS_TAG") protein_id = attributes.get("PROTEIN_ID") - + if locus_tag is not None: gene_id = locus_tag @@ -922,15 +918,15 @@ def check_chevrons_in_start_and_stop(start: str, stop: str) -> Tuple[int, int, b if gene_id in id_attr_to_gene_id: # the ID has already been seen at least once in this genome existing_gene = id_attr_to_gene_id[gene_id] - new_gene_info = {"strand":fields_gff[gff_strand], - "type":fields_gff[gff_type], - "name":name, - "position":contig.number_of_genes, - "product":product, - "local_identifier":gene_id, - "start": start, - "stop": stop, - "frame":gene_frame} + new_gene_info = {"strand": fields_gff[gff_strand], + "type": fields_gff[gff_type], + "name": name, + "position": contig.number_of_genes, + "product": product, + "local_identifier": gene_id, + "start": gene_start, + "stop": gene_stop, + "frame": gene_frame} check_and_add_extra_gene_part(existing_gene, new_gene_info) @@ -941,12 +937,11 @@ def check_chevrons_in_start_and_stop(start: str, stop: str) -> Tuple[int, int, b id_attr_to_gene_id[gene_id] = gene # here contig is filled in order, so position is the number of genes already stored in the contig. - gene.fill_annotations(start=start, stop=stop, - strand=fields_gff[gff_strand], gene_type=fields_gff[gff_type], name=name, - position=contig.number_of_genes, product=product, - local_identifier=gene_id, + gene.fill_annotations(start=gene_start, stop=gene_stop, strand=fields_gff[gff_strand], + gene_type=fields_gff[gff_type], name=name, product=product, + position=contig.number_of_genes, local_identifier=gene_id, genetic_code=genetic_code, is_partial=is_partial, frame=gene_frame) - + gene.fill_parents(org, contig) gene_counter += 1 contig.add(gene) @@ -956,9 +951,9 @@ def check_chevrons_in_start_and_stop(start: str, stop: str) -> Tuple[int, int, b rna_type = fields_gff[gff_type] rna = RNA(org.name + f"_{rna_type}_" + str(rna_counter).zfill(4)) - rna.fill_annotations(start=start, stop=stop, - strand=fields_gff[gff_strand], gene_type=fields_gff[gff_type], name=name, - product=product, local_identifier=gene_id) + rna.fill_annotations(start=gene_start, stop=gene_stop, strand=fields_gff[gff_strand], + gene_type=fields_gff[gff_type], name=name, product=product, + local_identifier=gene_id) rna.fill_parents(org, contig) rna_counter += 1 contig.add_rna(rna) @@ -971,7 +966,8 @@ def check_chevrons_in_start_and_stop(start: str, stop: str) -> Tuple[int, int, b for gene in contig.genes: if gene.is_partial: is_complement = gene.strand == '-' - gene.coordinates = fix_partial_gene_coordinates(gene.coordinates, is_complement=is_complement, start_shift=gene.frame ) + gene.coordinates = fix_partial_gene_coordinates(gene.coordinates, is_complement=is_complement, + start_shift=gene.frame) # GET THE FASTA SEQUENCES OF THE GENES if fasta_string == "": @@ -1000,7 +996,8 @@ def check_chevrons_in_start_and_stop(start: str, stop: str) -> Tuple[int, int, b return org, has_fasta -def add_metadata_from_gff_file(contig_name_to_region_info: Dict[str, str], org: Organism, gff_file_path: Path): +def add_metadata_from_gff_file(contig_name_to_region_info: Dict[str, Dict[str, str]], + org: Organism, gff_file_path: Path): """ Add metadata to the organism object from a GFF file. @@ -1011,7 +1008,8 @@ def add_metadata_from_gff_file(contig_name_to_region_info: Dict[str, str], org: # Check if the number of contigs matches the expected number in the organism if len(contig_name_to_region_info) == org.number_of_contigs: - genome_metadata, contig_to_uniq_metadata = combine_contigs_metadata(contig_name_to_region_info) + contig_to_region_info = {org.get(name): region_info for name, region_info in contig_name_to_region_info.items()} + genome_metadata, contig_to_uniq_metadata = combine_contigs_metadata(contig_to_region_info) if genome_metadata: org.add_metadata(Metadata(source='annotation_file', **genome_metadata)) else: @@ -1019,13 +1017,9 @@ def add_metadata_from_gff_file(contig_name_to_region_info: Dict[str, str], org: f"Inconsistent data in GFF file {gff_file_path}: " f"expected {org.number_of_contigs} contigs but found {len(contig_name_to_region_info)} regions." ) + contig_to_uniq_metadata = {} - for contig_name, metadata_dict in contig_to_uniq_metadata.items(): - try: - contig = org.get(contig_name) - except KeyError: - raise ValueError(f"Contig '{contig_name}' does not exist in the genome object created from GFF file {gff_file_path}.") - + for contig, metadata_dict in contig_to_uniq_metadata.items(): contig.add_metadata(Metadata(source='annotation_file', **metadata_dict)) @@ -1056,7 +1050,8 @@ def check_and_add_extra_gene_part(gene: Gene, new_gene_info: Dict, max_separatio # The new gene info seems concordant with the gene object. We can try to merge them assert new_gene_info['start'] <= new_gene_info['stop'], "Start is greater than stop. Incorrect coordinates." - new_gene_is_before = (gene.strand == "+" and new_gene_info['start'] < gene.start) or (gene.strand == "-" and new_gene_info['start'] > gene.start) + new_gene_is_before = (gene.strand == "+" and new_gene_info['start'] < gene.start) or ( + gene.strand == "-" and new_gene_info['start'] > gene.start) if new_gene_is_before: # new gene start if before the current gene # so its frame if used @@ -1069,7 +1064,7 @@ def check_and_add_extra_gene_part(gene: Gene, new_gene_info: Dict, max_separatio first_stop = gene.coordinates[0][1] for start, _ in gene.coordinates[1:]: if abs(start - first_stop) > max_separation: - # This is maybe to restrictive but lets go with that first. + # This is maybe to restrictive but let's go with that first. raise ValueError( f"The coordinates of genes are too far apart ({abs(start - first_stop)}nt). This is unexpected. " f"Gene coordinates : {gene.coordinates}") @@ -1091,7 +1086,6 @@ def check_and_add_extra_gene_part(gene: Gene, new_gene_info: Dict, max_separatio "same local identifier": f"{gene.local_identifier} == {new_gene_info['local_identifier']}: {gene.local_identifier == new_gene_info['local_identifier']}", } - raise ValueError( f"Two genes have the same id attributes but different info in some key attribute. {detailed_comparison}") diff --git a/tests/annotate/test_annotate.py b/tests/annotate/test_annotate.py index 08682d91..e52868c2 100644 --- a/tests/annotate/test_annotate.py +++ b/tests/annotate/test_annotate.py @@ -1,28 +1,35 @@ import pytest from pathlib import Path + +from ppanggolin.genome import Contig from ppanggolin.annotate.annotate import extract_positions, read_anno_file, parse_contig_header_lines, \ - parse_gbff_by_contig, parse_feature_lines, parse_dna_seq_lines, read_org_gbff, combine_contigs_metadata, fix_partial_gene_coordinates, shift_start_coordinates, shift_end_coordinates - - -@pytest.mark.parametrize("input_string, expected_positions, expected_complement, expected_partialgene_start, expected_partialgene_end", [ - ("join(190..7695,7695..12071)", [(190, 7695), (7695, 12071)], False, False, False), - ("order(190..7695,7995..12071)", [(190, 7695), (7995, 12071)], False, False, False), - ("complement(join(4359800..4360707,4360707..4360962,1..100))", [(4359800, 4360707), (4360707, 4360962), (1, 100)], - True, False, False), - ("complement(order(4359800..4360707,4360707..4360962,1..100))", [(4359800, 4360707), (4360707, 4360962), (1, 100)], - True, False, False), - ("join(6835405..6835731,1..1218)", [(6835405, 6835731), (1, 1218)], False, False, False), - ("join(1375484..1375555,1375557..1376579)", [(1375484, 1375555), (1375557, 1376579)], False, False, False), - ("complement(6815492..6816265)", [(6815492, 6816265)], True, False, False), - ("6811501..6812109", [(6811501, 6812109)], False, False, False), - ("complement(6792573..>6795461)", [(6792573, 6795461)], True, False, True), - ("complement(<6792573..6795461)", [(6792573, 6795461)], True, True, False), - ("complement(<6792573..>6795461)", [(6792573, 6795461)], True, True, True), - ("join(1038313,1..1016)", [(1038313, 1038313), (1, 1016)], False, False, False), - ("1038313", [(1038313, 1038313)], False, False, False) -]) -def test_extract_positions(input_string, expected_positions, expected_complement, expected_partialgene_start, expected_partialgene_end): - positions, is_complement, has_partial_start, has_partial_end = extract_positions(input_string) + parse_gbff_by_contig, parse_feature_lines, parse_dna_seq_lines, read_org_gbff, combine_contigs_metadata, \ + fix_partial_gene_coordinates, shift_start_coordinates, shift_end_coordinates + + +@pytest.mark.parametrize( + "input_string, expected_positions, expected_complement, expected_partialgene_start, expected_partialgene_end", [ + ("join(190..7695,7695..12071)", [(190, 7695), (7695, 12071)], False, False, False), + ("order(190..7695,7995..12071)", [(190, 7695), (7995, 12071)], False, False, False), + ("complement(join(4359800..4360707,4360707..4360962,1..100))", + [(4359800, 4360707), (4360707, 4360962), (1, 100)], + True, False, False), + ("complement(order(4359800..4360707,4360707..4360962,1..100))", + [(4359800, 4360707), (4360707, 4360962), (1, 100)], + True, False, False), + ("join(6835405..6835731,1..1218)", [(6835405, 6835731), (1, 1218)], False, False, False), + ("join(1375484..1375555,1375557..1376579)", [(1375484, 1375555), (1375557, 1376579)], False, False, False), + ("complement(6815492..6816265)", [(6815492, 6816265)], True, False, False), + ("6811501..6812109", [(6811501, 6812109)], False, False, False), + ("complement(6792573..>6795461)", [(6792573, 6795461)], True, False, True), + ("complement(<6792573..6795461)", [(6792573, 6795461)], True, True, False), + ("complement(<6792573..>6795461)", [(6792573, 6795461)], True, True, True), + ("join(1038313,1..1016)", [(1038313, 1038313), (1, 1016)], False, False, False), + ("1038313", [(1038313, 1038313)], False, False, False) + ]) +def test_extract_positions(input_string, expected_positions, expected_complement, expected_partialgene_start, + expected_partialgene_end): + positions, is_complement, has_partial_start, has_partial_end = extract_positions(input_string) assert positions == expected_positions assert is_complement == expected_complement assert has_partial_start == expected_partialgene_start @@ -43,6 +50,7 @@ def test_extract_positions_with_strange_chevrons(): with pytest.raises(ValueError): extract_positions("complement(join(4359800..4360707,1..<100))") # start chevron in ending position + def test_extract_positions_with_wrong_positions_format2(): with pytest.raises(ValueError): extract_positions("start..stop") # start and stop are not integer @@ -238,8 +246,6 @@ def test_parse_gbff_by_contig(sample_gbff_path): # Add more test cases as needed ]) def test_parse_feature_lines(input_lines, expected_output): - print(expected_output) - a = list(parse_feature_lines(input_lines)) assert list(parse_feature_lines(input_lines)) == expected_output @@ -252,23 +258,24 @@ def test_parse_dna_seq_lines(): def test_combine_contigs_metadata(): + contig1, contig2, contig3 = Contig(1, "contig1"), Contig(2, "contig2"), Contig(3, "contig3") contig_to_metadata = { - "contig1": {"sp": "spA", "strain": "123", "contig_feat": "ABC"}, - "contig2": {"sp": "spA", "strain": "123", "contig_feat": "XYZ"}, - "contig3": {"sp": "spA", "strain": "123"} + contig1: {"sp": "spA", "strain": "123", "contig_feat": "ABC"}, + contig2: {"sp": "spA", "strain": "123", "contig_feat": "XYZ"}, + contig3: {"sp": "spA", "strain": "123"} } genome_metadata, contig_metadata = combine_contigs_metadata(contig_to_metadata) assert genome_metadata == {"sp": "spA", "strain": "123"} - assert contig_metadata == {"contig1": {"contig_feat": "ABC"}, "contig2": {"contig_feat": "XYZ"}, } + assert contig_metadata == {contig1: {"contig_feat": "ABC"}, contig2: {"contig_feat": "XYZ"}, } @pytest.mark.parametrize("coordinates, is_complement, start_shift, expected", [ # Case 1: No partial start or end, expect no change in non-complement strand # Coordinates are already correct, no need to modify anything. ([(11, 40)], False, 0, [(11, 40)]), - + # Case 2: Partial start, no partial end (Non-complement) # A shift of 1 is added to the start coordinate. ([(10, 40)], False, 1, [(11, 40)]), # start_shift of 1 added to start @@ -276,7 +283,7 @@ def test_combine_contigs_metadata(): # Case 2: Partial start, no partial end (Non-complement) # A shift of 2 is added to the start coordinate. ([(2, 33)], False, 2, [(4, 33)]), # start_shift of 2 added to start - + # Case 3: No partial start, partial end (Non-complement) # Adjust last coordinate to make gene length a multiple of 3. ([(11, 41)], False, 0, [(11, 40)]), # last end adjusted to be a multiple of 3 @@ -284,23 +291,23 @@ def test_combine_contigs_metadata(): # Case 3: No partial start, partial end (Non-complement) # Gene length is already a multiple of 3, so no changes needed. ([(11, 40)], False, 0, [(11, 40)]), # gene length already a multiple of 3 so no change is made - + # Case 4: Partial start and end (Non-complement) # Both start and end need adjustment: add shift to start and adjust end to make gene length a multiple of 3. ([(10, 41)], False, 1, [(11, 40)]), # start_shift added to start, and length adjusted - + # Case 5: Partial start and no partial end on complement strand # Adjust start since we are on the complement strand. - ([(9, 40)], True, 0, [(11, 40)]), # length adjusted - + ([(9, 40)], True, 0, [(11, 40)]), # length adjusted + # Case 5: No partial start but partial end on complement strand # Shift removed from the last end on the complement strand. - ( [(9, 40)], True, 2, [(9, 38)]), # start_shift removed + ([(9, 40)], True, 2, [(9, 38)]), # start_shift removed # Case 5: Partial start and end on complement strand # Adjust both start and end since we are on the complement strand, ensuring gene length is a multiple of 3. - ( [(8, 40)], True, 2, [(9, 38)]), # start_shift removed and length adjusted - + ([(8, 40)], True, 2, [(9, 38)]), # start_shift removed and length adjusted + # Case 5: Joined coordinates without partial start or end # Nothing to adjust as the gene is properly framed. ([(1, 9), (7, 12)], False, 0, [(1, 9), (7, 12)]), # nothing to do @@ -308,7 +315,7 @@ def test_combine_contigs_metadata(): # Case 5: Joined coordinates with partial start # Adjust the first start coordinate by the shift. ([(3, 9), (7, 12)], False, 1, [(4, 9), (7, 12)]), # adjust start - + # Case 5: Joined coordinates with partial end # Adjust the last end to ensure the gene length is a multiple of 3. ([(3, 9), (7, 12)], False, 0, [(3, 9), (7, 11)]), # adjust end @@ -322,48 +329,50 @@ def test_combine_contigs_metadata(): ([(4, 9), (7, 12)], True, 2, [(5, 9), (7, 10)]), # adjust start and end in complement mode # Real tricky case from GCF_000623275.1 - ([(4681814, 4682911), (1, 1)], False, 0, [(4681814, 4682911)]), # ajust the end by removing one nt. In this case that remove the second part of the coordinates + ([(4681814, 4682911), (1, 1)], False, 0, [(4681814, 4682911)]), + # ajust the end by removing one nt. In this case that remove the second part of the coordinates # Tricky case inspired by last case - ([(30, 60), (1, 1)], False, 0, [(30, 59)]), # ajust the end by removing two nt. In this case that remove the second part of the coordinates and one nt in the first part - + ([(30, 60), (1, 1)], False, 0, [(30, 59)]), + # ajust the end by removing two nt. In this case that remove the second part of the coordinates and one nt in the first part # Tricky case inspired by last case - ([(60, 60), (1, 9)], False, 1, [(1, 9)]), # ajust the end by removing one nt. In this case that remove the second part of the coordinates + ([(60, 60), (1, 9)], False, 1, [(1, 9)]), + # ajust the end by removing one nt. In this case that remove the second part of the coordinates # Tricky case inspired by last case - ([(60, 60), (1, 10)], False, 2, [(2, 10)]), # ajust the end by removing one nt. In this case that remove the second part of the coordinates + ([(60, 60), (1, 10)], False, 2, [(2, 10)]), + # ajust the end by removing one nt. In this case that remove the second part of the coordinates # Very tricky case inspired by last case - ([(59, 60), (60, 60), (1, 9)], False, 3, [(1, 9)]), # ajust the end by removing one nt. In this case that remove the second part of the coordinates - + ([(59, 60), (60, 60), (1, 9)], False, 3, [(1, 9)]), + # ajust the end by removing one nt. In this case that remove the second part of the coordinates + # Very tricky case inspired by last case ([(60, 61), (1, 8)], True, 3, [(61, 61), (1, 5)]), # - - ]) - def test_fix_partial_gene_coordinates(coordinates, is_complement, start_shift, expected): result = fix_partial_gene_coordinates(coordinates, is_complement, start_shift) assert result == expected - def test_fix_partial_gene_coordinates_with_wrong_coordinates(): - with pytest.raises(ValueError): - fix_partial_gene_coordinates(coordinates=[(1, 1)], is_complement=False, start_shift=0) # gene is too small, the length adjustement at the end lead to no gene + fix_partial_gene_coordinates(coordinates=[(1, 1)], is_complement=False, + start_shift=0) # gene is too small, the length adjustement at the end lead to no gene with pytest.raises(ValueError): - fix_partial_gene_coordinates([(1, 1)], False, 1) # gene is too small, the length adjustement at the start lead to no gene - + fix_partial_gene_coordinates([(1, 1)], False, + 1) # gene is too small, the length adjustement at the start lead to no gene + with pytest.raises(ValueError): - fix_partial_gene_coordinates([(60,60), (1, 1)], False, 1) # gene is too small, the length adjustement at the start and at the end lead to no gene + fix_partial_gene_coordinates([(60, 60), (1, 1)], False, + 1) # gene is too small, the length adjustement at the start and at the end lead to no gene with pytest.raises(ValueError): - fix_partial_gene_coordinates([], False, 1) # chevron in inner position - + fix_partial_gene_coordinates([], False, 1) # chevron in inner position + @pytest.mark.parametrize("coordinates, shift, expected", [ @@ -377,10 +386,7 @@ def test_fix_partial_gene_coordinates_with_wrong_coordinates(): ([(1, 1), (1, 2), (1, 4)], 2, [(2, 2), (1, 4)]), - - ]) - - +]) def test_shift_start_coordinates(coordinates, shift, expected): result = shift_start_coordinates(coordinates, shift) assert result == expected @@ -398,11 +404,7 @@ def test_shift_start_coordinates(coordinates, shift, expected): ([(18, 18), (1, 4)], 4, [(18, 18)]), - - ]) - - +]) def test_shift_end_coordinates(coordinates, shift, expected): result = shift_end_coordinates(coordinates, shift) assert result == expected - From 0b6d1dffc9d845ac04344557e153b2e3e7457a40 Mon Sep 17 00:00:00 2001 From: JeanMainguy Date: Wed, 16 Oct 2024 17:17:09 +0200 Subject: [PATCH 40/52] filter out non ascii character when found in product --- ppanggolin/annotate/annotate.py | 22 +++++++++++++++++++++- ppanggolin/utils.py | 25 +++++++++++++++++++++++++ 2 files changed, 46 insertions(+), 1 deletion(-) diff --git a/ppanggolin/annotate/annotate.py b/ppanggolin/annotate/annotate.py index 69420cff..05607d11 100644 --- a/ppanggolin/annotate/annotate.py +++ b/ppanggolin/annotate/annotate.py @@ -24,7 +24,7 @@ init_contig_counter, contig_counter) from ppanggolin.pangenome import Pangenome from ppanggolin.genome import Organism, Gene, RNA, Contig -from ppanggolin.utils import read_compressed_or_not, mk_file_name, detect_filetype, check_input_files +from ppanggolin.utils import read_compressed_or_not, mk_file_name, detect_filetype, check_input_files, has_non_ascii, replace_non_ascii from ppanggolin.formats import write_pangenome from ppanggolin.metadata import Metadata @@ -53,6 +53,8 @@ def check_annotate_args(args: argparse.Namespace): check_input_files(args.anno, True) + + def create_gene(org: Organism, contig: Contig, gene_counter: int, rna_counter: int, gene_id: str, dbxrefs: Set[str], coordinates: List[Tuple[int, int]], strand: str, gene_type: str, position: int = None, gene_name: str = "", product: str = "", genetic_code: int = 11, protein_id: str = "") -> Gene: @@ -74,6 +76,15 @@ def create_gene(org: Organism, contig: Contig, gene_counter: int, rna_counter: i :param genetic_code: Genetic code used :param protein_id: Protein identifier """ + # check for non ascii character in product field + if has_non_ascii(product): + + logging.getLogger("PPanGGOLiN").warning( + f"In genome '{org.name}', the 'product' field of gene '{gene_id}' contains non-ASCII characters: '{product}'. " + "These characters cannot be stored in the HDF5 file and will be replaced by underscores." + ) + product = replace_non_ascii(product) + start, stop = coordinates[0][0], coordinates[-1][1] @@ -889,6 +900,15 @@ def check_chevrons_in_start_and_stop(start: str, stop: str) -> Tuple[int, int, b is_partial = False product = attributes.pop('PRODUCT', "") + + if has_non_ascii(product): + + logging.getLogger("PPanGGOLiN").warning( + f"In genome '{organism}', the 'product' field of gene '{gene_id}' contains non-ASCII characters: '{product}'. " + "These characters cannot be stored in the HDF5 file and will be replaced by underscores." + ) + product = replace_non_ascii(product) + if contig is None or contig.name != fields_gff[gff_seqname]: # get the current contig diff --git a/ppanggolin/utils.py b/ppanggolin/utils.py index 7145fa71..d0ecc29d 100755 --- a/ppanggolin/utils.py +++ b/ppanggolin/utils.py @@ -1254,3 +1254,28 @@ def run_subprocess(cmd: List[str], output: Path = None, msg: str = "Subprocess f if output is not None: with open(output, 'w') as fout: fout.write(result.stdout) + + + +def has_non_ascii(string_to_test: str) -> bool: + """ + Check if a string contains any non-ASCII characters. + + :param string_to_test: The string to check for non-ASCII characters. + :return: True if the string contains non-ASCII characters, False otherwise. + """ + try: + string_to_test.encode('ascii') + except UnicodeEncodeError: + return True + return False + +def replace_non_ascii(string_with_ascii: str, replacement_string: str = "_") -> str: + """ + Replace all non-ASCII characters in a string with a specified replacement string. + + :param string_with_ascii: The string potentially containing non-ASCII characters. + :param replacement_string: The string to replace non-ASCII characters with (default is '_'). + :return: A new string where all non-ASCII characters have been replaced. + """ + return re.sub(r'[^\x00-\x7F]+', replacement_string, string_with_ascii) From fbe61326238639d53d555b2e6667c3e569e0b02e Mon Sep 17 00:00:00 2001 From: JeanMainguy Date: Wed, 16 Oct 2024 17:19:29 +0200 Subject: [PATCH 41/52] add some pytest to test ascii filtering fct --- tests/utils/test_utilities.py | 27 +++++++++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/tests/utils/test_utilities.py b/tests/utils/test_utilities.py index ceeef757..edb48d55 100644 --- a/tests/utils/test_utilities.py +++ b/tests/utils/test_utilities.py @@ -7,8 +7,7 @@ import zipfile from typing import Generator -from ppanggolin.utils import is_compressed, read_compressed_or_not, write_compressed_or_not - +from ppanggolin.utils import is_compressed, read_compressed_or_not, write_compressed_or_not, has_non_ascii, replace_non_ascii class TestCompressed: """ @@ -157,3 +156,27 @@ def test_write_uncompressed(self, plain_file_path: Path) -> None: f.write("Test data") with open(plain_file_path, 'r') as f: assert f.read() == "Test data" + + +# Test cases for has_non_ascii +@pytest.mark.parametrize("input_string, expected", [ + ("Escherichia_coli", False), # All ASCII characters + ("Escherichia_colí", True), # Contains non-ASCII character 'í' + ("simple_string", False), # Simple ASCII string + ("Ωmega", True), # Contains non-ASCII character 'Ω' + ("", False), # Empty string should return False +]) +def test_has_non_ascii(input_string, expected): + assert has_non_ascii(input_string) == expected + +# Test cases for replace_non_ascii +@pytest.mark.parametrize("input_string, replacement, expected", [ + ("Escherichia_coli", "_", "Escherichia_coli"), # All ASCII characters, no replacement needed + ("Escherichia_colí", "_", "Escherichia_col_"), # Replace 'í' with '_' + ("Ωmega", "-", "-mega"), # Replace 'Ω' with '-' + ("Escherichia_Ωcoli", "X", "Escherichia_Xcoli"),# Replace 'Ω' with 'X' + ("", "_", ""), # Empty string, no replacement +]) +def test_replace_non_ascii(input_string, replacement, expected): + assert replace_non_ascii(input_string, replacement) == expected + From 70155bd50a8fdca009aa8ce0c3d250bb63184ef8 Mon Sep 17 00:00:00 2001 From: JeanMainguy Date: Tue, 29 Oct 2024 12:12:59 +0100 Subject: [PATCH 42/52] apply black to ppanggolin python code --- docs/conf.py | 24 +- ppanggolin/RGP/__init__.py | 2 +- ppanggolin/RGP/genomicIsland.py | 223 +- ppanggolin/RGP/rgp_cluster.py | 559 +- ppanggolin/RGP/spot.py | 254 +- ppanggolin/__init__.py | 2 +- ppanggolin/align/alignOnPang.py | 702 +- ppanggolin/annotate/annotate.py | 1102 ++- ppanggolin/annotate/synta.py | 236 +- ppanggolin/cluster/cluster.py | 640 +- ppanggolin/context/searchGeneContext.py | 612 +- ppanggolin/edge.py | 36 +- ppanggolin/figures/draw_spot.py | 540 +- ppanggolin/figures/drawing.py | 138 +- ppanggolin/figures/tile_plot.py | 401 +- ppanggolin/figures/ucurve.py | 122 +- ppanggolin/formats/__init__.py | 2 +- ppanggolin/formats/readBinaries.py | 1034 ++- ppanggolin/formats/writeAnnotations.py | 342 +- ppanggolin/formats/writeBinaries.py | 532 +- ppanggolin/formats/writeFlatGenomes.py | 717 +- ppanggolin/formats/writeFlatMetadata.py | 157 +- ppanggolin/formats/writeFlatPangenome.py | 1120 ++- ppanggolin/formats/writeMSA.py | 331 +- ppanggolin/formats/writeMetadata.py | 290 +- ppanggolin/formats/writeSequences.py | 544 +- ppanggolin/formats/write_proksee.py | 342 +- ppanggolin/geneFamily.py | 109 +- ppanggolin/genetic_codes.py | 8945 +++++++++++++++++++++- ppanggolin/genome.py | 282 +- ppanggolin/graph/makeGraph.py | 117 +- ppanggolin/info/info.py | 96 +- ppanggolin/main.py | 122 +- ppanggolin/meta/meta.py | 256 +- ppanggolin/metadata.py | 78 +- ppanggolin/metrics/fluidity.py | 66 +- ppanggolin/metrics/metrics.py | 142 +- ppanggolin/mod/module.py | 178 +- ppanggolin/nem/partition.py | 726 +- ppanggolin/nem/rarefaction.py | 827 +- ppanggolin/pangenome.py | 258 +- ppanggolin/projection/__init__.py | 2 +- ppanggolin/projection/projection.py | 1369 ++-- ppanggolin/region.py | 367 +- ppanggolin/utility/__init__.py | 2 +- ppanggolin/utility/utils.py | 187 +- ppanggolin/utils.py | 661 +- ppanggolin/workflow/all.py | 624 +- ppanggolin/workflow/panModule.py | 4 +- ppanggolin/workflow/panRGP.py | 4 +- ppanggolin/workflow/workflow.py | 5 +- setup.py | 26 +- testingDataset/compare_results.py | 177 +- testingDataset/launch_test_locally.py | 134 +- tests/align/test_align.py | 78 +- tests/annotate/test_annotate.py | 479 +- tests/context/test_context.py | 201 +- tests/formats/test_writeFlatGenomes.py | 35 +- tests/region/test_genomicIsland.py | 34 +- tests/region/test_rgp_cluster.py | 120 +- tests/test_edge.py | 65 +- tests/test_genefamily.py | 225 +- tests/test_genome.py | 487 +- tests/test_metadata.py | 72 +- tests/test_pangenome.py | 142 +- tests/test_region.py | 573 +- tests/utils/test_utilities.py | 65 +- 67 files changed, 22933 insertions(+), 6411 deletions(-) diff --git a/docs/conf.py b/docs/conf.py index 7ec252d2..68a493c5 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -14,12 +14,14 @@ # -- Project information ----------------------------------------------------- -project = 'PPanGGOLiN' -copyright = '2023, LABGeM' -author = 'Jérôme Arnoux' +project = "PPanGGOLiN" +copyright = "2023, LABGeM" +author = "Jérôme Arnoux" # The full version, including alpha/beta/rc tags -release = open(Path(__file__).resolve().parents[1]/"VERSION").read().rstrip() # Get release number in the VERSION file +release = ( + open(Path(__file__).resolve().parents[1] / "VERSION").read().rstrip() +) # Get release number in the VERSION file # -- General configuration --------------------------------------------------- @@ -33,21 +35,19 @@ "sphinx.ext.duration", "sphinx.ext.autosectionlabel", "sphinx.ext.autodoc", - 'sphinx_search.extension', - 'sphinxcontrib.mermaid' + "sphinx_search.extension", + "sphinxcontrib.mermaid", ] -source_suffix = { - '.md': 'markdown' -} +source_suffix = {".md": "markdown"} # Prefix document path to section labels, to use: # `path/to/file:heading` instead of just `heading` autosectionlabel_prefix_document = True # Add any paths that contain templates here, relative to this directory. -templates_path = ['_templates'] +templates_path = ["_templates"] # List of patterns, relative to source directory, that match files and # directories to ignore when looking for source files. @@ -60,9 +60,9 @@ # The theme to use for HTML and HTML Help pages. See the documentation for # a list of builtin themes. # -html_theme = 'sphinx_rtd_theme' +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'] \ No newline at end of file +html_static_path = ["_static"] diff --git a/ppanggolin/RGP/__init__.py b/ppanggolin/RGP/__init__.py index 61883771..50f2feb3 100644 --- a/ppanggolin/RGP/__init__.py +++ b/ppanggolin/RGP/__init__.py @@ -1,3 +1,3 @@ from .genomicIsland import subparser, launch from .spot import * -from . import rgp_cluster \ No newline at end of file +from . import rgp_cluster diff --git a/ppanggolin/RGP/genomicIsland.py b/ppanggolin/RGP/genomicIsland.py index ec268f89..e7d8918d 100644 --- a/ppanggolin/RGP/genomicIsland.py +++ b/ppanggolin/RGP/genomicIsland.py @@ -33,13 +33,15 @@ def changes(self, score): def extract_rgp(contig, node, rgp_id, naming) -> Region: """ - Extract the region from the given starting node + Extract the region from the given starting node """ new_region = None if naming == "contig": new_region = Region(contig.name + "_RGP_" + str(rgp_id)) elif naming == "organism": - new_region = Region(node.gene.organism.name + "_" + contig.name + "_RGP_" + str(rgp_id)) + new_region = Region( + node.gene.organism.name + "_" + contig.name + "_RGP_" + str(rgp_id) + ) while node.state: new_region.add(node.gene) node.state = 0 @@ -52,7 +54,7 @@ def extract_rgp(contig, node, rgp_id, naming) -> Region: def rewrite_matrix(contig, matrix, index, persistent, continuity, multi): """ - ReWrite the matrice from the given index of the node that started a region. + ReWrite the matrice from the given index of the node that started a region. """ prev = matrix[index] index += 1 @@ -63,7 +65,10 @@ def rewrite_matrix(contig, matrix, index, persistent, continuity, multi): next_node = matrix[index] nb_perc = 0 while next_node.state: # while the old state is not 0, recompute the scores. - if next_node.gene.family.named_partition == "persistent" and next_node.gene.family not in multi: + if ( + next_node.gene.family.named_partition == "persistent" + and next_node.gene.family not in multi + ): modif = -pow(persistent, nb_perc) nb_perc += 1 else: @@ -85,7 +90,9 @@ def rewrite_matrix(contig, matrix, index, persistent, continuity, multi): next_node = matrix[index] -def init_matrices(contig: Contig, multi: set, persistent_penalty: int = 3, variable_gain: int = 1) -> list: +def init_matrices( + contig: Contig, multi: set, persistent_penalty: int = 3, variable_gain: int = 1 +) -> list: """ Initialize the vector of score/state nodes @@ -119,10 +126,12 @@ def init_matrices(contig: Contig, multi: set, persistent_penalty: int = 3, varia if prev.state == 0: zero_ind = prev mat.append(prev) - logging.getLogger("PPanGGOLiN").debug(f"gene:{gene.ID};zero_ind:{zero_ind};curr_state:{curr_state};curr_score:{curr_score}.") + logging.getLogger("PPanGGOLiN").debug( + f"gene:{gene.ID};zero_ind:{zero_ind};curr_state:{curr_state};curr_score:{curr_score}." + ) if zero_ind is None: - zero_ind = prev#don't go further than the current node, if no node were at 0. + zero_ind = prev # don't go further than the current node, if no node were at 0. # if the contig is circular, and we're in a rgp state, # we need to continue from the "starting" gene until we leave rgp state. @@ -135,11 +144,16 @@ def init_matrices(contig: Contig, multi: set, persistent_penalty: int = 3, varia mat_node = mat[c] if mat_node == zero_ind: # then we've parsed the entire contig twice. - logging.getLogger("PPanGGOLiN").debug(f"{contig.name} was parsed entirely twice.") + logging.getLogger("PPanGGOLiN").debug( + f"{contig.name} was parsed entirely twice." + ) # The whole sequence is a rgp, so we're stopping the iteration now, otherwise we'll loop indefinitely break - if mat_node.gene.family.named_partition == "persistent" and mat_node.gene.family not in multi: + if ( + mat_node.gene.family.named_partition == "persistent" + and mat_node.gene.family not in multi + ): modif = -pow(persistent_penalty, nb_perc) nb_perc += 1 else: @@ -149,13 +163,23 @@ def init_matrices(contig: Contig, multi: set, persistent_penalty: int = 3, varia curr_score = modif + mat_node.prev.score curr_state = 1 if curr_score >= 0 else 0 mat_node.changes(curr_score) - logging.getLogger("PPanGGOLiN").debug(f"gene:{mat_node.gene.ID};curr_state:{curr_state};curr_score:{curr_score}.") + logging.getLogger("PPanGGOLiN").debug( + f"gene:{mat_node.gene.ID};curr_state:{curr_state};curr_score:{curr_score}." + ) c += 1 return mat -def mk_regions(contig: Contig, matrix: list, multi: set, min_length: int = 3000, min_score: int = 4, - persistent: int = 3, continuity: int = 1, naming: str = "contig") -> Set[Region]: +def mk_regions( + contig: Contig, + matrix: list, + multi: set, + min_length: int = 3000, + min_score: int = 4, + persistent: int = 3, + continuity: int = 1, + naming: str = "contig", +) -> Set[Region]: """ Processing matrix and 'emptying' it to get the regions. @@ -183,7 +207,9 @@ def max_index_node(lst): max_index = idx return max_score, max_index else: - raise TypeError(f"List of matriceNode is expected. The detected type was {type(lst)}") + raise TypeError( + f"List of matriceNode is expected. The detected type was {type(lst)}" + ) contig_regions = set() val, index = max_index_node(matrix) @@ -197,9 +223,16 @@ def max_index_node(lst): return contig_regions -def compute_org_rgp( organism: Organism, multigenics: set, - persistent_penalty: int = 3, variable_gain: int = 1, min_length: int = 3000, min_score: int = 4, - naming: str = "contig", disable_bar: bool = True ) -> set: +def compute_org_rgp( + organism: Organism, + multigenics: set, + persistent_penalty: int = 3, + variable_gain: int = 1, + min_length: int = 3000, + min_score: int = 4, + naming: str = "contig", + disable_bar: bool = True, +) -> set: """ Compute regions of genomic plasticity (RGP) on the given organism based on the provided parameters. @@ -211,14 +244,21 @@ def compute_org_rgp( organism: Organism, multigenics: set, :param min_score: Minimum score threshold for considering a region as RGP (default: 4). :param naming: Naming scheme for the regions, either "contig" or "organism" (default: "contig"). :param disable_bar: Whether to disable the progress bar. It is recommended to disable it when calling this function in a loop on multiple organisms (default: True). - + :return: A set of RGPs of the provided organism. """ org_regions = set() - for contig in tqdm(organism.contigs, total=organism.number_of_contigs, unit="contig", disable=disable_bar): + for contig in tqdm( + organism.contigs, + total=organism.number_of_contigs, + unit="contig", + disable=disable_bar, + ): if contig.number_of_genes != 0: # some contigs have no coding genes... # can definitely multiprocess this part, as not THAT much information is needed... - matrix = init_matrices(contig, multigenics, persistent_penalty, variable_gain) + matrix = init_matrices( + contig, multigenics, persistent_penalty, variable_gain + ) org_regions |= mk_regions( contig, matrix, @@ -227,7 +267,7 @@ def compute_org_rgp( organism: Organism, multigenics: set, min_score, persistent_penalty, variable_gain, - naming=naming + naming=naming, ) return org_regions @@ -245,29 +285,41 @@ def naming_scheme(organisms: Iterable[Organism]) -> str: oldlen = len(contigsids) contigsids.add(contig.name) if oldlen == len(contigsids): - logging.getLogger("PPanGGOLiN").warning("You have contigs with identical identifiers in your " - "assemblies. Identifiers will be supplemented with your " - "provided organism names.") + logging.getLogger("PPanGGOLiN").warning( + "You have contigs with identical identifiers in your " + "assemblies. Identifiers will be supplemented with your " + "provided organism names." + ) return "organism" return "contig" def check_pangenome_former_rgp(pangenome: Pangenome, force: bool = False): - """ checks pangenome status and .h5 files for former rgp, delete them if allowed or raise an error + """checks pangenome status and .h5 files for former rgp, delete them if allowed or raise an error :param pangenome: Pangenome object :param force: Allow to force write on Pangenome file """ if pangenome.status["predictedRGP"] == "inFile" and not force: - raise Exception("You are trying to predict RGPs in a pangenome that already have them predicted. " - "If you REALLY want to do that, use --force " - "(it will erase RGPs and every feature computed from them).") + raise Exception( + "You are trying to predict RGPs in a pangenome that already have them predicted. " + "If you REALLY want to do that, use --force " + "(it will erase RGPs and every feature computed from them)." + ) elif pangenome.status["predictedRGP"] == "inFile" and force: erase_pangenome(pangenome, rgp=True) -def predict_rgp(pangenome: Pangenome, persistent_penalty: int = 3, variable_gain: int = 1, min_length: int = 3000, - min_score: int = 4, dup_margin: float = 0.05, force: bool = False, disable_bar: bool = False): +def predict_rgp( + pangenome: Pangenome, + persistent_penalty: int = 3, + variable_gain: int = 1, + min_length: int = 3000, + min_score: int = 4, + dup_margin: float = 0.05, + force: bool = False, + disable_bar: bool = False, +): """ Main function to predict region of genomic plasticity @@ -282,16 +334,34 @@ def predict_rgp(pangenome: Pangenome, persistent_penalty: int = 3, variable_gain """ # check statuses and load info check_pangenome_former_rgp(pangenome, force) - check_pangenome_info(pangenome, need_annotations=True, need_families=True, need_graph=False, need_partitions=True, - disable_bar=disable_bar) + check_pangenome_info( + pangenome, + need_annotations=True, + need_families=True, + need_graph=False, + need_partitions=True, + disable_bar=disable_bar, + ) logging.getLogger("PPanGGOLiN").info("Detecting multigenic families...") multigenics = pangenome.get_multigenics(dup_margin) logging.getLogger("PPanGGOLiN").info("Compute Regions of Genomic Plasticity ...") name_scheme = naming_scheme(pangenome.organisms) - for org in tqdm(pangenome.organisms, total=pangenome.number_of_organisms, unit="genomes", disable=disable_bar): - for region in compute_org_rgp(org, multigenics, persistent_penalty, variable_gain, min_length, - min_score, naming=name_scheme): + for org in tqdm( + pangenome.organisms, + total=pangenome.number_of_organisms, + unit="genomes", + disable=disable_bar, + ): + for region in compute_org_rgp( + org, + multigenics, + persistent_penalty, + variable_gain, + min_length, + min_score, + naming=name_scheme, + ): pangenome.add_region(region) logging.getLogger("PPanGGOLiN").info(f"Predicted {pangenome.number_of_rgp} RGP") @@ -302,7 +372,7 @@ def predict_rgp(pangenome: Pangenome, persistent_penalty: int = 3, variable_gain pangenome.parameters["rgp"]["min_length"] = min_length pangenome.parameters["rgp"]["min_score"] = min_score pangenome.parameters["rgp"]["dup_margin"] = dup_margin - pangenome.status['predictedRGP'] = "Computed" + pangenome.status["predictedRGP"] = "Computed" def launch(args: argparse.Namespace): @@ -313,10 +383,19 @@ def launch(args: argparse.Namespace): """ pangenome = Pangenome() pangenome.add_file(args.pangenome) - predict_rgp(pangenome, persistent_penalty=args.persistent_penalty, variable_gain=args.variable_gain, - min_length=args.min_length, min_score=args.min_score, dup_margin=args.dup_margin, force=args.force, - disable_bar=args.disable_prog_bar) - write_pangenome(pangenome, pangenome.file, args.force, disable_bar=args.disable_prog_bar) + predict_rgp( + pangenome, + persistent_penalty=args.persistent_penalty, + variable_gain=args.variable_gain, + min_length=args.min_length, + min_score=args.min_score, + dup_margin=args.dup_margin, + force=args.force, + disable_bar=args.disable_prog_bar, + ) + write_pangenome( + pangenome, pangenome.file, args.force, disable_bar=args.disable_prog_bar + ) def subparser(sub_parser: argparse._SubParsersAction) -> argparse.ArgumentParser: @@ -338,31 +417,61 @@ def parser_rgp(parser: argparse.ArgumentParser): :param parser: parser for align argument """ - required = parser.add_argument_group(title="Required arguments", - description="One of the following arguments is required :") - required.add_argument('-p', '--pangenome', required=False, type=Path, help="The pangenome .h5 file") + required = parser.add_argument_group( + title="Required arguments", + description="One of the following arguments is required :", + ) + required.add_argument( + "-p", "--pangenome", required=False, type=Path, help="The pangenome .h5 file" + ) optional = parser.add_argument_group(title="Optional arguments") - optional.add_argument('--persistent_penalty', required=False, type=int, default=3, - help="Penalty score to apply to persistent genes") - optional.add_argument('--variable_gain', required=False, type=int, default=1, - help="Gain score to apply to variable genes") - optional.add_argument('--min_score', required=False, type=int, default=4, - help="Minimal score wanted for considering a region as being a RGP") - optional.add_argument('--min_length', required=False, type=int, default=3000, - help="Minimum length (bp) of a region to be considered a RGP") - optional.add_argument("--dup_margin", required=False, type=restricted_float, default=0.05, - help="Minimum ratio of genomes where the family is present in which the family must " - "have multiple genes for it to be considered 'duplicated'") - - -if __name__ == '__main__': + optional.add_argument( + "--persistent_penalty", + required=False, + type=int, + default=3, + help="Penalty score to apply to persistent genes", + ) + optional.add_argument( + "--variable_gain", + required=False, + type=int, + default=1, + help="Gain score to apply to variable genes", + ) + optional.add_argument( + "--min_score", + required=False, + type=int, + default=4, + help="Minimal score wanted for considering a region as being a RGP", + ) + optional.add_argument( + "--min_length", + required=False, + type=int, + default=3000, + help="Minimum length (bp) of a region to be considered a RGP", + ) + optional.add_argument( + "--dup_margin", + required=False, + type=restricted_float, + default=0.05, + help="Minimum ratio of genomes where the family is present in which the family must " + "have multiple genes for it to be considered 'duplicated'", + ) + + +if __name__ == "__main__": """To test local change and allow using debugger""" from ppanggolin.utils import set_verbosity_level, add_common_arguments main_parser = argparse.ArgumentParser( description="Depicting microbial species diversity via a Partitioned PanGenome Graph Of Linked Neighbors", - formatter_class=argparse.RawTextHelpFormatter) + formatter_class=argparse.RawTextHelpFormatter, + ) parser_rgp(main_parser) add_common_arguments(main_parser) diff --git a/ppanggolin/RGP/rgp_cluster.py b/ppanggolin/RGP/rgp_cluster.py index b40f67da..b3924570 100644 --- a/ppanggolin/RGP/rgp_cluster.py +++ b/ppanggolin/RGP/rgp_cluster.py @@ -33,7 +33,13 @@ class IdenticalRegions: :param is_contig_border: A boolean indicating if the identical regions span across contig borders. """ - def __init__(self, name: str, identical_rgps: Set[Region], families: Set[GeneFamily], is_contig_border: bool): + def __init__( + self, + name: str, + identical_rgps: Set[Region], + families: Set[GeneFamily], + is_contig_border: bool, + ): if not isinstance(identical_rgps, set): raise TypeError("Expected 'identical_rgps' to be a set") else: @@ -56,7 +62,7 @@ def __init__(self, name: str, identical_rgps: Set[Region], families: Set[GeneFam Region.id_counter += 1 - def __eq__(self, other: 'IdenticalRegions') -> bool: + def __eq__(self, other: "IdenticalRegions") -> bool: """ Check if two IdenticalRegions objects are equal based on their families, identical regions, and contig border status. @@ -66,15 +72,22 @@ def __eq__(self, other: 'IdenticalRegions') -> bool: """ if not isinstance(other, IdenticalRegions): # don't attempt to compare against unrelated types - raise TypeError("'IdenticalRegions' type object was expected, " - f"but '{type(other)}' type object was provided.") + raise TypeError( + "'IdenticalRegions' type object was expected, " + f"but '{type(other)}' type object was provided." + ) - return (self.families == other.families and self.rgps == other.rgps and - self.is_contig_border == other.is_contig_border) + return ( + self.families == other.families + and self.rgps == other.rgps + and self.is_contig_border == other.is_contig_border + ) def __repr__(self): - return (f"IdenticalRegions(name='{self.name}', num_rgps={len(self.rgps)}, num_families={len(self.families)}," - f" is_contig_border={self.is_contig_border})") + return ( + f"IdenticalRegions(name='{self.name}', num_rgps={len(self.rgps)}, num_families={len(self.families)}," + f" is_contig_border={self.is_contig_border})" + ) def __str__(self): return self.name @@ -101,6 +114,7 @@ def genes(self): """ for rgp in self.rgps: yield from rgp.genes + @property def spots(self) -> Set[Spot]: """ @@ -114,13 +128,16 @@ def modules(self) -> Set[Module]: """ Return iterable of genes from all RGPs that are identical in families """ - modules = set() + modules = set() for rgp in self.rgps: modules |= rgp.modules return modules -def compute_grr(rgp_a_families: Set[GeneFamily], rgp_b_families: Set[GeneFamily], mode: Callable) -> float: + +def compute_grr( + rgp_a_families: Set[GeneFamily], rgp_b_families: Set[GeneFamily], mode: Callable +) -> float: """ Compute gene repertoire relatedness (GRR) between two rgp. Mode can be the function min to compute min GRR or max to compute max_grr @@ -132,7 +149,9 @@ def compute_grr(rgp_a_families: Set[GeneFamily], rgp_b_families: Set[GeneFamily] :return: GRR value between 0 and 1 """ - grr = len(rgp_a_families & rgp_b_families) / mode(len(rgp_a_families), len(rgp_b_families)) + grr = len(rgp_a_families & rgp_b_families) / mode( + len(rgp_a_families), len(rgp_b_families) + ) return grr @@ -147,7 +166,9 @@ def compute_jaccard_index(rgp_a_families: set, rgp_b_families: set) -> float: :return : Jaccard index """ - jaccard_index = len(rgp_a_families & rgp_b_families) / len(rgp_a_families | rgp_b_families) + jaccard_index = len(rgp_a_families & rgp_b_families) / len( + rgp_a_families | rgp_b_families + ) return jaccard_index @@ -167,15 +188,17 @@ def add_info_to_rgp_nodes(graph, regions: List[Region], region_to_spot: dict): region_attributes = {} for region in regions: - region_info = {"contig": region.contig.name, - 'genome': region.organism.name, - "name": region.name, - "genes_count": len(region), - "is_contig_border": region.is_contig_border, - "is_whole_contig": region.is_whole_contig, - "spot_id": get_spot_id(region, region_to_spot), - "modules": ';'.join({str(module) for module in region.modules}), - 'families_count': region.number_of_families} + region_info = { + "contig": region.contig.name, + "genome": region.organism.name, + "name": region.name, + "genes_count": len(region), + "is_contig_border": region.is_contig_border, + "is_whole_contig": region.is_whole_contig, + "spot_id": get_spot_id(region, region_to_spot), + "modules": ";".join({str(module) for module in region.modules}), + "families_count": region.number_of_families, + } region_attributes[region.ID] = region_info @@ -185,7 +208,7 @@ def add_info_to_rgp_nodes(graph, regions: List[Region], region_to_spot: dict): return region_attributes -def join_dicts(dicts: List[Dict[str, Any]], delimiter: str = ';') -> Dict[str, Any]: +def join_dicts(dicts: List[Dict[str, Any]], delimiter: str = ";") -> Dict[str, Any]: """ Join dictionaries by concatenating the values with a custom delimiter for common keys. @@ -217,12 +240,18 @@ def format_rgp_metadata(rgp: Region) -> Dict[str, str]: for rgp_metadata in rgp.metadata: source = rgp_metadata.source for field in rgp_metadata.fields: - source_field_2_value[f"{source}_{field}"].append(str(rgp_metadata.get(field))) + source_field_2_value[f"{source}_{field}"].append( + str(rgp_metadata.get(field)) + ) - return {col_name: '|'.join(values) for col_name, values in source_field_2_value.items()} + return { + col_name: "|".join(values) for col_name, values in source_field_2_value.items() + } -def add_rgp_metadata_to_graph(graph: nx.Graph, rgps: List[Union[Region, IdenticalRegions]]) -> None: +def add_rgp_metadata_to_graph( + graph: nx.Graph, rgps: List[Union[Region, IdenticalRegions]] +) -> None: """ Add metadata from Region or IdenticalRegions objects to the graph. @@ -231,41 +260,62 @@ def add_rgp_metadata_to_graph(graph: nx.Graph, rgps: List[Union[Region, Identica """ for rgp in rgps: - element_to_metadata_sources = {"family":set(), "gene":set(), "module":set(), "spot":set()} - + element_to_metadata_sources = { + "family": set(), + "gene": set(), + "module": set(), + "spot": set(), + } for family in rgp.families: - element_to_metadata_sources["family"] |= {metadata.source for metadata in family.metadata} + element_to_metadata_sources["family"] |= { + metadata.source for metadata in family.metadata + } if family.module: - element_to_metadata_sources["module"] |= {metadata.source for metadata in family.module.metadata} + element_to_metadata_sources["module"] |= { + metadata.source for metadata in family.module.metadata + } for gene in rgp.genes: - element_to_metadata_sources["gene"] |= {metadata.source for metadata in gene.metadata} + element_to_metadata_sources["gene"] |= { + metadata.source for metadata in gene.metadata + } if isinstance(rgp, Region): rgp_metadata = rgp.formatted_metadata_dict() if rgp.spot is not None: - element_to_metadata_sources["spot"] = {metadata.source for metadata in rgp.spot.metadata} + element_to_metadata_sources["spot"] = { + metadata.source for metadata in rgp.spot.metadata + } elif isinstance(rgp, IdenticalRegions): - rgp_metadata_dicts = [ident_rgp.formatted_metadata_dict() for ident_rgp in rgp.rgps] + rgp_metadata_dicts = [ + ident_rgp.formatted_metadata_dict() for ident_rgp in rgp.rgps + ] rgp_metadata = join_dicts(rgp_metadata_dicts) - element_to_metadata_sources["spot"] |= {metadata.source for spot in rgp.spots for metadata in spot.metadata} + element_to_metadata_sources["spot"] |= { + metadata.source for spot in rgp.spots for metadata in spot.metadata + } else: - raise TypeError(f'Expect Region or IdenticalRegions object, not {type(rgp)}') + raise TypeError( + f"Expect Region or IdenticalRegions object, not {type(rgp)}" + ) for element, metadata_sources in element_to_metadata_sources.items(): for source in metadata_sources: - graph.nodes[rgp.ID][f'has_{element}_with_{source}'] = True + graph.nodes[rgp.ID][f"has_{element}_with_{source}"] = True for metadata_name, value in rgp_metadata.items(): graph.nodes[rgp.ID][metadata_name] = value -def add_info_to_identical_rgps(rgp_graph: nx.Graph, identical_rgps_objects: List[IdenticalRegions], - rgp_to_spot: Dict[Region, int]): +def add_info_to_identical_rgps( + rgp_graph: nx.Graph, + identical_rgps_objects: List[IdenticalRegions], + rgp_to_spot: Dict[Region, int], +): """ Add identical rgps info in the graph as node attributes. @@ -274,27 +324,41 @@ def add_info_to_identical_rgps(rgp_graph: nx.Graph, identical_rgps_objects: List """ for identical_rgp_obj in identical_rgps_objects: - spots_of_identical_rgp_obj = {get_spot_id(i_rgp, rgp_to_spot) for i_rgp in identical_rgp_obj.rgps} - - rgp_graph.add_node(identical_rgp_obj.ID, - identical_rgp_group=True, - name=identical_rgp_obj.name, - families_count=len(identical_rgp_obj.families), - identical_rgp_count=len(identical_rgp_obj.rgps), - identical_rgp_names=';'.join(i_rgp.name for i_rgp in identical_rgp_obj.rgps), - identical_rgp_genomes=';'.join({i_rgp.organism.name for i_rgp in identical_rgp_obj.rgps}), - identical_rgp_contig_border_count=len( - [True for i_rgp in identical_rgp_obj.rgps if i_rgp.is_contig_border]), - identical_rgp_whole_contig_count=len( - [True for i_rgp in identical_rgp_obj.rgps if i_rgp.is_whole_contig]), - identical_rgp_spots=";".join(spots_of_identical_rgp_obj), - spot_id=spots_of_identical_rgp_obj.pop() if len( - spots_of_identical_rgp_obj) == 1 else "Multiple spots", - modules = ';'.join({str(module) for module in identical_rgp_obj.modules}), - ) - - -def add_edges_to_identical_rgps(rgp_graph: nx.Graph, identical_rgps_objects: List[IdenticalRegions]): + spots_of_identical_rgp_obj = { + get_spot_id(i_rgp, rgp_to_spot) for i_rgp in identical_rgp_obj.rgps + } + + rgp_graph.add_node( + identical_rgp_obj.ID, + identical_rgp_group=True, + name=identical_rgp_obj.name, + families_count=len(identical_rgp_obj.families), + identical_rgp_count=len(identical_rgp_obj.rgps), + identical_rgp_names=";".join( + i_rgp.name for i_rgp in identical_rgp_obj.rgps + ), + identical_rgp_genomes=";".join( + {i_rgp.organism.name for i_rgp in identical_rgp_obj.rgps} + ), + identical_rgp_contig_border_count=len( + [True for i_rgp in identical_rgp_obj.rgps if i_rgp.is_contig_border] + ), + identical_rgp_whole_contig_count=len( + [True for i_rgp in identical_rgp_obj.rgps if i_rgp.is_whole_contig] + ), + identical_rgp_spots=";".join(spots_of_identical_rgp_obj), + spot_id=( + spots_of_identical_rgp_obj.pop() + if len(spots_of_identical_rgp_obj) == 1 + else "Multiple spots" + ), + modules=";".join({str(module) for module in identical_rgp_obj.modules}), + ) + + +def add_edges_to_identical_rgps( + rgp_graph: nx.Graph, identical_rgps_objects: List[IdenticalRegions] +): """ Replace identical rgp objects by all identical RGPs it contains. @@ -302,26 +366,35 @@ def add_edges_to_identical_rgps(rgp_graph: nx.Graph, identical_rgps_objects: Lis :param identical_rgps_objects: A dictionary mapping RGPs to sets of identical RGPs. """ - identical_edge_data = {'grr': 1.0, 'max_grr': 1.0, - 'min_grr': 1.0, - "identical_famillies": True} + identical_edge_data = { + "grr": 1.0, + "max_grr": 1.0, + "min_grr": 1.0, + "identical_famillies": True, + } added_identical_rgps = [] for identical_rgp_obj in identical_rgps_objects: - rgp_graph.add_nodes_from([ident_rgp.ID for ident_rgp in identical_rgp_obj.rgps], - identical_rgp_group=identical_rgp_obj.name) + rgp_graph.add_nodes_from( + [ident_rgp.ID for ident_rgp in identical_rgp_obj.rgps], + identical_rgp_group=identical_rgp_obj.name, + ) # add edge between identical rgp with metrics at one (perfect score) - edges_to_add = [(rgp_a.ID, rgp_b.ID, identical_edge_data) - for rgp_a, rgp_b in combinations(identical_rgp_obj.rgps, 2)] + edges_to_add = [ + (rgp_a.ID, rgp_b.ID, identical_edge_data) + for rgp_a, rgp_b in combinations(identical_rgp_obj.rgps, 2) + ] # replicate all edges that connect identical rgp object to other rgps for connected_rgp in rgp_graph.neighbors(identical_rgp_obj.ID): edge_data = rgp_graph[identical_rgp_obj.ID][connected_rgp] - edges_to_add += [(identical_rgp.ID, connected_rgp, edge_data) - for identical_rgp in identical_rgp_obj.rgps] + edges_to_add += [ + (identical_rgp.ID, connected_rgp, edge_data) + for identical_rgp in identical_rgp_obj.rgps + ] rgp_graph.add_edges_from(edges_to_add) @@ -333,8 +406,9 @@ def add_edges_to_identical_rgps(rgp_graph: nx.Graph, identical_rgps_objects: Lis return added_identical_rgps -def dereplicate_rgp(rgps: Set[Union[Region, IdenticalRegions]], - disable_bar: bool = False) -> List[Union[Region, IdenticalRegions]]: +def dereplicate_rgp( + rgps: Set[Union[Region, IdenticalRegions]], disable_bar: bool = False +) -> List[Union[Region, IdenticalRegions]]: """ Dereplicate RGPs that have the same families. @@ -347,7 +421,7 @@ def dereplicate_rgp(rgps: Set[Union[Region, IdenticalRegions]], :return: A list of dereplicated RGPs (Region or IdenticalRegions objects). For RGPs with the same families, they will be grouped together in IdenticalRegions objects. """ - logging.info(f'Dereplicating {len(rgps)} RGPs') + logging.info(f"Dereplicating {len(rgps)} RGPs") families_to_rgps = defaultdict(list) for rgp in tqdm(rgps, total=len(rgps), unit="RGP", disable=disable_bar): @@ -365,21 +439,22 @@ def dereplicate_rgp(rgps: Set[Union[Region, IdenticalRegions]], is_contig_border = all(rgp.is_contig_border for rgp in rgps) # create a new object that will represent the identical rgps - identical_rgp = IdenticalRegions(name=f"identical_rgps_{identical_region_count}", - identical_rgps=set(rgps), - families=families, - is_contig_border=is_contig_border) + identical_rgp = IdenticalRegions( + name=f"identical_rgps_{identical_region_count}", + identical_rgps=set(rgps), + families=families, + is_contig_border=is_contig_border, + ) identical_region_count += 1 dereplicated_rgps.append(identical_rgp) - logging.info(f'{len(dereplicated_rgps)} unique RGPs') + logging.info(f"{len(dereplicated_rgps)} unique RGPs") return dereplicated_rgps -def compute_rgp_metric(rgp_a: Region, - rgp_b: Region, - grr_cutoff: float, - grr_metric: str) -> Union[Tuple[int, int, dict], None]: +def compute_rgp_metric( + rgp_a: Region, rgp_b: Region, grr_cutoff: float, grr_metric: str +) -> Union[Tuple[int, int, dict], None]: """ Compute GRR metric between two RGPs. @@ -395,16 +470,22 @@ def compute_rgp_metric(rgp_a: Region, # RGP at a contig border are seen as incomplete and min GRR is used instead of max GRR if rgp_a.is_contig_border or rgp_b.is_contig_border: - edge_metrics["incomplete_aware_grr"] = compute_grr(set(rgp_a.families), set(rgp_b.families), min) + edge_metrics["incomplete_aware_grr"] = compute_grr( + set(rgp_a.families), set(rgp_b.families), min + ) else: - edge_metrics["incomplete_aware_grr"] = compute_grr(set(rgp_a.families), set(rgp_b.families), max) + edge_metrics["incomplete_aware_grr"] = compute_grr( + set(rgp_a.families), set(rgp_b.families), max + ) # Compute max and min GRR metrics - edge_metrics['max_grr'] = compute_grr(set(rgp_a.families), set(rgp_b.families), max) - edge_metrics['min_grr'] = compute_grr(set(rgp_a.families), set(rgp_b.families), min) + edge_metrics["max_grr"] = compute_grr(set(rgp_a.families), set(rgp_b.families), max) + edge_metrics["min_grr"] = compute_grr(set(rgp_a.families), set(rgp_b.families), min) # The number of shared families can be useful when visualizing the graph - edge_metrics['shared_family'] = len(set(rgp_a.families).intersection(set(rgp_b.families))) + edge_metrics["shared_family"] = len( + set(rgp_a.families).intersection(set(rgp_b.families)) + ) # Only return the metrics if the GRR value is above the cutoff if edge_metrics[grr_metric] >= grr_cutoff: @@ -413,22 +494,25 @@ def compute_rgp_metric(rgp_a: Region, def cluster_rgp_on_grr(graph: nx.Graph, clustering_attribute: str = "grr"): """ - Cluster rgp based on grr using louvain communities clustering. + Cluster rgp based on grr using louvain communities clustering. :param graph: NetworkX graph object representing the RGPs and their relationship :param clustering_attribute: Attribute of the graph to use for clustering (default is "grr") """ partitions = nx.algorithms.community.louvain_communities( - graph, weight=clustering_attribute) + graph, weight=clustering_attribute + ) # Add partition index in node attributes for i, cluster_nodes in enumerate(partitions): nx.set_node_attributes( - graph, {node: f"cluster_{i}" for node in cluster_nodes}, name=f"{clustering_attribute}_cluster") + graph, + {node: f"cluster_{i}" for node in cluster_nodes}, + name=f"{clustering_attribute}_cluster", + ) - logging.info( - f"Graph has {len(partitions)} clusters using {clustering_attribute}") + logging.info(f"Graph has {len(partitions)} clusters using {clustering_attribute}") def get_spot_id(rgp: Region, rgp_to_spot: Dict[Region, int]) -> str: @@ -448,10 +532,13 @@ def get_spot_id(rgp: Region, rgp_to_spot: Dict[Region, int]) -> str: return "No spot" -def write_rgp_cluster_table(outfile: str, grr_graph: nx.Graph, - rgps_in_graph: List[Union[Region, IdenticalRegions]], - grr_metric: str, - rgp_to_spot: Dict[Region, int]) -> None: +def write_rgp_cluster_table( + outfile: str, + grr_graph: nx.Graph, + rgps_in_graph: List[Union[Region, IdenticalRegions]], + grr_metric: str, + rgp_to_spot: Dict[Region, int], +) -> None: """ Writes RGP cluster info to a TSV file using pandas. @@ -465,20 +552,35 @@ def write_rgp_cluster_table(outfile: str, grr_graph: nx.Graph, all_rgps_infos = [] for rgp_in_graph in rgps_in_graph: - cluster = grr_graph.nodes[rgp_in_graph.ID][f'{grr_metric}_cluster'] + cluster = grr_graph.nodes[rgp_in_graph.ID][f"{grr_metric}_cluster"] - identical_rgps = [rgp_in_graph] if isinstance(rgp_in_graph, Region) else rgp_in_graph.rgps + identical_rgps = ( + [rgp_in_graph] if isinstance(rgp_in_graph, Region) else rgp_in_graph.rgps + ) - all_rgps_infos += [{"RGPs": r.name, "cluster": cluster, - "spot_id": get_spot_id(r, rgp_to_spot)} for r in identical_rgps] + all_rgps_infos += [ + {"RGPs": r.name, "cluster": cluster, "spot_id": get_spot_id(r, rgp_to_spot)} + for r in identical_rgps + ] df = pd.DataFrame(all_rgps_infos) - df.to_csv(outfile, sep='\t', index=False) - - -def cluster_rgp(pangenome, grr_cutoff: float, output: str, basename: str, - ignore_incomplete_rgp: bool, unmerge_identical_rgps: bool, grr_metric: str, - disable_bar: bool, graph_formats: Set[str],add_metadata: bool = False, metadata_sep: str = "|", metadata_sources: List[str] = None,): + df.to_csv(outfile, sep="\t", index=False) + + +def cluster_rgp( + pangenome, + grr_cutoff: float, + output: str, + basename: str, + ignore_incomplete_rgp: bool, + unmerge_identical_rgps: bool, + grr_metric: str, + disable_bar: bool, + graph_formats: Set[str], + add_metadata: bool = False, + metadata_sep: str = "|", + metadata_sources: List[str] = None, +): """ Main function to cluster regions of genomic plasticity based on their GRR @@ -505,43 +607,64 @@ def cluster_rgp(pangenome, grr_cutoff: float, output: str, basename: str, sources_to_use = set(pangenome.status["metasources"][element]) if metadata_sources is not None: - if len(set(pangenome.status["metasources"][element]) & set(metadata_sources)) == 0: - logging.info(f'Metadata for {element} found in pangenome, but none match the specified sources {metadata_sources}. ' - f'Current source for {element}: {sources_to_use}.') + if ( + len( + set(pangenome.status["metasources"][element]) + & set(metadata_sources) + ) + == 0 + ): + logging.info( + f"Metadata for {element} found in pangenome, but none match the specified sources {metadata_sources}. " + f"Current source for {element}: {sources_to_use}." + ) continue else: - sources_to_use = set(pangenome.status["metasources"][element]) & set(metadata_sources) + sources_to_use = set( + pangenome.status["metasources"][element] + ) & set(metadata_sources) need_metadata = True metatypes.add(element) - logging.info(f'Metadata for {element} found in pangenome with sources {sources_to_use}. They will be included in the RGP graph.') + logging.info( + f"Metadata for {element} found in pangenome with sources {sources_to_use}. They will be included in the RGP graph." + ) # check statuses and load info - check_pangenome_info(pangenome, need_families=True, need_annotations=True, - disable_bar=disable_bar, need_rgp=True, need_spots=True, need_modules=True, - need_metadata=need_metadata, - sources= metadata_sources, - metatypes=metatypes) + check_pangenome_info( + pangenome, + need_families=True, + need_annotations=True, + disable_bar=disable_bar, + need_rgp=True, + need_spots=True, + need_modules=True, + need_metadata=need_metadata, + sources=metadata_sources, + metatypes=metatypes, + ) if pangenome.regions == 0: raise Exception( - "The pangenome has no RGPs. The clustering of RGP is then not possible.") + "The pangenome has no RGPs. The clustering of RGP is then not possible." + ) # add all rgp as node if ignore_incomplete_rgp: - valid_rgps = [ - rgp for rgp in pangenome.regions if not rgp.is_contig_border] + valid_rgps = [rgp for rgp in pangenome.regions if not rgp.is_contig_border] ignored_rgp_count = pangenome.number_of_rgp - len(valid_rgps) total_rgp_count = pangenome.number_of_rgp logging.info( - f'Ignoring {ignored_rgp_count}/{total_rgp_count} ({100 * ignored_rgp_count / total_rgp_count:.2f}%) ' - 'RGPs that are located at a contig border and are likely incomplete.') + f"Ignoring {ignored_rgp_count}/{total_rgp_count} ({100 * ignored_rgp_count / total_rgp_count:.2f}%) " + "RGPs that are located at a contig border and are likely incomplete." + ) if len(valid_rgps) == 0: raise Exception( - "The pangenome has no complete RGPs. The clustering of RGP is then not possible.") + "The pangenome has no complete RGPs. The clustering of RGP is then not possible." + ) else: valid_rgps = set(pangenome.regions) @@ -563,8 +686,7 @@ def cluster_rgp(pangenome, grr_cutoff: float, output: str, basename: str, pairs_count = len(rgp_pairs) - logging.info( - f'Computing GRR metric for {pairs_count:,} pairs of RGP.') + logging.info(f"Computing GRR metric for {pairs_count:,} pairs of RGP.") pairs_of_rgps_metrics = [] @@ -577,26 +699,34 @@ def cluster_rgp(pangenome, grr_cutoff: float, output: str, basename: str, grr_graph.add_edges_from(pairs_of_rgps_metrics) - identical_rgps_objects = [rgp for rgp in dereplicated_rgps if isinstance(rgp, IdenticalRegions)] + identical_rgps_objects = [ + rgp for rgp in dereplicated_rgps if isinstance(rgp, IdenticalRegions) + ] rgp_objects_in_graph = [rgp for rgp in dereplicated_rgps if isinstance(rgp, Region)] if unmerge_identical_rgps: - rgp_objects_in_graph += add_edges_to_identical_rgps(grr_graph, identical_rgps_objects) + rgp_objects_in_graph += add_edges_to_identical_rgps( + grr_graph, identical_rgps_objects + ) # cluster rgp based on grr value logging.info( - f"Louvain_communities clustering of RGP based on {grr_metric} on {grr_graph}.") + f"Louvain_communities clustering of RGP based on {grr_metric} on {grr_graph}." + ) cluster_rgp_on_grr(grr_graph, grr_metric) - rgp_to_spot = {region: int(spot.ID) - for spot in pangenome.spots for region in spot.regions} + rgp_to_spot = { + region: int(spot.ID) for spot in pangenome.spots for region in spot.regions + } if not unmerge_identical_rgps: logging.info("Add info on identical RGPs merged in the graph") add_info_to_identical_rgps(grr_graph, identical_rgps_objects, rgp_to_spot) - rgps_in_graph = rgp_objects_in_graph if unmerge_identical_rgps else dereplicated_rgps + rgps_in_graph = ( + rgp_objects_in_graph if unmerge_identical_rgps else dereplicated_rgps + ) # add some attribute to the graph nodes. logging.info("Add RGP information to the graph") @@ -619,8 +749,7 @@ def cluster_rgp(pangenome, grr_cutoff: float, output: str, basename: str, outfile = os.path.join(output, f"{basename}.tsv") logging.info(f"Writing rgp clusters in tsv format in {outfile}") - write_rgp_cluster_table( - outfile, grr_graph, rgps_in_graph, grr_metric, rgp_to_spot) + write_rgp_cluster_table(outfile, grr_graph, rgps_in_graph, grr_metric, rgp_to_spot) def launch(args: argparse.Namespace): @@ -635,11 +764,20 @@ def launch(args: argparse.Namespace): pangenome.add_file(args.pangenome) - cluster_rgp(pangenome, grr_cutoff=args.grr_cutoff, output=args.output, - basename=args.basename, ignore_incomplete_rgp=args.ignore_incomplete_rgp, - unmerge_identical_rgps=args.no_identical_rgp_merging, - grr_metric=args.grr_metric, disable_bar=args.disable_prog_bar, graph_formats=args.graph_formats, - add_metadata=args.add_metadata, metadata_sep=args.metadata_sep, metadata_sources=args.metadata_sources) + cluster_rgp( + pangenome, + grr_cutoff=args.grr_cutoff, + output=args.output, + basename=args.basename, + ignore_incomplete_rgp=args.ignore_incomplete_rgp, + unmerge_identical_rgps=args.no_identical_rgp_merging, + grr_metric=args.grr_metric, + disable_bar=args.disable_prog_bar, + graph_formats=args.graph_formats, + add_metadata=args.add_metadata, + metadata_sep=args.metadata_sep, + metadata_sources=args.metadata_sources, + ) def subparser(sub_parser: argparse._SubParsersAction) -> argparse.ArgumentParser: @@ -651,7 +789,8 @@ def subparser(sub_parser: argparse._SubParsersAction) -> argparse.ArgumentParser :return : Parser arguments for cluster_rgp command """ parser = sub_parser.add_parser( - "rgp_cluster", formatter_class=argparse.RawTextHelpFormatter) + "rgp_cluster", formatter_class=argparse.RawTextHelpFormatter + ) parser_cluster_rgp(parser) return parser @@ -662,59 +801,103 @@ def parser_cluster_rgp(parser: argparse.ArgumentParser): :param parser: Parser for cluster_rgp argument """ - required = parser.add_argument_group(title="Required arguments", - description="One of the following arguments is required :") - required.add_argument('-p', '--pangenome', required=True, - type=Path, help="The pangenome .h5 file") + required = parser.add_argument_group( + title="Required arguments", + description="One of the following arguments is required :", + ) + required.add_argument( + "-p", "--pangenome", required=True, type=Path, help="The pangenome .h5 file" + ) optional = parser.add_argument_group(title="Optional arguments") - optional.add_argument('--grr_cutoff', required=False, type=restricted_float, default=0.8, - help="Min gene repertoire relatedness metric used in the rgp clustering") - optional.add_argument('--grr_metric', required=False, type=str, default="incomplete_aware_grr", - help="The grr (Gene Repertoire Relatedness) is used to assess the similarity between two " - "RGPs based on their gene families." - "There are three different modes for calculating the grr value: 'min_grr', 'max_grr' " - "or 'incomplete_aware_grr'." - "'min_grr': Computes the number of gene families shared between the two RGPs and " - "divides it by the smaller number of gene families among the two RGPs." - "'max_grr': Calculates the number of gene families shared between the two RGPs and " - "divides it by the larger number of gene families among the two RGPs." - "'incomplete_aware_grr' (default): If at least one RGP is considered incomplete, " - "which occurs when it is located at the border of a contig," - "the 'min_grr' mode is used. Otherwise, the 'max_grr' mode is applied.", - choices=['incomplete_aware_grr', "min_grr", "max_grr"]) - - optional.add_argument('--ignore_incomplete_rgp', required=False, action="store_true", - help="Do not cluster RGPs located on a contig border which are likely incomplete.") - - optional.add_argument('--no_identical_rgp_merging', required=False, action="store_true", - help="Do not merge in one node identical RGP " - "(i.e. having the same family content) before clustering.") - - optional.add_argument("--basename", required=False, - default="rgp_cluster", help="basename for the output file") - - optional.add_argument('-o', '--output', required=False, type=Path, - default="rgp_clustering", help="Output directory") - - optional.add_argument('--graph_formats', required=False, type=str, choices=['gexf', "graphml"], nargs="+", - default=['gexf', 'graphml'], help="Format of the output graph.") - - optional.add_argument("--add_metadata", - required=False, - action="store_true", - help="Include metadata information in the output files " - "if any have been added to pangenome elements (see ppanggolin metadata command).") - - optional.add_argument("--metadata_sources", - default=None, - nargs="+", - help="Which source of metadata should be written. " - "By default all metadata sources are included.") - - optional.add_argument("--metadata_sep", - required=False, - default='|', - help="The separator used to join multiple metadata values for elements with multiple metadata" - " values from the same source. This character should not appear in metadata values.") + optional.add_argument( + "--grr_cutoff", + required=False, + type=restricted_float, + default=0.8, + help="Min gene repertoire relatedness metric used in the rgp clustering", + ) + optional.add_argument( + "--grr_metric", + required=False, + type=str, + default="incomplete_aware_grr", + help="The grr (Gene Repertoire Relatedness) is used to assess the similarity between two " + "RGPs based on their gene families." + "There are three different modes for calculating the grr value: 'min_grr', 'max_grr' " + "or 'incomplete_aware_grr'." + "'min_grr': Computes the number of gene families shared between the two RGPs and " + "divides it by the smaller number of gene families among the two RGPs." + "'max_grr': Calculates the number of gene families shared between the two RGPs and " + "divides it by the larger number of gene families among the two RGPs." + "'incomplete_aware_grr' (default): If at least one RGP is considered incomplete, " + "which occurs when it is located at the border of a contig," + "the 'min_grr' mode is used. Otherwise, the 'max_grr' mode is applied.", + choices=["incomplete_aware_grr", "min_grr", "max_grr"], + ) + + optional.add_argument( + "--ignore_incomplete_rgp", + required=False, + action="store_true", + help="Do not cluster RGPs located on a contig border which are likely incomplete.", + ) + + optional.add_argument( + "--no_identical_rgp_merging", + required=False, + action="store_true", + help="Do not merge in one node identical RGP " + "(i.e. having the same family content) before clustering.", + ) + + optional.add_argument( + "--basename", + required=False, + default="rgp_cluster", + help="basename for the output file", + ) + + optional.add_argument( + "-o", + "--output", + required=False, + type=Path, + default="rgp_clustering", + help="Output directory", + ) + + optional.add_argument( + "--graph_formats", + required=False, + type=str, + choices=["gexf", "graphml"], + nargs="+", + default=["gexf", "graphml"], + help="Format of the output graph.", + ) + + optional.add_argument( + "--add_metadata", + required=False, + action="store_true", + help="Include metadata information in the output files " + "if any have been added to pangenome elements (see ppanggolin metadata command).", + ) + + optional.add_argument( + "--metadata_sources", + default=None, + nargs="+", + help="Which source of metadata should be written. " + "By default all metadata sources are included.", + ) + + optional.add_argument( + "--metadata_sep", + required=False, + default="|", + help="The separator used to join multiple metadata values for elements with multiple metadata" + " values from the same source. This character should not appear in metadata values.", + ) diff --git a/ppanggolin/RGP/spot.py b/ppanggolin/RGP/spot.py index 5de9423f..df76e480 100644 --- a/ppanggolin/RGP/spot.py +++ b/ppanggolin/RGP/spot.py @@ -19,8 +19,13 @@ from ppanggolin.utils import mk_outdir -def comp_border(border1: list, border2: list, overlapping_match: int = 2, - set_size: int = 3, exact_match: int = 1) -> bool: +def comp_border( + border1: list, + border2: list, + overlapping_match: int = 2, + set_size: int = 3, + exact_match: int = 1, +) -> bool: """ Compare two border @@ -36,16 +41,21 @@ def comp_border(border1: list, border2: list, overlapping_match: int = 2, return True elif len(border1) == set_size and len(border2) == set_size: for ikb in range(1, set_size - overlapping_match + 1): - if border1[0:len(border2[ikb:])] == border2[ikb:]: + if border1[0 : len(border2[ikb:])] == border2[ikb:]: return True for ib in range(1, set_size - overlapping_match + 1): - if border1[ib:] == border2[0:len(border1[ib:])]: + if border1[ib:] == border2[0 : len(border1[ib:])]: return True return False -def check_sim(pair_border1: list, pair_border2: list, overlapping_match: int = 2, - set_size: int = 3, exact_match: int = 1) -> bool: +def check_sim( + pair_border1: list, + pair_border2: list, + overlapping_match: int = 2, + set_size: int = 3, + exact_match: int = 1, +) -> bool: """ Checks if the two pairs of exact_match first gene families are identical, or eventually if they overlap in an ordered way at least 'overlapping_match' @@ -80,8 +90,15 @@ def add_new_node_in_spot_graph(g: nx.Graph, region: Region, borders: list) -> st :param borders: bordering families in spot :return blocks: name of the node that has been added """ - blocks = str(sorted([[gene.family.ID for gene in borders[0]], [gene.family.ID for gene in borders[1]]], - key=lambda x: x[0])) + blocks = str( + sorted( + [ + [gene.family.ID for gene in borders[0]], + [gene.family.ID for gene in borders[1]], + ], + key=lambda x: x[0], + ) + ) g.add_node(blocks) try: g.nodes[blocks]["nb_rgp"] += 1 @@ -95,8 +112,13 @@ def add_new_node_in_spot_graph(g: nx.Graph, region: Region, borders: list) -> st return blocks -def make_spot_graph(rgps: list, multigenics: set, overlapping_match: int = 2, - set_size: int = 3, exact_match: int = 1) -> nx.Graph: +def make_spot_graph( + rgps: list, + multigenics: set, + overlapping_match: int = 2, + set_size: int = 3, + exact_match: int = 1, +) -> nx.Graph: """ Create a spot graph from pangenome RGP @@ -119,17 +141,28 @@ def make_spot_graph(rgps: list, multigenics: set, overlapping_match: int = 2, else: used += 1 add_new_node_in_spot_graph(graph_spot, rgp, border) - logging.getLogger("PPanGGOLiN").info(f"{lost} RGPs were not used as they are on a contig border (or have " - f"less than {set_size} persistent gene families until the contig border)") - logging.getLogger("PPanGGOLiN").info(f"{used} RGPs are being used to predict spots of insertion") + logging.getLogger("PPanGGOLiN").info( + f"{lost} RGPs were not used as they are on a contig border (or have " + f"less than {set_size} persistent gene families until the contig border)" + ) + logging.getLogger("PPanGGOLiN").info( + f"{used} RGPs are being used to predict spots of insertion" + ) node_list = list(graph_spot.nodes) - logging.getLogger("PPanGGOLiN").info(f"{len(node_list)} number of different pairs of flanking gene families") + logging.getLogger("PPanGGOLiN").info( + f"{len(node_list)} number of different pairs of flanking gene families" + ) for i, nodei in enumerate(node_list[:-1]): - for nodej in node_list[i + 1:]: + for nodej in node_list[i + 1 :]: node_obj_i = graph_spot.nodes[nodei] node_obj_j = graph_spot.nodes[nodej] - if check_sim([node_obj_i["border0"], node_obj_i["border1"]], [node_obj_j["border0"], node_obj_j["border1"]], - overlapping_match, set_size, exact_match): + if check_sim( + [node_obj_i["border0"], node_obj_i["border1"]], + [node_obj_j["border0"], node_obj_j["border1"]], + overlapping_match, + set_size, + exact_match, + ): graph_spot.add_edge(nodei, nodej) return graph_spot @@ -137,20 +170,28 @@ def make_spot_graph(rgps: list, multigenics: set, overlapping_match: int = 2, def write_spot_graph(graph_spot, outdir, graph_formats, file_basename="spotGraph"): for node in graph_spot.nodes: - graph_spot.nodes[node]["border0"] = ';'.join([fam.name for fam in graph_spot.nodes[node]["border0"]]) - graph_spot.nodes[node]["border1"] = ';'.join([fam.name for fam in graph_spot.nodes[node]["border1"]]) - - graph_spot.nodes[node]["genomes"] = ';'.join({rgp.organism.name for rgp in graph_spot.nodes[node]["rgp"]}) - graph_spot.nodes[node]["rgp"] = ';'.join([rgp.name for rgp in graph_spot.nodes[node]["rgp"]]) + graph_spot.nodes[node]["border0"] = ";".join( + [fam.name for fam in graph_spot.nodes[node]["border0"]] + ) + graph_spot.nodes[node]["border1"] = ";".join( + [fam.name for fam in graph_spot.nodes[node]["border1"]] + ) + + graph_spot.nodes[node]["genomes"] = ";".join( + {rgp.organism.name for rgp in graph_spot.nodes[node]["rgp"]} + ) + graph_spot.nodes[node]["rgp"] = ";".join( + [rgp.name for rgp in graph_spot.nodes[node]["rgp"]] + ) if "gexf" in graph_formats: outfile = outdir / f"{file_basename}.gexf" - logging.getLogger("PPanGGOLiN").info(f'Writing spot graph in {outfile}') + logging.getLogger("PPanGGOLiN").info(f"Writing spot graph in {outfile}") nx.readwrite.gexf.write_gexf(graph_spot, outfile) if "graphml" in graph_formats: outfile = outdir / f"{file_basename}.graphml" - logging.getLogger("PPanGGOLiN").info(f'Writing spot graph in {outfile}') + logging.getLogger("PPanGGOLiN").info(f"Writing spot graph in {outfile}") nx.readwrite.graphml.write_graphml(graph_spot, outfile) @@ -162,15 +203,25 @@ def check_pangenome_former_spots(pangenome: Pangenome, force: bool = False): :param force: Allow to force write on Pangenome file """ if pangenome.status["spots"] == "inFile" and not force: - raise Exception("You are trying to detect spots on a pangenome which already has predicted spots. " - "If you REALLY want to do that, use --force (it will erase spots previously predicted).") + raise Exception( + "You are trying to detect spots on a pangenome which already has predicted spots. " + "If you REALLY want to do that, use --force (it will erase spots previously predicted)." + ) elif pangenome.status["spots"] == "inFile" and force: erase_pangenome(pangenome, spots=True) -def predict_hotspots(pangenome: Pangenome, output: Path, spot_graph: bool = False, graph_formats: List[str] = ['gexf'], - overlapping_match: int = 2, - set_size: int = 3, exact_match: int = 1, force: bool = False, disable_bar: bool = False): +def predict_hotspots( + pangenome: Pangenome, + output: Path, + spot_graph: bool = False, + graph_formats: List[str] = ["gexf"], + overlapping_match: int = 2, + set_size: int = 3, + exact_match: int = 1, + force: bool = False, + disable_bar: bool = False, +): """ Main function to predict hotspot @@ -186,16 +237,26 @@ def predict_hotspots(pangenome: Pangenome, output: Path, spot_graph: bool = Fals """ # check that given parameters for hotspot computation make sense if overlapping_match >= set_size: - raise Exception(f'--overlapping_match_hotspot ({overlapping_match}) cannot be bigger than (or equal to) ' - f'--set_size_hotspot ({set_size})') + raise Exception( + f"--overlapping_match_hotspot ({overlapping_match}) cannot be bigger than (or equal to) " + f"--set_size_hotspot ({set_size})" + ) if exact_match > set_size: - raise Exception(f'--exact_match_size_hotspot ({exact_match}) cannot be bigger than ' - f'--set_size_hotspot ({set_size})') + raise Exception( + f"--exact_match_size_hotspot ({exact_match}) cannot be bigger than " + f"--set_size_hotspot ({set_size})" + ) # check for formerly computed stuff, and erase if allowed check_pangenome_former_spots(pangenome, force) # check statuses and load info - check_pangenome_info(pangenome, need_annotations=True, need_families=True, need_partitions=True, - need_rgp=True, disable_bar=disable_bar) + check_pangenome_info( + pangenome, + need_annotations=True, + need_families=True, + need_partitions=True, + need_rgp=True, + disable_bar=disable_bar, + ) # get multigenic gene families logging.getLogger("PPanGGOLiN").info("Detecting multigenic families...") @@ -204,11 +265,14 @@ def predict_hotspots(pangenome: Pangenome, output: Path, spot_graph: bool = Fals logging.getLogger("PPanGGOLiN").info("Detecting hotspots in the pangenome...") # make spots - graph_spot = make_spot_graph(pangenome.regions, multigenics, overlapping_match, set_size, - exact_match) + graph_spot = make_spot_graph( + pangenome.regions, multigenics, overlapping_match, set_size, exact_match + ) spots = [] - for spot_id, comp in enumerate(nx.algorithms.components.connected_components(graph_spot)): + for spot_id, comp in enumerate( + nx.algorithms.components.connected_components(graph_spot) + ): curr_spot = Spot(spot_id) spots.append(curr_spot) @@ -244,11 +308,20 @@ def launch(args: argparse.Namespace): pangenome.add_file(args.pangenome) if args.spot_graph: mk_outdir(args.output, args.force) - predict_hotspots(pangenome, args.output, force=args.force, - spot_graph=args.spot_graph, graph_formats=args.graph_formats, - overlapping_match=args.overlapping_match, set_size=args.set_size, - exact_match=args.exact_match_size, disable_bar=args.disable_prog_bar, ) - write_pangenome(pangenome, pangenome.file, args.force, disable_bar=args.disable_prog_bar) + predict_hotspots( + pangenome, + args.output, + force=args.force, + spot_graph=args.spot_graph, + graph_formats=args.graph_formats, + overlapping_match=args.overlapping_match, + set_size=args.set_size, + exact_match=args.exact_match_size, + disable_bar=args.disable_prog_bar, + ) + write_pangenome( + pangenome, pangenome.file, args.force, disable_bar=args.disable_prog_bar + ) def subparser(sub_parser: argparse._SubParsersAction) -> argparse.ArgumentParser: @@ -259,7 +332,9 @@ def subparser(sub_parser: argparse._SubParsersAction) -> argparse.ArgumentParser :return : parser arguments for align command """ - parser = sub_parser.add_parser("spot", formatter_class=argparse.RawTextHelpFormatter) + parser = sub_parser.add_parser( + "spot", formatter_class=argparse.RawTextHelpFormatter + ) parser_spot(parser) return parser @@ -270,39 +345,76 @@ def parser_spot(parser: argparse.ArgumentParser): :param parser: parser for align argument """ - required = parser.add_argument_group(title="Required arguments", - description="One of the following arguments is required :") - required.add_argument('-p', '--pangenome', required=False, type=Path, help="The pangenome .h5 file") + required = parser.add_argument_group( + title="Required arguments", + description="One of the following arguments is required :", + ) + required.add_argument( + "-p", "--pangenome", required=False, type=Path, help="The pangenome .h5 file" + ) optional = parser.add_argument_group(title="Optional arguments") - optional.add_argument('-o', '--output', required=False, type=Path, - default=Path( - f"ppanggolin_output{time.strftime('DATE%Y-%m-%d_HOUR%H.%M.%S', time.localtime())}" - f"_PID{str(os.getpid())}"), - help="Output directory") - optional.add_argument("--spot_graph", required=False, action="store_true", - help="Writes a graph of pairs of blocks of single copy markers flanking RGPs," - " supposedly belonging to the same hotspot") - optional.add_argument("--overlapping_match", required=False, type=int, default=2, - help="The number of 'missing' persistent genes allowed when comparing flanking genes during " - "hotspot computations") - optional.add_argument("--set_size", required=False, type=int, default=3, - help="Number of single copy markers to use as flanking genes for a RGP during " - "hotspot computation") - optional.add_argument("--exact_match_size", required=False, type=int, default=1, - help="Number of perfectly matching flanking single copy markers required to associate RGPs " - "during hotspot computation (Ex: If set to 1, two RGPs are in the same hotspot " - "if both their 1st flanking genes are the same)") - optional.add_argument('--graph_formats', required=False, type=str, choices=['gexf', "graphml"], nargs="+", - default=['gexf'], help="Format of the output graph.") - - -if __name__ == '__main__': + optional.add_argument( + "-o", + "--output", + required=False, + type=Path, + default=Path( + f"ppanggolin_output{time.strftime('DATE%Y-%m-%d_HOUR%H.%M.%S', time.localtime())}" + f"_PID{str(os.getpid())}" + ), + help="Output directory", + ) + optional.add_argument( + "--spot_graph", + required=False, + action="store_true", + help="Writes a graph of pairs of blocks of single copy markers flanking RGPs," + " supposedly belonging to the same hotspot", + ) + optional.add_argument( + "--overlapping_match", + required=False, + type=int, + default=2, + help="The number of 'missing' persistent genes allowed when comparing flanking genes during " + "hotspot computations", + ) + optional.add_argument( + "--set_size", + required=False, + type=int, + default=3, + help="Number of single copy markers to use as flanking genes for a RGP during " + "hotspot computation", + ) + optional.add_argument( + "--exact_match_size", + required=False, + type=int, + default=1, + help="Number of perfectly matching flanking single copy markers required to associate RGPs " + "during hotspot computation (Ex: If set to 1, two RGPs are in the same hotspot " + "if both their 1st flanking genes are the same)", + ) + optional.add_argument( + "--graph_formats", + required=False, + type=str, + choices=["gexf", "graphml"], + nargs="+", + default=["gexf"], + help="Format of the output graph.", + ) + + +if __name__ == "__main__": """To test local change and allow using debugger""" from ppanggolin.utils import set_verbosity_level, add_common_arguments main_parser = argparse.ArgumentParser( description="Depicting microbial species diversity via a Partitioned PanGenome Graph Of Linked Neighbors", - formatter_class=argparse.RawTextHelpFormatter) + formatter_class=argparse.RawTextHelpFormatter, + ) parser_spot(main_parser) add_common_arguments(main_parser) diff --git a/ppanggolin/__init__.py b/ppanggolin/__init__.py index badec1d4..9b163bdf 100755 --- a/ppanggolin/__init__.py +++ b/ppanggolin/__init__.py @@ -39,7 +39,7 @@ "context": ppanggolin.context.subparser, "projection": ppanggolin.projection.subparser, "rgp_cluster": ppanggolin.RGP.rgp_cluster.subparser, - "metadata": ppanggolin.meta.subparser + "metadata": ppanggolin.meta.subparser, } diff --git a/ppanggolin/align/alignOnPang.py b/ppanggolin/align/alignOnPang.py index 3671ab6a..69efe798 100644 --- a/ppanggolin/align/alignOnPang.py +++ b/ppanggolin/align/alignOnPang.py @@ -16,7 +16,12 @@ # local libraries from ppanggolin.formats import check_pangenome_info from ppanggolin.geneFamily import GeneFamily -from ppanggolin.utils import mk_outdir, read_compressed_or_not, create_tmpdir, run_subprocess +from ppanggolin.utils import ( + mk_outdir, + read_compressed_or_not, + create_tmpdir, + run_subprocess, +) from ppanggolin.pangenome import Pangenome from ppanggolin.region import Spot from ppanggolin.figures.draw_spot import draw_selected_spots, subgraph @@ -24,12 +29,22 @@ from ppanggolin.formats.writeSequences import translate_genes, create_mmseqs_db -def align_seq_to_pang(target_seq_file: Union[Path, Iterable[Path]], query_seq_files: Union[Path, Iterable[Path]], - tmpdir: Path, cpu: int = 1, no_defrag: bool = False, identity: float = 0.8, coverage: float = 0.8, - query_type: str = "unknow", is_query_slf: bool = False, target_type: str = "unknow", - is_target_slf: bool = False, translation_table: int = None) -> Path: +def align_seq_to_pang( + target_seq_file: Union[Path, Iterable[Path]], + query_seq_files: Union[Path, Iterable[Path]], + tmpdir: Path, + cpu: int = 1, + no_defrag: bool = False, + identity: float = 0.8, + coverage: float = 0.8, + query_type: str = "unknow", + is_query_slf: bool = False, + target_type: str = "unknow", + is_target_slf: bool = False, + translation_table: int = None, +) -> Path: """ - Align fasta sequence to pangenome sequences. + Align fasta sequence to pangenome sequences. :param target_seq_file: File with sequences of pangenome (target) :param query_seq_files: Iterable of files with sequences from input file (query) @@ -48,26 +63,46 @@ def align_seq_to_pang(target_seq_file: Union[Path, Iterable[Path]], query_seq_fi """ if target_type == "nucleotide": - logging.getLogger("PPanGGOLiN").debug("Target sequences will be translated by mmseqs with " - f"translation table {translation_table}") - with create_tmpdir(tmpdir, basename="target_db", keep_tmp=True) as target_db_dir: + logging.getLogger("PPanGGOLiN").debug( + "Target sequences will be translated by mmseqs with " + f"translation table {translation_table}" + ) + with create_tmpdir( + tmpdir, basename="target_db", keep_tmp=True + ) as target_db_dir: # Keep is set as true because whether tmpdir is deleted or not target_db_dir will be the same - target_db = translate_genes(target_seq_file, target_db_dir, cpu, is_target_slf, translation_table) + target_db = translate_genes( + target_seq_file, target_db_dir, cpu, is_target_slf, translation_table + ) else: db_type = 1 if target_type == "protein" else 0 - target_db = create_mmseqs_db([target_seq_file] if isinstance(target_seq_file, Path) else target_seq_file, - 'target_db', tmpdir, db_mode=1 if is_target_slf else 0, db_type=db_type) + target_db = create_mmseqs_db( + [target_seq_file] if isinstance(target_seq_file, Path) else target_seq_file, + "target_db", + tmpdir, + db_mode=1 if is_target_slf else 0, + db_type=db_type, + ) if query_type == "nucleotide": - logging.getLogger("PPanGGOLiN").debug("Query sequences will be translated by mmseqs " - f"with translation table {translation_table}") + logging.getLogger("PPanGGOLiN").debug( + "Query sequences will be translated by mmseqs " + f"with translation table {translation_table}" + ) with create_tmpdir(tmpdir, basename="query_db", keep_tmp=True) as query_db_dir: # Keep is set as true because whether tmpdir is deleted or not target_db_dir will be the same - query_db = translate_genes(query_seq_files, query_db_dir, cpu, is_query_slf, translation_table) + query_db = translate_genes( + query_seq_files, query_db_dir, cpu, is_query_slf, translation_table + ) else: db_type = 1 if query_type == "protein" else 0 - query_db = create_mmseqs_db([query_seq_files] if isinstance(query_seq_files, Path) else query_seq_files, - 'query_db', tmpdir, db_mode=1 if is_query_slf else 0, db_type=db_type) + query_db = create_mmseqs_db( + [query_seq_files] if isinstance(query_seq_files, Path) else query_seq_files, + "query_db", + tmpdir, + db_mode=1 if is_query_slf else 0, + db_type=db_type, + ) cov_mode = "2" # coverage of query if no_defrag: @@ -76,33 +111,80 @@ def align_seq_to_pang(target_seq_file: Union[Path, Iterable[Path]], query_seq_fi # mmseqs search command # see https://github.com/soedinglab/MMseqs2/issues/373 Using a combination of param to no miss short proteins - with tempfile.NamedTemporaryFile(mode="w", dir=tmpdir.as_posix(), prefix="aln_result_db_file", suffix=".aln.DB", - delete=False) as aln_db: + with tempfile.NamedTemporaryFile( + mode="w", + dir=tmpdir.as_posix(), + prefix="aln_result_db_file", + suffix=".aln.DB", + delete=False, + ) as aln_db: logging.getLogger("PPanGGOLiN").info("Aligning sequences") - cmd = ["mmseqs", "search", query_db.as_posix(), target_db.as_posix(), aln_db.name, tmpdir.as_posix(), "-a", - "--min-seq-id", str(identity), "-c", str(coverage), "--cov-mode", cov_mode, "--threads", str(cpu), - "--seed-sub-mat", "VTML40.out", "-s", "2", '--comp-bias-corr', "0", "--mask", "0", "-e", "1"] + cmd = [ + "mmseqs", + "search", + query_db.as_posix(), + target_db.as_posix(), + aln_db.name, + tmpdir.as_posix(), + "-a", + "--min-seq-id", + str(identity), + "-c", + str(coverage), + "--cov-mode", + cov_mode, + "--threads", + str(cpu), + "--seed-sub-mat", + "VTML40.out", + "-s", + "2", + "--comp-bias-corr", + "0", + "--mask", + "0", + "-e", + "1", + ] start = time.time() run_subprocess(cmd, msg="MMSeqs search failed with the following error:\n") align_time = time.time() - start - logging.getLogger("PPanGGOLiN").info(f"Done aligning sequences in {round(align_time, 2)} seconds") - - with tempfile.NamedTemporaryFile(mode="w", dir=tmpdir, prefix="aln_result_db_file", suffix=".tsv", - delete=False) as outfile: + logging.getLogger("PPanGGOLiN").info( + f"Done aligning sequences in {round(align_time, 2)} seconds" + ) + + with tempfile.NamedTemporaryFile( + mode="w", + dir=tmpdir, + prefix="aln_result_db_file", + suffix=".tsv", + delete=False, + ) as outfile: logging.getLogger("PPanGGOLiN").info("Extracting alignments...") - cmd = ["mmseqs", "convertalis", query_db.as_posix(), target_db.as_posix(), aln_db.name, outfile.name, - "--format-mode", "2"] - - run_subprocess(cmd, msg="MMSeqs convertalis failed with the following error:\n") + cmd = [ + "mmseqs", + "convertalis", + query_db.as_posix(), + target_db.as_posix(), + aln_db.name, + outfile.name, + "--format-mode", + "2", + ] + + run_subprocess( + cmd, msg="MMSeqs convertalis failed with the following error:\n" + ) return Path(outfile.name) -def map_input_gene_to_family_all_aln(aln_res: Path, outdir: Path, - pangenome: Pangenome) -> Tuple[Dict[str, GeneFamily], Path]: +def map_input_gene_to_family_all_aln( + aln_res: Path, outdir: Path, pangenome: Pangenome +) -> Tuple[Dict[str, GeneFamily], Path]: """ - Read alignment result to link input sequences to pangenome gene family. + Read alignment result to link input sequences to pangenome gene family. Alignment have been made against all genes of the pangenome. :param aln_res: Alignment result file @@ -113,14 +195,18 @@ def map_input_gene_to_family_all_aln(aln_res: Path, outdir: Path, """ seq2pang = {} - aln_file_clean = outdir / "alignment_input_seqs_to_all_pangenome_genes.tsv" # write the actual result file - logging.getLogger("PPanGGOLiN").debug(f'Writing alignment file in {aln_file_clean}') + aln_file_clean = ( + outdir / "alignment_input_seqs_to_all_pangenome_genes.tsv" + ) # write the actual result file + logging.getLogger("PPanGGOLiN").debug(f"Writing alignment file in {aln_file_clean}") with open(aln_res) as alnFile, open(aln_file_clean, "w") as aln_outfl: for line in alnFile: line_splitted = line.split() - line_splitted[1] = line_splitted[1].replace("ppanggolin_", "") # remove the 'ppanggolin_' bit of the id + line_splitted[1] = line_splitted[1].replace( + "ppanggolin_", "" + ) # remove the 'ppanggolin_' bit of the id line_splitted[0] = line_splitted[0].replace("ppanggolin_", "") input_seq_id, gene_id = line_splitted[0:2] @@ -129,13 +215,16 @@ def map_input_gene_to_family_all_aln(aln_res: Path, outdir: Path, if seq2pang.get(input_seq_id) is None: # if no results were found yet family = pangenome.get_gene(gene_id).family - seq2pang[input_seq_id] = family # then the best hit is the first one we see. + seq2pang[input_seq_id] = ( + family # then the best hit is the first one we see. + ) return seq2pang, aln_file_clean -def map_input_gene_to_family_rep_aln(aln_res: Path, outdir: Path, - pangenome: Pangenome) -> Tuple[Dict[Any, GeneFamily], Path]: +def map_input_gene_to_family_rep_aln( + aln_res: Path, outdir: Path, pangenome: Pangenome +) -> Tuple[Dict[Any, GeneFamily], Path]: """ Read alignment result to link input sequences to pangenome gene family. Alignment have been made against representative sequence of gene families of the pangenome. @@ -147,15 +236,19 @@ def map_input_gene_to_family_rep_aln(aln_res: Path, outdir: Path, :return: Dictionary with sequence link to pangenome gene families and actual path to the cleaned alignment file """ seq2pang = {} - aln_file_clean = outdir / "alignment_input_seqs_to_pangenome_gene_families.tsv" # write the actual result file + aln_file_clean = ( + outdir / "alignment_input_seqs_to_pangenome_gene_families.tsv" + ) # write the actual result file - logging.getLogger("PPanGGOLiN").debug(f'Writing alignment file in {aln_file_clean}') + logging.getLogger("PPanGGOLiN").debug(f"Writing alignment file in {aln_file_clean}") with open(aln_res) as alnFile, open(aln_file_clean, "w") as aln_outfl: for line in alnFile: line_splitted = line.split() - line_splitted[1] = line_splitted[1].replace("ppanggolin_", "") # remove the 'ppanggolin_' bit of the id + line_splitted[1] = line_splitted[1].replace( + "ppanggolin_", "" + ) # remove the 'ppanggolin_' bit of the id line_splitted[0] = line_splitted[0].replace("ppanggolin_", "") aln_outfl.write("\t".join(line_splitted) + "\n") @@ -163,7 +256,9 @@ def map_input_gene_to_family_rep_aln(aln_res: Path, outdir: Path, input_seq_id, gene_family_id = line_splitted[0:2] if seq2pang.get(input_seq_id) is None: # if no results were found yet - family = pangenome.get_gene_family(gene_family_id) # then the best hit is the first one we see. + family = pangenome.get_gene_family( + gene_family_id + ) # then the best hit is the first one we see. seq2pang[input_seq_id] = family return seq2pang, aln_file_clean @@ -177,7 +272,7 @@ def get_seq_ids(seq_file: TextIOWrapper) -> Tuple[Set[str], bool, bool]: :return: A tuple containing a set of sequence IDs and a boolean indicating if the sequences are nucleotide sequences. """ - dna_expected_char = {'A', 'T', 'G', 'C', 'N'} + dna_expected_char = {"A", "T", "G", "C", "N"} seq_set = set() seq_count = 0 first_seq_concat = "" @@ -187,7 +282,9 @@ def get_seq_ids(seq_file: TextIOWrapper) -> Tuple[Set[str], bool, bool]: if line.startswith(">"): seq_set.add(line[1:].split()[0].strip()) seq_count += 1 - if count_fasta_line > 1: # Allow to know if we can use soft link with createdb from MMSeqs2 + if ( + count_fasta_line > 1 + ): # Allow to know if we can use soft link with createdb from MMSeqs2 single_line_fasta = False count_fasta_line = 0 else: @@ -201,7 +298,9 @@ def get_seq_ids(seq_file: TextIOWrapper) -> Tuple[Set[str], bool, bool]: return seq_set, is_nucleotide, single_line_fasta -def write_gene_fam_sequences(pangenome: Pangenome, output: Path, add: str = "", disable_bar: bool = False): +def write_gene_fam_sequences( + pangenome: Pangenome, output: Path, add: str = "", disable_bar: bool = False +): """ Export the sequence of gene families @@ -211,13 +310,19 @@ def write_gene_fam_sequences(pangenome: Pangenome, output: Path, add: str = "", :param disable_bar: disable progress bar """ with open(output, "w") as file_obj: - for fam in tqdm(pangenome.gene_families, unit="families", disable=disable_bar, - total=pangenome.number_of_gene_families): + for fam in tqdm( + pangenome.gene_families, + unit="families", + disable=disable_bar, + total=pangenome.number_of_gene_families, + ): file_obj.write(">" + add + fam.name + "\n") file_obj.write(fam.sequence + "\n") -def write_all_gene_sequences(pangenome: Pangenome, output: Path, add: str = "", disable_bar: bool = False): +def write_all_gene_sequences( + pangenome: Pangenome, output: Path, add: str = "", disable_bar: bool = False +): """ Export the sequence of pangenome genes @@ -228,13 +333,17 @@ def write_all_gene_sequences(pangenome: Pangenome, output: Path, add: str = "", """ if pangenome.status["geneSequences"] == "inFile": - get_non_redundant_gene_sequences_from_file(pangenome.file, output, add=add, disable_bar=disable_bar) + get_non_redundant_gene_sequences_from_file( + pangenome.file, output, add=add, disable_bar=disable_bar + ) else: # this should never happen if the pangenome has been properly checked before launching this function. raise Exception("The pangenome does not include gene sequences") -def project_and_write_partition(seqid_to_gene_family: Dict[str, GeneFamily], seq_set: Set[str], output: Path) -> Path: +def project_and_write_partition( + seqid_to_gene_family: Dict[str, GeneFamily], seq_set: Set[str], output: Path +) -> Path: """ Project the partition of each sequence from the input file and write them in a file @@ -250,11 +359,15 @@ def project_and_write_partition(seqid_to_gene_family: Dict[str, GeneFamily], seq for input_seq, gene_fam in seqid_to_gene_family.items(): partProjFile.write(input_seq + "\t" + gene_fam.named_partition + "\n") for remaining_seq in seq_set - seqid_to_gene_family.keys(): - partProjFile.write(remaining_seq + "\tcloud\n") # if there is no hit, it's going to be cloud genes. + partProjFile.write( + remaining_seq + "\tcloud\n" + ) # if there is no hit, it's going to be cloud genes. return partition_proj -def write_gene_to_gene_family(seqid_to_gene_family: Dict[str, GeneFamily], seq_set: Set[str], output: Path) -> Path: +def write_gene_to_gene_family( + seqid_to_gene_family: Dict[str, GeneFamily], seq_set: Set[str], output: Path +) -> Path: """ Write input gene to pangenome gene family. @@ -292,14 +405,20 @@ def get_fam_to_rgp(pangenome, multigenics: set) -> dict: for rgp in pangenome.regions: for fam in rgp.families: fam2rgp[fam].append(rgp.name) - for fam in [gene.family for border in rgp.get_bordering_genes(pangenome.parameters["spot"]["set_size"], - multigenics) for gene in border]: + for fam in [ + gene.family + for border in rgp.get_bordering_genes( + pangenome.parameters["spot"]["set_size"], multigenics + ) + for gene in border + ]: fam2rgp[fam].append(rgp.name) return fam2rgp -def get_fam_to_spot(pangenome: Pangenome, multigenics: Set[GeneFamily]) \ - -> Tuple[Dict[str, List[Spot]], Dict[str, List[Spot]]]: +def get_fam_to_spot( + pangenome: Pangenome, multigenics: Set[GeneFamily] +) -> Tuple[Dict[str, List[Spot]], Dict[str, List[Spot]]]: """ Reads a pangenome object to link families and spots and indicate where each family is. @@ -316,9 +435,15 @@ def get_fam_to_spot(pangenome: Pangenome, multigenics: Set[GeneFamily]) \ fams_border = set() for rgp in spot.regions: fams |= set(rgp.families) - fams_border |= set([gene.family for border in # Set of families in border of spot - rgp.get_bordering_genes(pangenome.parameters["spot"]["set_size"], multigenics) - for gene in border]) + fams_border |= set( + [ + gene.family + for border in rgp.get_bordering_genes( # Set of families in border of spot + pangenome.parameters["spot"]["set_size"], multigenics + ) + for gene in border + ] + ) for fam in fams: fam2spot[fam].append(spot) for fam in fams_border: @@ -326,7 +451,9 @@ def get_fam_to_spot(pangenome: Pangenome, multigenics: Set[GeneFamily]) \ return fam2spot, fam2border -def draw_spot_gexf(spots: set, output: Path, multigenics: set, fam_to_mod: dict, set_size: int = 3): +def draw_spot_gexf( + spots: set, output: Path, multigenics: set, fam_to_mod: dict, set_size: int = 3 +): """ Draw a gexf graph of the spot @@ -338,10 +465,22 @@ def draw_spot_gexf(spots: set, output: Path, multigenics: set, fam_to_mod: dict, """ for spot in spots: fname = output / f"spot_{str(spot.ID)}.gexf" - subgraph(spot, fname, set_size=set_size, multigenics=multigenics, fam_to_mod=fam_to_mod) - - -def get_seq_info(seq_to_pang: dict, pangenome: Pangenome, output: Path, draw_related: bool = False, disable_bar=False): + subgraph( + spot, + fname, + set_size=set_size, + multigenics=multigenics, + fam_to_mod=fam_to_mod, + ) + + +def get_seq_info( + seq_to_pang: dict, + pangenome: Pangenome, + output: Path, + draw_related: bool = False, + disable_bar=False, +): """ Get sequences information after alignment @@ -352,18 +491,33 @@ def get_seq_info(seq_to_pang: dict, pangenome: Pangenome, output: Path, draw_rel :param disable_bar: disable progress bar :return: """ - logging.getLogger("PPanGGOLiN").info("Writing RGP and spot information related to hits in the pangenome") + logging.getLogger("PPanGGOLiN").info( + "Writing RGP and spot information related to hits in the pangenome" + ) multigenics = pangenome.get_multigenics(pangenome.parameters["rgp"]["dup_margin"]) with open(output / "info_input_seq.tsv", "w") as finfo: - finfo.write("input\tfamily\tpartition\tspot_list_as_member\tspot_list_as_border\trgp_list\n") + finfo.write( + "input\tfamily\tpartition\tspot_list_as_member\tspot_list_as_border\trgp_list\n" + ) fam2rgp = get_fam_to_rgp(pangenome, multigenics) fam2spot, fam2border = get_fam_to_spot(pangenome, multigenics) spot_list = set() for seq, panfam in seq_to_pang.items(): - finfo.write(seq + '\t' + panfam.name + "\t" + panfam.named_partition + "\t" + ",".join( - map(str, fam2spot[panfam])) + "\t" + ",".join( - map(str, fam2border[panfam])) + "\t" + ','.join(fam2rgp[panfam]) + "\n") + finfo.write( + seq + + "\t" + + panfam.name + + "\t" + + panfam.named_partition + + "\t" + + ",".join(map(str, fam2spot[panfam])) + + "\t" + + ",".join(map(str, fam2border[panfam])) + + "\t" + + ",".join(fam2rgp[panfam]) + + "\n" + ) spot_list |= set(fam2spot[panfam]) spot_list |= set(fam2border[panfam]) @@ -372,11 +526,19 @@ def get_seq_info(seq_to_pang: dict, pangenome: Pangenome, output: Path, draw_rel for spot in spot_list: if len(spot.get_uniq_ordered_set()) > 1: drawn_spots.add(spot) - logging.getLogger("PPanGGOLiN").info(f"Drawing the {len(drawn_spots)} spots with more than 1 organization " - f"related to hits of the input sequences...") - draw_selected_spots(drawn_spots, pangenome, output, pangenome.parameters["spot"]["overlapping_match"], - pangenome.parameters["spot"]["exact_match_size"], pangenome.parameters["spot"]["set_size"], - disable_bar=disable_bar) + logging.getLogger("PPanGGOLiN").info( + f"Drawing the {len(drawn_spots)} spots with more than 1 organization " + f"related to hits of the input sequences..." + ) + draw_selected_spots( + drawn_spots, + pangenome, + output, + pangenome.parameters["spot"]["overlapping_match"], + pangenome.parameters["spot"]["exact_match_size"], + pangenome.parameters["spot"]["set_size"], + disable_bar=disable_bar, + ) fam2mod = {} # fam2module if pangenome.status["modules"] != "No": @@ -386,15 +548,26 @@ def get_seq_info(seq_to_pang: dict, pangenome: Pangenome, output: Path, draw_rel draw_spot_gexf(drawn_spots, output, multigenics=multigenics, fam_to_mod=fam2mod) - logging.getLogger("PPanGGOLiN").info(f"File listing RGP and spots where sequences of interest are located : " - f"{output / 'info_input_seq.tsv'}") - - -def get_input_seq_to_family_with_rep(pangenome: Pangenome, sequence_files: Union[Path, Iterable[Path]], output: Path, - tmpdir: Path, input_type: str = "unknow", is_input_slf: bool = False, cpu: int = 1, - no_defrag: bool = False, identity: float = 0.8, coverage: float = 0.8, - translation_table: int = 11, disable_bar: bool = False - ) -> Tuple[Path, Dict[str, GeneFamily]]: + logging.getLogger("PPanGGOLiN").info( + f"File listing RGP and spots where sequences of interest are located : " + f"{output / 'info_input_seq.tsv'}" + ) + + +def get_input_seq_to_family_with_rep( + pangenome: Pangenome, + sequence_files: Union[Path, Iterable[Path]], + output: Path, + tmpdir: Path, + input_type: str = "unknow", + is_input_slf: bool = False, + cpu: int = 1, + no_defrag: bool = False, + identity: float = 0.8, + coverage: float = 0.8, + translation_table: int = 11, + disable_bar: bool = False, +) -> Tuple[Path, Dict[str, GeneFamily]]: """ Assign gene families from a pangenome to input sequences. @@ -413,30 +586,55 @@ def get_input_seq_to_family_with_rep(pangenome: Pangenome, sequence_files: Union :param coverage: Minimum coverage threshold for the alignment (default: 0.8). :param translation_table: Translation table to use if sequences need to be translated (default: 11). :param disable_bar: If True, disable the progress bar. - - :return: A tuple containing the path to the alignment result file, + + :return: A tuple containing the path to the alignment result file, and a dictionary mapping input sequences to gene families. """ pangenome_sequences = tmpdir / "proteins_families.faa" - logging.getLogger("PPanGGOLiN").debug(f'Write gene family sequences in {pangenome_sequences.absolute()}') - write_gene_fam_sequences(pangenome, pangenome_sequences, add="ppanggolin_", disable_bar=disable_bar) - - align_file = align_seq_to_pang(target_seq_file=pangenome_sequences, query_seq_files=sequence_files, tmpdir=tmpdir, - cpu=cpu, no_defrag=no_defrag, identity=identity, coverage=coverage, - query_type=input_type, is_query_slf=is_input_slf, is_target_slf=True, - target_type="protein", translation_table=translation_table) - - seq2pang, align_file = map_input_gene_to_family_rep_aln(align_file, output, pangenome) + logging.getLogger("PPanGGOLiN").debug( + f"Write gene family sequences in {pangenome_sequences.absolute()}" + ) + write_gene_fam_sequences( + pangenome, pangenome_sequences, add="ppanggolin_", disable_bar=disable_bar + ) + + align_file = align_seq_to_pang( + target_seq_file=pangenome_sequences, + query_seq_files=sequence_files, + tmpdir=tmpdir, + cpu=cpu, + no_defrag=no_defrag, + identity=identity, + coverage=coverage, + query_type=input_type, + is_query_slf=is_input_slf, + is_target_slf=True, + target_type="protein", + translation_table=translation_table, + ) + + seq2pang, align_file = map_input_gene_to_family_rep_aln( + align_file, output, pangenome + ) return align_file, seq2pang -def get_input_seq_to_family_with_all(pangenome: Pangenome, sequence_files: Union[Path, Iterable[Path]], output: Path, - tmpdir: Path, input_type: str = "unknow", is_input_slf: bool = False, cpu: int = 1, - no_defrag: bool = False, identity: float = 0.8, coverage: float = 0.8, - translation_table: int = 11, disable_bar: bool = False - ) -> Tuple[Path, Dict[str, GeneFamily]]: +def get_input_seq_to_family_with_all( + pangenome: Pangenome, + sequence_files: Union[Path, Iterable[Path]], + output: Path, + tmpdir: Path, + input_type: str = "unknow", + is_input_slf: bool = False, + cpu: int = 1, + no_defrag: bool = False, + identity: float = 0.8, + coverage: float = 0.8, + translation_table: int = 11, + disable_bar: bool = False, +) -> Tuple[Path, Dict[str, GeneFamily]]: """ Assign gene families from a pangenome to input sequences. @@ -456,27 +654,55 @@ def get_input_seq_to_family_with_all(pangenome: Pangenome, sequence_files: Unio :param translation_table: Translation table to use if sequences need to be translated (default: 11). :param disable_bar: If True, disable the progress bar. - :return: A tuple containing the path to the alignment result file, + :return: A tuple containing the path to the alignment result file, and a dictionary mapping input sequences to gene families. """ pangenome_sequences = tmpdir / "nucleotide_genes.fna" - logging.getLogger("PPanGGOLiN").debug(f'Write all pangenome gene sequences in {pangenome_sequences.absolute()}') - write_all_gene_sequences(pangenome, pangenome_sequences, add="ppanggolin_", disable_bar=disable_bar) - - align_file = align_seq_to_pang(target_seq_file=pangenome_sequences, query_seq_files=sequence_files, tmpdir=tmpdir, - cpu=cpu, no_defrag=no_defrag, identity=identity, coverage=coverage, - query_type=input_type, is_query_slf=is_input_slf, is_target_slf=True, - target_type="nucleotide", translation_table=translation_table) - - seq2pang, align_file = map_input_gene_to_family_all_aln(align_file, output, pangenome) + logging.getLogger("PPanGGOLiN").debug( + f"Write all pangenome gene sequences in {pangenome_sequences.absolute()}" + ) + write_all_gene_sequences( + pangenome, pangenome_sequences, add="ppanggolin_", disable_bar=disable_bar + ) + + align_file = align_seq_to_pang( + target_seq_file=pangenome_sequences, + query_seq_files=sequence_files, + tmpdir=tmpdir, + cpu=cpu, + no_defrag=no_defrag, + identity=identity, + coverage=coverage, + query_type=input_type, + is_query_slf=is_input_slf, + is_target_slf=True, + target_type="nucleotide", + translation_table=translation_table, + ) + + seq2pang, align_file = map_input_gene_to_family_all_aln( + align_file, output, pangenome + ) return align_file, seq2pang -def align(pangenome: Pangenome, sequence_file: Path, output: Path, identity: float = 0.8, - coverage: float = 0.8, no_defrag: bool = False, cpu: int = 1, getinfo: bool = False, - use_representatives: bool = False, draw_related: bool = False, translation_table: int = 11, - tmpdir: Path = None, disable_bar: bool = False, keep_tmp=False): +def align( + pangenome: Pangenome, + sequence_file: Path, + output: Path, + identity: float = 0.8, + coverage: float = 0.8, + no_defrag: bool = False, + cpu: int = 1, + getinfo: bool = False, + use_representatives: bool = False, + draw_related: bool = False, + translation_table: int = 11, + tmpdir: Path = None, + disable_bar: bool = False, + keep_tmp=False, +): """ Aligns pangenome sequences with sequences in a FASTA file using MMSeqs2. @@ -498,8 +724,10 @@ def align(pangenome: Pangenome, sequence_file: Path, output: Path, identity: flo tmpdir = Path(tempfile.gettempdir()) if tmpdir is None else tmpdir if pangenome.status["geneFamilySequences"] not in ["inFile", "Loaded", "Computed"]: - raise Exception("Cannot use this function as your pangenome does not have gene families representatives " - "associated to it. For now this works only if the clustering is realised by PPanGGOLiN.") + raise Exception( + "Cannot use this function as your pangenome does not have gene families representatives " + "associated to it. For now this works only if the clustering is realised by PPanGGOLiN." + ) # could be possible either by picking a representative somehow, or by aligning on genes rather than on # families, if they are in the pangenome. @@ -508,42 +736,72 @@ def align(pangenome: Pangenome, sequence_file: Path, output: Path, identity: flo if pangenome.status["modules"] != "No": # modules are not required to be loaded, but if they have been computed we load them. need_mod = True - check_pangenome_info(pangenome, need_annotations=True, need_families=True, need_partitions=True, need_rgp=True, - need_spots=True, need_modules=need_mod, disable_bar=disable_bar) + check_pangenome_info( + pangenome, + need_annotations=True, + need_families=True, + need_partitions=True, + need_rgp=True, + need_spots=True, + need_modules=need_mod, + disable_bar=disable_bar, + ) else: check_pangenome_info(pangenome, need_families=True, disable_bar=disable_bar) with read_compressed_or_not(sequence_file) as seqFileObj: seq_set, is_nucleotide, single_line_fasta = get_seq_ids(seqFileObj) - with create_tmpdir(main_dir=tmpdir, basename="align_input_seq_tmpdir", keep_tmp=keep_tmp) as new_tmpdir: + with create_tmpdir( + main_dir=tmpdir, basename="align_input_seq_tmpdir", keep_tmp=keep_tmp + ) as new_tmpdir: input_type = "nucleotide" if is_nucleotide else "unknow" if use_representatives: - align_file, seq2pang = get_input_seq_to_family_with_rep(pangenome, sequence_file, output, new_tmpdir, - input_type=input_type, - is_input_slf=single_line_fasta, cpu=cpu, - no_defrag=no_defrag, identity=identity, - coverage=coverage, - translation_table=translation_table, - disable_bar=disable_bar) + align_file, seq2pang = get_input_seq_to_family_with_rep( + pangenome, + sequence_file, + output, + new_tmpdir, + input_type=input_type, + is_input_slf=single_line_fasta, + cpu=cpu, + no_defrag=no_defrag, + identity=identity, + coverage=coverage, + translation_table=translation_table, + disable_bar=disable_bar, + ) else: - align_file, seq2pang = get_input_seq_to_family_with_all(pangenome=pangenome, sequence_files=sequence_file, - output=output, tmpdir=new_tmpdir, - input_type=input_type, - is_input_slf=single_line_fasta, - cpu=cpu, no_defrag=no_defrag, identity=identity, - coverage=coverage, - translation_table=translation_table, - disable_bar=disable_bar) + align_file, seq2pang = get_input_seq_to_family_with_all( + pangenome=pangenome, + sequence_files=sequence_file, + output=output, + tmpdir=new_tmpdir, + input_type=input_type, + is_input_slf=single_line_fasta, + cpu=cpu, + no_defrag=no_defrag, + identity=identity, + coverage=coverage, + translation_table=translation_table, + disable_bar=disable_bar, + ) if getinfo or draw_related: # TODO Add getinfo to function and remove if get_seq_info(seq2pang, pangenome, output, draw_related, disable_bar=disable_bar) - part_proj = project_and_write_partition(seq2pang, seq_set, output) # write the partition assignation only - logging.getLogger("PPanGGOLiN").info(f"sequences partition projection : '{part_proj}'") + part_proj = project_and_write_partition( + seq2pang, seq_set, output + ) # write the partition assignation only + logging.getLogger("PPanGGOLiN").info( + f"sequences partition projection : '{part_proj}'" + ) logging.getLogger("PPanGGOLiN").info( - f"{len(seq2pang)} sequences over {len(seq_set)} have at least one hit in the pangenome.") - logging.getLogger("PPanGGOLiN").info(f"Blast-tab file of the alignment : '{align_file}'") + f"{len(seq2pang)} sequences over {len(seq_set)} have at least one hit in the pangenome." + ) + logging.getLogger("PPanGGOLiN").info( + f"Blast-tab file of the alignment : '{align_file}'" + ) def launch(args: argparse.Namespace): @@ -555,12 +813,22 @@ def launch(args: argparse.Namespace): mk_outdir(args.output, args.force) pangenome = Pangenome() pangenome.add_file(args.pangenome) - align(pangenome=pangenome, sequence_file=args.sequences, output=args.output, - tmpdir=args.tmpdir, identity=args.identity, coverage=args.coverage, - no_defrag=args.no_defrag, cpu=args.cpu, getinfo=args.getinfo, - use_representatives=args.fast, draw_related=args.draw_related, - translation_table=args.translation_table, - disable_bar=args.disable_prog_bar, keep_tmp=args.keep_tmp) + align( + pangenome=pangenome, + sequence_file=args.sequences, + output=args.output, + tmpdir=args.tmpdir, + identity=args.identity, + coverage=args.coverage, + no_defrag=args.no_defrag, + cpu=args.cpu, + getinfo=args.getinfo, + use_representatives=args.fast, + draw_related=args.draw_related, + translation_table=args.translation_table, + disable_bar=args.disable_prog_bar, + keep_tmp=args.keep_tmp, + ) def subparser(sub_parser: argparse._SubParsersAction) -> argparse.ArgumentParser: @@ -571,7 +839,9 @@ def subparser(sub_parser: argparse._SubParsersAction) -> argparse.ArgumentParser :return : parser arguments for align command """ - parser = sub_parser.add_parser("align", formatter_class=argparse.RawTextHelpFormatter) + parser = sub_parser.add_parser( + "align", formatter_class=argparse.RawTextHelpFormatter + ) parser_align(parser) return parser @@ -582,52 +852,118 @@ def parser_align(parser: argparse.ArgumentParser): :param parser: parser for align argument """ - required = parser.add_argument_group(title="Required arguments", - description="All of the following arguments are required :") - required.add_argument('-S', '--sequences', required=False, type=Path, - help="sequences (nucleotides or amino acids) to align on the pangenome gene families") - - required.add_argument('-p', '--pangenome', required=False, type=Path, help="The pangenome .h5 file") - required.add_argument('-o', '--output', required=True, type=Path, - help="Output directory where the file(s) will be written") + required = parser.add_argument_group( + title="Required arguments", + description="All of the following arguments are required :", + ) + required.add_argument( + "-S", + "--sequences", + required=False, + type=Path, + help="sequences (nucleotides or amino acids) to align on the pangenome gene families", + ) + + required.add_argument( + "-p", "--pangenome", required=False, type=Path, help="The pangenome .h5 file" + ) + required.add_argument( + "-o", + "--output", + required=True, + type=Path, + help="Output directory where the file(s) will be written", + ) optional = parser.add_argument_group(title="Optional arguments") - optional.add_argument('--no_defrag', required=False, action="store_true", - help="DO NOT Realign gene families to link fragments with" - "their non-fragmented gene family. (default: False)") - optional.add_argument('--identity', required=False, type=float, default=0.5, - help="min identity percentage threshold") - optional.add_argument('--coverage', required=False, type=float, default=0.8, - help="min coverage percentage threshold") - optional.add_argument("--fast", required=False, action="store_true", - help="Use representative sequences of gene families for input gene alignment. " - "This option is faster but may be less sensitive. By default, all pangenome genes are used.") - optional.add_argument("--translation_table", required=False, default="11", - help="Translation table (genetic code) to use.") - optional.add_argument("--getinfo", required=False, action="store_true", - help="Use this option to extract info related to the best hit of each query, " - "such as the RGP it is in, or the spots.") - optional.add_argument("--draw_related", required=False, action="store_true", - help="Draw figures and provide graphs in a gexf format of the eventual spots" - " associated to the input sequences") + optional.add_argument( + "--no_defrag", + required=False, + action="store_true", + help="DO NOT Realign gene families to link fragments with" + "their non-fragmented gene family. (default: False)", + ) + optional.add_argument( + "--identity", + required=False, + type=float, + default=0.5, + help="min identity percentage threshold", + ) + optional.add_argument( + "--coverage", + required=False, + type=float, + default=0.8, + help="min coverage percentage threshold", + ) + optional.add_argument( + "--fast", + required=False, + action="store_true", + help="Use representative sequences of gene families for input gene alignment. " + "This option is faster but may be less sensitive. By default, all pangenome genes are used.", + ) + optional.add_argument( + "--translation_table", + required=False, + default="11", + help="Translation table (genetic code) to use.", + ) + optional.add_argument( + "--getinfo", + required=False, + action="store_true", + help="Use this option to extract info related to the best hit of each query, " + "such as the RGP it is in, or the spots.", + ) + optional.add_argument( + "--draw_related", + required=False, + action="store_true", + help="Draw figures and provide graphs in a gexf format of the eventual spots" + " associated to the input sequences", + ) # but does not use the option - optional.add_argument("--use_pseudo", required=False, action="store_true", - help="In the context of provided annotation, use this option to read pseudogenes. " - "(Default behavior is to ignore them)") - optional.add_argument("-c", "--cpu", required=False, default=1, type=int, help="Number of available cpus") - optional.add_argument("--tmpdir", required=False, type=Path, default=Path(tempfile.gettempdir()), - help="directory for storing temporary files") - optional.add_argument("--keep_tmp", required=False, default=False, action="store_true", - help="Keeping temporary files (useful for debugging).") - - -if __name__ == '__main__': + optional.add_argument( + "--use_pseudo", + required=False, + action="store_true", + help="In the context of provided annotation, use this option to read pseudogenes. " + "(Default behavior is to ignore them)", + ) + optional.add_argument( + "-c", + "--cpu", + required=False, + default=1, + type=int, + help="Number of available cpus", + ) + optional.add_argument( + "--tmpdir", + required=False, + type=Path, + default=Path(tempfile.gettempdir()), + help="directory for storing temporary files", + ) + optional.add_argument( + "--keep_tmp", + required=False, + default=False, + action="store_true", + help="Keeping temporary files (useful for debugging).", + ) + + +if __name__ == "__main__": """To test local change and allow using debugger""" from ppanggolin.utils import set_verbosity_level, add_common_arguments main_parser = argparse.ArgumentParser( description="Depicting microbial species diversity via a Partitioned PanGenome Graph Of Linked Neighbors", - formatter_class=argparse.RawTextHelpFormatter) + formatter_class=argparse.RawTextHelpFormatter, + ) parser_align(main_parser) add_common_arguments(main_parser) set_verbosity_level(main_parser.parse_args()) diff --git a/ppanggolin/annotate/annotate.py b/ppanggolin/annotate/annotate.py index 05607d11..c20cbd86 100644 --- a/ppanggolin/annotate/annotate.py +++ b/ppanggolin/annotate/annotate.py @@ -20,16 +20,28 @@ from tables.path import check_name_validity, NaturalNameWarning # local libraries -from ppanggolin.annotate.synta import (annotate_organism, read_fasta, get_dna_sequence, - init_contig_counter, contig_counter) +from ppanggolin.annotate.synta import ( + annotate_organism, + read_fasta, + get_dna_sequence, + init_contig_counter, + contig_counter, +) from ppanggolin.pangenome import Pangenome from ppanggolin.genome import Organism, Gene, RNA, Contig -from ppanggolin.utils import read_compressed_or_not, mk_file_name, detect_filetype, check_input_files, has_non_ascii, replace_non_ascii +from ppanggolin.utils import ( + read_compressed_or_not, + mk_file_name, + detect_filetype, + check_input_files, + has_non_ascii, + replace_non_ascii, +) from ppanggolin.formats import write_pangenome from ppanggolin.metadata import Metadata -# ignore NaturalNameWarning -warnings.filterwarnings('ignore', category=NaturalNameWarning) +# ignore NaturalNameWarning +warnings.filterwarnings("ignore", category=NaturalNameWarning) ctg_counter = contig_counter @@ -42,9 +54,11 @@ def check_annotate_args(args: argparse.Namespace): :raise Exception: """ if args.fasta is None and args.anno is None: - raise argparse.ArgumentError(argument=None, - message="You must provide at least a file with the --fasta option to annotate " - "from sequences, or a file with the --anno option to load annotations from.") + raise argparse.ArgumentError( + argument=None, + message="You must provide at least a file with the --fasta option to annotate " + "from sequences, or a file with the --anno option to load annotations from.", + ) if hasattr(args, "fasta") and args.fasta is not None: check_input_files(args.fasta, True) @@ -53,11 +67,22 @@ def check_annotate_args(args: argparse.Namespace): check_input_files(args.anno, True) - - -def create_gene(org: Organism, contig: Contig, gene_counter: int, rna_counter: int, gene_id: str, dbxrefs: Set[str], - coordinates: List[Tuple[int, int]], strand: str, gene_type: str, position: int = None, - gene_name: str = "", product: str = "", genetic_code: int = 11, protein_id: str = "") -> Gene: +def create_gene( + org: Organism, + contig: Contig, + gene_counter: int, + rna_counter: int, + gene_id: str, + dbxrefs: Set[str], + coordinates: List[Tuple[int, int]], + strand: str, + gene_type: str, + position: int = None, + gene_name: str = "", + product: str = "", + genetic_code: int = 11, + protein_id: str = "", +) -> Gene: """ Create a Gene object and associate to contig and Organism @@ -78,26 +103,27 @@ def create_gene(org: Organism, contig: Contig, gene_counter: int, rna_counter: i """ # check for non ascii character in product field if has_non_ascii(product): - + logging.getLogger("PPanGGOLiN").warning( - f"In genome '{org.name}', the 'product' field of gene '{gene_id}' contains non-ASCII characters: '{product}'. " - "These characters cannot be stored in the HDF5 file and will be replaced by underscores." - ) + f"In genome '{org.name}', the 'product' field of gene '{gene_id}' contains non-ASCII characters: '{product}'. " + "These characters cannot be stored in the HDF5 file and will be replaced by underscores." + ) product = replace_non_ascii(product) - start, stop = coordinates[0][0], coordinates[-1][1] - if any(dbxref.startswith('MaGe:') or dbxref.startswith('SEED:') for dbxref in dbxrefs): + if any( + dbxref.startswith("MaGe:") or dbxref.startswith("SEED:") for dbxref in dbxrefs + ): if gene_name == "": gene_name = gene_id for dbxref in dbxrefs: - if dbxref.startswith('MaGe:'): - gene_id = dbxref.split(':')[1] + if dbxref.startswith("MaGe:"): + gene_id = dbxref.split(":")[1] break - if dbxref.startswith('SEED:'): - gene_id = dbxref.split(':')[1] + if dbxref.startswith("SEED:"): + gene_id = dbxref.split(":")[1] break if gene_type == "CDS": @@ -108,16 +134,30 @@ def create_gene(org: Organism, contig: Contig, gene_counter: int, rna_counter: i # but was when cases like this were encountered) new_gene = Gene(org.name + "_CDS_" + str(gene_counter).zfill(4)) - new_gene.fill_annotations(start=start, stop=stop, strand=strand, coordinates=coordinates, - gene_type=gene_type, name=gene_name, - position=position, product=product, local_identifier=gene_id, - genetic_code=genetic_code) + new_gene.fill_annotations( + start=start, + stop=stop, + strand=strand, + coordinates=coordinates, + gene_type=gene_type, + name=gene_name, + position=position, + product=product, + local_identifier=gene_id, + genetic_code=genetic_code, + ) contig.add(new_gene) else: # if not CDS, it is RNA new_gene = RNA(org.name + f"_{gene_type}_" + str(rna_counter).zfill(4)) - new_gene.fill_annotations(start=start, stop=stop, strand=strand, coordinates=coordinates, gene_type=gene_type, - name=gene_name, - product=product) + new_gene.fill_annotations( + start=start, + stop=stop, + strand=strand, + coordinates=coordinates, + gene_type=gene_type, + name=gene_name, + product=product, + ) contig.add_rna(new_gene) new_gene.fill_parents(org, contig) return new_gene @@ -126,8 +166,8 @@ def create_gene(org: Organism, contig: Contig, gene_counter: int, rna_counter: i def extract_positions(string: str) -> Tuple[List[Tuple[int, int]], bool, bool, bool]: """ Extracts start and stop positions from a string and determines whether it is complement and pseudogene. - - Example of strings that the function is able to process: + + Example of strings that the function is able to process: "join(190..7695,7695..12071)", "complement(join(4359800..4360707,4360707..4360962))", @@ -137,7 +177,7 @@ def extract_positions(string: str) -> Tuple[List[Tuple[int, int]], bool, bool, b "6811501..6812109", "complement(6792573..>6795461)", "join(1038313,1..1016)" - + :param string: The input string containing position information. @@ -154,40 +194,46 @@ def extract_positions(string: str) -> Tuple[List[Tuple[int, int]], bool, bool, b has_partial_end = False # Check if 'complement' exists in the string - if 'complement' in string: + if "complement" in string: complement = True if "(" in string: # Extract positions found inside the parenthesis - inner_parentheses_regex = r'\(([^()]+)\)' + inner_parentheses_regex = r"\(([^()]+)\)" inner_matches = re.findall(inner_parentheses_regex, string) try: positions = inner_matches[-1] except IndexError: - raise ValueError(f'Gene position {string} is not formatted as expected.') + raise ValueError(f"Gene position {string} is not formatted as expected.") else: positions = string.rstrip() # Check if '>' or '<' exists in the positions to identify partial genes - if '>' in positions or '<' in positions: - if '<' in positions.split(',')[0]: + if ">" in positions or "<" in positions: + if "<" in positions.split(",")[0]: has_partial_start = True - if ">" in positions.split(',')[-1]: + if ">" in positions.split(",")[-1]: has_partial_end = True - inner_positions = ','.join(positions.split(',')[1:-1]) + inner_positions = ",".join(positions.split(",")[1:-1]) - if '>' in inner_positions or '<' in inner_positions or (not has_partial_end and not has_partial_start): - raise ValueError(f"Error parsing positions '{positions}' extracted from GBFF string '{string}'. " - f"Chevrons are found in the inner position. This case is unexpected and not handle.") + if ( + ">" in inner_positions + or "<" in inner_positions + or (not has_partial_end and not has_partial_start) + ): + raise ValueError( + f"Error parsing positions '{positions}' extracted from GBFF string '{string}'. " + f"Chevrons are found in the inner position. This case is unexpected and not handle." + ) - for position in positions.split(','): + for position in positions.split(","): try: - start, stop = position.replace(">", "").replace("<", "").split('..') + start, stop = position.replace(">", "").replace("<", "").split("..") except ValueError: # in some case there is only one position meaning that the gene is long of only one nt in this piece. # for instance : join(1038313,1..1016) @@ -196,17 +242,23 @@ def extract_positions(string: str) -> Tuple[List[Tuple[int, int]], bool, bool, b try: start, stop = int(start), int(stop) except ValueError: - raise ValueError(f"Error parsing position '{position}' extracted from GBFF string '{string}'. " - f"Start position ({start}) and/or stop position ({stop}) are not valid integers.") + raise ValueError( + f"Error parsing position '{position}' extracted from GBFF string '{string}'. " + f"Start position ({start}) and/or stop position ({stop}) are not valid integers." + ) coordinates.append((start, stop)) return coordinates, complement, has_partial_start, has_partial_end -def parse_gbff_by_contig(gbff_file_path: Path - ) -> Generator[Tuple[Dict[str, str], Generator[Dict[str, Union[str, Set[str]]], None, None], str], - None, None]: +def parse_gbff_by_contig( + gbff_file_path: Path, +) -> Generator[ + Tuple[Dict[str, str], Generator[Dict[str, Union[str, Set[str]]], None, None], str], + None, + None, +]: """ Parse a GBFF file by contig and yield tuples containing header, feature, and sequence info for each contig. @@ -225,19 +277,19 @@ def parse_gbff_by_contig(gbff_file_path: Path if not line.strip(): continue - if line.startswith('LOCUS') or line.startswith('CONTIG'): + if line.startswith("LOCUS") or line.startswith("CONTIG"): # CONTIG line are found between FEATURES and ORIGIN and are put in header section here for simplicity current_section = "header" - elif line.startswith('FEATURES'): + elif line.startswith("FEATURES"): current_section = "feature" continue - elif line.startswith('ORIGIN'): + elif line.startswith("ORIGIN"): current_section = "sequence" continue - if line.strip() == '//': + if line.strip() == "//": # Check that each section has some lines assert header_lines and feature_lines and sequence_lines, ( "Missing section in GBFF file. " @@ -246,8 +298,11 @@ def parse_gbff_by_contig(gbff_file_path: Path f"{len(header_lines)} feature lines, " f"and {len(sequence_lines)} sequence lines." ) - yield (parse_contig_header_lines(header_lines), parse_feature_lines(feature_lines), - parse_dna_seq_lines(sequence_lines)) + yield ( + parse_contig_header_lines(header_lines), + parse_feature_lines(feature_lines), + parse_dna_seq_lines(sequence_lines), + ) header_lines = [] feature_lines = [] @@ -265,12 +320,17 @@ def parse_gbff_by_contig(gbff_file_path: Path sequence_lines.append(line) else: - raise ValueError(f'Unexpected structure in GBFF file: {gbff_file_path}. {line}') + raise ValueError( + f"Unexpected structure in GBFF file: {gbff_file_path}. {line}" + ) # In case the last // is missing, return the last contig if header_lines or feature_lines or sequence_lines: - yield (parse_contig_header_lines(header_lines), parse_feature_lines(feature_lines), - parse_dna_seq_lines(sequence_lines)) + yield ( + parse_contig_header_lines(header_lines), + parse_feature_lines(feature_lines), + parse_dna_seq_lines(sequence_lines), + ) def parse_contig_header_lines(header_lines: List[str]) -> Dict[str, str]: @@ -281,7 +341,9 @@ def parse_contig_header_lines(header_lines: List[str]) -> Dict[str, str]: :return: A dict with keys representing different fields and values representing their corresponding values joined by new line. """ field = "" # Initialize field - field_to_value = defaultdict(list) # Initialize defaultdict to store field-value pairs + field_to_value = defaultdict( + list + ) # Initialize defaultdict to store field-value pairs for line in header_lines: field_of_line = line[:12].strip() # Extract field from the first 12 characters @@ -292,10 +354,12 @@ def parse_contig_header_lines(header_lines: List[str]) -> Dict[str, str]: # Append value to the current field in the defaultdict field_to_value[field].append(line[12:].strip()) - return {field: '\n'.join(value) for field, value in field_to_value.items()} + return {field: "\n".join(value) for field, value in field_to_value.items()} -def parse_feature_lines(feature_lines: List[str]) -> Generator[Dict[str, Union[str, Set[str]]], None, None]: +def parse_feature_lines( + feature_lines: List[str], +) -> Generator[Dict[str, Union[str, Set[str]]], None, None]: """ Parse feature lines from a GBFF file and yield dictionaries representing each feature. @@ -303,10 +367,12 @@ def parse_feature_lines(feature_lines: List[str]) -> Generator[Dict[str, Union[s :return: A generator that yields dictionaries, each representing a feature with its type, location, and qualifiers. """ - def stringify_feature_values(feature: Dict[str, List[str]]) -> Dict[str, Union[str, Set[str]]]: + def stringify_feature_values( + feature: Dict[str, List[str]] + ) -> Dict[str, Union[str, Set[str]]]: """ - All value of the returned dict are str except for db_xref that is a list. - When multiple values exist for the same tag only the first one is kept. + All value of the returned dict are str except for db_xref that is a list. + When multiple values exist for the same tag only the first one is kept. """ stringify_feature = {} for tag, val in feature.items(): @@ -334,11 +400,11 @@ def stringify_feature_values(feature: Dict[str, List[str]]) -> Dict[str, Union[s } current_qualifier = "location" - elif line.strip().startswith('/'): + elif line.strip().startswith("/"): qualifier_line = line.strip()[1:] # [1:] used to remove / if "=" in qualifier_line: - current_qualifier, value = qualifier_line.split('=', 1) + current_qualifier, value = qualifier_line.split("=", 1) else: current_qualifier, value = qualifier_line, qualifier_line # clean value from quote @@ -369,14 +435,15 @@ def parse_dna_seq_lines(sequence_lines: List[str]) -> str: :param sequence_lines: List of strings representing sequence lines from a GBFF file. :return: a string in upper case of the DNA sequences that have been cleaned """ - sequence = '' + sequence = "" for line in sequence_lines: sequence += line[10:].replace(" ", "").strip().upper() return sequence -def combine_contigs_metadata(contig_to_metadata: Dict[Contig, Dict[str, str]] - ) -> Tuple[Dict[str, str], Dict[Contig, Dict[str, str]]]: +def combine_contigs_metadata( + contig_to_metadata: Dict[Contig, Dict[str, str]] +) -> Tuple[Dict[str, str], Dict[Contig, Dict[str, str]]]: """ Combine contig metadata to identify shared and unique metadata tags and values. @@ -386,8 +453,12 @@ def combine_contigs_metadata(contig_to_metadata: Dict[Contig, Dict[str, str]] - A dictionary mapping each contig to its unique metadata tags and values. """ # Flatten all metadata items and count their occurrences - all_tag_to_value = [(tag, value) for source_info in contig_to_metadata.values() for (tag, value) in - source_info.items() if isinstance(value, str)] + all_tag_to_value = [ + (tag, value) + for source_info in contig_to_metadata.values() + for (tag, value) in source_info.items() + if isinstance(value, str) + ] # Filter tags that would have a / as it is forbidden when writing the table in HDF5. Such tag can appear with db_xref formatting invalid_tag_names = [] @@ -397,20 +468,29 @@ def combine_contigs_metadata(contig_to_metadata: Dict[Contig, Dict[str, str]] warnings.simplefilter("ignore") check_name_validity(tag) except ValueError as err: - logging.getLogger("PPanGGOLiN").debug(f"{err}. The tag {tag} is ignored for metadata.") + logging.getLogger("PPanGGOLiN").debug( + f"{err}. The tag {tag} is ignored for metadata." + ) invalid_tag_names.append(tag) if value == "": - logging.getLogger("PPanGGOLiN").debug(f"Ignoring tag '{tag}' for metadata due to an empty value.") + logging.getLogger("PPanGGOLiN").debug( + f"Ignoring tag '{tag}' for metadata due to an empty value." + ) invalid_tag_names.append(tag) - all_tag_to_value = [(tag, value) for tag, value in all_tag_to_value if tag not in invalid_tag_names] + all_tag_to_value = [ + (tag, value) for tag, value in all_tag_to_value if tag not in invalid_tag_names + ] contig_count = len(contig_to_metadata) # Identify tags and values shared by all contigs - shared_tag_and_values = {tag_and_value for tag_and_value in all_tag_to_value if - all_tag_to_value.count(tag_and_value) == contig_count} + shared_tag_and_values = { + tag_and_value + for tag_and_value in all_tag_to_value + if all_tag_to_value.count(tag_and_value) == contig_count + } # Create a dictionary for shared metadata genome_metadata = dict(shared_tag_and_values) @@ -418,15 +498,21 @@ def combine_contigs_metadata(contig_to_metadata: Dict[Contig, Dict[str, str]] contig_to_uniq_metadata = {} for contig, tag_to_value in contig_to_metadata.items(): # Identify unique metadata for each contig - uniq_tag_to_value = {tag: value for tag, value in tag_to_value.items() if - tag not in list(genome_metadata) + invalid_tag_names and isinstance(value, str)} + uniq_tag_to_value = { + tag: value + for tag, value in tag_to_value.items() + if tag not in list(genome_metadata) + invalid_tag_names + and isinstance(value, str) + } if uniq_tag_to_value: contig_to_uniq_metadata[contig] = uniq_tag_to_value return genome_metadata, contig_to_uniq_metadata -def reverse_complement_coordinates(coordinates: List[Tuple[int, int]]) -> List[Tuple[int, int]]: +def reverse_complement_coordinates( + coordinates: List[Tuple[int, int]] +) -> List[Tuple[int, int]]: """ Reverses and inverts the given list of coordinates. Each coordinate pair (start, end) is transformed into (-end, -start) and the order of the coordinates is reversed. @@ -438,7 +524,9 @@ def reverse_complement_coordinates(coordinates: List[Tuple[int, int]]) -> List[T return [(-end, -start) for start, end in coordinates[::-1]] -def shift_end_coordinates(coordinates: List[Tuple[int, int]], shift: int) -> List[Tuple[int, int]]: +def shift_end_coordinates( + coordinates: List[Tuple[int, int]], shift: int +) -> List[Tuple[int, int]]: """ Shifts the end of a set of coordinates by a specified amount and then returns the final shifted coordinates. This involves reversing the coordinates twice, shifting the start, and then returning the original orientation. @@ -455,7 +543,9 @@ def shift_end_coordinates(coordinates: List[Tuple[int, int]], shift: int) -> Lis return final_coordinates -def shift_start_coordinates(coordinates: List[Tuple[int, int]], shift: int) -> List[Tuple[int, int]]: +def shift_start_coordinates( + coordinates: List[Tuple[int, int]], shift: int +) -> List[Tuple[int, int]]: """ Shifts the start of the first coordinate in the list by the specified amount. If the shift results in a negative or zero-length interval for the first coordinate, this interval is removed, and the shift is @@ -479,11 +569,14 @@ def shift_start_coordinates(coordinates: List[Tuple[int, int]], shift: int) -> L if adjusted_part_length <= 0: # If the shift results in a zero or negative length, handle accordingly if len(new_coordinates) <= 1: - raise ValueError(f'Shifting the start resulted in a gene with null or negative size. ' - f'Coordinates: {coordinates}, Shift: {shift}') + raise ValueError( + f"Shifting the start resulted in a gene with null or negative size. " + f"Coordinates: {coordinates}, Shift: {shift}" + ) else: logging.getLogger("PPanGGOLiN").warning( - f'Coordinate part {new_coordinates[0]} resulted in a non-positive length after shift. Removing it.') + f"Coordinate part {new_coordinates[0]} resulted in a non-positive length after shift. Removing it." + ) new_coordinates = new_coordinates[1:] # If length is negative, propagate the shift to the next coordinate @@ -495,14 +588,14 @@ def shift_start_coordinates(coordinates: List[Tuple[int, int]], shift: int) -> L def fix_partial_gene_coordinates( - coordinates: List[Tuple[int, int]], - is_complement: bool, - start_shift: int, - ensure_codon_multiple: bool = True + coordinates: List[Tuple[int, int]], + is_complement: bool, + start_shift: int, + ensure_codon_multiple: bool = True, ) -> List[Tuple[int, int]]: """ Adjusts gene coordinates if they have partial starts or ends, ensuring the gene length is a multiple of 3. - + If the gene is on the complement strand, the adjustments will be reversed (i.e., applied to the opposite ends). :param coordinates: List of coordinate tuples (start, stop) for the gene. @@ -514,7 +607,9 @@ def fix_partial_gene_coordinates( """ if not coordinates: - raise ValueError('No coordinates provided. Cannot fix partial gene coordinates.') + raise ValueError( + "No coordinates provided. Cannot fix partial gene coordinates." + ) # Non-complement strand adjustments if not is_complement: @@ -524,7 +619,7 @@ def fix_partial_gene_coordinates( if ensure_codon_multiple: # Ensure the gene length is a multiple of 3 by adjusting the last end gene_length = sum([(stop - start + 1) for start, stop in coordinates]) - end_shift = (gene_length % 3) + end_shift = gene_length % 3 if end_shift != 0: coordinates = shift_end_coordinates(coordinates, end_shift) @@ -536,7 +631,7 @@ def fix_partial_gene_coordinates( if ensure_codon_multiple: # Adjust first start for complement strand gene_length = sum([(stop - start + 1) for start, stop in coordinates]) - start_shift = (gene_length % 3) + start_shift = gene_length % 3 if start_shift != 0: coordinates = shift_start_coordinates(coordinates, start_shift) @@ -545,13 +640,19 @@ def fix_partial_gene_coordinates( if gene_length % 3 != 0: logging.getLogger("PPanGGOLiN").warning( - f'Gene with coordinates: {coordinates} has a length that is not a multiple of 3 after adjusting for partiality with new cordinates ({coordinates}): {gene_length}') + f"Gene with coordinates: {coordinates} has a length that is not a multiple of 3 after adjusting for partiality with new cordinates ({coordinates}): {gene_length}" + ) return coordinates -def read_org_gbff(organism_name: str, gbff_file_path: Path, circular_contigs: List[str], - use_pseudogenes: bool = False, translation_table: int = 11) -> Tuple[Organism, bool]: +def read_org_gbff( + organism_name: str, + gbff_file_path: Path, + circular_contigs: List[str], + use_pseudogenes: bool = False, + translation_table: int = 11, +) -> Tuple[Organism, bool]: """ Read a GBFF file and fills Organism, Contig and Genes objects based on information contained in this file @@ -569,73 +670,89 @@ def read_org_gbff(organism_name: str, gbff_file_path: Path, circular_contigs: Li organism = Organism(organism_name) - logging.getLogger("PPanGGOLiN").debug(f"Extracting genes information from the given gbff {gbff_file_path.name}") + logging.getLogger("PPanGGOLiN").debug( + f"Extracting genes information from the given gbff {gbff_file_path.name}" + ) gene_counter = 0 rna_counter = 0 contig_to_metadata = {} for header, features, sequence in parse_gbff_by_contig(gbff_file_path): if "LOCUS" not in header: - raise ValueError('Missing LOCUS line in GBFF header.') + raise ValueError("Missing LOCUS line in GBFF header.") - if "VERSION" in header and header['VERSION'] != "": - contig_id = header['VERSION'] + if "VERSION" in header and header["VERSION"] != "": + contig_id = header["VERSION"] else: # If contig_id is not specified in VERSION field like with Prokka, in that case we use the one in LOCUS - contig_id = header['LOCUS'].split()[0] + contig_id = header["LOCUS"].split()[0] - contig_len = int(header['LOCUS'].split()[1]) + contig_len = int(header["LOCUS"].split()[1]) if contig_len != len(sequence): - logging.getLogger("PPanGGOLiN").warning("Unable to determine if the contig is circular or linear in file " - f"'{gbff_file_path}' from the LOCUS header information: {header['LOCUS']}. " - "By default, the contig will be considered linear.") + logging.getLogger("PPanGGOLiN").warning( + "Unable to determine if the contig is circular or linear in file " + f"'{gbff_file_path}' from the LOCUS header information: {header['LOCUS']}. " + "By default, the contig will be considered linear." + ) - if "CIRCULAR" in header['LOCUS'].upper(): + if "CIRCULAR" in header["LOCUS"].upper(): # this line contains linear/circular word telling if the dna sequence is circularized or not is_circ = True - elif "LINEAR" in header['LOCUS'].upper(): + elif "LINEAR" in header["LOCUS"].upper(): is_circ = False else: is_circ = False logging.getLogger("PPanGGOLiN").warning( f"It's impossible to identify if contig {contig_id} is circular or linear." - f"in file {gbff_file_path}.") + f"in file {gbff_file_path}." + ) try: contig = organism.get(contig_id) except KeyError: with contig_counter.get_lock(): - contig = Contig(contig_counter.value, contig_id, - True if contig_id in circular_contigs or is_circ else False) + contig = Contig( + contig_counter.value, + contig_id, + True if contig_id in circular_contigs or is_circ else False, + ) contig_counter.value += 1 organism.add(contig) contig.length = contig_len for feature in features: - if feature['feature_type'] == "source": - contig_to_metadata[contig] = {tag: value for tag, value in feature.items() if - tag not in ['feature_type', "location"] and isinstance(value, str)} + if feature["feature_type"] == "source": + contig_to_metadata[contig] = { + tag: value + for tag, value in feature.items() + if tag not in ["feature_type", "location"] + and isinstance(value, str) + } if "db_xref" in feature: try: - db_xref_for_metadata = {f"db_xref_{database}": identifier for database_identifier in - feature["db_xref"] for database, identifier in - [database_identifier.split(':')]} + db_xref_for_metadata = { + f"db_xref_{database}": identifier + for database_identifier in feature["db_xref"] + for database, identifier in [database_identifier.split(":")] + } contig_to_metadata[contig].update(db_xref_for_metadata) except ValueError: logging.getLogger("PPanGGOLiN").warning( f"db_xref values does not have the expected format. Expect 'db_xref=:' " f"but got {feature['db_xref']} in file {gbff_file_path}. " - "db_xref tags is therefore not retrieved in contig/genomes metadata.") + "db_xref tags is therefore not retrieved in contig/genomes metadata." + ) else: contig_to_metadata[contig].update(db_xref_for_metadata) - genetic_code = '' - if feature['feature_type'] not in ['CDS', 'rRNA', 'tRNA']: + genetic_code = "" + if feature["feature_type"] not in ["CDS", "rRNA", "tRNA"]: continue - coordinates, is_complement, has_partial_start, has_partial_end = extract_positions( - ''.join(feature['location'])) + coordinates, is_complement, has_partial_start, has_partial_end = ( + extract_positions("".join(feature["location"])) + ) if "pseudo" in feature and not use_pseudogenes: continue @@ -649,19 +766,25 @@ def read_org_gbff(organism_name: str, gbff_file_path: Path, circular_contigs: Li "will likely contain an internal stop codon when translated with PPanGGOLiN." ) - if feature['feature_type'] == 'CDS': - if feature['transl_table'] == "": + if feature["feature_type"] == "CDS": + if feature["transl_table"] == "": used_transl_table_arg += 1 genetic_code = translation_table else: genetic_code = int(feature["transl_table"]) if has_partial_start or has_partial_end: - start_shift = 0 if 'codon_start' not in feature else int( - feature['codon_start']) - 1 # -1 is to be in zero based index. - - coordinates = fix_partial_gene_coordinates(coordinates, is_complement=is_complement, - start_shift=start_shift) + start_shift = ( + 0 + if "codon_start" not in feature + else int(feature["codon_start"]) - 1 + ) # -1 is to be in zero based index. + + coordinates = fix_partial_gene_coordinates( + coordinates, + is_complement=is_complement, + start_shift=start_shift, + ) strand = "-" if is_complement else "+" @@ -670,16 +793,16 @@ def read_org_gbff(organism_name: str, gbff_file_path: Path, circular_contigs: Li contig=contig, gene_counter=gene_counter, rna_counter=rna_counter, - gene_id=feature['locus_tag'], + gene_id=feature["locus_tag"], dbxrefs=feature["db_xref"], coordinates=coordinates, strand=strand, gene_type=feature["feature_type"], position=contig.number_of_genes, gene_name=feature["gene"], - product=feature['product'], + product=feature["product"], genetic_code=genetic_code, - protein_id=feature["protein_id"] + protein_id=feature["protein_id"], ) gene.add_sequence(get_dna_sequence(sequence, gene)) @@ -689,11 +812,15 @@ def read_org_gbff(organism_name: str, gbff_file_path: Path, circular_contigs: Li else: rna_counter += 1 - genome_metadata, contig_to_uniq_metadata = combine_contigs_metadata(contig_to_metadata) - organism.add_metadata(metadata=Metadata(source='annotation_file', **genome_metadata)) + genome_metadata, contig_to_uniq_metadata = combine_contigs_metadata( + contig_to_metadata + ) + organism.add_metadata( + metadata=Metadata(source="annotation_file", **genome_metadata) + ) for contig, metadata_dict in contig_to_uniq_metadata.items(): - contig.add_metadata(Metadata(source='annotation_file', **metadata_dict)) + contig.add_metadata(Metadata(source="annotation_file", **metadata_dict)) if used_transl_table_arg: logging.getLogger("PPanGGOLiN").info( @@ -704,7 +831,9 @@ def read_org_gbff(organism_name: str, gbff_file_path: Path, circular_contigs: Li return organism, True -def parse_db_xref_metadata(db_xref_values: List[str], annot_file_path: Path = "") -> Dict[str, str]: +def parse_db_xref_metadata( + db_xref_values: List[str], annot_file_path: Path = "" +) -> Dict[str, str]: """ Parses a list of db_xref values and returns a dictionary with formatted keys and identifiers. @@ -718,7 +847,7 @@ def parse_db_xref_metadata(db_xref_values: List[str], annot_file_path: Path = "" db_xref_for_metadata = { f"db_xref_{database}": identifier for database_identifier in db_xref_values - for database, identifier in [database_identifier.split(':')] + for database, identifier in [database_identifier.split(":")] } except ValueError: logging.getLogger("PPanGGOLiN").warning( @@ -729,8 +858,13 @@ def parse_db_xref_metadata(db_xref_values: List[str], annot_file_path: Path = "" return db_xref_for_metadata -def read_org_gff(organism: str, gff_file_path: Path, circular_contigs: List[str], - pseudo: bool = False, translation_table: int = 11) -> Tuple[Organism, bool]: +def read_org_gff( + organism: str, + gff_file_path: Path, + circular_contigs: List[str], + pseudo: bool = False, + translation_table: int = 11, +) -> Tuple[Organism, bool]: """ Read annotation from GFF file @@ -747,7 +881,17 @@ def read_org_gff(organism: str, gff_file_path: Path, circular_contigs: List[str] used_transl_table_arg = 0 global ctg_counter - (gff_seqname, _, gff_type, gff_start, gff_end, _, gff_strand, frame, gff_attribute) = range(0, 9) + ( + gff_seqname, + _, + gff_type, + gff_start, + gff_end, + _, + gff_strand, + frame, + gff_attribute, + ) = range(0, 9) # Missing values: source, score. They are unused. def get_gff_attributes(gff_fields: list) -> dict: @@ -757,11 +901,13 @@ def get_gff_attributes(gff_fields: list) -> dict: :return: Attributes get """ - attributes_field = [f for f in gff_fields[gff_attribute].strip().split(';') if len(f) > 0] + attributes_field = [ + f for f in gff_fields[gff_attribute].strip().split(";") if len(f) > 0 + ] attributes_get = {} for att in attributes_field: try: - (key, value) = att.strip().split('=') + (key, value) = att.strip().split("=") attributes_get[key.upper()] = value except ValueError: pass # we assume that it is a strange, but useless field for our analysis @@ -778,11 +924,15 @@ def get_id_attribute(attributes_dict: dict) -> str: """ element_id = attributes_dict.get("ID") if not element_id: - raise Exception(f"Each CDS type of the gff files must own a unique ID attribute. " - f"Not the case for file: {gff_file_path}") + raise Exception( + f"Each CDS type of the gff files must own a unique ID attribute. " + f"Not the case for file: {gff_file_path}" + ) return element_id - def check_chevrons_in_start_and_stop(start: str, stop: str) -> Tuple[int, int, bool]: + def check_chevrons_in_start_and_stop( + start: str, stop: str + ) -> Tuple[int, int, bool]: """ Checks for the presence of chevrons ('<' or '>') in the start and stop strings, removes them if present, and converts the remaining parts to integers. @@ -792,11 +942,11 @@ def check_chevrons_in_start_and_stop(start: str, stop: str) -> Tuple[int, int, b :return: A tuple containing the integer values of start and stop, and a boolean indicating if chevrons were present in either string. """ - chevrons_present = '>' in start or '<' in start or '>' in stop or '<' in stop + chevrons_present = ">" in start or "<" in start or ">" in stop or "<" in stop if chevrons_present: - start = int(start.replace('<', '').replace('>', '')) - stop = int(stop.replace('<', '').replace('>', '')) + start = int(start.replace("<", "").replace(">", "")) + stop = int(stop.replace("<", "").replace(">", "")) else: start = int(start) stop = int(stop) @@ -819,62 +969,84 @@ def check_chevrons_in_start_and_stop(start: str, stop: str) -> Tuple[int, int, b if has_fasta: fasta_string += line - elif line.startswith('##', 0, 2): - if line.startswith('FASTA', 2, 7): + elif line.startswith("##", 0, 2): + if line.startswith("FASTA", 2, 7): has_fasta = True - elif line.startswith('sequence-region', 2, 17): + elif line.startswith("sequence-region", 2, 17): fields = [el.strip() for el in line.split()] with contig_counter.get_lock(): - contig = Contig(contig_counter.value, fields[1], - True if fields[1] in circular_contigs else False) + contig = Contig( + contig_counter.value, + fields[1], + True if fields[1] in circular_contigs else False, + ) contig_counter.value += 1 org.add(contig) contig.length = int(fields[-1]) - int(fields[2]) + 1 else: continue - elif line.startswith('#'): - if line.startswith('Sequence Data', 2, 15): # GFF from prodigal - fields_prodigal = [el.strip() for el in line.split(': ')[1].split(";")] - attr_prodigal = {field.split("=")[0]: field.split("=")[1] for field in fields_prodigal} + elif line.startswith("#"): + if line.startswith("Sequence Data", 2, 15): # GFF from prodigal + fields_prodigal = [ + el.strip() for el in line.split(": ")[1].split(";") + ] + attr_prodigal = { + field.split("=")[0]: field.split("=")[1] + for field in fields_prodigal + } else: # comment lines to be ignores by parsers continue - elif line.rstrip() == "": # empty lines are not expected, but they do not carry information, so we'll ignore them + elif ( + line.rstrip() == "" + ): # empty lines are not expected, but they do not carry information, so we'll ignore them continue else: - fields_gff = [el.strip() for el in line.split('\t')] + fields_gff = [el.strip() for el in line.split("\t")] attributes = get_gff_attributes(fields_gff) pseudogene = False - gene_start, gene_stop, has_chevron = check_chevrons_in_start_and_stop(start=fields_gff[gff_start], - stop=fields_gff[gff_end]) + gene_start, gene_stop, has_chevron = check_chevrons_in_start_and_stop( + start=fields_gff[gff_start], stop=fields_gff[gff_end] + ) - if fields_gff[gff_type] == 'region': + if fields_gff[gff_type] == "region": # keep region attributes to add them as metadata of genome and contigs # excluding some info as they are already contained in contig object. - contig_name_to_region_info[fields_gff[gff_seqname]] = {tag.lower(): value for tag, value in - attributes.items() if - tag not in ['ID', "NAME", "IS_CIRCULAR", - "DB_XREF", "DBXREF"]} + contig_name_to_region_info[fields_gff[gff_seqname]] = { + tag.lower(): value + for tag, value in attributes.items() + if tag not in ["ID", "NAME", "IS_CIRCULAR", "DB_XREF", "DBXREF"] + } - if "DB_XREF" in attributes or "DBXREF" in attributes: # db_xref can be written Dbxref and db_ref + if ( + "DB_XREF" in attributes or "DBXREF" in attributes + ): # db_xref can be written Dbxref and db_ref dbxref_tag = "DB_XREF" if "DB_XREF" in attributes else "DBXREF" - dbxref_metadata = parse_db_xref_metadata(attributes[dbxref_tag].split(','), gff_file_path) - contig_name_to_region_info[fields_gff[gff_seqname]].update(dbxref_metadata) - - if fields_gff[gff_seqname] in circular_contigs or ('IS_CIRCULAR' in attributes and - attributes['IS_CIRCULAR'] == "true"): + dbxref_metadata = parse_db_xref_metadata( + attributes[dbxref_tag].split(","), gff_file_path + ) + contig_name_to_region_info[fields_gff[gff_seqname]].update( + dbxref_metadata + ) + + if fields_gff[gff_seqname] in circular_contigs or ( + "IS_CIRCULAR" in attributes + and attributes["IS_CIRCULAR"] == "true" + ): # WARNING: In case we have prodigal gff with is_circular attributes. # This would fail as contig is not defined. However, is_circular should not be found in prodigal gff - logging.getLogger("PPanGGOLiN").debug(f"Contig {contig.name} is circular.") + logging.getLogger("PPanGGOLiN").debug( + f"Contig {contig.name} is circular." + ) contig.is_circular = True assert contig.name == fields_gff[gff_seqname] - elif fields_gff[gff_type] == 'CDS' or "RNA" in fields_gff[gff_type]: + elif fields_gff[gff_type] == "CDS" or "RNA" in fields_gff[gff_type]: id_attribute = get_id_attribute(attributes) locus_tag = attributes.get("LOCUS_TAG") @@ -889,41 +1061,52 @@ def check_chevrons_in_start_and_stop(start: str, stop: str) -> Tuple[int, int, b else: gene_id = id_attribute - name = attributes.pop('NAME', attributes.pop('GENE', "")) + name = attributes.pop("NAME", attributes.pop("GENE", "")) if "PSEUDO" in attributes or "PSEUDOGENE" in attributes: pseudogene = True - if ("PARTIAL" in attributes and attributes["PARTIAL"].upper() == "TRUE") or has_chevron: + if ( + "PARTIAL" in attributes + and attributes["PARTIAL"].upper() == "TRUE" + ) or has_chevron: is_partial = True else: is_partial = False - product = attributes.pop('PRODUCT', "") - + product = attributes.pop("PRODUCT", "") + if has_non_ascii(product): - + logging.getLogger("PPanGGOLiN").warning( - f"In genome '{organism}', the 'product' field of gene '{gene_id}' contains non-ASCII characters: '{product}'. " - "These characters cannot be stored in the HDF5 file and will be replaced by underscores." - ) + f"In genome '{organism}', the 'product' field of gene '{gene_id}' contains non-ASCII characters: '{product}'. " + "These characters cannot be stored in the HDF5 file and will be replaced by underscores." + ) product = replace_non_ascii(product) - if contig is None or contig.name != fields_gff[gff_seqname]: # get the current contig try: contig = org.get(fields_gff[gff_seqname]) except KeyError: with contig_counter.get_lock(): - contig = Contig(contig_counter.value, fields_gff[gff_seqname], - True if fields_gff[gff_seqname] in circular_contigs else False) + contig = Contig( + contig_counter.value, + fields_gff[gff_seqname], + ( + True + if fields_gff[gff_seqname] in circular_contigs + else False + ), + ) contig_counter.value += 1 org.add(contig) if attr_prodigal is not None: contig.length = int(attr_prodigal["seqlen"]) - if fields_gff[gff_type] == "CDS" and (not pseudogene or (pseudogene and pseudo)): + if fields_gff[gff_type] == "CDS" and ( + not pseudogene or (pseudogene and pseudo) + ): if "TRANSL_TABLE" in attributes: genetic_code = int(attributes["TRANSL_TABLE"]) @@ -936,17 +1119,21 @@ def check_chevrons_in_start_and_stop(start: str, stop: str) -> Tuple[int, int, b if fields_gff[frame] in ["1", "2", "0"]: gene_frame = int(fields_gff[frame]) - if gene_id in id_attr_to_gene_id: # the ID has already been seen at least once in this genome + if ( + gene_id in id_attr_to_gene_id + ): # the ID has already been seen at least once in this genome existing_gene = id_attr_to_gene_id[gene_id] - new_gene_info = {"strand": fields_gff[gff_strand], - "type": fields_gff[gff_type], - "name": name, - "position": contig.number_of_genes, - "product": product, - "local_identifier": gene_id, - "start": gene_start, - "stop": gene_stop, - "frame": gene_frame} + new_gene_info = { + "strand": fields_gff[gff_strand], + "type": fields_gff[gff_type], + "name": name, + "position": contig.number_of_genes, + "product": product, + "local_identifier": gene_id, + "start": gene_start, + "stop": gene_stop, + "frame": gene_frame, + } check_and_add_extra_gene_part(existing_gene, new_gene_info) @@ -957,10 +1144,19 @@ def check_chevrons_in_start_and_stop(start: str, stop: str) -> Tuple[int, int, b id_attr_to_gene_id[gene_id] = gene # here contig is filled in order, so position is the number of genes already stored in the contig. - gene.fill_annotations(start=gene_start, stop=gene_stop, strand=fields_gff[gff_strand], - gene_type=fields_gff[gff_type], name=name, product=product, - position=contig.number_of_genes, local_identifier=gene_id, - genetic_code=genetic_code, is_partial=is_partial, frame=gene_frame) + gene.fill_annotations( + start=gene_start, + stop=gene_stop, + strand=fields_gff[gff_strand], + gene_type=fields_gff[gff_type], + name=name, + product=product, + position=contig.number_of_genes, + local_identifier=gene_id, + genetic_code=genetic_code, + is_partial=is_partial, + frame=gene_frame, + ) gene.fill_parents(org, contig) gene_counter += 1 @@ -969,11 +1165,19 @@ def check_chevrons_in_start_and_stop(start: str, stop: str) -> Tuple[int, int, b elif "RNA" in fields_gff[gff_type]: rna_type = fields_gff[gff_type] - rna = RNA(org.name + f"_{rna_type}_" + str(rna_counter).zfill(4)) - - rna.fill_annotations(start=gene_start, stop=gene_stop, strand=fields_gff[gff_strand], - gene_type=fields_gff[gff_type], name=name, product=product, - local_identifier=gene_id) + rna = RNA( + org.name + f"_{rna_type}_" + str(rna_counter).zfill(4) + ) + + rna.fill_annotations( + start=gene_start, + stop=gene_stop, + strand=fields_gff[gff_strand], + gene_type=fields_gff[gff_type], + name=name, + product=product, + local_identifier=gene_id, + ) rna.fill_parents(org, contig) rna_counter += 1 contig.add_rna(rna) @@ -985,19 +1189,26 @@ def check_chevrons_in_start_and_stop(start: str, stop: str) -> Tuple[int, int, b for contig in org.contigs: for gene in contig.genes: if gene.is_partial: - is_complement = gene.strand == '-' - gene.coordinates = fix_partial_gene_coordinates(gene.coordinates, is_complement=is_complement, - start_shift=gene.frame) + is_complement = gene.strand == "-" + gene.coordinates = fix_partial_gene_coordinates( + gene.coordinates, + is_complement=is_complement, + start_shift=gene.frame, + ) # GET THE FASTA SEQUENCES OF THE GENES if fasta_string == "": has_fasta = False if has_fasta: - contig_sequences = read_fasta(org, fasta_string.split('\n')) # _ is total contig length + contig_sequences = read_fasta( + org, fasta_string.split("\n") + ) # _ is total contig length for contig in org.contigs: if contig.length != len(contig_sequences[contig.name]): - raise ValueError("The contig length defined is different than the sequence length") + raise ValueError( + "The contig length defined is different than the sequence length" + ) for gene in contig.genes: gene.add_sequence(get_dna_sequence(contig_sequences[contig.name], gene)) @@ -1016,8 +1227,11 @@ def check_chevrons_in_start_and_stop(start: str, stop: str) -> Tuple[int, int, b return org, has_fasta -def add_metadata_from_gff_file(contig_name_to_region_info: Dict[str, Dict[str, str]], - org: Organism, gff_file_path: Path): +def add_metadata_from_gff_file( + contig_name_to_region_info: Dict[str, Dict[str, str]], + org: Organism, + gff_file_path: Path, +): """ Add metadata to the organism object from a GFF file. @@ -1028,10 +1242,15 @@ def add_metadata_from_gff_file(contig_name_to_region_info: Dict[str, Dict[str, s # Check if the number of contigs matches the expected number in the organism if len(contig_name_to_region_info) == org.number_of_contigs: - contig_to_region_info = {org.get(name): region_info for name, region_info in contig_name_to_region_info.items()} - genome_metadata, contig_to_uniq_metadata = combine_contigs_metadata(contig_to_region_info) + contig_to_region_info = { + org.get(name): region_info + for name, region_info in contig_name_to_region_info.items() + } + genome_metadata, contig_to_uniq_metadata = combine_contigs_metadata( + contig_to_region_info + ) if genome_metadata: - org.add_metadata(Metadata(source='annotation_file', **genome_metadata)) + org.add_metadata(Metadata(source="annotation_file", **genome_metadata)) else: logging.getLogger("PPanGGOLiN").warning( f"Inconsistent data in GFF file {gff_file_path}: " @@ -1040,10 +1259,12 @@ def add_metadata_from_gff_file(contig_name_to_region_info: Dict[str, Dict[str, s contig_to_uniq_metadata = {} for contig, metadata_dict in contig_to_uniq_metadata.items(): - contig.add_metadata(Metadata(source='annotation_file', **metadata_dict)) + contig.add_metadata(Metadata(source="annotation_file", **metadata_dict)) -def check_and_add_extra_gene_part(gene: Gene, new_gene_info: Dict, max_separation: int = 10): +def check_and_add_extra_gene_part( + gene: Gene, new_gene_info: Dict, max_separation: int = 10 +): """ Checks and potentially adds extra gene parts based on new gene information. This is done before checking for potential overlapping edge genes. Gene coordinates are expected to be in ascending order, and no circularity is taken into account here. @@ -1059,26 +1280,31 @@ def check_and_add_extra_gene_part(gene: Gene, new_gene_info: Dict, max_separatio # Compare attributes of the existing gene with new_gene_info comparison = [ - gene.strand == new_gene_info['strand'], + gene.strand == new_gene_info["strand"], gene.type == new_gene_info["type"], - gene.product == new_gene_info['product'], - gene.name == new_gene_info['name'], - gene.local_identifier == new_gene_info['local_identifier'] + gene.product == new_gene_info["product"], + gene.name == new_gene_info["name"], + gene.local_identifier == new_gene_info["local_identifier"], ] if all(comparison): # The new gene info seems concordant with the gene object. We can try to merge them - assert new_gene_info['start'] <= new_gene_info['stop'], "Start is greater than stop. Incorrect coordinates." + assert ( + new_gene_info["start"] <= new_gene_info["stop"] + ), "Start is greater than stop. Incorrect coordinates." - new_gene_is_before = (gene.strand == "+" and new_gene_info['start'] < gene.start) or ( - gene.strand == "-" and new_gene_info['start'] > gene.start) + new_gene_is_before = ( + gene.strand == "+" and new_gene_info["start"] < gene.start + ) or (gene.strand == "-" and new_gene_info["start"] > gene.start) if new_gene_is_before: - # new gene start if before the current gene - # so its frame if used - gene.frame = new_gene_info['frame'] + # new gene start if before the current gene + # so its frame if used + gene.frame = new_gene_info["frame"] # Add new coordinates to gene's coordinates - gene.coordinates = sorted(gene.coordinates + [(new_gene_info['start'], new_gene_info['stop'])]) + gene.coordinates = sorted( + gene.coordinates + [(new_gene_info["start"], new_gene_info["stop"])] + ) # Check if the coordinates are within the allowed maximum separation first_stop = gene.coordinates[0][1] @@ -1087,7 +1313,8 @@ def check_and_add_extra_gene_part(gene: Gene, new_gene_info: Dict, max_separatio # This is maybe to restrictive but let's go with that first. raise ValueError( f"The coordinates of genes are too far apart ({abs(start - first_stop)}nt). This is unexpected. " - f"Gene coordinates : {gene.coordinates}") + f"Gene coordinates : {gene.coordinates}" + ) # Update start and stop positions based on new coordinates gene.start, gene.stop = gene.coordinates[0][0], gene.coordinates[-1][1] @@ -1095,7 +1322,8 @@ def check_and_add_extra_gene_part(gene: Gene, new_gene_info: Dict, max_separatio logging.getLogger("PPanGGOLiN").debug( f"Gene {new_gene_info['local_identifier']} is found in multiple parts. " "These parts are merged into one gene. " - f"New gene coordinates: {gene.coordinates}") + f"New gene coordinates: {gene.coordinates}" + ) else: detailed_comparison = { @@ -1107,7 +1335,8 @@ def check_and_add_extra_gene_part(gene: Gene, new_gene_info: Dict, max_separatio } raise ValueError( - f"Two genes have the same id attributes but different info in some key attribute. {detailed_comparison}") + f"Two genes have the same id attributes but different info in some key attribute. {detailed_comparison}" + ) def correct_putative_overlaps(contigs: Iterable[Contig]): @@ -1130,16 +1359,20 @@ def correct_putative_overlaps(contigs: Iterable[Contig]): if start > len(contig): if len(new_coordinates) == 0: - raise ValueError(f"First gene start position ({start}) is higher than contig " - f"length ({len(contig)}). This case is not handled.") + raise ValueError( + f"First gene start position ({start}) is higher than contig " + f"length ({len(contig)}). This case is not handled." + ) new_start = start - len(contig) new_stop = stop - len(contig) new_coordinates.append((new_start, new_stop)) - warn_msg = (f"Start position ({start}) for gene {gene.name} is higher than contig {contig.name}" - f" length ({len(contig)}). New coordinate are {new_coordinates}") + warn_msg = ( + f"Start position ({start}) for gene {gene.name} is higher than contig {contig.name}" + f" length ({len(contig)}). New coordinate are {new_coordinates}" + ) logging.getLogger("PPanGGOLiN").warning(warn_msg) elif stop > len(contig): # Handle overlapping gene @@ -1162,8 +1395,13 @@ def correct_putative_overlaps(contigs: Iterable[Contig]): gene.coordinates = new_coordinates -def read_anno_file(organism_name: str, filename: Path, circular_contigs: list, - pseudo: bool = False, translation_table: int = 11) -> Tuple[Organism, bool]: +def read_anno_file( + organism_name: str, + filename: Path, + circular_contigs: list, + pseudo: bool = False, + translation_table: int = 11, +) -> Tuple[Organism, bool]: """ Read a GBFF file for one organism @@ -1179,26 +1417,38 @@ def read_anno_file(organism_name: str, filename: Path, circular_contigs: list, filetype = detect_filetype(filename) if filetype == "gff": try: - org, has_fasta = read_org_gff(organism_name, filename, circular_contigs, pseudo, translation_table) + org, has_fasta = read_org_gff( + organism_name, filename, circular_contigs, pseudo, translation_table + ) except Exception as err: - raise Exception(f"Reading the gff3 file '{filename}' raised an error. {err}") + raise Exception( + f"Reading the gff3 file '{filename}' raised an error. {err}" + ) else: return org, has_fasta elif filetype == "gbff": try: - org, has_fasta = read_org_gbff(organism_name, filename, circular_contigs, pseudo, translation_table) + org, has_fasta = read_org_gbff( + organism_name, filename, circular_contigs, pseudo, translation_table + ) except Exception as err: - raise Exception(f"Reading the gbff file '{filename}' raised an error. {err}") + raise Exception( + f"Reading the gbff file '{filename}' raised an error. {err}" + ) else: return org, has_fasta elif filetype == "fasta": - raise ValueError(f"Invalid file type provided for parameter '--anno'. " - f"The file '{filename}' looks like a fasta file. " - "Please use a .gff or .gbff file. You may be able to use --fasta instead of --anno.") + raise ValueError( + f"Invalid file type provided for parameter '--anno'. " + f"The file '{filename}' looks like a fasta file. " + "Please use a .gff or .gbff file. You may be able to use --fasta instead of --anno." + ) else: - raise ValueError(f"Invalid file type provided for parameter '--anno'. " - f"The file '{filename}' appears to be of type '{filetype}'. Please use .gff or .gbff files.") + raise ValueError( + f"Invalid file type provided for parameter '--anno'. " + f"The file '{filename}' appears to be of type '{filetype}'. Please use .gff or .gbff files." + ) def chose_gene_identifiers(pangenome: Pangenome) -> bool: @@ -1214,8 +1464,12 @@ def chose_gene_identifiers(pangenome: Pangenome) -> bool: if local_identifiers_are_unique(pangenome.genes): for gene in pangenome.genes: - gene.ID = gene.local_identifier # Erase ppanggolin generated gene ids and replace with local identifiers - gene.local_identifier = "" # this is now useless, setting it to default value + gene.ID = ( + gene.local_identifier + ) # Erase ppanggolin generated gene ids and replace with local identifiers + gene.local_identifier = ( + "" # this is now useless, setting it to default value + ) pangenome._mk_gene_getter() # re-build the gene getter return True @@ -1243,9 +1497,14 @@ def local_identifiers_are_unique(genes: Iterable[Gene]) -> bool: return True -def read_annotations(pangenome: Pangenome, organisms_file: Path, cpu: int = 1, pseudo: bool = False, - translation_table: int = 11, - disable_bar: bool = False): +def read_annotations( + pangenome: Pangenome, + organisms_file: Path, + cpu: int = 1, + pseudo: bool = False, + translation_table: int = 11, + disable_bar: bool = False, +): """ Read the annotation from GBFF file @@ -1257,26 +1516,34 @@ def read_annotations(pangenome: Pangenome, organisms_file: Path, cpu: int = 1, p :param disable_bar: Disable the progress bar """ - logging.getLogger("PPanGGOLiN").info(f"Reading {organisms_file.name} the list of genome files ...") + logging.getLogger("PPanGGOLiN").info( + f"Reading {organisms_file.name} the list of genome files ..." + ) pangenome.status["geneSequences"] = "Computed" # we assume there are gene sequences in the annotation files, # unless a gff file without fasta is met (which is the only case where sequences can be absent) args = [] for line in read_compressed_or_not(organisms_file): - if not line.strip() or line.strip().startswith('#'): + if not line.strip() or line.strip().startswith("#"): continue elements = [el.strip() for el in line.split("\t")] org_path = Path(elements[1]) name = elements[0] circular_contigs = elements[2:] - if not org_path.exists(): # Check tsv sanity test if it's not one it's the other + if ( + not org_path.exists() + ): # Check tsv sanity test if it's not one it's the other org_path = organisms_file.parent.joinpath(org_path) args.append((name, org_path, circular_contigs, pseudo, translation_table)) - with ProcessPoolExecutor(mp_context=get_context('fork'), max_workers=cpu, - initializer=init_contig_counter, initargs=(contig_counter,)) as executor: + with ProcessPoolExecutor( + mp_context=get_context("fork"), + max_workers=cpu, + initializer=init_contig_counter, + initargs=(contig_counter,), + ) as executor: with tqdm(total=len(args), unit="file", disable=disable_bar) as progress: futures = [] @@ -1295,15 +1562,21 @@ def read_annotations(pangenome: Pangenome, organisms_file: Path, cpu: int = 1, p # decide whether we use local ids or ppanggolin ids. used_local_identifiers = chose_gene_identifiers(pangenome) if used_local_identifiers: - logging.getLogger("PPanGGOLiN").info("gene identifiers used in the provided annotation files were unique, " - "PPanGGOLiN will use them.") + logging.getLogger("PPanGGOLiN").info( + "gene identifiers used in the provided annotation files were unique, " + "PPanGGOLiN will use them." + ) else: - logging.getLogger("PPanGGOLiN").info("gene identifiers used in the provided annotation files were not unique, " - "PPanGGOLiN will use self-generated identifiers.") + logging.getLogger("PPanGGOLiN").info( + "gene identifiers used in the provided annotation files were not unique, " + "PPanGGOLiN will use self-generated identifiers." + ) pangenome.status["genomesAnnotated"] = "Computed" pangenome.parameters["annotate"] = {} - pangenome.parameters["annotate"]["# used_local_identifiers"] = used_local_identifiers + pangenome.parameters["annotate"][ + "# used_local_identifiers" + ] = used_local_identifiers pangenome.parameters["annotate"]["use_pseudo"] = pseudo pangenome.parameters["annotate"]["# read_annotations_from_file"] = True @@ -1316,7 +1589,9 @@ def read_annotations(pangenome: Pangenome, organisms_file: Path, cpu: int = 1, p pangenome.status["metasources"]["contigs"].append("annotation_file") -def get_gene_sequences_from_fastas(pangenome: Pangenome, fasta_files: Path, disable_bar: bool = False): +def get_gene_sequences_from_fastas( + pangenome: Pangenome, fasta_files: Path, disable_bar: bool = False +): """ Get gene sequences from fastas @@ -1328,51 +1603,80 @@ def get_gene_sequences_from_fastas(pangenome: Pangenome, fasta_files: Path, disa for line in read_compressed_or_not(fasta_files): elements = [el.strip() for el in line.split("\t")] if len(elements) <= 1: - logging.getLogger("PPanGGOLiN").error("No tabulation separator found in genome file") + logging.getLogger("PPanGGOLiN").error( + "No tabulation separator found in genome file" + ) exit(1) try: org = pangenome.get_organism(elements[0]) except KeyError: - raise KeyError(f"One of the genome in your '{fasta_files}' was not found in the pan." - f" This might mean that the genome names between your annotation file and " - f"your fasta file are different.") + raise KeyError( + f"One of the genome in your '{fasta_files}' was not found in the pan." + f" This might mean that the genome names between your annotation file and " + f"your fasta file are different." + ) with read_compressed_or_not(Path(elements[1])) as currFastaFile: fasta_dict[org] = read_fasta(org, currFastaFile) if set(pangenome.organisms) > set(fasta_dict.keys()): - missing = pangenome.number_of_organisms - len(set(pangenome.organisms) & set(fasta_dict.keys())) - raise KeyError(f"Not all of your pangenome genomes are present within the provided fasta file. " - f"{missing} are missing (out of {pangenome.number_of_organisms}).") + missing = pangenome.number_of_organisms - len( + set(pangenome.organisms) & set(fasta_dict.keys()) + ) + raise KeyError( + f"Not all of your pangenome genomes are present within the provided fasta file. " + f"{missing} are missing (out of {pangenome.number_of_organisms})." + ) elif pangenome.number_of_organisms < len(fasta_dict): # Indicates that all organisms in the pangenome are present in the provided FASTA file, # but additional genomes are also detected in the file. diff_genomes = len(fasta_dict) - pangenome.number_of_organisms - logging.getLogger("PPanGGOLiN").warning(f"The provided fasta file contains {diff_genomes} " - "additional genomes compared to the pangenome.") + logging.getLogger("PPanGGOLiN").warning( + f"The provided fasta file contains {diff_genomes} " + "additional genomes compared to the pangenome." + ) - with tqdm(total=pangenome.number_of_genes, unit="gene", disable=disable_bar, - desc="Add sequences to genes") as bar: + with tqdm( + total=pangenome.number_of_genes, + unit="gene", + disable=disable_bar, + desc="Add sequences to genes", + ) as bar: for org in pangenome.organisms: for contig in org.contigs: try: for gene in contig.genes: - gene.add_sequence(get_dna_sequence(fasta_dict[org][contig.name], gene)) + gene.add_sequence( + get_dna_sequence(fasta_dict[org][contig.name], gene) + ) bar.update() # for rna in contig.RNAs: # rna.add_sequence(get_dna_sequence(fasta_dict[org][contig.name], rna)) except KeyError: - msg = f"Fasta file for genome {org.name} did not have the contig {contig.name} " \ - f"that was read from the annotation file. " - msg += f"The provided contigs in the fasta were : " \ - f"{', '.join(fasta_dict[org].keys())}." + msg = ( + f"Fasta file for genome {org.name} did not have the contig {contig.name} " + f"that was read from the annotation file. " + ) + msg += ( + f"The provided contigs in the fasta were : " + f"{', '.join(fasta_dict[org].keys())}." + ) raise KeyError(msg) pangenome.status["geneSequences"] = "Computed" -def annotate_pangenome(pangenome: Pangenome, fasta_list: Path, tmpdir: str, cpu: int = 1, translation_table: int = 11, - kingdom: str = "bacteria", norna: bool = False, allow_overlap: bool = False, - procedure: str = None, disable_bar: bool = False): +def annotate_pangenome( + pangenome: Pangenome, + fasta_list: Path, + tmpdir: str, + cpu: int = 1, + translation_table: int = 11, + kingdom: str = "bacteria", + norna: bool = False, + allow_overlap: bool = False, + procedure: str = None, + disable_bar: bool = False, +): """ Main function to annotate a pangenome @@ -1388,7 +1692,9 @@ def annotate_pangenome(pangenome: Pangenome, fasta_list: Path, tmpdir: str, cpu: :param disable_bar: Disable the progress bar """ - logging.getLogger("PPanGGOLiN").info(f"Reading {fasta_list} the list of genome files") + logging.getLogger("PPanGGOLiN").info( + f"Reading {fasta_list} the list of genome files" + ) arguments = [] # Argument given to annotate organism in same order than prototype for line in read_compressed_or_not(fasta_list): @@ -1396,18 +1702,37 @@ def annotate_pangenome(pangenome: Pangenome, fasta_list: Path, tmpdir: str, cpu: elements = [el.strip() for el in line.split("\t")] org_path = Path(elements[1]) - if not org_path.exists(): # Check tsv sanity test if it's not one it's the other + if ( + not org_path.exists() + ): # Check tsv sanity test if it's not one it's the other org_path = fasta_list.parent.joinpath(org_path) - arguments.append((elements[0], org_path, elements[2:], tmpdir, translation_table, - norna, kingdom, allow_overlap, procedure)) + arguments.append( + ( + elements[0], + org_path, + elements[2:], + tmpdir, + translation_table, + norna, + kingdom, + allow_overlap, + procedure, + ) + ) if len(arguments) == 0: raise Exception("There are no genomes in the provided file") - logging.getLogger("PPanGGOLiN").info(f"Annotating {len(arguments)} genomes using {cpu} cpus...") - with ProcessPoolExecutor(mp_context=get_context('fork'), max_workers=cpu, - initializer=init_contig_counter, initargs=(contig_counter,)) as executor: + logging.getLogger("PPanGGOLiN").info( + f"Annotating {len(arguments)} genomes using {cpu} cpus..." + ) + with ProcessPoolExecutor( + mp_context=get_context("fork"), + max_workers=cpu, + initializer=init_contig_counter, + initargs=(contig_counter,), + ) as executor: with tqdm(total=len(arguments), unit="file", disable=disable_bar) as progress: futures = [] @@ -1421,12 +1746,16 @@ def annotate_pangenome(pangenome: Pangenome, fasta_list: Path, tmpdir: str, cpu: logging.getLogger("PPanGGOLiN").info("Done annotating genomes") pangenome.status["genomesAnnotated"] = "Computed" # the pangenome is now annotated. - pangenome.status["geneSequences"] = "Computed" # the gene objects have their respective gene sequences. + pangenome.status["geneSequences"] = ( + "Computed" # the gene objects have their respective gene sequences. + ) pangenome.parameters["annotate"] = {} pangenome.parameters["annotate"]["norna"] = norna pangenome.parameters["annotate"]["kingdom"] = kingdom pangenome.parameters["annotate"]["translation_table"] = translation_table - pangenome.parameters["annotate"]["prodigal_procedure"] = None if procedure is None else procedure + pangenome.parameters["annotate"]["prodigal_procedure"] = ( + None if procedure is None else procedure + ) pangenome.parameters["annotate"]["allow_overlap"] = allow_overlap pangenome.parameters["annotate"]["# read_annotations_from_file"] = False @@ -1441,28 +1770,53 @@ def launch(args: argparse.Namespace): filename = mk_file_name(args.basename, args.output, args.force) pangenome = Pangenome() if args.fasta is not None and args.anno is None: - annotate_pangenome(pangenome, args.fasta, tmpdir=args.tmpdir, cpu=args.cpu, procedure=args.prodigal_procedure, - translation_table=args.translation_table, kingdom=args.kingdom, norna=args.norna, - allow_overlap=args.allow_overlap, disable_bar=args.disable_prog_bar) + annotate_pangenome( + pangenome, + args.fasta, + tmpdir=args.tmpdir, + cpu=args.cpu, + procedure=args.prodigal_procedure, + translation_table=args.translation_table, + kingdom=args.kingdom, + norna=args.norna, + allow_overlap=args.allow_overlap, + disable_bar=args.disable_prog_bar, + ) elif args.anno is not None: # TODO add warning for option not compatible with read_annotations - read_annotations(pangenome, args.anno, cpu=args.cpu, pseudo=args.use_pseudo, - translation_table=args.translation_table, disable_bar=args.disable_prog_bar) + read_annotations( + pangenome, + args.anno, + cpu=args.cpu, + pseudo=args.use_pseudo, + translation_table=args.translation_table, + disable_bar=args.disable_prog_bar, + ) if pangenome.status["geneSequences"] == "No": if args.fasta: - logging.getLogger("PPanGGOLiN").info(f"Get sequences from FASTA file: {args.fasta}") - get_gene_sequences_from_fastas(pangenome, args.fasta, disable_bar=args.disable_prog_bar) + logging.getLogger("PPanGGOLiN").info( + f"Get sequences from FASTA file: {args.fasta}" + ) + get_gene_sequences_from_fastas( + pangenome, args.fasta, disable_bar=args.disable_prog_bar + ) else: - logging.getLogger("PPanGGOLiN").warning("You provided gff files without sequences, " - "and you did not provide fasta sequences. " - "Thus it was not possible to get the gene sequences.") - logging.getLogger("PPanGGOLiN").warning("You will be able to proceed with your analysis " - "ONLY if you provide the clustering results in the next step.") + logging.getLogger("PPanGGOLiN").warning( + "You provided gff files without sequences, " + "and you did not provide fasta sequences. " + "Thus it was not possible to get the gene sequences." + ) + logging.getLogger("PPanGGOLiN").warning( + "You will be able to proceed with your analysis " + "ONLY if you provide the clustering results in the next step." + ) else: if args.fasta: - logging.getLogger("PPanGGOLiN").warning("You provided fasta sequences " - "but your gff files were already with sequences." - "PPanGGOLiN will use sequences in GFF and not from your fasta.") + logging.getLogger("PPanGGOLiN").warning( + "You provided fasta sequences " + "but your gff files were already with sequences." + "PPanGGOLiN will use sequences in GFF and not from your fasta." + ) write_pangenome(pangenome, filename, args.force, disable_bar=args.disable_prog_bar) @@ -1474,7 +1828,9 @@ def subparser(sub_parser: argparse._SubParsersAction) -> argparse.ArgumentParser :return : parser arguments for align command """ - parser = sub_parser.add_parser("annotate", formatter_class=argparse.RawTextHelpFormatter) + parser = sub_parser.add_parser( + "annotate", formatter_class=argparse.RawTextHelpFormatter + ) parser_annot(parser) return parser @@ -1486,49 +1842,113 @@ def parser_annot(parser: argparse.ArgumentParser): :param parser: parser for annotate argument """ date = time.strftime("_DATE%Y-%m-%d_HOUR%H.%M.%S", time.localtime()) - required = parser.add_argument_group(title="Required arguments", - description="One of the following arguments is required :") - required.add_argument('--fasta', required=False, type=Path, - help="A tab-separated file listing the genome names, and the fasta filepath of its genomic " - "sequence(s) (the fastas can be compressed with gzip). One line per genome.") - required.add_argument('--anno', required=False, type=Path, - help="A tab-separated file listing the genome names, and the gff/gbff filepath of its " - "annotations (the files can be compressed with gzip). One line per genome. " - "If this is provided, those annotations will be used.") + required = parser.add_argument_group( + title="Required arguments", + description="One of the following arguments is required :", + ) + required.add_argument( + "--fasta", + required=False, + type=Path, + help="A tab-separated file listing the genome names, and the fasta filepath of its genomic " + "sequence(s) (the fastas can be compressed with gzip). One line per genome.", + ) + required.add_argument( + "--anno", + required=False, + type=Path, + help="A tab-separated file listing the genome names, and the gff/gbff filepath of its " + "annotations (the files can be compressed with gzip). One line per genome. " + "If this is provided, those annotations will be used.", + ) optional = parser.add_argument_group(title="Optional arguments") - optional.add_argument('-o', '--output', required=False, type=Path, - default=Path(f'ppanggolin_output{date}_PID{str(os.getpid())}'), - help="Output directory") - optional.add_argument('--allow_overlap', required=False, action='store_true', default=False, - help="Use to not remove genes overlapping with RNA features.") - optional.add_argument("--norna", required=False, action="store_true", default=False, - help="Use to avoid annotating RNA features.") - optional.add_argument("--kingdom", required=False, type=str.lower, default="bacteria", - choices=["bacteria", "archaea"], - help="Kingdom to which the prokaryota belongs to, " - "to know which models to use for rRNA annotation.") - optional.add_argument("--translation_table", required=False, type=int, default=11, - help="Translation table (genetic code) to use.") - optional.add_argument("--basename", required=False, default="pangenome", help="basename for the output file") - optional.add_argument("--use_pseudo", required=False, action="store_true", - help="In the context of provided annotation, use this option to read pseudogenes. " - "(Default behavior is to ignore them)") - optional.add_argument("-p", "--prodigal_procedure", required=False, type=str.lower, choices=["single", "meta"], - default=None, help="Allow to force the prodigal procedure. " - "If nothing given, PPanGGOLiN will decide in function of contig length") - optional.add_argument("-c", "--cpu", required=False, default=1, type=int, help="Number of available cpus") - optional.add_argument("--tmpdir", required=False, type=str, default=Path(tempfile.gettempdir()), - help="directory for storing temporary files") - - -if __name__ == '__main__': + optional.add_argument( + "-o", + "--output", + required=False, + type=Path, + default=Path(f"ppanggolin_output{date}_PID{str(os.getpid())}"), + help="Output directory", + ) + optional.add_argument( + "--allow_overlap", + required=False, + action="store_true", + default=False, + help="Use to not remove genes overlapping with RNA features.", + ) + optional.add_argument( + "--norna", + required=False, + action="store_true", + default=False, + help="Use to avoid annotating RNA features.", + ) + optional.add_argument( + "--kingdom", + required=False, + type=str.lower, + default="bacteria", + choices=["bacteria", "archaea"], + help="Kingdom to which the prokaryota belongs to, " + "to know which models to use for rRNA annotation.", + ) + optional.add_argument( + "--translation_table", + required=False, + type=int, + default=11, + help="Translation table (genetic code) to use.", + ) + optional.add_argument( + "--basename", + required=False, + default="pangenome", + help="basename for the output file", + ) + optional.add_argument( + "--use_pseudo", + required=False, + action="store_true", + help="In the context of provided annotation, use this option to read pseudogenes. " + "(Default behavior is to ignore them)", + ) + optional.add_argument( + "-p", + "--prodigal_procedure", + required=False, + type=str.lower, + choices=["single", "meta"], + default=None, + help="Allow to force the prodigal procedure. " + "If nothing given, PPanGGOLiN will decide in function of contig length", + ) + optional.add_argument( + "-c", + "--cpu", + required=False, + default=1, + type=int, + help="Number of available cpus", + ) + optional.add_argument( + "--tmpdir", + required=False, + type=str, + default=Path(tempfile.gettempdir()), + help="directory for storing temporary files", + ) + + +if __name__ == "__main__": """To test local change and allow using debugger""" from ppanggolin.utils import set_verbosity_level, add_common_arguments main_parser = argparse.ArgumentParser( description="Depicting microbial species diversity via a Partitioned PanGenome Graph Of Linked Neighbors", - formatter_class=argparse.RawTextHelpFormatter) + formatter_class=argparse.RawTextHelpFormatter, + ) parser_annot(main_parser) add_common_arguments(main_parser) diff --git a/ppanggolin/annotate/synta.py b/ppanggolin/annotate/synta.py index 6ad10365..2b65ea40 100644 --- a/ppanggolin/annotate/synta.py +++ b/ppanggolin/annotate/synta.py @@ -19,7 +19,7 @@ from ppanggolin.genome import Organism, Gene, RNA, Contig from ppanggolin.utils import is_compressed, read_compressed_or_not -contig_counter: Value = Value('i', 0) +contig_counter: Value = Value("i", 0) def init_contig_counter(value: Value): @@ -36,8 +36,23 @@ def reverse_complement(seq: str): :return: reverse sequence """ - complement = {'A': 'T', 'C': 'G', 'G': 'C', 'T': 'A', 'N': 'N', 'R': 'Y', 'Y': 'R', - 'S': 'S', 'W': 'W', 'K': 'M', 'M': 'K', 'B': 'V', 'V': 'B', 'D': 'H', 'H': 'D'} + complement = { + "A": "T", + "C": "G", + "G": "C", + "T": "A", + "N": "N", + "R": "Y", + "Y": "R", + "S": "S", + "W": "W", + "K": "M", + "M": "K", + "B": "V", + "V": "B", + "D": "H", + "H": "D", + } # see https://www.bioinformatics.org/sms/iupac.html for the code. rcseq = "" for i in reversed(seq): @@ -45,7 +60,9 @@ def reverse_complement(seq: str): return rcseq -def launch_aragorn(fna_file: str, org: Organism, contig_to_length: Dict[str, int]) -> defaultdict: +def launch_aragorn( + fna_file: str, org: Organism, contig_to_length: Dict[str, int] +) -> defaultdict: """ Launches Aragorn to annotate tRNAs. @@ -59,7 +76,7 @@ def launch_aragorn(fna_file: str, org: Organism, contig_to_length: Dict[str, int logging.getLogger("PPanGGOLiN").debug(f"aragorn command : {' '.join(cmd)}") p = Popen(cmd, stdout=PIPE) # loading the whole thing, reverting it to 'pop' in order. - file_data = p.communicate()[0].decode().split("\n")[:: -1] + file_data = p.communicate()[0].decode().split("\n")[::-1] gene_objs = defaultdict(set) c = 0 contig_name = "" @@ -73,24 +90,40 @@ def launch_aragorn(fna_file: str, org: Organism, contig_to_length: Dict[str, int start, stop = map(int, ast.literal_eval(line_data[2].replace("c", ""))) if start < 1 or stop < 1: # In some case aragorn gives negative coordinates. This case is just ignored. - logging.warning(f'Aragorn gives non valid coordiates for a RNA gene in contig {contig_name}: {line_data}. This RNA is ignored.') + logging.warning( + f"Aragorn gives non valid coordiates for a RNA gene in contig {contig_name}: {line_data}. This RNA is ignored." + ) continue - if start > contig_to_length[contig_name] or stop > contig_to_length[contig_name]: - logging.warning(f'Aragorn gives non valide coordiates for a RNA gene in contig {contig_name}. ' - f'Gene coordinates exceed contig length ({contig_to_length[contig_name]}): ' - f'{line_data}. This RNA is ignored.') + if ( + start > contig_to_length[contig_name] + or stop > contig_to_length[contig_name] + ): + logging.warning( + f"Aragorn gives non valide coordiates for a RNA gene in contig {contig_name}. " + f"Gene coordinates exceed contig length ({contig_to_length[contig_name]}): " + f"{line_data}. This RNA is ignored." + ) continue c += 1 - gene = RNA(rna_id=locustag + '_tRNA_' + str(c).zfill(4)) - gene.fill_annotations(start=start, stop=stop, strand="-" if line_data[2].startswith("c") else "+", - gene_type="tRNA", product=line_data[1] + line_data[4]) + gene = RNA(rna_id=locustag + "_tRNA_" + str(c).zfill(4)) + gene.fill_annotations( + start=start, + stop=stop, + strand="-" if line_data[2].startswith("c") else "+", + gene_type="tRNA", + product=line_data[1] + line_data[4], + ) gene_objs[contig_name].add(gene) return gene_objs -def launch_prodigal(contig_sequences: Dict[str, str], org: Organism, code: int = 11, - use_meta: bool = False) -> defaultdict: +def launch_prodigal( + contig_sequences: Dict[str, str], + org: Organism, + code: int = 11, + use_meta: bool = False, +) -> defaultdict: """ Launches Prodigal to annotate CDS. Takes a fna file name and a locustag to give an ID to the pred genes. @@ -102,29 +135,40 @@ def launch_prodigal(contig_sequences: Dict[str, str], org: Organism, code: int = :return: Annotated genes in a list of gene objects """ gene_objs = defaultdict(set) - sequences = {contig_name: Sequence(sequence) for contig_name, sequence in contig_sequences.items()} + sequences = { + contig_name: Sequence(sequence) + for contig_name, sequence in contig_sequences.items() + } gene_finder = GeneFinder( meta=use_meta, # '-p meta' if meta is true else '-p single' closed=True, # -c: Closed ends. Do not allow genes to run off edges. mask=True, # -m: Treat runs of N as masked sequence; don't build genes across them. - min_gene=120 # This is to prevent error with mmseqs translatenucs that cut too short sequences + min_gene=120, # This is to prevent error with mmseqs translatenucs that cut too short sequences ) if not use_meta: - gene_finder.train(*contig_sequences.values(), force_nonsd=False, - translation_table=code) # -g: Specify a translation table to use (default 11). + gene_finder.train( + *contig_sequences.values(), force_nonsd=False, translation_table=code + ) # -g: Specify a translation table to use (default 11). gene_counter = 1 for contig_name, sequence in sequences.items(): for pred in gene_finder.find_genes(sequence): gene = Gene(gene_id=f"{org.name}_CDS_{str(gene_counter).zfill(4)}") - gene.fill_annotations(start=pred.begin, stop=pred.end, strand='-' if pred.strand == -1 else '+', - gene_type="CDS", genetic_code=code) + gene.fill_annotations( + start=pred.begin, + stop=pred.end, + strand="-" if pred.strand == -1 else "+", + gene_type="CDS", + genetic_code=code, + ) gene_counter += 1 gene_objs[contig_name].add(gene) return gene_objs -def launch_infernal(fna_file: str, org: Organism, tmpdir: str, kingdom: str = "bacteria") -> defaultdict: +def launch_infernal( + fna_file: str, org: Organism, tmpdir: str, kingdom: str = "bacteria" +) -> defaultdict: """ Launches Infernal in hmmer-only mode to annotate rRNAs. @@ -138,21 +182,39 @@ def launch_infernal(fna_file: str, org: Organism, tmpdir: str, kingdom: str = "b locustag = org.name modelfile = "" if kingdom == "bacteria": - modelfile = os.path.dirname(os.path.realpath(__file__)) + "/rRNA_DB/rRNA_bact.cm" + modelfile = ( + os.path.dirname(os.path.realpath(__file__)) + "/rRNA_DB/rRNA_bact.cm" + ) elif kingdom == "archaea": - modelfile = os.path.dirname(os.path.realpath(__file__)) + "/rRNA_DB/rRNA_arch.cm" + modelfile = ( + os.path.dirname(os.path.realpath(__file__)) + "/rRNA_DB/rRNA_arch.cm" + ) tmp_file = tempfile.NamedTemporaryFile(mode="r", dir=tmpdir) - cmd = ["cmscan", "--tblout", tmp_file.name, "--hmmonly", "--cpu", str(1), "--noali", modelfile, fna_file] + cmd = [ + "cmscan", + "--tblout", + tmp_file.name, + "--hmmonly", + "--cpu", + str(1), + "--noali", + modelfile, + fna_file, + ] logging.getLogger("PPanGGOLiN").debug(f"infernal command : {' '.join(cmd)}") p = Popen(cmd, stdout=open(os.devnull, "w"), stderr=PIPE) err = p.communicate()[1].decode().split() if err: - if err[0] == 'Error: ': - raise Exception(f"Infernal (cmscan) failed with error: '{' '.join(err)}'. If you never used this script," - f" you should press the .cm file using cmpress executable from Infernal. " - f"You should find the file in '{os.path.dirname(os.path.realpath(__file__))}/rRNA_DB/'.") - raise Exception(f"An error occurred with Infernal. Error is: '{' '.join(err)}'.") + if err[0] == "Error: ": + raise Exception( + f"Infernal (cmscan) failed with error: '{' '.join(err)}'. If you never used this script," + f" you should press the .cm file using cmpress executable from Infernal. " + f"You should find the file in '{os.path.dirname(os.path.realpath(__file__))}/rRNA_DB/'." + ) + raise Exception( + f"An error occurred with Infernal. Error is: '{' '.join(err)}'." + ) # never managed to test what happens if the .cm files are compressed with a 'bad' version of infernal, # so if that happens you are on your own. @@ -163,16 +225,28 @@ def launch_infernal(fna_file: str, org: Organism, tmpdir: str, kingdom: str = "b c += 1 line_data = line.split() strand = line_data[9] - start, stop = map(int, (line_data[8], line_data[7]) if strand == "-" else (line_data[7], line_data[8])) + start, stop = map( + int, + ( + (line_data[8], line_data[7]) + if strand == "-" + else (line_data[7], line_data[8]) + ), + ) gene = RNA(rna_id=locustag + "_rRNA_" + str(c).zfill(4)) - gene.fill_annotations(start=start, stop=stop, strand=strand, gene_type="rRNA", - product=" ".join(line_data[17:])) + gene.fill_annotations( + start=start, + stop=stop, + strand=strand, + gene_type="rRNA", + product=" ".join(line_data[17:]), + ) gene_objs[line_data[2]].add(gene) return gene_objs def read_fasta(org: Organism, fna_file: Union[TextIOWrapper, list]) -> Dict[str, str]: - """ Reads a fna file (or stream, or string) and stores it in a dictionary with contigs as key and sequence as value. + """Reads a fna file (or stream, or string) and stores it in a dictionary with contigs as key and sequence as value. :param org: Organism corresponding to fasta file :param fna_file: Input fasta file with sequences or list of each line as sequence @@ -185,7 +259,7 @@ def read_fasta(org: Organism, fna_file: Union[TextIOWrapper, list]) -> Dict[str, contig_seq = "" contig = None for line in fna_file: - if line.startswith('>'): + if line.startswith(">"): if len(contig_seq) >= 1: # contig filter = 1 contigs[contig.name] = contig_seq.upper() contig.length = len(contig_seq) @@ -204,12 +278,16 @@ def read_fasta(org: Organism, fna_file: Union[TextIOWrapper, list]) -> Dict[str, contig.length = len(contig_seq) except AttributeError as e: - raise AttributeError(f"{e}\nAn error was raised when reading file: '{fna_file.name}'. " - f"One possibility for this error is that the file did not start with a '>' " - f"as it would be expected from a fna file.") + raise AttributeError( + f"{e}\nAn error was raised when reading file: '{fna_file.name}'. " + f"One possibility for this error is that the file did not start with a '>' " + f"as it would be expected from a fna file." + ) except Exception as err: # To manage other exception which can occur - raise Exception(f"{err}: Please check your input file and if everything looks fine, " - "please post an issue on our github") + raise Exception( + f"{err}: Please check your input file and if everything looks fine, " + "please post an issue on our github" + ) return contigs @@ -229,15 +307,22 @@ def write_tmp_fasta(contigs: dict, tmpdir: str) -> tempfile._TemporaryFileWrappe tmp_file.write(f">{header}\n") j = 0 while j < len(contigs[header]): - tmp_file.write(contigs[header][j: j + 60] + "\n") + tmp_file.write(contigs[header][j : j + 60] + "\n") j += 60 tmp_file.flush() # force write what remains in the buffer. return tmp_file -def syntaxic_annotation(org: Organism, fasta_file: TextIOWrapper, contig_sequences: Dict[str, str], - tmpdir: str, norna: bool = False, kingdom: str = "bacteria", - code: int = 11, use_meta: bool = False) -> defaultdict: +def syntaxic_annotation( + org: Organism, + fasta_file: TextIOWrapper, + contig_sequences: Dict[str, str], + tmpdir: str, + norna: bool = False, + kingdom: str = "bacteria", + code: int = 11, + use_meta: bool = False, +) -> defaultdict: """ Runs the different software for the syntaxic annotation. @@ -255,14 +340,23 @@ def syntaxic_annotation(org: Organism, fasta_file: TextIOWrapper, contig_sequenc # launching tools for syntaxic annotation genes = defaultdict(list) - for contig_name, genes_from_contig in launch_prodigal(contig_sequences=contig_sequences, org=org, code=code, use_meta=use_meta).items(): + for contig_name, genes_from_contig in launch_prodigal( + contig_sequences=contig_sequences, org=org, code=code, use_meta=use_meta + ).items(): genes[contig_name].extend(genes_from_contig) if not norna: - contig_to_length = {contig_name:len(contig_seq) for contig_name, contig_seq in contig_sequences.items()} - - for contig_name, genes_from_contig in launch_aragorn(fna_file=fasta_file.name, org=org, contig_to_length= contig_to_length).items(): + contig_to_length = { + contig_name: len(contig_seq) + for contig_name, contig_seq in contig_sequences.items() + } + + for contig_name, genes_from_contig in launch_aragorn( + fna_file=fasta_file.name, org=org, contig_to_length=contig_to_length + ).items(): genes[contig_name].extend(genes_from_contig) - for contig_name, genes_from_contig in launch_infernal(fna_file=fasta_file.name, org=org, kingdom=kingdom, tmpdir=tmpdir).items(): + for contig_name, genes_from_contig in launch_infernal( + fna_file=fasta_file.name, org=org, kingdom=kingdom, tmpdir=tmpdir + ).items(): genes[contig_name].extend(genes_from_contig) fasta_file.close() # closing either tmp file or original fasta file. return genes @@ -286,9 +380,17 @@ def overlap_filter(all_genes: defaultdict, allow_overlap: bool = False) -> defau for i, gene_i in enumerate(tmp_genes): if i + 1 < len(tmp_genes): gene_j = tmp_genes[i + 1] - if gene_i.type != "CDS" and gene_j.type == "CDS" and gene_i.stop > gene_j.start: + if ( + gene_i.type != "CDS" + and gene_j.type == "CDS" + and gene_i.stop > gene_j.start + ): rm_genes.add(gene_j) - elif gene_i.type == "CDS" and gene_j.type != "CDS" and gene_i.stop > gene_j.start: + elif ( + gene_i.type == "CDS" + and gene_j.type != "CDS" + and gene_i.stop > gene_j.start + ): rm_genes.add(gene_i) for gene in rm_genes: @@ -314,14 +416,17 @@ def get_dna_sequence(contig_seq: str, gene: Union[Gene, RNA]) -> str: # check contig coordinate is in scope of contig seq length highest_position = max((stop for _, stop in gene.coordinates)) assert highest_position <= len( - contig_seq), f"Coordinates of gene {gene} exceed length of the contig. Gene coordinates {gene.coordinates} vs contig length {len(contig_seq)}" + contig_seq + ), f"Coordinates of gene {gene} exceed length of the contig. Gene coordinates {gene.coordinates} vs contig length {len(contig_seq)}" # Extract gene seq - seq = ''.join([contig_seq[start - 1:stop] for start, stop in gene.coordinates]) + seq = "".join([contig_seq[start - 1 : stop] for start, stop in gene.coordinates]) # check length of extracted seq - assert len(seq) == len(gene), (f"The gene sequence of {gene} extracted from the contig does not have the expected length: " - f"extracted seq length {len(seq)}nt vs expected length based on gene coordinates ({gene.coordinates}) {len(gene)}nt ") + assert len(seq) == len(gene), ( + f"The gene sequence of {gene} extracted from the contig does not have the expected length: " + f"extracted seq length {len(seq)}nt vs expected length based on gene coordinates ({gene.coordinates}) {len(gene)}nt " + ) if gene.strand == "+": return seq @@ -329,9 +434,17 @@ def get_dna_sequence(contig_seq: str, gene: Union[Gene, RNA]) -> str: return reverse_complement(seq) -def annotate_organism(org_name: str, file_name: Path, circular_contigs: List[str], tmpdir: str, - code: int = 11, norna: bool = False, kingdom: str = "bacteria", - allow_overlap: bool = False, procedure: Optional[str] = None) -> Organism: +def annotate_organism( + org_name: str, + file_name: Path, + circular_contigs: List[str], + tmpdir: str, + code: int = 11, + norna: bool = False, + kingdom: str = "bacteria", + allow_overlap: bool = False, + procedure: Optional[str] = None, +) -> Organism: """ Function to annotate a single organism @@ -359,13 +472,16 @@ def annotate_organism(org_name: str, file_name: Path, circular_contigs: List[str if max_contig_len < 20000: # case of short sequence use_meta = True logging.getLogger("PPanGGOLiN").info( - f"Using the metagenomic mode to predict genes for {org_name}, as all its contigs are < 20KB in size.") + f"Using the metagenomic mode to predict genes for {org_name}, as all its contigs are < 20KB in size." + ) else: use_meta = False else: use_meta = True if procedure == "meta" else False - genes = syntaxic_annotation(org, fasta_file, contig_sequences, tmpdir, norna, kingdom, code, use_meta) + genes = syntaxic_annotation( + org, fasta_file, contig_sequences, tmpdir, norna, kingdom, code, use_meta + ) genes = overlap_filter(genes, allow_overlap=allow_overlap) for contig_name, genes in genes.items(): diff --git a/ppanggolin/cluster/cluster.py b/ppanggolin/cluster/cluster.py index a740890d..eec599ad 100644 --- a/ppanggolin/cluster/cluster.py +++ b/ppanggolin/cluster/cluster.py @@ -15,14 +15,27 @@ from networkx import Graph from tqdm import tqdm import pandas as pd + # local libraries from ppanggolin.pangenome import Pangenome from ppanggolin.genome import Gene from ppanggolin.geneFamily import GeneFamily -from ppanggolin.utils import is_compressed, restricted_float, run_subprocess, create_tmpdir +from ppanggolin.utils import ( + is_compressed, + restricted_float, + run_subprocess, + create_tmpdir, +) from ppanggolin.formats.writeBinaries import write_pangenome, erase_pangenome -from ppanggolin.formats.readBinaries import check_pangenome_info, write_gene_sequences_from_pangenome_file -from ppanggolin.formats.writeSequences import write_gene_sequences_from_annotations, translate_genes, create_mmseqs_db +from ppanggolin.formats.readBinaries import ( + check_pangenome_info, + write_gene_sequences_from_pangenome_file, +) +from ppanggolin.formats.writeSequences import ( + write_gene_sequences_from_annotations, + translate_genes, + create_mmseqs_db, +) # Global functions @@ -34,15 +47,21 @@ def check_pangenome_former_clustering(pangenome: Pangenome, force: bool = False) :param force: Force to write on existing pangenome information """ if pangenome.status["genesClustered"] == "inFile" and not force: - raise Exception("You are trying to cluster genes that are already clustered together. If you REALLY want to " - "do that, use --force (it will erase everything except annotation data in your HDF5 file!)") + raise Exception( + "You are trying to cluster genes that are already clustered together. If you REALLY want to " + "do that, use --force (it will erase everything except annotation data in your HDF5 file!)" + ) elif pangenome.status["genesClustered"] == "inFile" and force: erase_pangenome(pangenome, gene_families=True) # Clustering functions -def check_pangenome_for_clustering(pangenome: Pangenome, sequences: Path, force: bool = False, - disable_bar: bool = False): +def check_pangenome_for_clustering( + pangenome: Pangenome, + sequences: Path, + force: bool = False, + disable_bar: bool = False, +): """ Check the pangenome statuses and write the gene sequences in the provided tmpFile. (whether they are written in the .h5 file or currently in memory) @@ -54,24 +73,44 @@ def check_pangenome_for_clustering(pangenome: Pangenome, sequences: Path, force: """ check_pangenome_former_clustering(pangenome, force) if pangenome.status["geneSequences"] in ["Computed", "Loaded"]: - logging.getLogger("PPanGGOLiN").debug("Write sequences from annotation loaded in pangenome") + logging.getLogger("PPanGGOLiN").debug( + "Write sequences from annotation loaded in pangenome" + ) # we append the gene ids by 'ppanggolin' to avoid crashes from mmseqs when sequence IDs are only numeric. - write_gene_sequences_from_annotations(pangenome.genes, sequences, add="ppanggolin_", - compress=False, disable_bar=disable_bar) + write_gene_sequences_from_annotations( + pangenome.genes, + sequences, + add="ppanggolin_", + compress=False, + disable_bar=disable_bar, + ) elif pangenome.status["geneSequences"] == "inFile": logging.getLogger("PPanGGOLiN").debug("Write sequences from pangenome file") - write_gene_sequences_from_pangenome_file(pangenome.file, sequences, add="ppanggolin_", - compress=False, - disable_bar=disable_bar) # write CDS sequences to the tmpFile + write_gene_sequences_from_pangenome_file( + pangenome.file, + sequences, + add="ppanggolin_", + compress=False, + disable_bar=disable_bar, + ) # write CDS sequences to the tmpFile else: - raise Exception("The pangenome does not include gene sequences, thus it is impossible to cluster " - "the genes in gene families. Either provide clustering results (see --clusters), " - "or provide a way to access the gene sequence during the annotation step " - "(having the fasta in the gff files, or providing the fasta files through the --fasta option)") + raise Exception( + "The pangenome does not include gene sequences, thus it is impossible to cluster " + "the genes in gene families. Either provide clustering results (see --clusters), " + "or provide a way to access the gene sequence during the annotation step " + "(having the fasta in the gff files, or providing the fasta files through the --fasta option)" + ) -def first_clustering(sequences: Path, tmpdir: Path, cpu: int = 1, code: int = 11, coverage: float = 0.8, - identity: float = 0.8, mode: int = 1) -> Tuple[Path, Path]: +def first_clustering( + sequences: Path, + tmpdir: Path, + cpu: int = 1, + code: int = 11, + coverage: float = 0.8, + identity: float = 0.8, + mode: int = 1, +) -> Tuple[Path, Path]: """ Make a first clustering of all sequences in pangenome @@ -86,23 +125,80 @@ def first_clustering(sequences: Path, tmpdir: Path, cpu: int = 1, code: int = 11 :return: path to representative sequence file and path to tsv clustering result """ - seqdb = translate_genes(sequences=sequences, tmpdir=tmpdir, cpu=cpu, - is_single_line_fasta=True, code=code) + seqdb = translate_genes( + sequences=sequences, + tmpdir=tmpdir, + cpu=cpu, + is_single_line_fasta=True, + code=code, + ) logging.getLogger("PPanGGOLiN").info("Clustering sequences...") - cludb = tmpdir / 'cluster_db' - cmd = list(map(str, ["mmseqs", "cluster", seqdb, cludb, tmpdir, "--cluster-mode", mode, "--min-seq-id", - identity, "-c", coverage, "--threads", cpu, "--kmer-per-seq", 80, "--max-seqs", 300])) + cludb = tmpdir / "cluster_db" + cmd = list( + map( + str, + [ + "mmseqs", + "cluster", + seqdb, + cludb, + tmpdir, + "--cluster-mode", + mode, + "--min-seq-id", + identity, + "-c", + coverage, + "--threads", + cpu, + "--kmer-per-seq", + 80, + "--max-seqs", + 300, + ], + ) + ) run_subprocess(cmd, msg="MMSeqs2 cluster failed with the following error:\n") logging.getLogger("PPanGGOLiN").info("Extracting cluster representatives...") - repdb = tmpdir / 'representative_db' - cmd = list(map(str, ["mmseqs", "result2repseq", seqdb, cludb, repdb, "--threads", cpu])) + repdb = tmpdir / "representative_db" + cmd = list( + map(str, ["mmseqs", "result2repseq", seqdb, cludb, repdb, "--threads", cpu]) + ) run_subprocess(cmd, msg="MMSeqs2 result2repseq failed with the following error:\n") - reprfa = tmpdir / 'representative_sequences.fasta' - cmd = list(map(str, ["mmseqs", "result2flat", seqdb, seqdb, repdb, reprfa, "--use-fasta-header"])) + reprfa = tmpdir / "representative_sequences.fasta" + cmd = list( + map( + str, + [ + "mmseqs", + "result2flat", + seqdb, + seqdb, + repdb, + reprfa, + "--use-fasta-header", + ], + ) + ) run_subprocess(cmd, msg="MMSeqs2 result2flat failed with the following error:\n") logging.getLogger("PPanGGOLiN").info("Writing gene to family information") - outtsv = tmpdir / 'families_tsv' - cmd = list(map(str, ["mmseqs", "createtsv", seqdb, seqdb, cludb, outtsv, "--threads", cpu, "--full-header"])) + outtsv = tmpdir / "families_tsv" + cmd = list( + map( + str, + [ + "mmseqs", + "createtsv", + seqdb, + seqdb, + cludb, + outtsv, + "--threads", + cpu, + "--full-header", + ], + ) + ) run_subprocess(cmd, msg="MMSeqs2 createtsv failed with the following error:\n") return reprfa, outtsv @@ -119,14 +215,22 @@ def read_faa(faa_file_name: Path) -> Dict[str, str]: head = "" with open(faa_file_name) as faaFile: for line in faaFile: - if line.startswith('>'): - head = line[1:].strip().replace("ppanggolin_", "") # remove the eventual addition + if line.startswith(">"): + head = ( + line[1:].strip().replace("ppanggolin_", "") + ) # remove the eventual addition else: fam2seq[head] = line.strip() return fam2seq -def align_rep(faa_file: Path, tmpdir: Path, cpu: int = 1, coverage: float = 0.8, identity: float = 0.8) -> Path: +def align_rep( + faa_file: Path, + tmpdir: Path, + cpu: int = 1, + coverage: float = 0.8, + identity: float = 0.8, +) -> Path: """ Align representative sequence @@ -138,21 +242,58 @@ def align_rep(faa_file: Path, tmpdir: Path, cpu: int = 1, coverage: float = 0.8, :return: Result of alignment """ - seqdb = create_mmseqs_db([faa_file], 'rep_sequence_db', tmpdir, db_mode=1, db_type=1) + seqdb = create_mmseqs_db( + [faa_file], "rep_sequence_db", tmpdir, db_mode=1, db_type=1 + ) logging.getLogger("PPanGGOLiN").info("Aligning cluster representatives...") - alndb = tmpdir / 'rep_alignment_db' - cmd = list(map(str, ["mmseqs", "search", seqdb, seqdb, alndb, tmpdir, "-a", "--min-seq-id", identity, - "-c", coverage, "--cov-mode", 1, "--threads", cpu])) + alndb = tmpdir / "rep_alignment_db" + cmd = list( + map( + str, + [ + "mmseqs", + "search", + seqdb, + seqdb, + alndb, + tmpdir, + "-a", + "--min-seq-id", + identity, + "-c", + coverage, + "--cov-mode", + 1, + "--threads", + cpu, + ], + ) + ) run_subprocess(cmd, msg="MMSeqs2 search failed with the following error:\n") logging.getLogger("PPanGGOLiN").info("Extracting alignments...") - outfile = tmpdir / 'rep_families.tsv' - cmd = list(map(str, ["mmseqs", "convertalis", seqdb, seqdb, alndb, outfile, - "--format-output", "query,target,qlen,tlen,bits"])) + outfile = tmpdir / "rep_families.tsv" + cmd = list( + map( + str, + [ + "mmseqs", + "convertalis", + seqdb, + seqdb, + alndb, + outfile, + "--format-output", + "query,target,qlen,tlen,bits", + ], + ) + ) run_subprocess(cmd, msg="MMSeqs2 convertalis failed with the following error:\n") return outfile -def read_tsv(tsv_file_name: Path) -> Tuple[Dict[str, Tuple[str, bool]], Dict[str, Set[str]]]: +def read_tsv( + tsv_file_name: Path, +) -> Tuple[Dict[str, Tuple[str, bool]], Dict[str, Set[str]]]: """Reading tsv file :param tsv_file_name: path to the tsv @@ -163,15 +304,19 @@ def read_tsv(tsv_file_name: Path) -> Tuple[Dict[str, Tuple[str, bool]], Dict[str fam2genes = defaultdict(set) with open(tsv_file_name) as tsvfile: for line in tsvfile: - line = line.replace('"', '').replace("ppanggolin_", "").split() + line = line.replace('"', "").replace("ppanggolin_", "").split() # remove the '"' char which protects the fields, and the eventual addition - genes2fam[line[1]] = (line[0], False) # fam id, and it's a gene (and not a fragment) + genes2fam[line[1]] = ( + line[0], + False, + ) # fam id, and it's a gene (and not a fragment) fam2genes[line[0]].add(line[1]) return genes2fam, fam2genes -def refine_clustering(tsv: Path, aln_file: Path, - fam_to_seq: dict) -> Tuple[Dict[str, Tuple[str, bool]], Dict[str, str]]: +def refine_clustering( + tsv: Path, aln_file: Path, fam_to_seq: dict +) -> Tuple[Dict[str, Tuple[str, bool]], Dict[str, str]]: """ Refine clustering by removing fragment @@ -191,7 +336,9 @@ def refine_clustering(tsv: Path, aln_file: Path, # add the edges with open(aln_file) as alnfile: for line in alnfile: - line = line.replace('"', '').replace("ppanggolin_", "").split() # remove the eventual addition + line = ( + line.replace('"', "").replace("ppanggolin_", "").split() + ) # remove the eventual addition if line[0] != line[1]: simgraph.add_edge(line[0], line[1], score=float(line[4])) @@ -203,7 +350,11 @@ def refine_clustering(tsv: Path, aln_file: Path, for neighbor in sorted(simgraph.neighbors(node)): nei = simgraph.nodes[neighbor] score = simgraph[neighbor][node]["score"] - if nei["length"] > nodedata["length"] and nei["nbgenes"] >= nodedata["nbgenes"] and choice[3] < score: + if ( + nei["length"] > nodedata["length"] + and nei["nbgenes"] >= nodedata["nbgenes"] + and choice[3] < score + ): choice = (genes2fam[neighbor][0], nei["length"], nei["nbgenes"], score) # `genes2fam[neighbor]` instead of just neighbor in case that family has been assigned already # (this is for smaller fragments that are closer to other fragments than the actual gene family) @@ -217,7 +368,9 @@ def refine_clustering(tsv: Path, aln_file: Path, new_fam_to_seq = {} for fam in fam2genes: new_fam_to_seq[fam] = fam_to_seq[fam] - logging.getLogger("PPanGGOLiN").info(f"Ending with {len(new_fam_to_seq)} gene families") + logging.getLogger("PPanGGOLiN").info( + f"Ending with {len(new_fam_to_seq)} gene families" + ) return genes2fam, new_fam_to_seq @@ -228,7 +381,9 @@ def read_fam2seq(pangenome: Pangenome, fam_to_seq: Dict[str, str]): :param pangenome: Annotated pangenome :param fam_to_seq: Dictionary which link families and sequences """ - logging.getLogger("PPanGGOLiN").info("Adding protein sequences to the gene families") + logging.getLogger("PPanGGOLiN").info( + "Adding protein sequences to the gene families" + ) for family, protein in fam_to_seq.items(): fam = GeneFamily(pangenome.max_fam_id, family) fam.add_sequence(protein) @@ -243,17 +398,31 @@ def read_gene2fam(pangenome: Pangenome, gene_to_fam: dict, disable_bar: bool = F :param gene_to_fam: Dictionary which link gene to families :param disable_bar: Allow to disable progress bar """ - logging.getLogger("PPanGGOLiN").info(f"Adding {len(gene_to_fam)} genes to the gene families") - - link = True if pangenome.status["genomesAnnotated"] in ["Computed", "Loaded"] else False - if link and len(gene_to_fam) != pangenome.number_of_genes: # then maybe there are genes with identical IDs - logging.getLogger("PPanGGOLiN").debug(f"gene_to_fam size: {len(gene_to_fam)}, " - f"Pangenome nb genes: {pangenome.number_of_genes}") - raise Exception("Something unexpected happened during clustering (have less genes clustered than genes " - "in the pangenome). A probable reason is that two genes in two different genomes have " - "the same IDs; If you are sure that all of your genes have non identical IDs, please post an " - "issue at https://github.com/labgem/PPanGGOLiN/") - for gene, (family, is_frag) in tqdm(gene_to_fam.items(), unit="gene", total=len(gene_to_fam), disable=disable_bar): + logging.getLogger("PPanGGOLiN").info( + f"Adding {len(gene_to_fam)} genes to the gene families" + ) + + link = ( + True + if pangenome.status["genomesAnnotated"] in ["Computed", "Loaded"] + else False + ) + if ( + link and len(gene_to_fam) != pangenome.number_of_genes + ): # then maybe there are genes with identical IDs + logging.getLogger("PPanGGOLiN").debug( + f"gene_to_fam size: {len(gene_to_fam)}, " + f"Pangenome nb genes: {pangenome.number_of_genes}" + ) + raise Exception( + "Something unexpected happened during clustering (have less genes clustered than genes " + "in the pangenome). A probable reason is that two genes in two different genomes have " + "the same IDs; If you are sure that all of your genes have non identical IDs, please post an " + "issue at https://github.com/labgem/PPanGGOLiN/" + ) + for gene, (family, is_frag) in tqdm( + gene_to_fam.items(), unit="gene", total=len(gene_to_fam), disable=disable_bar + ): try: fam = pangenome.get_gene_family(family) except KeyError: # Family not found so create and add @@ -267,9 +436,19 @@ def read_gene2fam(pangenome: Pangenome, gene_to_fam: dict, disable_bar: bool = F fam.add(gene_obj) -def clustering(pangenome: Pangenome, tmpdir: Path, cpu: int = 1, defrag: bool = True, code: int = 11, - coverage: float = 0.8, identity: float = 0.8, mode: int = 1, force: bool = False, - disable_bar: bool = False, keep_tmp_files: bool = True): +def clustering( + pangenome: Pangenome, + tmpdir: Path, + cpu: int = 1, + defrag: bool = True, + code: int = 11, + coverage: float = 0.8, + identity: float = 0.8, + mode: int = 1, + force: bool = False, + disable_bar: bool = False, + keep_tmp_files: bool = True, +): """ Cluster gene sequences from an annotated pangenome into families. @@ -286,19 +465,25 @@ def clustering(pangenome: Pangenome, tmpdir: Path, cpu: int = 1, defrag: bool = :param keep_tmp_files: Keep temporary files (useful for debugging). """ date = time.strftime("_%Y-%m-%d_%H-%M-%S", time.localtime()) - dir_name = f'clustering_tmpdir_{date}_PID{os.getpid()}' + dir_name = f"clustering_tmpdir_{date}_PID{os.getpid()}" with create_tmpdir(tmpdir, basename=dir_name, keep_tmp=keep_tmp_files) as tmp_path: - sequence_path = tmp_path / 'nucleotide_sequences.fna' - check_pangenome_for_clustering(pangenome, sequence_path, force, disable_bar=disable_bar) + sequence_path = tmp_path / "nucleotide_sequences.fna" + check_pangenome_for_clustering( + pangenome, sequence_path, force, disable_bar=disable_bar + ) logging.getLogger("PPanGGOLiN").info("Clustering all of the genes sequences...") - rep, tsv = first_clustering(sequence_path, tmp_path, cpu, code, coverage, identity, mode) + rep, tsv = first_clustering( + sequence_path, tmp_path, cpu, code, coverage, identity, mode + ) fam2seq = read_faa(rep) if not defrag: logging.getLogger("PPanGGOLiN").debug("No defragmentation") genes2fam, _ = read_tsv(tsv) else: - logging.getLogger("PPanGGOLiN").info("Associating fragments to their original gene family...") + logging.getLogger("PPanGGOLiN").info( + "Associating fragments to their original gene family..." + ) aln = align_rep(rep, tmp_path, cpu, coverage, identity) genes2fam, fam2seq = refine_clustering(tsv, aln, fam2seq) pangenome.status["defragmented"] = "Computed" @@ -332,16 +517,21 @@ def mk_local_to_gene(pangenome: Pangenome) -> dict: old_len = len(local_dict) local_dict[gene.local_identifier] = gene if len(local_dict) == old_len: - if pangenome.parameters["annotate"]["# read_annotations_from_file"] and not \ - pangenome.parameters["annotate"]["# used_local_identifiers"]: - raise Exception(f"'{gene.local_identifier}' was found multiple times used as an identifier. " - f"The identifier of the genes (locus_tag, protein_id in gbff, ID in gff) were not " - f"unique throughout all of the files. It is thus impossible to differentiate the genes." - f" To use this function while importing annotate, all identifiers MUST be unique " - f"throughout all of your genomes") + if ( + pangenome.parameters["annotate"]["# read_annotations_from_file"] + and not pangenome.parameters["annotate"]["# used_local_identifiers"] + ): + raise Exception( + f"'{gene.local_identifier}' was found multiple times used as an identifier. " + f"The identifier of the genes (locus_tag, protein_id in gbff, ID in gff) were not " + f"unique throughout all of the files. It is thus impossible to differentiate the genes." + f" To use this function while importing annotate, all identifiers MUST be unique " + f"throughout all of your genomes" + ) return {} # local identifiers are not unique. return local_dict + def infer_singletons(pangenome: Pangenome): """ Creates a new family for each gene with no associated family. @@ -356,8 +546,6 @@ def infer_singletons(pangenome: Pangenome): fam.representative = gene fam.add(gene) - - # Try to add the new family try: pangenome.add_gene_family(fam) @@ -369,13 +557,22 @@ def infer_singletons(pangenome: Pangenome): singleton_counter += 1 - logging.getLogger("PPanGGOLiN").info(f"Inferred {singleton_counter} singleton families") + logging.getLogger("PPanGGOLiN").info( + f"Inferred {singleton_counter} singleton families" + ) -def get_family_representative_sequences(pangenome: Pangenome, code: int = 11, cpu: int = 1, - tmpdir: Path = None, keep_tmp: bool = False): +def get_family_representative_sequences( + pangenome: Pangenome, + code: int = 11, + cpu: int = 1, + tmpdir: Path = None, + keep_tmp: bool = False, +): - logging.getLogger("PPanGGOLiN").info("Retrieving protein sequences of family representatives.") + logging.getLogger("PPanGGOLiN").info( + "Retrieving protein sequences of family representatives." + ) tmpdir = Path(tempfile.gettempdir()) if tmpdir is None else tmpdir with create_tmpdir(tmpdir, "get_proteins_sequences", keep_tmp) as tmp: @@ -387,18 +584,27 @@ def get_family_representative_sequences(pangenome: Pangenome, code: int = 11, cp for family in pangenome.gene_families: if family.representative.dna is None: - raise ValueError(f'DNA sequence of representative gene {family.representative} is None. ' - 'Sequence may not have been loaded correctly from the pangenome file or the pangenome has no gene sequences.') + raise ValueError( + f"DNA sequence of representative gene {family.representative} is None. " + "Sequence may not have been loaded correctly from the pangenome file or the pangenome has no gene sequences." + ) repres_seq.write(f">{family.name}\n") repres_seq.write(f"{family.representative.dna}\n") - translate_db = translate_genes(sequences=repres_path, tmpdir=tmp, cpu=cpu, - is_single_line_fasta=True, code=code) + translate_db = translate_genes( + sequences=repres_path, + tmpdir=tmp, + cpu=cpu, + is_single_line_fasta=True, + code=code, + ) outpath = tmp / "representative_protein_genes.fna" cmd = list(map(str, ["mmseqs", "convert2fasta", translate_db, outpath])) - run_subprocess(cmd, msg="MMSeqs convert2fasta failed with the following error:\n") + run_subprocess( + cmd, msg="MMSeqs convert2fasta failed with the following error:\n" + ) with open(outpath) as repres_prot: lines = repres_prot.readlines() @@ -441,22 +647,28 @@ def read_clustering_file(families_tsv_path: Path) -> Tuple[pd.DataFrame, bool]: families_tsv_path, sep="\t", header=None, - compression=compress_type if compress_type is not None else 'infer', - dtype=str + compression=compress_type if compress_type is not None else "infer", + dtype=str, ) # Process DataFrame based on the number of columns if families_df.shape[1] == 2: families_df.columns = ["family", "gene"] - families_df["representative"] = families_df.groupby('family')['gene'].transform('first') + families_df["representative"] = families_df.groupby("family")["gene"].transform( + "first" + ) families_df["is_frag"] = False elif families_df.shape[1] == 3: # Check if the third column is 'is_frag' - if families_df[2].dropna().eq('F').all(): + if families_df[2].dropna().eq("F").all(): families_df.columns = ["family", "gene", "is_frag"] - families_df["is_frag"] = families_df["is_frag"].replace('F', True).fillna(False) - families_df["representative"] = families_df.groupby('family')['gene'].transform('first') + families_df["is_frag"] = ( + families_df["is_frag"].replace("F", True).fillna(False) + ) + families_df["representative"] = families_df.groupby("family")[ + "gene" + ].transform("first") else: families_df.columns = ["family", "gene", "representative"] families_df["is_frag"] = False @@ -478,15 +690,27 @@ def read_clustering_file(families_tsv_path: Path) -> Tuple[pd.DataFrame, bool]: duplicates = families_df[families_df["gene"].duplicated()]["gene"].unique() if len(duplicates) > 0: - raise ValueError(f"Duplicate gene IDs found in your clustering: {', '.join(duplicates)}") - + raise ValueError( + f"Duplicate gene IDs found in your clustering: {', '.join(duplicates)}" + ) - return families_df[["family", "representative", "gene", "is_frag"]], families_df["is_frag"].any() + return ( + families_df[["family", "representative", "gene", "is_frag"]], + families_df["is_frag"].any(), + ) -def read_clustering(pangenome: Pangenome, families_tsv_path: Path, infer_singleton: bool = False, - code: int = 11, cpu: int = 1, tmpdir: Path = None, keep_tmp: bool = False, - force: bool = False, disable_bar: bool = False): +def read_clustering( + pangenome: Pangenome, + families_tsv_path: Path, + infer_singleton: bool = False, + code: int = 11, + cpu: int = 1, + tmpdir: Path = None, + keep_tmp: bool = False, + force: bool = False, + disable_bar: bool = False, +): """ Get the pangenome information, the gene families and the genes with an associated gene family. Reads a families tsv file from mmseqs2 output and adds the gene families and the genes to the pangenome. @@ -504,11 +728,16 @@ def read_clustering(pangenome: Pangenome, families_tsv_path: Path, infer_singlet check_pangenome_former_clustering(pangenome, force) if pangenome.status["geneSequences"] == "No": - need_gene_sequences=False + need_gene_sequences = False else: need_gene_sequences = True - check_pangenome_info(pangenome, need_annotations=True, need_gene_sequences=need_gene_sequences, disable_bar=disable_bar) + check_pangenome_info( + pangenome, + need_annotations=True, + need_gene_sequences=need_gene_sequences, + disable_bar=disable_bar, + ) families_df, frag = read_clustering_file(families_tsv_path) @@ -522,9 +751,19 @@ def get_gene_obj(identifier): gene_obj = local_dict.get(identifier) return gene_obj - for _, row in tqdm(families_df.iterrows(), total=families_df.shape[0], unit="line", disable=disable_bar): - - fam_id, reprez_id, gene_id, is_frag = str(row['family']), str(row['representative']), str(row['gene']), bool(row['is_frag']) + for _, row in tqdm( + families_df.iterrows(), + total=families_df.shape[0], + unit="line", + disable=disable_bar, + ): + + fam_id, reprez_id, gene_id, is_frag = ( + str(row["family"]), + str(row["representative"]), + str(row["gene"]), + bool(row["is_frag"]), + ) gene = get_gene_obj(gene_id) @@ -538,7 +777,9 @@ def get_gene_obj(identifier): fam = GeneFamily(pangenome.max_fam_id, fam_id) representative_gene = get_gene_obj(reprez_id) if representative_gene is None: - raise KeyError(f"The gene {reprez_id} associated to family {fam_id} from the clustering file is not found in pangenome.") + raise KeyError( + f"The gene {reprez_id} associated to family {fam_id} from the clustering file is not found in pangenome." + ) fam.representative = representative_gene @@ -546,15 +787,20 @@ def get_gene_obj(identifier): gene.is_fragment = is_frag fam.add(gene) else: - raise KeyError(f"The gene {gene_id} associated to family {fam_id} from the clustering file is not found in pangenome.") + raise KeyError( + f"The gene {gene_id} associated to family {fam_id} from the clustering file is not found in pangenome." + ) - - if nb_gene_with_fam < pangenome.number_of_genes: # not all genes have an associated cluster + if ( + nb_gene_with_fam < pangenome.number_of_genes + ): # not all genes have an associated cluster if nb_gene_with_fam == 0: - raise Exception("No gene ID in the cluster file matched any gene ID from the annotation step." - " Please ensure that the annotations that you loaded previously and the clustering results " - "that you have used the same gene IDs. If you use .gff files it is the identifier stored in" - " the field 'ID'. If you use .gbff files it is the identifier stored in 'locus_tag'.") + raise Exception( + "No gene ID in the cluster file matched any gene ID from the annotation step." + " Please ensure that the annotations that you loaded previously and the clustering results " + "that you have used the same gene IDs. If you use .gff files it is the identifier stored in" + " the field 'ID'. If you use .gbff files it is the identifier stored in 'locus_tag'." + ) else: if infer_singleton: infer_singletons(pangenome) @@ -565,7 +811,9 @@ def get_gene_obj(identifier): f"or use the '--infer_singletons' option to automatically infer a cluster for each non-clustered gene." ) if pangenome.status["geneSequences"] == "No": - logging.getLogger("PPanGGOLiN").info("The pangenome has no gene sequences so it is not possible to extract sequence of family representatives.") + logging.getLogger("PPanGGOLiN").info( + "The pangenome has no gene sequences so it is not possible to extract sequence of family representatives." + ) else: get_family_representative_sequences(pangenome, code, cpu, tmpdir, keep_tmp) @@ -588,20 +836,52 @@ def launch(args: argparse.Namespace): pangenome.add_file(args.pangenome) if args.clusters is None: if args.infer_singletons is True: - logging.getLogger("PPanGGOLiN").warning("--infer_singletons option is not compatible with clustering " - "creation. To infer singleton you should give a clustering") - clustering(pangenome, args.tmpdir, args.cpu, defrag=not args.no_defrag, code=args.translation_table, - coverage=args.coverage, identity=args.identity, mode=args.mode, force=args.force, - disable_bar=args.disable_prog_bar, keep_tmp_files=args.keep_tmp) + logging.getLogger("PPanGGOLiN").warning( + "--infer_singletons option is not compatible with clustering " + "creation. To infer singleton you should give a clustering" + ) + clustering( + pangenome, + args.tmpdir, + args.cpu, + defrag=not args.no_defrag, + code=args.translation_table, + coverage=args.coverage, + identity=args.identity, + mode=args.mode, + force=args.force, + disable_bar=args.disable_prog_bar, + keep_tmp_files=args.keep_tmp, + ) logging.getLogger("PPanGGOLiN").info("Done with the clustering") else: - if None in [args.tmpdir, args.cpu, args.no_defrag, args.translation_table, - args.coverage, args.identity, args.mode]: - logging.getLogger("PPanGGOLiN").warning("You are using an option compatible only with clustering creation.") - read_clustering(pangenome, args.clusters, args.infer_singletons, args.translation_table, - args.cpu, args.tmpdir, args.keep_tmp, args.force, disable_bar=args.disable_prog_bar) + if None in [ + args.tmpdir, + args.cpu, + args.no_defrag, + args.translation_table, + args.coverage, + args.identity, + args.mode, + ]: + logging.getLogger("PPanGGOLiN").warning( + "You are using an option compatible only with clustering creation." + ) + read_clustering( + pangenome, + args.clusters, + args.infer_singletons, + args.translation_table, + args.cpu, + args.tmpdir, + args.keep_tmp, + args.force, + disable_bar=args.disable_prog_bar, + ) logging.getLogger("PPanGGOLiN").info("Done reading the cluster file") - write_pangenome(pangenome, pangenome.file, args.force, disable_bar=args.disable_prog_bar) + write_pangenome( + pangenome, pangenome.file, args.force, disable_bar=args.disable_prog_bar + ) def subparser(sub_parser: argparse._SubParsersAction) -> argparse.ArgumentParser: @@ -612,7 +892,9 @@ def subparser(sub_parser: argparse._SubParsersAction) -> argparse.ArgumentParser :return : parser arguments for align command """ - parser = sub_parser.add_parser("cluster", formatter_class=argparse.RawTextHelpFormatter) + parser = sub_parser.add_parser( + "cluster", formatter_class=argparse.RawTextHelpFormatter + ) parser_clust(parser) return parser @@ -623,45 +905,99 @@ def parser_clust(parser: argparse.ArgumentParser): :param parser: parser for align argument """ - required = parser.add_argument_group(title="Required arguments", - description="One of the following arguments is required :") - required.add_argument('-p', '--pangenome', required=False, type=Path, help="The pangenome .h5 file") + required = parser.add_argument_group( + title="Required arguments", + description="One of the following arguments is required :", + ) + required.add_argument( + "-p", "--pangenome", required=False, type=Path, help="The pangenome .h5 file" + ) clust = parser.add_argument_group(title="Clustering arguments") - clust.add_argument("--identity", required=False, type=restricted_float, default=0.8, - help="Minimal identity percent for two proteins to be in the same cluster") - clust.add_argument("--coverage", required=False, type=restricted_float, default=0.8, - help="Minimal coverage of the alignment for two proteins to be in the same cluster") - clust.add_argument("--mode", required=False, default="1", choices=["0", "1", "2", "3"], - help="the cluster mode of MMseqs2. 0: Setcover, 1: single linkage (or connected component)," - " 2: CD-HIT-like, 3: CD-HIT-like (lowmem)") - clust.add_argument('--no_defrag', required=False, default=False, action="store_true", - help="DO NOT Use the defragmentation strategy to link potential fragments " - "with their original gene family.") + clust.add_argument( + "--identity", + required=False, + type=restricted_float, + default=0.8, + help="Minimal identity percent for two proteins to be in the same cluster", + ) + clust.add_argument( + "--coverage", + required=False, + type=restricted_float, + default=0.8, + help="Minimal coverage of the alignment for two proteins to be in the same cluster", + ) + clust.add_argument( + "--mode", + required=False, + default="1", + choices=["0", "1", "2", "3"], + help="the cluster mode of MMseqs2. 0: Setcover, 1: single linkage (or connected component)," + " 2: CD-HIT-like, 3: CD-HIT-like (lowmem)", + ) + clust.add_argument( + "--no_defrag", + required=False, + default=False, + action="store_true", + help="DO NOT Use the defragmentation strategy to link potential fragments " + "with their original gene family.", + ) read = parser.add_argument_group(title="Read clustering arguments") - read.add_argument('--clusters', required=False, type=Path, - help="A tab-separated list containing the result of a clustering. One line per gene. " - "First column is cluster ID, and second is gene ID") - read.add_argument("--infer_singletons", required=False, action="store_true", - help="When reading a clustering result with --clusters, if a gene is not in the provided file" - " it will be placed in a cluster where the gene is the only member.") + read.add_argument( + "--clusters", + required=False, + type=Path, + help="A tab-separated list containing the result of a clustering. One line per gene. " + "First column is cluster ID, and second is gene ID", + ) + read.add_argument( + "--infer_singletons", + required=False, + action="store_true", + help="When reading a clustering result with --clusters, if a gene is not in the provided file" + " it will be placed in a cluster where the gene is the only member.", + ) optional = parser.add_argument_group(title="Optional arguments") - optional.add_argument("--translation_table", required=False, default="11", - help="Translation table (genetic code) to use.") - optional.add_argument("-c", "--cpu", required=False, default=1, type=int, help="Number of available cpus") - optional.add_argument("--tmpdir", required=False, type=Path, default=Path(tempfile.gettempdir()), - help="directory for storing temporary files") - optional.add_argument("--keep_tmp", required=False, default=False, action="store_true", - help="Keeping temporary files (useful for debugging).") + optional.add_argument( + "--translation_table", + required=False, + default="11", + help="Translation table (genetic code) to use.", + ) + optional.add_argument( + "-c", + "--cpu", + required=False, + default=1, + type=int, + help="Number of available cpus", + ) + optional.add_argument( + "--tmpdir", + required=False, + type=Path, + default=Path(tempfile.gettempdir()), + help="directory for storing temporary files", + ) + optional.add_argument( + "--keep_tmp", + required=False, + default=False, + action="store_true", + help="Keeping temporary files (useful for debugging).", + ) -if __name__ == '__main__': +if __name__ == "__main__": """To test local change and allow using debugger""" from ppanggolin.utils import set_verbosity_level, add_common_arguments main_parser = argparse.ArgumentParser( description="Depicting microbial species diversity via a Partitioned PanGenome Graph Of Linked Neighbors", - formatter_class=argparse.RawTextHelpFormatter) + formatter_class=argparse.RawTextHelpFormatter, + ) parser_clust(main_parser) add_common_arguments(main_parser) set_verbosity_level(main_parser.parse_args()) diff --git a/ppanggolin/context/searchGeneContext.py b/ppanggolin/context/searchGeneContext.py index 88cd9fc8..fbd989e4 100644 --- a/ppanggolin/context/searchGeneContext.py +++ b/ppanggolin/context/searchGeneContext.py @@ -19,34 +19,62 @@ # local libraries from ppanggolin.formats import check_pangenome_info from ppanggolin.genome import Gene, Contig, Organism -from ppanggolin.utils import mk_outdir, restricted_float, create_tmpdir, read_compressed_or_not, extract_contig_window +from ppanggolin.utils import ( + mk_outdir, + restricted_float, + create_tmpdir, + read_compressed_or_not, + extract_contig_window, +) from ppanggolin.pangenome import Pangenome -from ppanggolin.align.alignOnPang import project_and_write_partition, get_input_seq_to_family_with_rep, \ - get_input_seq_to_family_with_all, get_seq_ids +from ppanggolin.align.alignOnPang import ( + project_and_write_partition, + get_input_seq_to_family_with_rep, + get_input_seq_to_family_with_all, + get_seq_ids, +) from ppanggolin.region import GeneContext from ppanggolin.geneFamily import GeneFamily from ppanggolin.projection.projection import write_gene_to_gene_family def check_pangenome_for_context_search(pangenome: Pangenome, sequences: bool = False): - """ Check pangenome status and information to search context + """Check pangenome status and information to search context :param pangenome: The pangenome object :param sequences: True if search contexts with sequences """ if pangenome.status["genesClustered"] not in ["inFile", "Loaded", "Computed"]: - raise AttributeError("Cannot use this function as pangenome genes has not been clustered yet. " - "See the 'ppanggolin cluster' if you want to do that.") - if sequences and pangenome.status["geneFamilySequences"] not in ["inFile", "Loaded", "Computed"]: - raise AttributeError("Your pangenome gene families does not have representatives sequences associated. " - "For now this works only if the clustering has been made by PPanGGOLiN.") - - -def align_sequences_to_families(pangenome: Pangenome, output: Path, sequence_file: Path = None, identity: float = 0.5, - coverage: float = 0.8, use_representatives: bool = False, no_defrag: bool = False, - cpu: int = 1, translation_table: int = 11, tmpdir: Path = None, keep_tmp: bool = False, - disable_bar=True) -> Tuple[Set[GeneFamily], Dict[GeneFamily, Set[str]]]: - """ Align sequences to pangenome gene families to get families of interest + raise AttributeError( + "Cannot use this function as pangenome genes has not been clustered yet. " + "See the 'ppanggolin cluster' if you want to do that." + ) + if sequences and pangenome.status["geneFamilySequences"] not in [ + "inFile", + "Loaded", + "Computed", + ]: + raise AttributeError( + "Your pangenome gene families does not have representatives sequences associated. " + "For now this works only if the clustering has been made by PPanGGOLiN." + ) + + +def align_sequences_to_families( + pangenome: Pangenome, + output: Path, + sequence_file: Path = None, + identity: float = 0.5, + coverage: float = 0.8, + use_representatives: bool = False, + no_defrag: bool = False, + cpu: int = 1, + translation_table: int = 11, + tmpdir: Path = None, + keep_tmp: bool = False, + disable_bar=True, +) -> Tuple[Set[GeneFamily], Dict[GeneFamily, Set[str]]]: + """Align sequences to pangenome gene families to get families of interest :param pangenome: Pangenome containing GeneFamilies to align with sequence set :param sequence_file: Path to file containing the sequences @@ -71,24 +99,44 @@ def align_sequences_to_families(pangenome: Pangenome, output: Path, sequence_fil with read_compressed_or_not(sequence_file) as seqFileObj: seq_set, is_nucleotide, is_slf = get_seq_ids(seqFileObj) - logging.debug(f"Input sequences are {'nucleotide' if is_nucleotide else 'protein'} sequences") + logging.debug( + f"Input sequences are {'nucleotide' if is_nucleotide else 'protein'} sequences" + ) - with create_tmpdir(main_dir=tmpdir, basename="align_input_seq_tmpdir", keep_tmp=keep_tmp) as new_tmpdir: + with create_tmpdir( + main_dir=tmpdir, basename="align_input_seq_tmpdir", keep_tmp=keep_tmp + ) as new_tmpdir: input_type = "nucleotide" if is_nucleotide else "unknow" if use_representatives: - _, seqid2fam = get_input_seq_to_family_with_rep(pangenome, sequence_file, output, new_tmpdir, - input_type=input_type, is_input_slf=is_slf, cpu=cpu, - no_defrag=no_defrag, identity=identity, - coverage=coverage, translation_table=translation_table, - disable_bar=disable_bar) + _, seqid2fam = get_input_seq_to_family_with_rep( + pangenome, + sequence_file, + output, + new_tmpdir, + input_type=input_type, + is_input_slf=is_slf, + cpu=cpu, + no_defrag=no_defrag, + identity=identity, + coverage=coverage, + translation_table=translation_table, + disable_bar=disable_bar, + ) else: - _, seqid2fam = get_input_seq_to_family_with_all(pangenome=pangenome, sequence_files=sequence_file, - output=output, tmpdir=new_tmpdir, - input_type=input_type, is_input_slf=is_slf, - cpu=cpu, no_defrag=no_defrag, - identity=identity, coverage=coverage, - translation_table=translation_table, - disable_bar=disable_bar) + _, seqid2fam = get_input_seq_to_family_with_all( + pangenome=pangenome, + sequence_files=sequence_file, + output=output, + tmpdir=new_tmpdir, + input_type=input_type, + is_input_slf=is_slf, + cpu=cpu, + no_defrag=no_defrag, + identity=identity, + coverage=coverage, + translation_table=translation_table, + disable_bar=disable_bar, + ) project_and_write_partition(seqid2fam, seq_set, output) write_gene_to_gene_family(seqid2fam, seq_set, output) @@ -102,9 +150,18 @@ def align_sequences_to_families(pangenome: Pangenome, output: Path, sequence_fil return families_of_interest, family_2_input_seqid -def search_gene_context_in_pangenome(pangenome: Pangenome, output: Path, sequence_file: Path = None, - families: Path = None, transitive: int = 4, jaccard_threshold: float = 0.85, - window_size: int = 1, graph_format: str = "graphml", disable_bar=True, **kwargs): +def search_gene_context_in_pangenome( + pangenome: Pangenome, + output: Path, + sequence_file: Path = None, + families: Path = None, + transitive: int = 4, + jaccard_threshold: float = 0.85, + window_size: int = 1, + graph_format: str = "graphml", + disable_bar=True, + **kwargs, +): """ Main function to search common gene contexts between sequence set and pangenome families @@ -120,14 +177,19 @@ def search_gene_context_in_pangenome(pangenome: Pangenome, output: Path, sequenc """ # check statuses and load info - check_pangenome_for_context_search(pangenome, sequences=True if sequence_file is not None else False) - check_pangenome_info(pangenome, need_annotations=True, need_families=True, disable_bar=disable_bar) + check_pangenome_for_context_search( + pangenome, sequences=True if sequence_file is not None else False + ) + check_pangenome_info( + pangenome, need_annotations=True, need_families=True, disable_bar=disable_bar + ) families_of_interest = set() family_2_input_seqid = {} if sequence_file is not None: - fams_of_interest, family_2_input_seqid = align_sequences_to_families(pangenome, output, sequence_file, - disable_bar=disable_bar, **kwargs) + fams_of_interest, family_2_input_seqid = align_sequences_to_families( + pangenome, output, sequence_file, disable_bar=disable_bar, **kwargs + ) families_of_interest |= fams_of_interest if families is not None: with read_compressed_or_not(families) as f: @@ -139,27 +201,38 @@ def search_gene_context_in_pangenome(pangenome: Pangenome, output: Path, sequenc logging.getLogger().info("Building the graph...") - gene_context_graph, _ = compute_gene_context_graph(families=families_of_interest, transitive=transitive, - window_size=window_size, disable_bar=disable_bar) + gene_context_graph, _ = compute_gene_context_graph( + families=families_of_interest, + transitive=transitive, + window_size=window_size, + disable_bar=disable_bar, + ) - logging.getLogger().info(f"Took {round(time.time() - start_time, 2)} " - f"seconds to build the graph to find common gene contexts") + logging.getLogger().info( + f"Took {round(time.time() - start_time, 2)} " + f"seconds to build the graph to find common gene contexts" + ) - logging.getLogger().debug(f"Context graph made of {nx.number_of_nodes(gene_context_graph)} nodes and " - f"{nx.number_of_edges(gene_context_graph)} edges") + logging.getLogger().debug( + f"Context graph made of {nx.number_of_nodes(gene_context_graph)} nodes and " + f"{nx.number_of_edges(gene_context_graph)} edges" + ) compute_edge_metrics(gene_context_graph, jaccard_threshold) # Filter graph - filter_flag = f'is_jaccard_gene_>_{jaccard_threshold}' + filter_flag = f"is_jaccard_gene_>_{jaccard_threshold}" - edges_to_remove = [(n, v) for n, v, d in gene_context_graph.edges(data=True) if not d[filter_flag]] + edges_to_remove = [ + (n, v) for n, v, d in gene_context_graph.edges(data=True) if not d[filter_flag] + ] gene_context_graph.remove_edges_from(edges_to_remove) logging.getLogger().debug(f"Filtering context graph on {filter_flag}") logging.getLogger().debug( f"Context graph made of {nx.number_of_nodes(gene_context_graph)} nodes and " - f"{nx.number_of_edges(gene_context_graph)} edges") + f"{nx.number_of_edges(gene_context_graph)} edges" + ) gene_contexts = get_gene_contexts(gene_context_graph, families_of_interest) @@ -168,24 +241,31 @@ def search_gene_context_in_pangenome(pangenome: Pangenome, output: Path, sequenc if len(gene_contexts) != 0: logging.getLogger().info( - f"There are {sum(len(gc) for gc in gene_contexts)} families among {len(gene_contexts)} gene contexts") + f"There are {sum(len(gc) for gc in gene_contexts)} families among {len(gene_contexts)} gene contexts" + ) output_file = output / "gene_contexts.tsv" - export_context_to_dataframe(gene_contexts, family_2_input_seqid, families_of_interest, output_file) + export_context_to_dataframe( + gene_contexts, family_2_input_seqid, families_of_interest, output_file + ) else: logging.getLogger("PPanGGOLiN").info("No gene contexts were found") - logging.getLogger("PPanGGOLiN").info(f"Computing gene contexts took {round(time.time() - start_time, 2)} seconds") + logging.getLogger("PPanGGOLiN").info( + f"Computing gene contexts took {round(time.time() - start_time, 2)} seconds" + ) return gene_context_graph, out_graph_file -def get_gene_contexts(context_graph: nx.Graph, families_of_interest: Set[GeneFamily]) -> Set[GeneContext]: +def get_gene_contexts( + context_graph: nx.Graph, families_of_interest: Set[GeneFamily] +) -> Set[GeneContext]: """ Extract gene contexts from a context graph based on the provided set of gene families of interest. - - Gene contexts are extracted from a context graph by identifying connected components. + + Gene contexts are extracted from a context graph by identifying connected components. The function filters the connected components based on the following criteria: - Remove singleton families (components with only one gene family). - Remove components that do not contain any gene families of interest. @@ -202,10 +282,16 @@ def get_gene_contexts(context_graph: nx.Graph, families_of_interest: Set[GeneFam # Connected component graph Filtering # remove singleton families - connected_components = (component for component in connected_components if len(component) > 1) + connected_components = ( + component for component in connected_components if len(component) > 1 + ) # remove component made only of families not initially requested - connected_components = (component for component in connected_components if component & families_of_interest) + connected_components = ( + component + for component in connected_components + if component & families_of_interest + ) gene_contexts = set() families_in_context = set() @@ -213,11 +299,15 @@ def get_gene_contexts(context_graph: nx.Graph, families_of_interest: Set[GeneFam for i, component in enumerate(connected_components): families_in_context |= component family_of_interest_of_gc = component & families_of_interest - gene_context = GeneContext(gc_id=i, families=component, families_of_interest=family_of_interest_of_gc) + gene_context = GeneContext( + gc_id=i, families=component, families_of_interest=family_of_interest_of_gc + ) # add gc id to node attribute - node_attributes = {n: {"gene_context_id": i, "families_of_interest": n in families_of_interest} for n in - component} + node_attributes = { + n: {"gene_context_id": i, "families_of_interest": n in families_of_interest} + for n in component + } nx.set_node_attributes(context_graph, node_attributes) gene_contexts.add(gene_context) @@ -248,22 +338,35 @@ def filter_attribute(data: dict): writable_graph = nx.Graph() - writable_graph.add_edges_from((f1.name, f2.name, filter_attribute(d)) - for f1, f2, d in context_graph.edges(data=True)) + writable_graph.add_edges_from( + (f1.name, f2.name, filter_attribute(d)) + for f1, f2, d in context_graph.edges(data=True) + ) # convert transitivity dict to str - edges_with_transitivity_str = {(f1.name, f2.name): str(d['transitivity']) for f1, f2, d in - context_graph.edges(data=True)} + edges_with_transitivity_str = { + (f1.name, f2.name): str(d["transitivity"]) + for f1, f2, d in context_graph.edges(data=True) + } - nx.set_edge_attributes(writable_graph, edges_with_transitivity_str, name="transitivity") + nx.set_edge_attributes( + writable_graph, edges_with_transitivity_str, name="transitivity" + ) - nodes_attributes_filtered = {f.name: filter_attribute(d) for f, d in context_graph.nodes(data=True)} + nodes_attributes_filtered = { + f.name: filter_attribute(d) for f, d in context_graph.nodes(data=True) + } # on top of attributes already contained in node of context graph # add organisms and genes count that have the family, the partition and if the family was in initially requested - nodes_family_data = {f.name: {"genomes": f.number_of_organisms, - "partition": f.named_partition, - "genes": f.number_of_genes} for f in context_graph.nodes()} + nodes_family_data = { + f.name: { + "genomes": f.number_of_organisms, + "partition": f.named_partition, + "genes": f.number_of_genes, + } + for f in context_graph.nodes() + } for f, d in writable_graph.nodes(data=True): d.update(nodes_family_data[f]) @@ -274,30 +377,34 @@ def filter_attribute(data: dict): def write_graph(graph: nx.Graph, output_dir: Path, graph_format: str): """ - Write a graph to file in the GraphML format or/and in GEXF format. + Write a graph to file in the GraphML format or/and in GEXF format. :param graph: Graph to write :param output_dir: The output directory where the graph file will be written. - :param graph_format: Formats of the output graph. Can be graphml or gexf + :param graph_format: Formats of the output graph. Can be graphml or gexf """ if "graphml" == graph_format: out_file = output_dir / "graph_context.graphml" - logging.info(f'Writing context graph in {out_file}') + logging.info(f"Writing context graph in {out_file}") nx.write_graphml_lxml(graph, out_file) elif "gexf" == graph_format: out_file = output_dir / "graph_context.gexf" - logging.info(f'Writing context graph in {out_file}') + logging.info(f"Writing context graph in {out_file}") nx.readwrite.gexf.write_gexf(graph, out_file) else: - raise ValueError(f'The given graph format ({graph_format}) is not correct. it should be "graphml" or gexf') + raise ValueError( + f'The given graph format ({graph_format}) is not correct. it should be "graphml" or gexf' + ) return out_file -def compute_edge_metrics(context_graph: nx.Graph, gene_proportion_cutoff: float) -> None: +def compute_edge_metrics( + context_graph: nx.Graph, gene_proportion_cutoff: float +) -> None: """ Compute various metrics on the edges of the context graph. @@ -306,26 +413,32 @@ def compute_edge_metrics(context_graph: nx.Graph, gene_proportion_cutoff: float) """ # compute jaccard on organism and on genes for f1, f2, data in context_graph.edges(data=True): - data['jaccard_genome'] = len(data['genomes']) / len(set(f1.organisms) | set(f2.organisms)) + data["jaccard_genome"] = len(data["genomes"]) / len( + set(f1.organisms) | set(f2.organisms) + ) - f1_gene_proportion = len(data['genes'][f1]) / f1.number_of_genes - f2_gene_proportion = len(data['genes'][f2]) / f2.number_of_genes + f1_gene_proportion = len(data["genes"][f1]) / f1.number_of_genes + f2_gene_proportion = len(data["genes"][f2]) / f2.number_of_genes - data['f1'] = f1.name - data['f2'] = f2.name - data['f1_jaccard_gene'] = f1_gene_proportion - data['f2_jaccard_gene'] = f2_gene_proportion + data["f1"] = f1.name + data["f2"] = f2.name + data["f1_jaccard_gene"] = f1_gene_proportion + data["f2_jaccard_gene"] = f2_gene_proportion - data[f'is_jaccard_gene_>_{gene_proportion_cutoff}'] = (f1_gene_proportion >= gene_proportion_cutoff) and ( - f2_gene_proportion >= gene_proportion_cutoff) + data[f"is_jaccard_gene_>_{gene_proportion_cutoff}"] = ( + f1_gene_proportion >= gene_proportion_cutoff + ) and (f2_gene_proportion >= gene_proportion_cutoff) - transitivity_counter = data['transitivity'] + transitivity_counter = data["transitivity"] mean_transitivity = sum( - (transitivity * counter for transitivity, counter in transitivity_counter.items())) / sum( - counter for counter in transitivity_counter.values()) + ( + transitivity * counter + for transitivity, counter in transitivity_counter.items() + ) + ) / sum(counter for counter in transitivity_counter.values()) - data['mean_transitivity'] = mean_transitivity + data["mean_transitivity"] = mean_transitivity # the following commented out lines are additional metrics that could be used @@ -337,10 +450,12 @@ def compute_edge_metrics(context_graph: nx.Graph, gene_proportion_cutoff: float) # data[f'f2_jaccard_gene_partial'] = f2_gene_proportion_partial -def add_edges_to_context_graph(context_graph: nx.Graph, - contig: Contig, - contig_windows: List[Tuple[int, int]], - transitivity: int) -> nx.Graph: +def add_edges_to_context_graph( + context_graph: nx.Graph, + contig: Contig, + contig_windows: List[Tuple[int, int]], + transitivity: int, +) -> nx.Graph: """ Add edges to the context graph based on contig genes and windows. @@ -356,13 +471,20 @@ def add_edges_to_context_graph(context_graph: nx.Graph, for window_start, window_end in contig_windows: for gene_index in range(window_start, window_end + 1): gene = contig_genes[gene_index] - next_genes = get_n_next_genes_index(gene_index, next_genes_count=transitivity + 1, - contig_size=len(contig_genes), is_circular=contig.is_circular) + next_genes = get_n_next_genes_index( + gene_index, + next_genes_count=transitivity + 1, + contig_size=len(contig_genes), + is_circular=contig.is_circular, + ) next_genes = list(next_genes) for i, next_gene_index in enumerate(next_genes): # Check if the next gene is within the contig windows - if not any(lower <= next_gene_index <= upper for (lower, upper) in contig_windows): + if not any( + lower <= next_gene_index <= upper + for (lower, upper) in contig_windows + ): # next_gene_index is not in any range of genes in the context, # so it is ignored along with all following genes break @@ -376,15 +498,17 @@ def add_edges_to_context_graph(context_graph: nx.Graph, context_graph.add_edge(gene.family, next_gene.family) contig_graph.add_edge(gene.family, next_gene.family) - edge_dict = context_graph.get_edge_data(gene.family, next_gene.family, default={}) + edge_dict = context_graph.get_edge_data( + gene.family, next_gene.family, default={} + ) if i == 0: - edge_dict['adjacent_family'] = True + edge_dict["adjacent_family"] = True # Store information of the transitivity used to link the two genes: if "transitivity" not in edge_dict: - edge_dict['transitivity'] = {i: 0 for i in range(transitivity + 1)} - edge_dict['transitivity'][i] += 1 + edge_dict["transitivity"] = {i: 0 for i in range(transitivity + 1)} + edge_dict["transitivity"][i] += 1 # Add node attributes node_gene_dict = context_graph.nodes[gene.family] @@ -399,10 +523,10 @@ def add_edges_to_context_graph(context_graph: nx.Graph, # Add edge attributes edge_dict = context_graph[gene.family][next_gene.family] try: - genes_edge_dict = edge_dict['genes'] + genes_edge_dict = edge_dict["genes"] except KeyError: genes_edge_dict = {} - edge_dict['genes'] = genes_edge_dict + edge_dict["genes"] = genes_edge_dict add_val_to_dict_attribute(genes_edge_dict, gene.family, gene) add_val_to_dict_attribute(genes_edge_dict, next_gene.family, next_gene) @@ -411,8 +535,10 @@ def add_edges_to_context_graph(context_graph: nx.Graph, increment_attribute_counter(edge_dict, "gene_pairs") - assert gene.organism == next_gene.organism, (f"Gene of the same contig have a different genome. " - f"{gene.organism} and {next_gene.organism}") + assert gene.organism == next_gene.organism, ( + f"Gene of the same contig have a different genome. " + f"{gene.organism} and {next_gene.organism}" + ) return contig_graph @@ -448,8 +574,12 @@ def increment_attribute_counter(edge_dict: dict, key: Hashable): edge_dict[key] = 1 -def get_n_next_genes_index(current_index: int, next_genes_count: int, - contig_size: int, is_circular: bool = False) -> Iterator[int]: +def get_n_next_genes_index( + current_index: int, + next_genes_count: int, + contig_size: int, + is_circular: bool = False, +) -> Iterator[int]: """ Generate the indices of the next genes based on the current index and contig properties. @@ -465,10 +595,14 @@ def get_n_next_genes_index(current_index: int, next_genes_count: int, # Check if the current index is out of range if current_index >= contig_size: - raise IndexError(f'current gene index is out of range. ' - f"Contig has {contig_size} genes while the given gene index is {current_index}") + raise IndexError( + f"current gene index is out of range. " + f"Contig has {contig_size} genes while the given gene index is {current_index}" + ) if is_circular: - next_genes = chain(range(current_index + 1, contig_size), range(0, current_index)) + next_genes = chain( + range(current_index + 1, contig_size), range(0, current_index) + ) else: next_genes = range(current_index + 1, contig_size) @@ -483,7 +617,7 @@ def get_contig_to_genes(gene_families: Iterable[GeneFamily]) -> Dict[Contig, Set Group genes from specified gene families by contig. :param gene_families: An iterable of gene families object. - + :return: A dictionary mapping contigs to sets of genes. """ @@ -495,8 +629,12 @@ def get_contig_to_genes(gene_families: Iterable[GeneFamily]) -> Dict[Contig, Set return contig_to_genes_of_interest -def compute_gene_context_graph(families: Iterable[GeneFamily], transitive: int = 4, window_size: int = 0, - disable_bar: bool = False) -> Tuple[nx.Graph, Dict[FrozenSet[GeneFamily], Set[Organism]]]: +def compute_gene_context_graph( + families: Iterable[GeneFamily], + transitive: int = 4, + window_size: int = 0, + disable_bar: bool = False, +) -> Tuple[nx.Graph, Dict[FrozenSet[GeneFamily], Set[Organism]]]: """ Construct the graph of gene contexts between families of the pangenome. @@ -512,22 +650,34 @@ def compute_gene_context_graph(families: Iterable[GeneFamily], transitive: int = contig_to_genes_of_interest = get_contig_to_genes(families) combs2orgs = defaultdict(set) - for contig, genes_of_interest in tqdm(contig_to_genes_of_interest.items(), unit="contig", - total=len(contig_to_genes_of_interest), disable=disable_bar): + for contig, genes_of_interest in tqdm( + contig_to_genes_of_interest.items(), + unit="contig", + total=len(contig_to_genes_of_interest), + disable=disable_bar, + ): genes_count = contig.number_of_genes genes_of_interest_positions = [g.position for g in genes_of_interest] - contig_windows = extract_contig_window(genes_count, genes_of_interest_positions, - window_size=window_size, is_circular=contig.is_circular) + contig_windows = extract_contig_window( + genes_count, + genes_of_interest_positions, + window_size=window_size, + is_circular=contig.is_circular, + ) # This part is for PANORAMA - contig_graph = add_edges_to_context_graph(context_graph, contig, contig_windows, transitive) + contig_graph = add_edges_to_context_graph( + context_graph, contig, contig_windows, transitive + ) for cc in nx.connected_components(contig_graph): # If gene families are in the same connected component for the contig graph, # they exist in the same context in at least one genome - combination = list(cc.intersection({gene.family for gene in genes_of_interest})) + combination = list( + cc.intersection({gene.family for gene in genes_of_interest}) + ) # Family here are family of interest for the context and in the same connected component combs2orgs[frozenset(combination)].add(contig.organism) @@ -554,8 +704,12 @@ def fam_to_seq(seq_to_pan: dict) -> dict: return fam_2_seq -def export_context_to_dataframe(gene_contexts: set, fam2seq: Dict[GeneFamily, Set[str]], - families_of_interest: Set[GeneFamily], output: Path): +def export_context_to_dataframe( + gene_contexts: set, + fam2seq: Dict[GeneFamily, Set[str]], + families_of_interest: Set[GeneFamily], + output: Path, +): """ Export the results into dataFrame @@ -571,22 +725,24 @@ def export_context_to_dataframe(gene_contexts: set, fam2seq: Dict[GeneFamily, Se if fam2seq.get(family) is None: sequence_id = None else: - sequence_id = ','.join(fam2seq.get(family)) # Should we sort this ? + sequence_id = ",".join(fam2seq.get(family)) # Should we sort this ? - family_info = {"GeneContext_ID": gene_context.ID, - "Gene_family_name": family.name, - "Sequence_ID": sequence_id, - "Nb_Genomes": family.number_of_organisms, - "Partition": family.named_partition, - "Target_family": family in families_of_interest} + family_info = { + "GeneContext_ID": gene_context.ID, + "Gene_family_name": family.name, + "Sequence_ID": sequence_id, + "Nb_Genomes": family.number_of_organisms, + "Partition": family.named_partition, + "Target_family": family in families_of_interest, + } lines.append(family_info) df = pd.DataFrame(lines).set_index("GeneContext_ID") - df = df.sort_values(["GeneContext_ID", "Sequence_ID"], na_position='last') + df = df.sort_values(["GeneContext_ID", "Sequence_ID"], na_position="last") - df.to_csv(output, sep="\t", na_rep='NA') + df.to_csv(output, sep="\t", na_rep="NA") logging.getLogger().debug(f"detected gene context(s) are listed in: '{output}'") @@ -612,10 +768,18 @@ def launch(args: argparse.Namespace): "keep_tmp": args.keep_tmp, "cpu": args.cpu, } - search_gene_context_in_pangenome(pangenome=pangenome, output=args.output, sequence_file=args.sequences, - families=args.family, transitive=args.transitive, jaccard_threshold=args.jaccard, - window_size=args.window_size, graph_format=args.graph_format, - disable_bar=args.disable_prog_bar, **align_args) + search_gene_context_in_pangenome( + pangenome=pangenome, + output=args.output, + sequence_file=args.sequences, + families=args.family, + transitive=args.transitive, + jaccard_threshold=args.jaccard, + window_size=args.window_size, + graph_format=args.graph_format, + disable_bar=args.disable_prog_bar, + **align_args, + ) def subparser(sub_parser: argparse._SubParsersAction) -> argparse.ArgumentParser: @@ -627,7 +791,9 @@ def subparser(sub_parser: argparse._SubParsersAction) -> argparse.ArgumentParser :return : parser arguments for align command """ - parser = sub_parser.add_parser("context", formatter_class=argparse.RawTextHelpFormatter) + parser = sub_parser.add_parser( + "context", formatter_class=argparse.RawTextHelpFormatter + ) parser_context(parser) return parser @@ -639,62 +805,148 @@ def parser_context(parser: argparse.ArgumentParser): :param parser: parser for align argument """ - required = parser.add_argument_group(title="Required arguments", - description="All of the following arguments are required :") - required.add_argument('-p', '--pangenome', required=False, type=Path, help="The pangenome.h5 file") - required.add_argument('-o', '--output', required=False, type=Path, - default="ppanggolin_context" + time.strftime("_DATE%Y-%m-%d_HOUR%H.%M.%S", - time.localtime()) + "_PID" + str(os.getpid()), - help="Output directory where the file(s) will be written") - onereq = parser.add_argument_group(title="Input file", description="One of the following argument is required :") - onereq.add_argument('-S', '--sequences', required=False, type=Path, - help="Fasta file with the sequences of interest") - onereq.add_argument('-F', '--family', required=False, type=Path, - help="List of family IDs of interest from the pangenome") + required = parser.add_argument_group( + title="Required arguments", + description="All of the following arguments are required :", + ) + required.add_argument( + "-p", "--pangenome", required=False, type=Path, help="The pangenome.h5 file" + ) + required.add_argument( + "-o", + "--output", + required=False, + type=Path, + default="ppanggolin_context" + + time.strftime("_DATE%Y-%m-%d_HOUR%H.%M.%S", time.localtime()) + + "_PID" + + str(os.getpid()), + help="Output directory where the file(s) will be written", + ) + onereq = parser.add_argument_group( + title="Input file", description="One of the following argument is required :" + ) + onereq.add_argument( + "-S", + "--sequences", + required=False, + type=Path, + help="Fasta file with the sequences of interest", + ) + onereq.add_argument( + "-F", + "--family", + required=False, + type=Path, + help="List of family IDs of interest from the pangenome", + ) optional = parser.add_argument_group(title="Optional arguments") - optional.add_argument("-t", "--transitive", required=False, type=int, default=4, - help="Size of the transitive closure used to build the graph. This indicates the number of " - "non related genes allowed in-between two related genes. Increasing it will improve " - "precision but lower sensitivity a little.") - optional.add_argument("-w", "--window_size", required=False, type=int, default=5, - help="Number of neighboring genes that are considered on each side of " - "a gene of interest when searching for conserved genomic contexts.") - - optional.add_argument("-s", "--jaccard", required=False, type=restricted_float, default=0.85, - help="minimum jaccard similarity used to filter edges between gene families. Increasing it " - "will improve precision but lower sensitivity a lot.") - optional.add_argument('--graph_format', help="Format of the context graph. Can be gexf or graphml.", - default='graphml', choices=['gexf', 'graphml']) - align = parser.add_argument_group(title="Alignment arguments", - description="This argument makes sense only when --sequence is provided.") - align.add_argument('--no_defrag', required=False, action="store_true", - help="DO NOT Realign gene families to link fragments with" - "their non-fragmented gene family.") - align.add_argument("--fast", required=False, action="store_true", - help="Use representative sequences of gene families for input gene alignment. " - "This option is recommended for faster processing but may be less sensitive. " - "By default, all pangenome genes are used for alignment.") - align.add_argument('--identity', required=False, type=float, default=0.8, - help="min identity percentage threshold") - align.add_argument('--coverage', required=False, type=float, default=0.8, - help="min coverage percentage threshold") - align.add_argument("--translation_table", required=False, default="11", - help="The translation table to use when the input sequences are nucleotide sequences. ") - align.add_argument("--tmpdir", required=False, type=str, default=Path(tempfile.gettempdir()), - help="directory for storing temporary files") - align.add_argument("--keep_tmp", required=False, default=False, action="store_true", - help="Keeping temporary files (useful for debugging).") - align.add_argument("-c", "--cpu", required=False, default=1, type=int, - help="Number of available cpus") - - -if __name__ == '__main__': + optional.add_argument( + "-t", + "--transitive", + required=False, + type=int, + default=4, + help="Size of the transitive closure used to build the graph. This indicates the number of " + "non related genes allowed in-between two related genes. Increasing it will improve " + "precision but lower sensitivity a little.", + ) + optional.add_argument( + "-w", + "--window_size", + required=False, + type=int, + default=5, + help="Number of neighboring genes that are considered on each side of " + "a gene of interest when searching for conserved genomic contexts.", + ) + + optional.add_argument( + "-s", + "--jaccard", + required=False, + type=restricted_float, + default=0.85, + help="minimum jaccard similarity used to filter edges between gene families. Increasing it " + "will improve precision but lower sensitivity a lot.", + ) + optional.add_argument( + "--graph_format", + help="Format of the context graph. Can be gexf or graphml.", + default="graphml", + choices=["gexf", "graphml"], + ) + align = parser.add_argument_group( + title="Alignment arguments", + description="This argument makes sense only when --sequence is provided.", + ) + align.add_argument( + "--no_defrag", + required=False, + action="store_true", + help="DO NOT Realign gene families to link fragments with" + "their non-fragmented gene family.", + ) + align.add_argument( + "--fast", + required=False, + action="store_true", + help="Use representative sequences of gene families for input gene alignment. " + "This option is recommended for faster processing but may be less sensitive. " + "By default, all pangenome genes are used for alignment.", + ) + align.add_argument( + "--identity", + required=False, + type=float, + default=0.8, + help="min identity percentage threshold", + ) + align.add_argument( + "--coverage", + required=False, + type=float, + default=0.8, + help="min coverage percentage threshold", + ) + align.add_argument( + "--translation_table", + required=False, + default="11", + help="The translation table to use when the input sequences are nucleotide sequences. ", + ) + align.add_argument( + "--tmpdir", + required=False, + type=str, + default=Path(tempfile.gettempdir()), + help="directory for storing temporary files", + ) + align.add_argument( + "--keep_tmp", + required=False, + default=False, + action="store_true", + help="Keeping temporary files (useful for debugging).", + ) + align.add_argument( + "-c", + "--cpu", + required=False, + default=1, + type=int, + help="Number of available cpus", + ) + + +if __name__ == "__main__": """To test local change and allow using debugger""" from ppanggolin.utils import set_verbosity_level, add_common_arguments main_parser = argparse.ArgumentParser( description="Depicting microbial species diversity via a Partitioned PanGenome Graph Of Linked Neighbors", - formatter_class=argparse.RawTextHelpFormatter) + formatter_class=argparse.RawTextHelpFormatter, + ) parser_context(main_parser) add_common_arguments(main_parser) diff --git a/ppanggolin/edge.py b/ppanggolin/edge.py index 6b323eb1..cfc2887b 100644 --- a/ppanggolin/edge.py +++ b/ppanggolin/edge.py @@ -31,11 +31,15 @@ def __init__(self, source_gene: Gene, target_gene: Gene): """ # TODO try to change for gene family ? if source_gene.family is None: - raise AttributeError(f"You cannot create a graph without gene families. " - f"gene {source_gene.ID} did not have a gene family.") + raise AttributeError( + f"You cannot create a graph without gene families. " + f"gene {source_gene.ID} did not have a gene family." + ) if target_gene.family is None: - raise AttributeError(f"You cannot create a graph without gene families. " - f"gene {target_gene.ID} did not have a gene family.") + raise AttributeError( + f"You cannot create a graph without gene families. " + f"gene {target_gene.ID} did not have a gene family." + ) self.source = source_gene.family self.target = target_gene.family self.source.set_edge(self.target, self) @@ -77,11 +81,15 @@ def get_organisms_dict(self) -> Dict[Organism, List[Tuple[Gene, Gene]]]: @property def gene_pairs(self) -> List[Tuple[Gene, Gene]]: - """ Get the list of all the gene pairs in the Edge + """Get the list of all the gene pairs in the Edge :return: A list of all the gene pairs in the Edge """ - return [gene_pair for gene_list in self.get_organisms_dict().values() for gene_pair in gene_list] + return [ + gene_pair + for gene_list in self.get_organisms_dict().values() + for gene_pair in gene_list + ] def add_genes(self, source_gene: Gene, target_gene: Gene): """ @@ -96,11 +104,17 @@ def add_genes(self, source_gene: Gene, target_gene: Gene): :raises Exception: If the genes are not in the same organism. """ if not isinstance(source_gene, Gene) or not isinstance(target_gene, Gene): - raise TypeError(f"Genes are expected to be added to edge. " - f"Given type for source: {type(source_gene)} and target: {type(target_gene)}") + raise TypeError( + f"Genes are expected to be added to edge. " + f"Given type for source: {type(source_gene)} and target: {type(target_gene)}" + ) if source_gene.organism is None or target_gene.organism is None: - raise ValueError("Genes are not associated to genome. It's needed to create add genes to edge") + raise ValueError( + "Genes are not associated to genome. It's needed to create add genes to edge" + ) if source_gene.organism != target_gene.organism: - raise Exception(f"You tried to create an edge between two genes that are not even in the same genome ! " - f"(genes are '{source_gene.ID}' and '{target_gene.ID}')") + raise Exception( + f"You tried to create an edge between two genes that are not even in the same genome ! " + f"(genes are '{source_gene.ID}' and '{target_gene.ID}')" + ) self._organisms[source_gene.organism].append((source_gene, target_gene)) diff --git a/ppanggolin/figures/draw_spot.py b/ppanggolin/figures/draw_spot.py index b179b266..b52278f2 100644 --- a/ppanggolin/figures/draw_spot.py +++ b/ppanggolin/figures/draw_spot.py @@ -19,7 +19,17 @@ from bokeh.plotting import ColumnDataSource, figure, save from bokeh.io import output_file from bokeh.layouts import column, row -from bokeh.models import WheelZoomTool, LabelSet, Slider, CustomJS, HoverTool, Div, Column, GlyphRenderer, RadioButtonGroup +from bokeh.models import ( + WheelZoomTool, + LabelSet, + Slider, + CustomJS, + HoverTool, + Div, + Column, + GlyphRenderer, + RadioButtonGroup, +) # local libraries from ppanggolin.pangenome import Pangenome @@ -31,10 +41,12 @@ def check_predicted_spots(pangenome): - """ checks pangenome status and .h5 files for predicted spots, raises an error if they were not predicted""" + """checks pangenome status and .h5 files for predicted spots, raises an error if they were not predicted""" if pangenome.status["spots"] == "No": - raise Exception("You are trying to draw spots for a pangenome that does not have spots predicted. " - "Please see the 'spot' subcommand.") + raise Exception( + "You are trying to draw spots for a pangenome that does not have spots predicted. " + "Please see the 'spot' subcommand." + ) def make_colors_for_iterable(it: set) -> dict: @@ -52,11 +64,13 @@ def make_colors_for_iterable(it: set) -> dict: if element == "none": famcol[element] = "#D3D3D3" else: - famcol[element] = '#%02x%02x%02x' % (col[0], col[1], col[2]) + famcol[element] = "#%02x%02x%02x" % (col[0], col[1], col[2]) return famcol -def order_gene_lists(gene_lists: list, overlapping_match: int, exact_match: int, set_size: int): +def order_gene_lists( + gene_lists: list, overlapping_match: int, exact_match: int, set_size: int +): """ Order all rgps the same way, and order them by similarity in gene content. @@ -86,7 +100,9 @@ def row_order_gene_lists(gene_lists: list) -> list: return gene_lists if len(gene_lists) > sys.getrecursionlimit(): - sys.setrecursionlimit(len(gene_lists)) # we need the recursion limit to be higher than the number of regions. + sys.setrecursionlimit( + len(gene_lists) + ) # we need the recursion limit to be higher than the number of regions. for index, genelist in enumerate([genelist[0] for genelist in gene_lists]): for gene in genelist: @@ -100,9 +116,13 @@ def row_order_gene_lists(gene_lists: list) -> list: all_columns.extend(rgp_indexes) data.extend([1.0] * len(rgp_indexes)) - mat_p_a = csc_matrix((data, (all_indexes, all_columns)), shape=(len(fam_dict), len(gene_lists)), dtype='float') + mat_p_a = csc_matrix( + (data, (all_indexes, all_columns)), + shape=(len(fam_dict), len(gene_lists)), + dtype="float", + ) dist = pdist(1 - jaccard_similarities(mat_p_a, 0).todense()) - hc = linkage(dist, 'single') + hc = linkage(dist, "single") dendro = dendrogram(hc, no_plot=True) @@ -111,7 +131,9 @@ def row_order_gene_lists(gene_lists: list) -> list: return new_gene_lists -def line_order_gene_lists(gene_lists: list, overlapping_match: int, exact_match: int, set_size: int): +def line_order_gene_lists( + gene_lists: list, overlapping_match: int, exact_match: int, set_size: int +): """ Line ordering of all rgps @@ -132,12 +154,18 @@ def line_order_gene_lists(gene_lists: list, overlapping_match: int, exact_match: for unclass_index in list(to_classify): border1 = [gene.family for gene in gene_lists[unclass_index][1][0]] border2 = [gene.family for gene in gene_lists[unclass_index][1][1]] - if comp_border(base_border1, border1, overlapping_match, set_size, exact_match) and \ - comp_border(base_border2, border2, overlapping_match, set_size, exact_match): + if comp_border( + base_border1, border1, overlapping_match, set_size, exact_match + ) and comp_border( + base_border2, border2, overlapping_match, set_size, exact_match + ): to_classify.discard(unclass_index) new_classify.add(unclass_index) - elif comp_border(base_border2, border1, overlapping_match, set_size, exact_match) and \ - comp_border(base_border1, border2, overlapping_match, set_size, exact_match): + elif comp_border( + base_border2, border1, overlapping_match, set_size, exact_match + ) and comp_border( + base_border1, border2, overlapping_match, set_size, exact_match + ): # reverse the order of the genes to match the 'reference' gene_lists[unclass_index][0] = gene_lists[unclass_index][0][::-1] # inverse the borders @@ -149,13 +177,21 @@ def line_order_gene_lists(gene_lists: list, overlapping_match: int, exact_match: # specify the new 'classified' and remove from unclassified to_classify.discard(unclass_index) new_classify.add(unclass_index) - classified |= new_classify # the newly classified will help to check the unclassified, + classified |= ( + new_classify # the newly classified will help to check the unclassified, + ) # the formerly classified are not useful for what remains (if something remains) new_classify = set() -def subgraph(spot: Spot, outname: Path, with_border: bool = True, set_size: int = 3, - multigenics: set = None, fam_to_mod: dict = None): +def subgraph( + spot: Spot, + outname: Path, + with_border: bool = True, + set_size: int = 3, + multigenics: set = None, + fam_to_mod: dict = None, +): """ Write a pangeome subgraph of the gene families of a spot in gexf format @@ -212,7 +248,8 @@ def subgraph(spot: Spot, outname: Path, with_border: bool = True, set_size: int nx.write_gexf(g, outname.absolute().as_posix()) -def is_gene_list_ordered(genes:List[Feature]): + +def is_gene_list_ordered(genes: List[Feature]): """ Check if a list of genes is ordered. """ @@ -228,7 +265,9 @@ def is_gene_list_ordered(genes:List[Feature]): return False -def mk_source_data(genelists: list, fam_col: dict, fam_to_mod: dict) -> (ColumnDataSource, list): +def mk_source_data( + genelists: list, fam_col: dict, fam_to_mod: dict +) -> (ColumnDataSource, list): """ :param genelists: @@ -238,10 +277,30 @@ def mk_source_data(genelists: list, fam_col: dict, fam_to_mod: dict) -> (ColumnD """ partition_colors = {"shell": "#00D860", "persistent": "#F7A507", "cloud": "#79DEFF"} - df = {'name': [], 'ordered': [], 'strand': [], "start": [], "stop": [], "length": [], 'module': [], - 'module_color': [], 'x': [], 'y': [], 'width': [], 'family_color': [], 'partition_color': [], 'partition': [], - "family": [], "product": [], "x_label": [], "y_label": [], "label": [], "gene_type": [], 'gene_ID': [], - "gene_local_ID": []} + df = { + "name": [], + "ordered": [], + "strand": [], + "start": [], + "stop": [], + "length": [], + "module": [], + "module_color": [], + "x": [], + "y": [], + "width": [], + "family_color": [], + "partition_color": [], + "partition": [], + "family": [], + "product": [], + "x_label": [], + "y_label": [], + "label": [], + "gene_type": [], + "gene_ID": [], + "gene_local_ID": [], + } for index, gene_list in enumerate(genelists): @@ -258,7 +317,9 @@ def mk_source_data(genelists: list, fam_col: dict, fam_to_mod: dict) -> (ColumnD ordered = False start = first_gene.stop for gene in genelist: - relative_start = gene.start_relative_to(first_gene if ordered else last_gene) + relative_start = gene.start_relative_to( + first_gene if ordered else last_gene + ) relative_stop = gene.stop_relative_to(first_gene if ordered else last_gene) df["ordered"].append(str(ordered)) df["strand"].append(gene.strand) @@ -268,7 +329,7 @@ def mk_source_data(genelists: list, fam_col: dict, fam_to_mod: dict) -> (ColumnD df["gene_type"].append(gene.type) df["product"].append(gene.product) df["gene_local_ID"].append(gene.local_identifier) - df['gene_ID'].append(gene.ID) + df["gene_ID"].append(gene.ID) if "RNA" in gene.type: # dedicated values for RNA genes df["name"].append(gene.product) @@ -282,12 +343,16 @@ def mk_source_data(genelists: list, fam_col: dict, fam_to_mod: dict) -> (ColumnD df["family"].append(gene.family.name) df["partition"].append(gene.family.named_partition) df["family_color"].append(fam_col[gene.family]) - df["partition_color"].append(partition_colors[gene.family.named_partition]) + df["partition_color"].append( + partition_colors[gene.family.named_partition] + ) df["module"].append(fam_to_mod.get(gene.family, "none")) # df["x"].append((abs(gene.start - start) + abs(gene.stop - start)) / 2) # df["width"].append(gene.stop - gene.start) - df["x"].append((abs(relative_start - start) + abs(relative_stop - start)) / 2) + df["x"].append( + (abs(relative_start - start) + abs(relative_stop - start)) / 2 + ) df["width"].append(len(gene)) df["x_label"].append(str(int(df["x"][-1]) - int(int(df["width"][-1]) / 2))) @@ -342,7 +407,7 @@ def add_gene_tools(recs: GlyphRenderer, source_data: ColumnDataSource) -> Column """ def color_str(color_element: str) -> str: - """ + """ Javascript code to switch between partition, family and module color for the given 'color_element' :param color_element: @@ -364,31 +429,52 @@ def color_str(color_element: str) -> str: source.change.emit(); """ - radio_line_color = RadioButtonGroup(labels=["partition", "family", "module"], active=0) - radio_fill_color = RadioButtonGroup(labels=["partition", "family", "module"], active=1) - - radio_line_color.js_on_event("button_click", - CustomJS(args=dict(recs=recs, source=source_data, btn=radio_line_color), - code=color_str("line_color"))) - - radio_fill_color.js_on_event("button_click", - CustomJS(args=dict(recs=recs, source=source_data, btn=radio_fill_color), - code=color_str("fill_color"))) + radio_line_color = RadioButtonGroup( + labels=["partition", "family", "module"], active=0 + ) + radio_fill_color = RadioButtonGroup( + labels=["partition", "family", "module"], active=1 + ) + + radio_line_color.js_on_event( + "button_click", + CustomJS( + args=dict(recs=recs, source=source_data, btn=radio_line_color), + code=color_str("line_color"), + ), + ) + + radio_fill_color.js_on_event( + "button_click", + CustomJS( + args=dict(recs=recs, source=source_data, btn=radio_fill_color), + code=color_str("fill_color"), + ), + ) color_header = Div(text="Genes:") line_title = Div(text="""Color to use for gene outlines:""") fill_title = Div(text="""Color to fill genes with:""") - gene_outline_size = Slider(start=0, end=10, value=5, step=0.1, title="Gene outline size:") - gene_outline_size.js_on_change('value', CustomJS(args=dict(other=recs), - code=""" + gene_outline_size = Slider( + start=0, end=10, value=5, step=0.1, title="Gene outline size:" + ) + gene_outline_size.js_on_change( + "value", + CustomJS( + args=dict(other=recs), + code=""" other.glyph.line_width = this.value; console.log('SLIDER: active=' + this.value, this.toString()) - """ - )) + """, + ), + ) - return column(color_header, row(column(line_title, radio_line_color), column(fill_title, radio_fill_color)), - gene_outline_size) + return column( + color_header, + row(column(line_title, radio_line_color), column(fill_title, radio_fill_color)), + gene_outline_size, + ) def add_gene_labels(fig, source_data: ColumnDataSource) -> (Column, LabelSet): @@ -398,24 +484,39 @@ def add_gene_labels(fig, source_data: ColumnDataSource) -> (Column, LabelSet): :param source_data: :return: """ - labels = LabelSet(x='x_label', y='y_label', text='label', source=source_data, text_font_size="18px") - slider_font = Slider(start=0, end=64, value=16, step=1, title="Gene label font size in px") - slider_angle = Slider(start=0, end=pi / 2, value=0, step=0.01, title="Gene label angle in radian") - - radio_label_type = RadioButtonGroup(labels=["name", "product", "family", "local identifier", "gene ID", "none"], - active=1) - - slider_angle.js_link('value', labels, 'angle') - - slider_font.js_on_change('value', - CustomJS(args=dict(other=labels), - code="other.text_font_size = this.value+'px';" - ) - ) - - radio_label_type.js_on_event("button_click", - CustomJS(args=dict(other=labels, source=source_data, btn=radio_label_type), - code=""" + labels = LabelSet( + x="x_label", + y="y_label", + text="label", + source=source_data, + text_font_size="18px", + ) + slider_font = Slider( + start=0, end=64, value=16, step=1, title="Gene label font size in px" + ) + slider_angle = Slider( + start=0, end=pi / 2, value=0, step=0.01, title="Gene label angle in radian" + ) + + radio_label_type = RadioButtonGroup( + labels=["name", "product", "family", "local identifier", "gene ID", "none"], + active=1, + ) + + slider_angle.js_link("value", labels, "angle") + + slider_font.js_on_change( + "value", + CustomJS( + args=dict(other=labels), code="other.text_font_size = this.value+'px';" + ), + ) + + radio_label_type.js_on_event( + "button_click", + CustomJS( + args=dict(other=labels, source=source_data, btn=radio_label_type), + code=""" if(btn.active == 5){ source.data['label'] = []; for(var i=0;i (Column, LabelSet): } other.source = source; source.change.emit(); - """ - )) + """, + ), + ) label_header = Div(text="Gene labels:") - radio_title = Div(text="""Gene labels to use:""", ) - labels_block = column(label_header, row(slider_font, slider_angle), column(radio_title, radio_label_type)) + radio_title = Div( + text="""Gene labels to use:""", + ) + labels_block = column( + label_header, + row(slider_font, slider_angle), + column(radio_title, radio_label_type), + ) fig.add_layout(labels) @@ -450,21 +558,21 @@ def mk_genomes(gene_lists: list, ordered_counts: list) -> (ColumnDataSource, lis :param ordered_counts: :return: """ - df = {"name": [], "width": [], "occurrences": [], 'x': [], 'y': [], "x_label": []} + df = {"name": [], "width": [], "occurrences": [], "x": [], "y": [], "x_label": []} for index, gene_list in enumerate(gene_lists): genelist = gene_list[0] df["occurrences"].append(ordered_counts[index]) df["y"].append(index * 10) first_gene = genelist[0] - last_gene = genelist[-1] + last_gene = genelist[-1] if is_gene_list_ordered(genelist): # if the order has been inverted, positioning elements on the figure is different - width = abs(last_gene.stop_relative_to(first_gene ) - genelist[0].start) + width = abs(last_gene.stop_relative_to(first_gene) - genelist[0].start) df["width"].append(width) else: # order has been inverted - width = abs(last_gene.stop_relative_to(last_gene ) - last_gene.start) + width = abs(last_gene.stop_relative_to(last_gene) - last_gene.start) df["width"].append(width) df["x"].append((df["width"][-1]) / 2) @@ -477,8 +585,15 @@ def mk_genomes(gene_lists: list, ordered_counts: list) -> (ColumnDataSource, lis return ColumnDataSource(data=df), tooltip -def add_genome_tools(fig, gene_recs: GlyphRenderer, genome_recs: GlyphRenderer, gene_source: ColumnDataSource, - genome_source: ColumnDataSource, nb: int, gene_labels: LabelSet): +def add_genome_tools( + fig, + gene_recs: GlyphRenderer, + genome_recs: GlyphRenderer, + gene_source: ColumnDataSource, + genome_source: ColumnDataSource, + nb: int, + gene_labels: LabelSet, +): """ :param fig: @@ -491,25 +606,47 @@ def add_genome_tools(fig, gene_recs: GlyphRenderer, genome_recs: GlyphRenderer, :return: """ # add genome labels - genome_labels = LabelSet(x='x_label', y='y', x_offset=-20, text='name', text_align="right", - source=genome_source, text_font_size="16px") + genome_labels = LabelSet( + x="x_label", + y="y", + x_offset=-20, + text="name", + text_align="right", + source=genome_source, + text_font_size="16px", + ) fig.add_layout(genome_labels) - slider_font = Slider(start=0, end=64, value=16, step=1, title="Genome label font size in px") - slider_font.js_on_change('value', - CustomJS(args=dict(other=genome_labels), - code="other.text_font_size = this.value+'px';" - ) - ) - - slider_offset = Slider(start=-400, end=0, value=-20, step=1, title="Genome label offset") - slider_offset.js_link('value', genome_labels, 'x_offset') + slider_font = Slider( + start=0, end=64, value=16, step=1, title="Genome label font size in px" + ) + slider_font.js_on_change( + "value", + CustomJS( + args=dict(other=genome_labels), + code="other.text_font_size = this.value+'px';", + ), + ) + + slider_offset = Slider( + start=-400, end=0, value=-20, step=1, title="Genome label offset" + ) + slider_offset.js_link("value", genome_labels, "x_offset") slider_spacing = Slider(start=1, end=40, value=10, step=1, title="Genomes spacing") - slider_spacing.js_on_change('value', CustomJS( - args=dict(gene_recs=gene_recs, gene_source=gene_source, genome_recs=genome_recs, genome_source=genome_source, - nb_elements=nb, genome_labels=genome_labels, gene_labels=gene_labels), - code=""" + slider_spacing.js_on_change( + "value", + CustomJS( + args=dict( + gene_recs=gene_recs, + gene_source=gene_source, + genome_recs=genome_recs, + genome_source=genome_source, + nb_elements=nb, + genome_labels=genome_labels, + gene_labels=gene_labels, + ), + code=""" var current_val = genome_source.data['y'][genome_source.data['y'].length - 1] / (nb_elements-1); for (let i=0 ; i < genome_source.data['y'].length ; i++){ genome_source.data['y'][i] = (genome_source.data['y'][i] * this.value) / current_val; @@ -530,13 +667,21 @@ def add_genome_tools(fig, gene_recs: GlyphRenderer, genome_recs: GlyphRenderer, genome_labels.source = genome_source; gene_source.change.emit(); genome_source.change.emit(); - """)) + """, + ), + ) genome_header = Div(text="Genomes:") return column(genome_header, slider_spacing, slider_font, slider_offset) -def draw_curr_spot(gene_lists: list, ordered_counts: list, fam_to_mod: dict, fam_col: dict, output: Path): +def draw_curr_spot( + gene_lists: list, + ordered_counts: list, + fam_to_mod: dict, + fam_col: dict, + output: Path, +): """ :param gene_lists: @@ -552,23 +697,59 @@ def draw_curr_spot(gene_lists: list, ordered_counts: list, fam_to_mod: dict, fam # generate the figure and add some tools to it wheel_zoom = WheelZoomTool() - fig = figure(title="spot graphic", width=1600, height=600, - tools=["pan", "box_zoom", "reset", "save", wheel_zoom, "ywheel_zoom", "xwheel_zoom"]) + fig = figure( + title="spot graphic", + width=1600, + height=600, + tools=[ + "pan", + "box_zoom", + "reset", + "save", + wheel_zoom, + "ywheel_zoom", + "xwheel_zoom", + ], + ) fig.axis.visible = True fig.toolbar.active_scroll = wheel_zoom # genome rectangles genome_source, genome_tooltip = mk_genomes(gene_lists, ordered_counts) - genome_recs = fig.rect(x='x', y='y', fill_color="dimgray", width="width", height=0.5, source=genome_source) - genome_recs_hover = HoverTool(renderers=[genome_recs], tooltips=genome_tooltip, mode="mouse", - point_policy="follow_mouse") + genome_recs = fig.rect( + x="x", + y="y", + fill_color="dimgray", + width="width", + height=0.5, + source=genome_source, + ) + genome_recs_hover = HoverTool( + renderers=[genome_recs], + tooltips=genome_tooltip, + mode="mouse", + point_policy="follow_mouse", + ) fig.add_tools(genome_recs_hover) # gene rectangles gene_source, gene_tooltips = mk_source_data(gene_lists, fam_col, fam_to_mod) - recs = fig.rect(x='x', y='y', line_color='line_color', fill_color='fill_color', width='width', height=2, - line_width=5, source=gene_source) - recs_hover = HoverTool(renderers=[recs], tooltips=gene_tooltips, mode="mouse", point_policy="follow_mouse") + recs = fig.rect( + x="x", + y="y", + line_color="line_color", + fill_color="fill_color", + width="width", + height=2, + line_width=5, + source=gene_source, + ) + recs_hover = HoverTool( + renderers=[recs], + tooltips=gene_tooltips, + mode="mouse", + point_policy="follow_mouse", + ) fig.add_tools(recs_hover) # gene modification tools gene_tools = add_gene_tools(recs, gene_source) @@ -577,13 +758,22 @@ def draw_curr_spot(gene_lists: list, ordered_counts: list, fam_to_mod: dict, fam labels_tools, labels = add_gene_labels(fig, gene_source) # genome tool - genome_tools = add_genome_tools(fig, recs, genome_recs, gene_source, genome_source, len(gene_lists), labels) + genome_tools = add_genome_tools( + fig, recs, genome_recs, gene_source, genome_source, len(gene_lists), labels + ) save(column(fig, row(labels_tools, gene_tools), row(genome_tools))) -def draw_selected_spots(selected_spots: Union[List[Spot], Set[Spot]], pangenome: Pangenome, output: Path, - overlapping_match: int, exact_match: int, set_size: int, disable_bar: bool = False): +def draw_selected_spots( + selected_spots: Union[List[Spot], Set[Spot]], + pangenome: Pangenome, + output: Path, + overlapping_match: int, + exact_match: int, + set_size: int, + disable_bar: bool = False, +): """ Draw only the selected spot and give parameters @@ -596,7 +786,9 @@ def draw_selected_spots(selected_spots: Union[List[Spot], Set[Spot]], pangenome: :param disable_bar: Allow preventing bar progress print """ - logging.getLogger("PPanGGOLiN").info("Ordering genes among regions, and drawing spots...") + logging.getLogger("PPanGGOLiN").info( + "Ordering genes among regions, and drawing spots..." + ) multigenics = pangenome.get_multigenics(pangenome.parameters["rgp"]["dup_margin"]) @@ -605,30 +797,56 @@ def draw_selected_spots(selected_spots: Union[List[Spot], Set[Spot]], pangenome: for fam in mod.families: fam2mod[fam] = f"module_{mod.ID}" - for spot in tqdm(selected_spots, total=len(selected_spots), unit="spot", disable=disable_bar): + for spot in tqdm( + selected_spots, total=len(selected_spots), unit="spot", disable=disable_bar + ): basename = f"spot_{str(spot.ID)}" - identical_rgp_out = output / (basename + '_identical_rgps.tsv') + identical_rgp_out = output / (basename + "_identical_rgps.tsv") # write rgps representatives and the rgps they are identical to - with open(identical_rgp_out, 'w') as out_struc: - out_struc.write('representative_rgp\trepresentative_rgp_genome\tidentical_rgp\tidentical_rgp_genome\n') + with open(identical_rgp_out, "w") as out_struc: + out_struc.write( + "representative_rgp\trepresentative_rgp_genome\tidentical_rgp\tidentical_rgp_genome\n" + ) for key_rgp, other_rgps in spot.get_uniq_to_rgp().items(): for rgp in other_rgps: - out_struc.write(f"{key_rgp.name}\t{key_rgp.organism.name}\t{rgp.name}\t{rgp.organism.name}\n") + out_struc.write( + f"{key_rgp.name}\t{key_rgp.organism.name}\t{rgp.name}\t{rgp.organism.name}\n" + ) fams = set() gene_lists = [] for rgp in spot.regions: contig = rgp.contig - left_border_and_in_between_genes, right_border_and_in_between_genes = rgp.get_bordering_genes(set_size, multigenics, return_only_persistents=False) + left_border_and_in_between_genes, right_border_and_in_between_genes = ( + rgp.get_bordering_genes( + set_size, multigenics, return_only_persistents=False + ) + ) # clean borders from multigenic and non persistent genes - left_border = [gene for gene in left_border_and_in_between_genes if gene.family.named_partition == "persistent" and gene.family not in multigenics] - right_border = [gene for gene in right_border_and_in_between_genes if gene.family.named_partition == "persistent" and gene.family not in multigenics] + left_border = [ + gene + for gene in left_border_and_in_between_genes + if gene.family.named_partition == "persistent" + and gene.family not in multigenics + ] + right_border = [ + gene + for gene in right_border_and_in_between_genes + if gene.family.named_partition == "persistent" + and gene.family not in multigenics + ] # in some rare case with plasmid left and right border can be made of the same genes # we use a set to only have one gene represented. - consecutive_genes_lists = contig.get_ordered_consecutive_genes(set(left_border_and_in_between_genes + right_border_and_in_between_genes + list(rgp.genes))) + consecutive_genes_lists = contig.get_ordered_consecutive_genes( + set( + left_border_and_in_between_genes + + right_border_and_in_between_genes + + list(rgp.genes) + ) + ) consecutive_genes_and_rnas_lists = [] @@ -641,10 +859,14 @@ def draw_selected_spots(selected_spots: Union[List[Spot], Set[Spot]], pangenome: if start < rna.start < stop: rnas_toadd.append(rna) - ordered_genes_with_rnas = sorted(consecutive_genes + rnas_toadd, key=lambda x: x.start) + ordered_genes_with_rnas = sorted( + consecutive_genes + rnas_toadd, key=lambda x: x.start + ) consecutive_genes_and_rnas_lists.append(ordered_genes_with_rnas) - ordered_genes = [gene for genes in consecutive_genes_and_rnas_lists for gene in genes] + ordered_genes = [ + gene for genes in consecutive_genes_and_rnas_lists for gene in genes + ] fams |= {gene.family for gene in ordered_genes if gene.type == "CDS"} @@ -652,7 +874,9 @@ def draw_selected_spots(selected_spots: Union[List[Spot], Set[Spot]], pangenome: famcolors = make_colors_for_iterable(fams) # order all rgps the same way, and order them by similarity in gene content - gene_lists = order_gene_lists(gene_lists, overlapping_match, exact_match, set_size) + gene_lists = order_gene_lists( + gene_lists, overlapping_match, exact_match, set_size + ) count_uniq = spot.count_uniq_ordered_set() # keep only the representative rgps for the figure @@ -666,12 +890,24 @@ def draw_selected_spots(selected_spots: Union[List[Spot], Set[Spot]], pangenome: draw_spot_out = output / (basename + ".html") subgraph_out = output / (basename + ".gexf") - draw_curr_spot(uniq_gene_lists, ordered_counts, fam2mod, famcolors, draw_spot_out) - subgraph(spot, subgraph_out, set_size=set_size, multigenics=multigenics, fam_to_mod=fam2mod) - logging.getLogger("PPanGGOLiN").info(f"Done drawing spot(s), they can be found in the directory: '{output}'") - - -def draw_spots(pangenome: Pangenome, output: Path, spot_list: str, disable_bar: bool = False): + draw_curr_spot( + uniq_gene_lists, ordered_counts, fam2mod, famcolors, draw_spot_out + ) + subgraph( + spot, + subgraph_out, + set_size=set_size, + multigenics=multigenics, + fam_to_mod=fam2mod, + ) + logging.getLogger("PPanGGOLiN").info( + f"Done drawing spot(s), they can be found in the directory: '{output}'" + ) + + +def draw_spots( + pangenome: Pangenome, output: Path, spot_list: str, disable_bar: bool = False +): """ Main function to draw spot @@ -688,33 +924,61 @@ def draw_spots(pangenome: Pangenome, output: Path, spot_list: str, disable_bar: # modules are not required to be loaded, but if they have been computed we load them. need_mod = True - check_pangenome_info(pangenome, need_annotations=True, need_families=True, need_graph=False, need_partitions=True, - need_rgp=True, need_spots=True, need_modules=need_mod, disable_bar=disable_bar) - - if spot_list == 'all' or any(x == 'all' for x in spot_list): - logging.getLogger("PPanGGOLiN").debug("'all' value is found in spot list, all spots are drawn.") + check_pangenome_info( + pangenome, + need_annotations=True, + need_families=True, + need_graph=False, + need_partitions=True, + need_rgp=True, + need_spots=True, + need_modules=need_mod, + disable_bar=disable_bar, + ) + + if spot_list == "all" or any(x == "all" for x in spot_list): + logging.getLogger("PPanGGOLiN").debug( + "'all' value is found in spot list, all spots are drawn." + ) selected_spots = list(pangenome.spots) - elif spot_list == "synteny" or any(x == 'synteny' for x in spot_list): + elif spot_list == "synteny" or any(x == "synteny" for x in spot_list): logging.getLogger().debug( - "'synteny' value is found in spot list, all spots with more than 1 conserved synteny are drawn.") - selected_spots = [s for s in pangenome.spots if len(s.get_uniq_ordered_set()) > 1] + "'synteny' value is found in spot list, all spots with more than 1 conserved synteny are drawn." + ) + selected_spots = [ + s for s in pangenome.spots if len(s.get_uniq_ordered_set()) > 1 + ] else: - curated_spot_list = {'spot_' + str(s) if not s.startswith("spot_") else str(s) for s in spot_list} - logging.getLogger("PPanGGOLiN").debug(f'Required spots to draw: {curated_spot_list}') - selected_spots = [s for s in pangenome.spots if "spot_" + str(s.ID) in curated_spot_list] + curated_spot_list = { + "spot_" + str(s) if not s.startswith("spot_") else str(s) for s in spot_list + } + logging.getLogger("PPanGGOLiN").debug( + f"Required spots to draw: {curated_spot_list}" + ) + selected_spots = [ + s for s in pangenome.spots if "spot_" + str(s.ID) in curated_spot_list + ] if len(selected_spots) != len(curated_spot_list): existing_spots = {"spot_" + str(s.ID) for s in pangenome.spots} required_non_existing_spots = curated_spot_list - existing_spots logging.getLogger("PPanGGOLiN").warning( - f'{len(required_non_existing_spots)} required spots to draw do not exist: {" ".join(required_non_existing_spots)} ') + f'{len(required_non_existing_spots)} required spots to draw do not exist: {" ".join(required_non_existing_spots)} ' + ) if len(selected_spots) < 10: - logging.getLogger("PPanGGOLiN").info(f"Drawing the following spots: " - f"{','.join(['spot_' + str(s.ID) for s in selected_spots])}") + logging.getLogger("PPanGGOLiN").info( + f"Drawing the following spots: " + f"{','.join(['spot_' + str(s.ID) for s in selected_spots])}" + ) else: logging.getLogger("PPanGGOLiN").info(f"Drawing {len(selected_spots)} spots") - draw_selected_spots(selected_spots, pangenome, output, - overlapping_match=pangenome.parameters["spot"]["overlapping_match"], - exact_match=pangenome.parameters["spot"]["exact_match_size"], - set_size=pangenome.parameters["spot"]["set_size"], disable_bar=disable_bar) + draw_selected_spots( + selected_spots, + pangenome, + output, + overlapping_match=pangenome.parameters["spot"]["overlapping_match"], + exact_match=pangenome.parameters["spot"]["exact_match_size"], + set_size=pangenome.parameters["spot"]["set_size"], + disable_bar=disable_bar, + ) diff --git a/ppanggolin/figures/drawing.py b/ppanggolin/figures/drawing.py index efe2e441..46c67447 100644 --- a/ppanggolin/figures/drawing.py +++ b/ppanggolin/figures/drawing.py @@ -24,9 +24,12 @@ def check_spot_args(args: argparse.Namespace): :type args: argparse.Namespace :raises argparse.ArgumentError: If args.spots is specified but args.draw_spots is False. """ - default_arg_spots = 'all' + default_arg_spots = "all" if not args.draw_spots and args.spots != default_arg_spots: - raise argparse.ArgumentError(None, "The --spots argument cannot be used when --draw_spots is not specified.") + raise argparse.ArgumentError( + None, + "The --spots argument cannot be used when --draw_spots is not specified.", + ) def launch(args: argparse.Namespace): @@ -43,13 +46,29 @@ def launch(args: argparse.Namespace): pangenome = Pangenome() pangenome.add_file(args.pangenome) if args.tile_plot: - draw_tile_plot(pangenome, args.output, args.nocloud, draw_dendrogram=args.add_dendrogram, disable_bar=args.disable_prog_bar, - add_metadata=args.add_metadata, - metadata_sources=args.metadata_sources) + draw_tile_plot( + pangenome, + args.output, + args.nocloud, + draw_dendrogram=args.add_dendrogram, + disable_bar=args.disable_prog_bar, + add_metadata=args.add_metadata, + metadata_sources=args.metadata_sources, + ) if args.ucurve: - draw_ucurve(pangenome, args.output, soft_core=args.soft_core, disable_bar=args.disable_prog_bar) + draw_ucurve( + pangenome, + args.output, + soft_core=args.soft_core, + disable_bar=args.disable_prog_bar, + ) if args.draw_spots: - draw_spots(pangenome=pangenome, output=args.output, spot_list=args.spots, disable_bar=args.disable_prog_bar) + draw_spots( + pangenome=pangenome, + output=args.output, + spot_list=args.spots, + disable_bar=args.disable_prog_bar, + ) def subparser(sub_parser: argparse._SubParsersAction) -> argparse.ArgumentParser: @@ -61,7 +80,9 @@ def subparser(sub_parser: argparse._SubParsersAction) -> argparse.ArgumentParser :return : parser arguments for align command """ - parser = sub_parser.add_parser("draw", formatter_class=argparse.RawTextHelpFormatter) + parser = sub_parser.add_parser( + "draw", formatter_class=argparse.RawTextHelpFormatter + ) parser_draw(parser) return parser @@ -73,34 +94,73 @@ def parser_draw(parser: argparse.ArgumentParser): :param parser: parser for align argument """ date = time.strftime("_DATE%Y-%m-%d_HOUR%H.%M.%S", time.localtime()) - required = parser.add_argument_group(title="Required arguments", - description="One of the following arguments is required :") - required.add_argument('-p', '--pangenome', required=False, type=Path, help="The pangenome.h5 file") + required = parser.add_argument_group( + title="Required arguments", + description="One of the following arguments is required :", + ) + required.add_argument( + "-p", "--pangenome", required=False, type=Path, help="The pangenome.h5 file" + ) optional = parser.add_argument_group(title="Optional arguments") - optional.add_argument('-o', '--output', required=False, type=Path, - default=Path(f'ppanggolin_output{date}_PID{str(os.getpid())}'), - help="Output directory") - optional.add_argument("--tile_plot", required=False, default=False, action="store_true", - help="draw the tile plot of the pangenome") - - optional.add_argument("--soft_core", required=False, default=0.95, type=restricted_float, - help="Soft core threshold to use") - optional.add_argument("--ucurve", required=False, default=False, action="store_true", - help="draw the U-curve of the pangenome") - optional.add_argument("--draw_spots", required=False, default=False, action="store_true", - help="draw plots for spots of the pangenome") - optional.add_argument("--spots", required=False, default='all', nargs='+', - help="a comma-separated list of spots to draw (or 'all' to draw all spots, or 'synteny' to draw spots with different RGP syntenies).") - - optional.add_argument("--nocloud", required=False, default=False, action="store_true", - help="Do not draw the cloud genes in the tile plot") + optional.add_argument( + "-o", + "--output", + required=False, + type=Path, + default=Path(f"ppanggolin_output{date}_PID{str(os.getpid())}"), + help="Output directory", + ) + optional.add_argument( + "--tile_plot", + required=False, + default=False, + action="store_true", + help="draw the tile plot of the pangenome", + ) + + optional.add_argument( + "--soft_core", + required=False, + default=0.95, + type=restricted_float, + help="Soft core threshold to use", + ) + optional.add_argument( + "--ucurve", + required=False, + default=False, + action="store_true", + help="draw the U-curve of the pangenome", + ) + optional.add_argument( + "--draw_spots", + required=False, + default=False, + action="store_true", + help="draw plots for spots of the pangenome", + ) + optional.add_argument( + "--spots", + required=False, + default="all", + nargs="+", + help="a comma-separated list of spots to draw (or 'all' to draw all spots, or 'synteny' to draw spots with different RGP syntenies).", + ) + + optional.add_argument( + "--nocloud", + required=False, + default=False, + action="store_true", + help="Do not draw the cloud genes in the tile plot", + ) optional.add_argument( "--add_dendrogram", required=False, default=False, action="store_true", - help="Include a dendrogram for genomes in the tile plot based on the presence/absence of gene families." + help="Include a dendrogram for genomes in the tile plot based on the presence/absence of gene families.", ) optional.add_argument( @@ -108,24 +168,26 @@ def parser_draw(parser: argparse.ArgumentParser): required=False, default=False, action="store_true", - help="Display gene metadata as hover text for each cell in the tile plot." + help="Display gene metadata as hover text for each cell in the tile plot.", ) - optional.add_argument("--metadata_sources", - default=None, - nargs="+", - help="Which source of metadata should be written in the tile plot. " - "By default all metadata sources are included.") - + optional.add_argument( + "--metadata_sources", + default=None, + nargs="+", + help="Which source of metadata should be written in the tile plot. " + "By default all metadata sources are included.", + ) -if __name__ == '__main__': +if __name__ == "__main__": """To test local change and allow using debugger""" from ppanggolin.utils import set_verbosity_level, add_common_arguments main_parser = argparse.ArgumentParser( description="Depicting microbial species diversity via a Partitioned PanGenome Graph Of Linked Neighbors", - formatter_class=argparse.RawTextHelpFormatter) + formatter_class=argparse.RawTextHelpFormatter, + ) parser_draw(main_parser) add_common_arguments(main_parser) diff --git a/ppanggolin/figures/tile_plot.py b/ppanggolin/figures/tile_plot.py index be130727..e1e40d33 100644 --- a/ppanggolin/figures/tile_plot.py +++ b/ppanggolin/figures/tile_plot.py @@ -20,13 +20,16 @@ from ppanggolin.pangenome import Pangenome from ppanggolin.utils import jaccard_similarities -def draw_tile_plot(pangenome: Pangenome, - output: Path, - nocloud: bool = False, - draw_dendrogram: bool = False, - add_metadata:bool=False, - metadata_sources:Optional[Set[str]]=None, - disable_bar: bool = False): + +def draw_tile_plot( + pangenome: Pangenome, + output: Path, + nocloud: bool = False, + draw_dendrogram: bool = False, + add_metadata: bool = False, + metadata_sources: Optional[Set[str]] = None, + disable_bar: bool = False, +): """ Draw a tile plot from a partitioned pangenome. @@ -38,9 +41,19 @@ def draw_tile_plot(pangenome: Pangenome, """ # Check if the pangenome has the required information and is partitioned - check_pangenome_info(pangenome, need_annotations=True, need_families=True, need_graph=True, disable_bar=disable_bar, need_metadata=add_metadata, sources=metadata_sources) + check_pangenome_info( + pangenome, + need_annotations=True, + need_families=True, + need_graph=True, + disable_bar=disable_bar, + need_metadata=add_metadata, + sources=metadata_sources, + ) if pangenome.status["partitioned"] == "No": - raise Exception("Cannot draw the tile plot as the pangenome has not been partitioned.") + raise Exception( + "Cannot draw the tile plot as the pangenome has not been partitioned." + ) # Warn if there are more than 32767 genomes, as the output might be too large for browsers to handle if pangenome.number_of_organisms > 32767: @@ -55,8 +68,9 @@ def draw_tile_plot(pangenome: Pangenome, "You can use the --nocloud flag to exclude cloud families from the plot. " ) - - logging.getLogger("PPanGGOLiN").info("Starting the process of drawing the tile plot...") + logging.getLogger("PPanGGOLiN").info( + "Starting the process of drawing the tile plot..." + ) # Prepare the data structures required for generating the tile plot families, org_index = prepare_data_structures(pangenome, nocloud) @@ -66,19 +80,32 @@ def draw_tile_plot(pangenome: Pangenome, order_organisms, dendrogram_fig = generate_dendrogram(mat_p_a, org_index) # Process the data to be displayed in the tile plot - binary_data, text_data, fam_order, separators = process_tile_data(families, order_organisms) + binary_data, text_data, fam_order, separators = process_tile_data( + families, order_organisms + ) # Create the tile plot figure with or without the dendrogram - fig = create_tile_plot(binary_data, text_data, fam_order, separators, order_organisms, dendrogram_fig, draw_dendrogram) + fig = create_tile_plot( + binary_data, + text_data, + fam_order, + separators, + order_organisms, + dendrogram_fig, + draw_dendrogram, + ) # Save the plot to the specified output directory filename = output / "tile_plot.html" fig.write_html(filename) - logging.getLogger("PPanGGOLiN").info(f"Tile plot successfully created and saved to: '{filename}'.") + logging.getLogger("PPanGGOLiN").info( + f"Tile plot successfully created and saved to: '{filename}'." + ) return fig + def prepare_data_structures(pangenome: Pangenome, nocloud: bool) -> Tuple[set, dict]: """ Prepare data structures required for generating the tile plot. @@ -90,7 +117,9 @@ def prepare_data_structures(pangenome: Pangenome, nocloud: bool) -> Tuple[set, d # Exclude gene families in the cloud partition if 'nocloud' is True; otherwise, include all gene families if nocloud: - families = {fam for fam in pangenome.gene_families if not fam.partition.startswith("C")} + families = { + fam for fam in pangenome.gene_families if not fam.partition.startswith("C") + } else: families = set(pangenome.gene_families) @@ -98,6 +127,7 @@ def prepare_data_structures(pangenome: Pangenome, nocloud: bool) -> Tuple[set, d org_index = pangenome.get_org_index() return families, org_index + def build_presence_absence_matrix(families: set, org_index: dict) -> csc_matrix: """ Build the presence-absence matrix for gene families. @@ -121,10 +151,15 @@ def build_presence_absence_matrix(families: set, org_index: dict) -> csc_matrix: data.extend([1.0] * len(new_col)) # All presences are marked with 1.0 # Construct the presence-absence matrix using Compressed Sparse Column format - mat_p_a = csc_matrix((data, (all_indexes, all_columns)), shape=(len(families), len(org_index)), dtype='float') + mat_p_a = csc_matrix( + (data, (all_indexes, all_columns)), + shape=(len(families), len(org_index)), + dtype="float", + ) return mat_p_a + def generate_dendrogram(mat_p_a: csc_matrix, org_index: dict) -> Tuple[List, go.Figure]: """ Generate the order of organisms based on a dendrogram. @@ -144,20 +179,31 @@ def generate_dendrogram(mat_p_a: csc_matrix, org_index: dict) -> Tuple[List, go. distance_matrice = 1 - jaccard_similarities(mat_p_a, 0).todense() # Create a dendrogram figure using the computed distance matrix - dendrogram_fig = ff.create_dendrogram(distance_matrice, labels=genom_names, orientation='bottom') + dendrogram_fig = ff.create_dendrogram( + distance_matrice, labels=genom_names, orientation="bottom" + ) # Adjust the dendrogram figure to make it match with the heatmap later on - for i in range(len(dendrogram_fig['data'])): - dendrogram_fig['data'][i]['yaxis'] = 'y2' # Aligns dendrogram data on a secondary y-axis - dendrogram_fig['data'][i]['showlegend'] = False # Hides legends in the dendrogram + for i in range(len(dendrogram_fig["data"])): + dendrogram_fig["data"][i][ + "yaxis" + ] = "y2" # Aligns dendrogram data on a secondary y-axis + dendrogram_fig["data"][i][ + "showlegend" + ] = False # Hides legends in the dendrogram # Extract the ordered list of organisms from the dendrogram tick labels - order_organisms = [name_to_org[org_name] for org_name in dendrogram_fig['layout']['xaxis']['ticktext']] + order_organisms = [ + name_to_org[org_name] + for org_name in dendrogram_fig["layout"]["xaxis"]["ticktext"] + ] return order_organisms, dendrogram_fig -def process_tile_data(families: set, order_organisms: List) -> Tuple[List[List[float]], List[List[str]], List[str], List[Tuple[str, float]]]: +def process_tile_data( + families: set, order_organisms: List +) -> Tuple[List[List[float]], List[List[str]], List[str], List[Tuple[str, float]]]: """ Process data for each tile in the plot. @@ -181,8 +227,22 @@ def process_tile_data(families: set, order_organisms: List) -> Tuple[List[List[f for node in ordered_nodes: fam_order.append(node.name) data = set(node.organisms) - binary_data.append([len(list(node.get_genes_per_org(org))) if org in data else np.nan for org in order_organisms]) - text_data.append([("\n".join(map(str, node.get_genes_per_org(org))) if org in data else np.nan) for org in order_organisms]) + binary_data.append( + [ + len(list(node.get_genes_per_org(org))) if org in data else np.nan + for org in order_organisms + ] + ) + text_data.append( + [ + ( + "\n".join(map(str, node.get_genes_per_org(org))) + if org in data + else np.nan + ) + for org in order_organisms + ] + ) # Generate hover text for the heatmap text_data = get_heatmap_hover_text(ordered_nodes, order_organisms) @@ -190,7 +250,9 @@ def process_tile_data(families: set, order_organisms: List) -> Tuple[List[List[f return binary_data, text_data, fam_order, separators -def order_nodes(partitions_dict: dict, shell_subs: set) -> Tuple[List, List[Tuple[str, float]]]: +def order_nodes( + partitions_dict: dict, shell_subs: set +) -> Tuple[List, List[Tuple[str, float]]]: """ Order gene families based on their partitions. @@ -200,8 +262,12 @@ def order_nodes(partitions_dict: dict, shell_subs: set) -> Tuple[List, List[Tupl """ # Sort persistent and cloud partitions by the number of organisms in descending order - ordered_nodes_p = sorted(partitions_dict["P"], key=lambda n: n.number_of_organisms, reverse=True) - ordered_nodes_c = sorted(partitions_dict["C"], key=lambda n: n.number_of_organisms, reverse=True) + ordered_nodes_p = sorted( + partitions_dict["P"], key=lambda n: n.number_of_organisms, reverse=True + ) + ordered_nodes_c = sorted( + partitions_dict["C"], key=lambda n: n.number_of_organisms, reverse=True + ) partition_separators = [("Persistent", len(ordered_nodes_p) - 0.5)] ordered_nodes = ordered_nodes_p @@ -209,13 +275,21 @@ def order_nodes(partitions_dict: dict, shell_subs: set) -> Tuple[List, List[Tupl # Sort shell subpartitions and add them to the ordered nodes list for subpartition in sorted(shell_subs): partition_name = "Shell" if len(shell_subs) == 1 else f"Shell_{subpartition}" - ordered_nodes_s = sorted(partitions_dict[subpartition], key=lambda n: n.number_of_organisms, reverse=True) + ordered_nodes_s = sorted( + partitions_dict[subpartition], + key=lambda n: n.number_of_organisms, + reverse=True, + ) ordered_nodes += ordered_nodes_s - partition_separators.append((partition_name, partition_separators[-1][1] + len(ordered_nodes_s))) + partition_separators.append( + (partition_name, partition_separators[-1][1] + len(ordered_nodes_s)) + ) # Append cloud partition to the ordered nodes list ordered_nodes += ordered_nodes_c - partition_separators.append(("Cloud", partition_separators[-1][1] + len(ordered_nodes_c))) + partition_separators.append( + ("Cloud", partition_separators[-1][1] + len(ordered_nodes_c)) + ) return ordered_nodes, partition_separators @@ -224,7 +298,7 @@ def create_partition_shapes( separators: List[Tuple[str, float]], xval_max: float, heatmap_row: int, - partition_to_color: Dict[str, str] + partition_to_color: Dict[str, str], ) -> List[dict]: """ Create the shapes for plot separators to visually distinguish partitions in the plot. @@ -238,32 +312,62 @@ def create_partition_shapes( shapes = [] sep_prec = 0 - xref = 'x1' - yref = f'y{heatmap_row}' + xref = "x1" + yref = f"y{heatmap_row}" for partition_name, sep in separators: color = partition_to_color[partition_name] # Left vertical line for partition separator - shapes.append(dict( - type='line', x0=-1, x1=-1, y0=sep_prec, y1=sep, - line=dict(width=10, color=color), xref=xref, yref=yref, - name=partition_name, showlegend=True, legendgroup=partition_name - )) + shapes.append( + dict( + type="line", + x0=-1, + x1=-1, + y0=sep_prec, + y1=sep, + line=dict(width=10, color=color), + xref=xref, + yref=yref, + name=partition_name, + showlegend=True, + legendgroup=partition_name, + ) + ) # Right vertical line for partition separator - shapes.append(dict( - type='line', x0=xval_max, x1=xval_max, y0=sep_prec, y1=sep, - line=dict(width=10, color=color), xref=xref, yref=yref, - name=partition_name, showlegend=False, legendgroup=partition_name - )) + shapes.append( + dict( + type="line", + x0=xval_max, + x1=xval_max, + y0=sep_prec, + y1=sep, + line=dict(width=10, color=color), + xref=xref, + yref=yref, + name=partition_name, + showlegend=False, + legendgroup=partition_name, + ) + ) # Horizontal line across the partition boundary - shapes.append(dict( - type='line', x0=-1, x1=xval_max, y0=sep, y1=sep, - line=dict(width=1, color=color), xref=xref, yref=yref, - name=partition_name, showlegend=False, legendgroup=partition_name - )) + shapes.append( + dict( + type="line", + x0=-1, + x1=xval_max, + y0=sep, + y1=sep, + line=dict(width=1, color=color), + xref=xref, + yref=yref, + name=partition_name, + showlegend=False, + legendgroup=partition_name, + ) + ) sep_prec = sep @@ -277,17 +381,22 @@ def metadata_stringify(gene) -> str: :param gene: The gene object with potential metadata. :return: A formatted string containing gene metadata information. """ - metadata_str = '' + metadata_str = "" if gene.has_metadata(): - metadata_str = f'

{gene.ID} metadata' + metadata_str = f"

{gene.ID} metadata" for metadata in gene.metadata: metadata_str += f"
metadata source: {metadata.source}
" metadata_dict = metadata.to_dict() - metadata_str += '
'.join((f"{key}: {value}" for key, value in metadata_dict.items())) + metadata_str += "
".join( + (f"{key}: {value}" for key, value in metadata_dict.items()) + ) return metadata_str -def get_heatmap_hover_text(ordered_families: List, order_organisms: List) -> List[List[str]]: + +def get_heatmap_hover_text( + ordered_families: List, order_organisms: List +) -> List[List[str]]: """ Generate hover text for the heatmap cells. @@ -304,18 +413,28 @@ def get_heatmap_hover_text(ordered_families: List, order_organisms: List) -> Lis if org in family.organisms: # gene_count = len(list(family.get_genes_per_org(org))) genes = ";".join(map(str, family.get_genes_per_org(org))) - names = ";".join((gene.name for gene in family.get_genes_per_org(org) if gene.name)) + names = ";".join( + (gene.name for gene in family.get_genes_per_org(org) if gene.name) + ) # Compile additional information about genes extra_gene_info = f"genes:{genes}" if names: - extra_gene_info += f'
names:{names}' - - metadata = "
".join((metadata_stringify(gene) for gene in family.get_genes_per_org(org) if gene.has_metadata())) + extra_gene_info += f"
names:{names}" + + metadata = "
".join( + ( + metadata_stringify(gene) + for gene in family.get_genes_per_org(org) + if gene.has_metadata() + ) + ) extra_gene_info += metadata else: # gene_count = 0 - extra_gene_info = np.nan # Using np.nan instead of numpy.nan for consistency with numpy import + extra_gene_info = ( + np.nan + ) # Using np.nan instead of numpy.nan for consistency with numpy import # To get a more explicit hover. But is quite heavy on the finam html # gene_info = f"genome:{org.name}
family:{family.name}
gene_count:{gene_count}
{extra_gene_info}" @@ -327,14 +446,17 @@ def get_heatmap_hover_text(ordered_families: List, order_organisms: List) -> Lis return text_data + def create_tile_plot( binary_data: List[List[float]], text_data: List[List[str]], fam_order: List[str], partition_separator: List[tuple], - order_organisms: List[Organism], # Replace 'Any' with the appropriate type if available + order_organisms: List[ + Organism + ], # Replace 'Any' with the appropriate type if available dendrogram_fig: go.Figure, - draw_dendrogram: bool + draw_dendrogram: bool, ) -> go.Figure: """ Create the heatmap tile plot using Plotly. @@ -351,71 +473,90 @@ def create_tile_plot( xaxis_values = [org.name for org in order_organisms] - heatmap_color = {"presence":"#005AB5", # blue - "multicopy":'#DC3220' # red - } + heatmap_color = {"presence": "#005AB5", "multicopy": "#DC3220"} # blue # red - green_colors = ['rgb(35,139,69)', - 'rgb(65,171,93)', - 'rgb(116,196,118)', - 'rgb(161,217,155)', - 'rgb(199,233,192)', - 'rgb(229,245,224)'] + green_colors = [ + "rgb(35,139,69)", + "rgb(65,171,93)", + "rgb(116,196,118)", + "rgb(161,217,155)", + "rgb(199,233,192)", + "rgb(229,245,224)", + ] shell_color_generator = cycle(green_colors) - partition_to_color = {"Persistent": "#F7A507", "Cloud": "#79DEFF", "Shell_S1": "#00D860"} - partition_to_color.update({partition:next(shell_color_generator) for partition, _ in partition_separator if partition not in partition_to_color}) - - - heatmap = [go.Heatmap(z=binary_data, - x=xaxis_values, - y=fam_order, - text=text_data, - zauto=False, - zmin=0, - zmax=2, - autocolorscale=False, - hovertemplate = 'genome: %{x}
family: %{y}
gene_count: %{z}
%{text} ', - colorscale=[[0, '#ffffff'],[0.33, '#ffffff'], - [0.33, heatmap_color['presence']],[0.66, heatmap_color['presence']], - [0.66, heatmap_color['multicopy']], [1, heatmap_color['multicopy']]], - - colorbar=dict(title='Presence/Absence', - titleside='top', - tickmode='array', - tickvals=[0.33, 1, 1.66], - ticktext=['Absence', 'Presence', 'Multicopy'], - len=0.27, - outlinecolor='black', - outlinewidth=0.5, - ticks=None, orientation='v'))] - + partition_to_color = { + "Persistent": "#F7A507", + "Cloud": "#79DEFF", + "Shell_S1": "#00D860", + } + partition_to_color.update( + { + partition: next(shell_color_generator) + for partition, _ in partition_separator + if partition not in partition_to_color + } + ) + heatmap = [ + go.Heatmap( + z=binary_data, + x=xaxis_values, + y=fam_order, + text=text_data, + zauto=False, + zmin=0, + zmax=2, + autocolorscale=False, + hovertemplate="genome: %{x}
family: %{y}
gene_count: %{z}
%{text} ", + colorscale=[ + [0, "#ffffff"], + [0.33, "#ffffff"], + [0.33, heatmap_color["presence"]], + [0.66, heatmap_color["presence"]], + [0.66, heatmap_color["multicopy"]], + [1, heatmap_color["multicopy"]], + ], + colorbar=dict( + title="Presence/Absence", + titleside="top", + tickmode="array", + tickvals=[0.33, 1, 1.66], + ticktext=["Absence", "Presence", "Multicopy"], + len=0.27, + outlinecolor="black", + outlinewidth=0.5, + ticks=None, + orientation="v", + ), + ) + ] if draw_dendrogram: heatmap_row = 2 - fig = make_subplots(rows=2, cols=1, - shared_xaxes=True, - vertical_spacing=0.01, - row_heights=[0.2, 0.8]) + fig = make_subplots( + rows=2, + cols=1, + shared_xaxes=True, + vertical_spacing=0.01, + row_heights=[0.2, 0.8], + ) - for data in dendrogram_fig['data']: - fig.add_trace(data, row=1, col=1) + for data in dendrogram_fig["data"]: + fig.add_trace(data, row=1, col=1) else: heatmap_row = 1 fig = make_subplots(rows=1, cols=1) - - heatmap[0]['x'] = dendrogram_fig['layout']['xaxis']['tickvals'] + heatmap[0]["x"] = dendrogram_fig["layout"]["xaxis"]["tickvals"] for data in heatmap: fig.add_trace(data, row=heatmap_row, col=1) - layout = go.Layout(title="Presence-Absence Matrix", - plot_bgcolor='#ffffff') + layout = go.Layout(title="Presence-Absence Matrix", plot_bgcolor="#ffffff") if draw_dendrogram: layout.xaxis2 = dendrogram_fig.layout.xaxis @@ -424,39 +565,47 @@ def create_tile_plot( fig.update_layout(layout) - - - fig.update_xaxes( - ticklen=0, - title="Genomes" - ) + fig.update_xaxes(ticklen=0, title="Genomes") fig.update_yaxes( ticklen=0, - title='Gene Families', + title="Gene Families", tickfont=dict(size=10), automargin=True, ) if draw_dendrogram: fig.layout.yaxis.title = None - fig.layout.yaxis2.title = dict(text='Gene Families') + fig.layout.yaxis2.title = dict(text="Gene Families") fig.layout.xaxis.title = None - xmax = dendrogram_fig['layout']['xaxis']['tickvals'][-1] + dendrogram_fig['layout']['xaxis']['tickvals'][0] + 0.5 - shapes = create_partition_shapes(partition_separator, xmax, heatmap_row, partition_to_color) + xmax = ( + dendrogram_fig["layout"]["xaxis"]["tickvals"][-1] + + dendrogram_fig["layout"]["xaxis"]["tickvals"][0] + + 0.5 + ) + shapes = create_partition_shapes( + partition_separator, xmax, heatmap_row, partition_to_color + ) - fig.update_layout(go.Layout(shapes=shapes, - showlegend=True, - )) + fig.update_layout( + go.Layout( + shapes=shapes, + showlegend=True, + ) + ) - fig.update_layout(legend=dict( - title="Family Partition", - traceorder="reversed", - )) + fig.update_layout( + legend=dict( + title="Family Partition", + traceorder="reversed", + ) + ) - fig.update_layout({'width':1000, 'height':1000, - }) + fig.update_layout( + { + "width": 1000, + "height": 1000, + } + ) return fig - - diff --git a/ppanggolin/figures/ucurve.py b/ppanggolin/figures/ucurve.py index 485055e1..75133162 100644 --- a/ppanggolin/figures/ucurve.py +++ b/ppanggolin/figures/ucurve.py @@ -12,7 +12,12 @@ from ppanggolin.pangenome import Pangenome -def draw_ucurve(pangenome: Pangenome, output: Path, soft_core: float = 0.95, disable_bar: bool = False): +def draw_ucurve( + pangenome: Pangenome, + output: Path, + soft_core: float = 0.95, + disable_bar: bool = False, +): """ :param pangenome: Partitioned pangenome @@ -21,7 +26,13 @@ def draw_ucurve(pangenome: Pangenome, output: Path, soft_core: float = 0.95, di :param disable_bar: Allow to disable progress bar :return: """ - check_pangenome_info(pangenome, need_annotations=True, need_families=True, need_graph=True, disable_bar=disable_bar) + check_pangenome_info( + pangenome, + need_annotations=True, + need_families=True, + need_graph=True, + disable_bar=disable_bar, + ) logging.getLogger("PPanGGOLiN").info("Drawing the U-shaped curve...") max_bar = 0 count = defaultdict(lambda: defaultdict(int)) @@ -35,14 +46,30 @@ def draw_ucurve(pangenome: Pangenome, output: Path, soft_core: float = 0.95, di has_undefined = True count[nb_org][fam.named_partition] += 1 count[nb_org]["pangenome"] += 1 - max_bar = count[nb_org]["pangenome"] if count[nb_org]["pangenome"] > max_bar else max_bar + max_bar = ( + count[nb_org]["pangenome"] + if count[nb_org]["pangenome"] > max_bar + else max_bar + ) data_plot = [] chao = "NA" if count[1]["pangenome"] > 0: - chao = round(pangenome.number_of_gene_families + (pow(count[1]["pangenome"], 2) / (count[2]["pangenome"] * 2)), 2) - colors = {"pangenome": "black", "exact_accessory": "#EB37ED", "exact_core": "#FF2828", "soft_core": "#c7c938", - "soft_accessory": "#996633", "shell": "#00D860", "persistent": "#F7A507", "cloud": "#79DEFF", - "undefined": "#828282"} + chao = round( + pangenome.number_of_gene_families + + (pow(count[1]["pangenome"], 2) / (count[2]["pangenome"] * 2)), + 2, + ) + colors = { + "pangenome": "black", + "exact_accessory": "#EB37ED", + "exact_core": "#FF2828", + "soft_core": "#c7c938", + "soft_accessory": "#996633", + "shell": "#00D860", + "persistent": "#F7A507", + "cloud": "#79DEFF", + "undefined": "#828282", + } if is_partitioned and not has_undefined: persistent_values = [] @@ -52,29 +79,68 @@ def draw_ucurve(pangenome: Pangenome, output: Path, soft_core: float = 0.95, di persistent_values.append(count[nb_org]["persistent"]) shell_values.append(count[nb_org]["shell"]) cloud_values.append(count[nb_org]["cloud"]) - data_plot.append(go.Bar(x=list(range(1, pangenome.number_of_organisms + 1)), y=persistent_values, name='persistent', - marker=dict(color=colors["persistent"]))) - data_plot.append(go.Bar(x=list(range(1, pangenome.number_of_organisms + 1)), y=shell_values, name='shell', - marker=dict(color=colors["shell"]))) - data_plot.append(go.Bar(x=list(range(1, pangenome.number_of_organisms + 1)), y=cloud_values, name='cloud', - marker=dict(color=colors["cloud"]))) + data_plot.append( + go.Bar( + x=list(range(1, pangenome.number_of_organisms + 1)), + y=persistent_values, + name="persistent", + marker=dict(color=colors["persistent"]), + ) + ) + data_plot.append( + go.Bar( + x=list(range(1, pangenome.number_of_organisms + 1)), + y=shell_values, + name="shell", + marker=dict(color=colors["shell"]), + ) + ) + data_plot.append( + go.Bar( + x=list(range(1, pangenome.number_of_organisms + 1)), + y=cloud_values, + name="cloud", + marker=dict(color=colors["cloud"]), + ) + ) else: - text = 'undefined' if has_undefined else "pangenome" - undefined_values = [count[nb_org][text] - for nb_org - in range(1, pangenome.number_of_organisms + 1)] + text = "undefined" if has_undefined else "pangenome" + undefined_values = [ + count[nb_org][text] + for nb_org in range(1, pangenome.number_of_organisms + 1) + ] - data_plot.append(go.Bar(x=list(range(1, pangenome.number_of_organisms + 1)), y=undefined_values, name=text, - marker=dict(color=colors[text]))) + data_plot.append( + go.Bar( + x=list(range(1, pangenome.number_of_organisms + 1)), + y=undefined_values, + name=text, + marker=dict(color=colors[text]), + ) + ) x = pangenome.number_of_organisms * soft_core - layout = go.Layout(title="Gene families frequency distribution (U shape), chao=" + str(chao), - xaxis=dict(title='Occurring in x genomes'), - yaxis=dict(title='# of gene families (F)'), - barmode='stack', - shapes=[dict(type='line', x0=x, x1=x, y0=0, y1=max_bar, - line=dict(dict(width=5, dash='dashdot', color="grey")))], - plot_bgcolor='#ffffff') + layout = go.Layout( + title="Gene families frequency distribution (U shape), chao=" + str(chao), + xaxis=dict(title="Occurring in x genomes"), + yaxis=dict(title="# of gene families (F)"), + barmode="stack", + shapes=[ + dict( + type="line", + x0=x, + x1=x, + y0=0, + y1=max_bar, + line=dict(dict(width=5, dash="dashdot", color="grey")), + ) + ], + plot_bgcolor="#ffffff", + ) fig = go.Figure(data=data_plot, layout=layout) - out_plotly.plot(fig, filename=output.as_posix() + "/Ushaped_plot.html", auto_open=False) - logging.getLogger("PPanGGOLiN").info(f"Done drawing the U-shaped curve : '{output.as_posix() + '/Ushaped_plot.html'}'") + out_plotly.plot( + fig, filename=output.as_posix() + "/Ushaped_plot.html", auto_open=False + ) + logging.getLogger("PPanGGOLiN").info( + f"Done drawing the U-shaped curve : '{output.as_posix() + '/Ushaped_plot.html'}'" + ) diff --git a/ppanggolin/formats/__init__.py b/ppanggolin/formats/__init__.py index accc36c2..1cdfd28e 100644 --- a/ppanggolin/formats/__init__.py +++ b/ppanggolin/formats/__init__.py @@ -4,4 +4,4 @@ from .writeSequences import subparser, launch from .writeMSA import subparser, launch from .writeFlatGenomes import subparser, launch -from .writeFlatMetadata import subparser, launch \ No newline at end of file +from .writeFlatMetadata import subparser, launch diff --git a/ppanggolin/formats/readBinaries.py b/ppanggolin/formats/readBinaries.py index 7d03f144..bf25c51d 100644 --- a/ppanggolin/formats/readBinaries.py +++ b/ppanggolin/formats/readBinaries.py @@ -25,8 +25,18 @@ class Genedata: genedata table """ - def __init__(self, start: int, stop: int, strand: str, gene_type: str, position: int, name: str, product: str, - genetic_code: int, coordinates: List[Tuple[int]] = None): + def __init__( + self, + start: int, + stop: int, + strand: str, + gene_type: str, + position: int, + name: str, + product: str, + genetic_code: int, + coordinates: List[Tuple[int]] = None, + ): """Constructor method :param start: Gene start position @@ -50,24 +60,36 @@ def __init__(self, start: int, stop: int, strand: str, gene_type: str, position: self.coordinates = coordinates def __eq__(self, other): - return self.start == other.start \ - and self.stop == other.stop \ - and self.strand == other.strand \ - and self.gene_type == other.gene_type \ - and self.position == other.position \ - and self.name == other.name \ - and self.product == other.product \ - and self.genetic_code == other.genetic_code \ - and self.coordinates == other.coordinates \ - + return ( + self.start == other.start + and self.stop == other.stop + and self.strand == other.strand + and self.gene_type == other.gene_type + and self.position == other.position + and self.name == other.name + and self.product == other.product + and self.genetic_code == other.genetic_code + and self.coordinates == other.coordinates + ) def __hash__(self): - return hash((self.start, self.stop, self.strand, self.gene_type, self.position, - self.name, self.product, self.genetic_code, tuple(self.coordinates))) + return hash( + ( + self.start, + self.stop, + self.strand, + self.gene_type, + self.position, + self.name, + self.product, + self.genetic_code, + tuple(self.coordinates), + ) + ) def get_number_of_organisms(pangenome: Pangenome) -> int: - """ Standalone function to get the number of organisms in a pangenome + """Standalone function to get the number of organisms in a pangenome :param pangenome: Annotated pangenome @@ -76,7 +98,9 @@ def get_number_of_organisms(pangenome: Pangenome) -> int: if hasattr(pangenome, "file"): filename = pangenome.file else: - raise FileNotFoundError("The provided pangenome does not have an associated .h5 file") + raise FileNotFoundError( + "The provided pangenome does not have an associated .h5 file" + ) h5f = tables.open_file(filename, "r") annotations = h5f.root.annotations @@ -113,14 +137,18 @@ def get_status(pangenome: Pangenome, pangenome_file: Path): pangenome.status["ppanggolin_version"] = str(status_group._v_attrs.version) else: logging.getLogger("PPanGGOLiN").error( - f'The provided pangenome file {pangenome_file} does not have a version stored in its status.' - ' This issue may indicate that the file is corrupted.') + f"The provided pangenome file {pangenome_file} does not have a version stored in its status." + " This issue may indicate that the file is corrupted." + ) pangenome.status["ppanggolin_version"] = None if status_group._v_attrs.Partitioned: pangenome.status["partitioned"] = "inFile" - if hasattr(status_group._v_attrs, "predictedRGP") and status_group._v_attrs.predictedRGP: + if ( + hasattr(status_group._v_attrs, "predictedRGP") + and status_group._v_attrs.predictedRGP + ): pangenome.status["predictedRGP"] = "inFile" if hasattr(status_group._v_attrs, "spots") and status_group._v_attrs.spots: @@ -173,26 +201,33 @@ def read_genedata(h5f: tables.File) -> Dict[int, Genedata]: start = int(row["start"]) stop = int(row["stop"]) - if "has_joined_coordinates" in row.dtype.names and row["has_joined_coordinates"]: + if ( + "has_joined_coordinates" in row.dtype.names + and row["has_joined_coordinates"] + ): # manage gene with joined coordinates if the info exists try: coordinates = genedata_id_to_coordinates[row["genedata_id"]] except KeyError: - raise KeyError(f'Genedata {row["genedata_id"]} is supposed to have joined ' - 'coordinates but is not found in annotations.joinCoordinates table') + raise KeyError( + f'Genedata {row["genedata_id"]} is supposed to have joined ' + "coordinates but is not found in annotations.joinCoordinates table" + ) else: coordinates = [(start, stop)] - genedata = Genedata(start=start, - stop=stop, - strand=row["strand"].decode(), - gene_type=row["gene_type"].decode(), - position=int(row["position"]), - name=row["name"].decode(), - product=row["product"].decode(), - genetic_code=int(row["genetic_code"]), - coordinates=coordinates) + genedata = Genedata( + start=start, + stop=stop, + strand=row["strand"].decode(), + gene_type=row["gene_type"].decode(), + position=int(row["position"]), + name=row["name"].decode(), + product=row["product"].decode(), + genetic_code=int(row["genetic_code"]), + coordinates=coordinates, + ) genedata_id = row["genedata_id"] genedata_id2genedata[genedata_id] = genedata @@ -220,12 +255,15 @@ def read_join_coordinates(h5f: tables.File) -> Dict[str, List[Tuple[int, int]]]: genedata_id = row["genedata_id"] genedata_id_to_coordinates[genedata_id].append( - (int(row["coordinate_rank"]), int(row["start"]), int(row["stop"]))) + (int(row["coordinate_rank"]), int(row["start"]), int(row["stop"])) + ) # sort coordinate by their rank genedata_id_to_sorted_coordinates = {} for genedata_id, coordinates in genedata_id_to_coordinates.items(): - sorted_coordinates = [(start, stop) for rank, start, stop in sorted(coordinates)] + sorted_coordinates = [ + (start, stop) for rank, start, stop in sorted(coordinates) + ] genedata_id_to_sorted_coordinates[genedata_id] = sorted_coordinates return genedata_id_to_sorted_coordinates @@ -240,12 +278,13 @@ def read_sequences(h5f: tables.File) -> dict: table = h5f.root.annotations.sequences seqid2seq = {} for row in read_chunks(table, chunk=20000): - seqid2seq[row["seqid"]] = row['dna'].decode() + seqid2seq[row["seqid"]] = row["dna"].decode() return seqid2seq -def get_non_redundant_gene_sequences_from_file(pangenome_filename: str, output: Path, add: str = '', - disable_bar: bool = False): +def get_non_redundant_gene_sequences_from_file( + pangenome_filename: str, output: Path, add: str = "", disable_bar: bool = False +): """ Writes the non-redundant CDS sequences of the Pangenome object to a File object that can be filtered or not by a list of CDS, and adds the eventual str 'add' in front of the identifiers. Loads the sequences from a .h5 pangenome file. @@ -257,8 +296,10 @@ def get_non_redundant_gene_sequences_from_file(pangenome_filename: str, output: """ - logging.getLogger("PPanGGOLiN").info(f"Extracting and writing non redundant CDS sequences from {pangenome_filename}" - f" to {output.absolute()}") + logging.getLogger("PPanGGOLiN").info( + f"Extracting and writing non redundant CDS sequences from {pangenome_filename}" + f" to {output.absolute()}" + ) with tables.open_file(pangenome_filename, "r", driver_core_backing_store=0) as h5f: @@ -272,14 +313,25 @@ def get_non_redundant_gene_sequences_from_file(pangenome_filename: str, output: table = h5f.root.annotations.sequences with open(output, "w") as file_obj: - for row in tqdm(read_chunks(table, chunk=20000), total=table.nrows, unit="gene", disable=disable_bar): + for row in tqdm( + read_chunks(table, chunk=20000), + total=table.nrows, + unit="gene", + disable=disable_bar, + ): cds_name = seqid2cds_name[row["seqid"]] - file_obj.write(f'>{add}{cds_name}\n') + file_obj.write(f">{add}{cds_name}\n") file_obj.write(f'{row["dna"].decode()}\n') -def write_gene_sequences_from_pangenome_file(pangenome_filename: str, output: Path, list_cds: Optional[Iterator] = None, - add: str = '', compress: bool = False, disable_bar: bool = False): +def write_gene_sequences_from_pangenome_file( + pangenome_filename: str, + output: Path, + list_cds: Optional[Iterator] = None, + add: str = "", + compress: bool = False, + disable_bar: bool = False, +): """ Writes the CDS sequences of the Pangenome object to a File object that can be filtered or not by a list of CDS, and adds the eventual str 'add' in front of the identifiers. Loads the sequences from a .h5 pangenome file. @@ -291,21 +343,30 @@ def write_gene_sequences_from_pangenome_file(pangenome_filename: str, output: Pa :param compress: Compress the output file :param disable_bar: Prevent to print disable progress bar """ - logging.getLogger("PPanGGOLiN").info(f"Extracting and writing CDS sequences from a {pangenome_filename} " - "file to a fasta file...") + logging.getLogger("PPanGGOLiN").info( + f"Extracting and writing CDS sequences from a {pangenome_filename} " + "file to a fasta file..." + ) with tables.open_file(pangenome_filename, "r", driver_core_backing_store=0) as h5f: table = h5f.root.annotations.geneSequences list_cds = set(list_cds) if list_cds is not None else None seqid2seq = read_sequences(h5f) with write_compressed_or_not(output, compress) as file_obj: - for row in tqdm(read_chunks(table, chunk=20000), total=table.nrows, unit="gene", disable=disable_bar): + for row in tqdm( + read_chunks(table, chunk=20000), + total=table.nrows, + unit="gene", + disable=disable_bar, + ): # Read the table chunk per chunk otherwise RAM dies on big pangenomes name_cds = row["gene"].decode() if row["type"] == b"CDS" and (list_cds is None or name_cds in list_cds): - file_obj.write('>' + add + name_cds + "\n") + file_obj.write(">" + add + name_cds + "\n") file_obj.write(seqid2seq[row["seqid"]] + "\n") - logging.getLogger("PPanGGOLiN").debug("Gene sequences from pangenome file was written to " - f"{output.absolute()}{'.gz' if compress else ''}") + logging.getLogger("PPanGGOLiN").debug( + "Gene sequences from pangenome file was written to " + f"{output.absolute()}{'.gz' if compress else ''}" + ) def read_rgp_genes_from_pangenome_file(h5f: tables.File) -> Set[bytes]: @@ -328,57 +389,64 @@ def get_families_from_genes(h5f: tables.File, genes: Set[bytes]) -> Set[bytes]: :param genes: A set of gene names (as bytes) for which to retrieve the associated families. :return: A set of gene family names (as bytes) associated with the specified genes. """ - + families = set() for row in read_chunks(h5f.root.geneFamilies, chunk=20000): - if row['gene'] in genes: + if row["gene"] in genes: families.add(row["geneFam"]) return families -def read_module_families_from_pangenome_file(h5f: tables.File, module_name: str) -> Set[bytes]: + +def read_module_families_from_pangenome_file( + h5f: tables.File, module_name: str +) -> Set[bytes]: """ Retrieves gene families associated with a specified module from the pangenome file. :param h5f: The open HDF5 pangenome file containing module data. - :param module_name: The name of the module (as a string). The module ID is extracted from + :param module_name: The name of the module (as a string). The module ID is extracted from the name by removing the "module_" prefix. :return: A set of gene family names (as bytes) associated with the specified module. """ - + family_to_write = set() - module_id = int(module_name[len("module_"):]) + module_id = int(module_name[len("module_") :]) module_table = h5f.root.modules for row in read_chunks(module_table, chunk=20000): - if row['module'] == module_id: - family_to_write.add(row['geneFam']) + if row["module"] == module_id: + family_to_write.add(row["geneFam"]) return family_to_write + def get_families_matching_partition(h5f: tables.File, partition: str) -> Set[bytes]: """ Retrieves gene families that match the specified partition. :param h5f: The open HDF5 pangenome file containing gene family information. - :param partition: The partition name (as a string). If "all", all gene families are included. + :param partition: The partition name (as a string). If "all", all gene families are included. Otherwise, it filters by the first letter of the partition. :return: A set of gene family names (as bytes) that match the partition criteria. """ family_to_write = set() - + gene_fam_info_table = h5f.root.geneFamiliesInfo parition_first_letter = partition[0].upper() for row in read_chunks(gene_fam_info_table, chunk=20000): - - if partition == "all" or row['partition'].decode().startswith(parition_first_letter): - family_to_write.add(row['name']) + + if partition == "all" or row["partition"].decode().startswith( + parition_first_letter + ): + family_to_write.add(row["name"]) return family_to_write + def get_genes_from_families(h5f: tables.File, families: List[bytes]) -> Set[bytes]: """ Retrieves a set of genes that belong to the specified families. @@ -390,24 +458,30 @@ def get_genes_from_families(h5f: tables.File, families: List[bytes]) -> Set[byte :param families: A list of gene families (as bytes) to filter genes by. :return: A set of genes (as bytes) that belong to the specified families. """ - + matching_genes = set() - + gene_fam_table = h5f.root.geneFamilies for row in read_chunks(gene_fam_table, chunk=20000): if row["geneFam"] in families: - matching_genes.add(row['gene']) + matching_genes.add(row["gene"]) return matching_genes -def get_seqid_to_genes(h5f: tables.File, genes:Set[bytes], get_all_genes:bool = False, disable_bar:bool = False) -> Dict[int, List[str]]: + +def get_seqid_to_genes( + h5f: tables.File, + genes: Set[bytes], + get_all_genes: bool = False, + disable_bar: bool = False, +) -> Dict[int, List[str]]: """ Creates a mapping of sequence IDs to gene names. :param h5f: The open HDF5 pangenome file containing gene sequence data. :param genes: A list of gene names to include in the mapping (if `get_all_genes` is False). - :param get_all_genes: Boolean flag to indicate if all genes should be included in the mapping. + :param get_all_genes: Boolean flag to indicate if all genes should be included in the mapping. If set to True, all genes will be added regardless of the `genes` parameter. :param disable_bar: Boolean flag to disable the progress bar if set to True. :return: A dictionary mapping sequence IDs (integers) to lists of gene names (strings). @@ -416,21 +490,34 @@ def get_seqid_to_genes(h5f: tables.File, genes:Set[bytes], get_all_genes:bool = seq_id_to_genes = defaultdict(list) gene_seq_table = h5f.root.annotations.geneSequences match_count = 0 - for row in tqdm(read_chunks(gene_seq_table, chunk=20000), total=gene_seq_table.nrows, unit="gene", disable=disable_bar): - - if get_all_genes or row['gene'] in genes: - seq_id_to_genes[row['seqid']].append(row['gene'].decode()) + for row in tqdm( + read_chunks(gene_seq_table, chunk=20000), + total=gene_seq_table.nrows, + unit="gene", + disable=disable_bar, + ): + + if get_all_genes or row["gene"] in genes: + seq_id_to_genes[row["seqid"]].append(row["gene"].decode()) match_count += 1 - assert get_all_genes or match_count == len(genes), f"Number of sequences found ({match_count}) does not match the number of expected genes {len(genes)}." + assert get_all_genes or match_count == len( + genes + ), f"Number of sequences found ({match_count}) does not match the number of expected genes {len(genes)}." return seq_id_to_genes -def write_genes_seq_from_pangenome_file(h5f: tables.File, outpath: Path, compress: bool, seq_id_to_genes: Dict[int, List[str]], disable_bar:bool): +def write_genes_seq_from_pangenome_file( + h5f: tables.File, + outpath: Path, + compress: bool, + seq_id_to_genes: Dict[int, List[str]], + disable_bar: bool, +): """ - Writes gene sequences from the pangenome file to an output file. - + Writes gene sequences from the pangenome file to an output file. + Only sequences whose IDs match the ones in `seq_id_to_genes` will be written. :param h5f: The open HDF5 pangenome file containing sequence data. @@ -439,12 +526,14 @@ def write_genes_seq_from_pangenome_file(h5f: tables.File, outpath: Path, compres :param seq_id_to_genes: A dictionary mapping sequence IDs to lists of gene names. :param disable_bar: Boolean flag to disable the progress bar if set to True. """ - + with write_compressed_or_not(file_path=outpath, compress=compress) as file_obj: seq_table = h5f.root.annotations.sequences - with tqdm(total=len(seq_id_to_genes), unit="sequence", disable=disable_bar) as pbar: + with tqdm( + total=len(seq_id_to_genes), unit="sequence", disable=disable_bar + ) as pbar: for row in read_chunks(table=seq_table, chunk=20000): if row["seqid"] in seq_id_to_genes: @@ -452,7 +541,6 @@ def write_genes_seq_from_pangenome_file(h5f: tables.File, outpath: Path, compres for seq_name in seq_id_to_genes[row["seqid"]]: file_obj.write(f">{seq_name}\n") file_obj.write(row["dna"].decode() + "\n") - pbar.update(1) @@ -464,10 +552,16 @@ def get_gene_to_genome(h5f: tables.File) -> Dict[bytes, bytes]: :param h5f: The open HDF5 pangenome file containing contig and gene annotations. :return: A dictionary mapping gene IDs to genome names. """ - - contig_id_to_genome = {row["ID"]:row['genome'] for row in read_chunks( h5f.root.annotations.contigs, chunk=20000) } - gene_to_genome = {row["ID"]:contig_id_to_genome[row['contig'] ] for row in read_chunks( h5f.root.annotations.genes, chunk=20000) } + contig_id_to_genome = { + row["ID"]: row["genome"] + for row in read_chunks(h5f.root.annotations.contigs, chunk=20000) + } + + gene_to_genome = { + row["ID"]: contig_id_to_genome[row["contig"]] + for row in read_chunks(h5f.root.annotations.genes, chunk=20000) + } return gene_to_genome @@ -479,19 +573,28 @@ def get_family_to_genome_count(h5f: tables.File) -> Dict[bytes, int]: :param h5f: The open HDF5 pangenome file containing contig, gene, and gene family data. :return: A dictionary mapping gene family names (as bytes) to the count of unique genomes. """ - - contig_id_to_genome = {row["ID"]:row['genome'] for row in read_chunks( h5f.root.annotations.contigs, chunk=20000) } - gene_to_genome = {row["ID"]:contig_id_to_genome[row['contig'] ] for row in read_chunks( h5f.root.annotations.genes, chunk=20000) } + contig_id_to_genome = { + row["ID"]: row["genome"] + for row in read_chunks(h5f.root.annotations.contigs, chunk=20000) + } + + gene_to_genome = { + row["ID"]: contig_id_to_genome[row["contig"]] + for row in read_chunks(h5f.root.annotations.genes, chunk=20000) + } family_to_genomes = defaultdict(set) - for row in read_chunks( h5f.root.geneFamilies, chunk=20000): - family_to_genomes[row['geneFam']].add(gene_to_genome[row["gene"]]) + for row in read_chunks(h5f.root.geneFamilies, chunk=20000): + family_to_genomes[row["geneFam"]].add(gene_to_genome[row["gene"]]) - family_to_genome_count = {fam: len(genomes) for fam, genomes in family_to_genomes.items()} + family_to_genome_count = { + fam: len(genomes) for fam, genomes in family_to_genomes.items() + } return family_to_genome_count + def get_soft_core_families(h5f: tables.File, soft_core: float) -> Set[bytes]: """ Identifies gene families that are present in at least a specified proportion of genomes. @@ -506,11 +609,22 @@ def get_soft_core_families(h5f: tables.File, soft_core: float) -> Set[bytes]: genome_count = pangenome_info["Content"]["Genomes"] genome_count_threshold = genome_count * soft_core - soft_core_families = {family for family, fam_genome_count in family_to_genome_count.items() if fam_genome_count >= genome_count_threshold} + soft_core_families = { + family + for family, fam_genome_count in family_to_genome_count.items() + if fam_genome_count >= genome_count_threshold + } return soft_core_families -def write_fasta_gene_fam_from_pangenome_file(pangenome_filename: str, output: Path, family_filter: str, soft_core:float = 0.95, - compress: bool = False, disable_bar=False): + +def write_fasta_gene_fam_from_pangenome_file( + pangenome_filename: str, + output: Path, + family_filter: str, + soft_core: float = 0.95, + compress: bool = False, + disable_bar=False, +): """ Write representative nucleotide sequences of gene families @@ -526,13 +640,14 @@ def write_fasta_gene_fam_from_pangenome_file(pangenome_filename: str, output: Pa with tables.open_file(pangenome_filename, "r", driver_core_backing_store=0) as h5f: - if family_filter in ["all", 'persistent', 'shell', 'cloud']: + if family_filter in ["all", "persistent", "shell", "cloud"]: family_to_write = get_families_matching_partition(h5f, family_filter) - elif family_filter.startswith("module_"): - family_to_write = read_module_families_from_pangenome_file(h5f, module_name=family_filter) - + family_to_write = read_module_families_from_pangenome_file( + h5f, module_name=family_filter + ) + elif family_filter == "rgp": rgp_genes = read_rgp_genes_from_pangenome_file(h5f) family_to_write = get_families_from_genes(h5f, rgp_genes) @@ -540,23 +655,35 @@ def write_fasta_gene_fam_from_pangenome_file(pangenome_filename: str, output: Pa elif family_filter in ["softcore", "core"]: if family_filter == "core": soft_core = 1.0 - + family_to_write = get_soft_core_families(h5f, soft_core) if len(family_to_write) == 0: - logging.getLogger("PPanGGOLiN").warning(f"No families matching filter {family_filter}.") + logging.getLogger("PPanGGOLiN").warning( + f"No families matching filter {family_filter}." + ) return seq_id_to_genes = get_seqid_to_genes(h5f, set(family_to_write)) - write_genes_seq_from_pangenome_file(h5f, outpath, compress, seq_id_to_genes, disable_bar=disable_bar) + write_genes_seq_from_pangenome_file( + h5f, outpath, compress, seq_id_to_genes, disable_bar=disable_bar + ) - logging.getLogger("PPanGGOLiN").info("Done writing the representative nucleotide sequences " - f"of the gene families : '{outpath}{'.gz' if compress else ''}") + logging.getLogger("PPanGGOLiN").info( + "Done writing the representative nucleotide sequences " + f"of the gene families : '{outpath}{'.gz' if compress else ''}" + ) -def write_fasta_prot_fam_from_pangenome_file(pangenome_filename: str, output: Path, family_filter: str, soft_core:float=0.95, - compress: bool = False, disable_bar=False): +def write_fasta_prot_fam_from_pangenome_file( + pangenome_filename: str, + output: Path, + family_filter: str, + soft_core: float = 0.95, + compress: bool = False, + disable_bar=False, +): """ Write representative amino acid sequences of gene families. @@ -573,44 +700,63 @@ def write_fasta_prot_fam_from_pangenome_file(pangenome_filename: str, output: Pa partition_filter = False family_to_write = [] - with tables.open_file(pangenome_filename, "r", driver_core_backing_store=0) as h5f, write_compressed_or_not(outpath, compress) as fasta: + with tables.open_file( + pangenome_filename, "r", driver_core_backing_store=0 + ) as h5f, write_compressed_or_not(outpath, compress) as fasta: - if family_filter in ["all", 'persistent', 'shell', 'cloud']: + if family_filter in ["all", "persistent", "shell", "cloud"]: partition_filter = True parition_first_letter = family_filter[0].upper() elif family_filter == "rgp": rgp_genes = read_rgp_genes_from_pangenome_file(h5f) family_to_write = get_families_from_genes(h5f, rgp_genes) - + elif family_filter.startswith("module_"): - family_to_write = read_module_families_from_pangenome_file(h5f, module_name=family_filter) - + family_to_write = read_module_families_from_pangenome_file( + h5f, module_name=family_filter + ) + elif family_filter in ["softcore", "core"]: - + soft_core_to_apply = 1.0 if family_filter == "core" else soft_core family_to_write = get_soft_core_families(h5f, soft_core=soft_core_to_apply) gene_fam_info_table = h5f.root.geneFamiliesInfo + for row in tqdm( + read_chunks(gene_fam_info_table, chunk=20000), + total=gene_fam_info_table.nrows, + unit="family", + disable=disable_bar, + ): - for row in tqdm(read_chunks(gene_fam_info_table, chunk=20000), total=gene_fam_info_table.nrows, unit="family", disable=disable_bar): - - partition_match = partition_filter and (family_filter == "all" or row['partition'].decode().startswith(parition_first_letter)) - family_match = row['name'] in family_to_write + partition_match = partition_filter and ( + family_filter == "all" + or row["partition"].decode().startswith(parition_first_letter) + ) + family_match = row["name"] in family_to_write if partition_match or family_match: - + fasta.write(f">{row['name'].decode()}\n") - fasta.write(row['protein'].decode() + "\n") + fasta.write(row["protein"].decode() + "\n") - logging.getLogger("PPanGGOLiN").info(f"Done writing the representative amino acid sequences of the gene families:" - f"'{outpath}{'.gz' if compress else ''}'") - + logging.getLogger("PPanGGOLiN").info( + f"Done writing the representative amino acid sequences of the gene families:" + f"'{outpath}{'.gz' if compress else ''}'" + ) -def write_genes_from_pangenome_file(pangenome_filename: str, output: Path, gene_filter: str, soft_core:float=0.95, - compress: bool = False, disable_bar=False): + +def write_genes_from_pangenome_file( + pangenome_filename: str, + output: Path, + gene_filter: str, + soft_core: float = 0.95, + compress: bool = False, + disable_bar=False, +): """ Write representative nucleotide sequences of gene families @@ -625,19 +771,26 @@ def write_genes_from_pangenome_file(pangenome_filename: str, output: Path, gene_ outpath = output / f"{gene_filter}_genes.fna" get_all_genes = False - with tables.open_file(pangenome_filename, "r", driver_core_backing_store=0) as h5f: - if gene_filter in ['persistent', 'shell', 'cloud', "softcore", "core"] or gene_filter.startswith("module_"): + if gene_filter in [ + "persistent", + "shell", + "cloud", + "softcore", + "core", + ] or gene_filter.startswith("module_"): if gene_filter.startswith("module_"): - families = read_module_families_from_pangenome_file(h5f, module_name=gene_filter) + families = read_module_families_from_pangenome_file( + h5f, module_name=gene_filter + ) elif gene_filter in ["softcore", "core"]: - + soft_core_to_apply = 1.0 if gene_filter == "core" else soft_core families = get_soft_core_families(h5f, soft_core=soft_core_to_apply) - + else: families = get_families_matching_partition(h5f, gene_filter) @@ -650,12 +803,18 @@ def write_genes_from_pangenome_file(pangenome_filename: str, output: Path, gene_ genes_to_write = set() get_all_genes = True - seq_id_to_genes = get_seqid_to_genes(h5f, genes_to_write, get_all_genes=get_all_genes, disable_bar=disable_bar) + seq_id_to_genes = get_seqid_to_genes( + h5f, genes_to_write, get_all_genes=get_all_genes, disable_bar=disable_bar + ) - write_genes_seq_from_pangenome_file(h5f, outpath, compress, seq_id_to_genes, disable_bar=disable_bar) - - logging.getLogger("PPanGGOLiN").info("Done writing the representative nucleotide sequences " - f"of the gene families : '{outpath}{'.gz' if compress else ''}") + write_genes_seq_from_pangenome_file( + h5f, outpath, compress, seq_id_to_genes, disable_bar=disable_bar + ) + + logging.getLogger("PPanGGOLiN").info( + "Done writing the representative nucleotide sequences " + f"of the gene families : '{outpath}{'.gz' if compress else ''}" + ) def read_graph(pangenome: Pangenome, h5f: tables.File, disable_bar: bool = False): @@ -668,18 +827,29 @@ def read_graph(pangenome: Pangenome, h5f: tables.File, disable_bar: bool = False """ table = h5f.root.edges - if pangenome.status["genomesAnnotated"] not in ["Computed", "Loaded"] or \ - pangenome.status["genesClustered"] not in ["Computed", "Loaded"]: - raise Exception("It's not possible to read the graph " - "if the annotations and the gene families have not been loaded.") - for row in tqdm(read_chunks(table, chunk=20000), total=table.nrows, unit="contig adjacency", disable=disable_bar): + if pangenome.status["genomesAnnotated"] not in [ + "Computed", + "Loaded", + ] or pangenome.status["genesClustered"] not in ["Computed", "Loaded"]: + raise Exception( + "It's not possible to read the graph " + "if the annotations and the gene families have not been loaded." + ) + for row in tqdm( + read_chunks(table, chunk=20000), + total=table.nrows, + unit="contig adjacency", + disable=disable_bar, + ): source = pangenome.get_gene(row["geneSource"].decode()) target = pangenome.get_gene(row["geneTarget"].decode()) pangenome.add_edge(source, target) pangenome.status["neighborsGraph"] = "Loaded" -def read_gene_families(pangenome: Pangenome, h5f: tables.File, disable_bar: bool = False): +def read_gene_families( + pangenome: Pangenome, h5f: tables.File, disable_bar: bool = False +): """ Read gene families in pangenome hdf5 file to add in pangenome object @@ -689,13 +859,24 @@ def read_gene_families(pangenome: Pangenome, h5f: tables.File, disable_bar: bool """ table = h5f.root.geneFamilies - link = True if pangenome.status["genomesAnnotated"] in ["Computed", "Loaded"] else False - - for row in tqdm(read_chunks(table, chunk=20000), total=table.nrows, unit="gene family", disable=disable_bar): + link = ( + True + if pangenome.status["genomesAnnotated"] in ["Computed", "Loaded"] + else False + ) + + for row in tqdm( + read_chunks(table, chunk=20000), + total=table.nrows, + unit="gene family", + disable=disable_bar, + ): try: fam = pangenome.get_gene_family(name=row["geneFam"].decode()) except KeyError: - fam = GeneFamily(family_id=pangenome.max_fam_id, name=row["geneFam"].decode()) + fam = GeneFamily( + family_id=pangenome.max_fam_id, name=row["geneFam"].decode() + ) pangenome.add_gene_family(fam) if link: # linking if we have loaded the annotations gene_obj = pangenome.get_gene(row["gene"].decode()) @@ -705,7 +886,9 @@ def read_gene_families(pangenome: Pangenome, h5f: tables.File, disable_bar: bool pangenome.status["genesClustered"] = "Loaded" -def read_gene_families_info(pangenome: Pangenome, h5f: tables.File, disable_bar: bool = False): +def read_gene_families_info( + pangenome: Pangenome, h5f: tables.File, disable_bar: bool = False +): """ Read information about gene families in pangenome hdf5 file to add in pangenome object @@ -715,7 +898,12 @@ def read_gene_families_info(pangenome: Pangenome, h5f: tables.File, disable_bar: """ table = h5f.root.geneFamiliesInfo - for row in tqdm(read_chunks(table, chunk=20000), total=table.nrows, unit="gene family", disable=disable_bar): + for row in tqdm( + read_chunks(table, chunk=20000), + total=table.nrows, + unit="gene family", + disable=disable_bar, + ): fam = pangenome.get_gene_family(row["name"].decode()) fam.partition = row["partition"].decode() fam.add_sequence(row["protein"].decode()) @@ -726,7 +914,9 @@ def read_gene_families_info(pangenome: Pangenome, h5f: tables.File, disable_bar: pangenome.status["geneFamilySequences"] = "Loaded" -def read_gene_sequences(pangenome: Pangenome, h5f: tables.File, disable_bar: bool = False): +def read_gene_sequences( + pangenome: Pangenome, h5f: tables.File, disable_bar: bool = False +): """ Read gene sequences in pangenome hdf5 file to add in pangenome object @@ -735,14 +925,21 @@ def read_gene_sequences(pangenome: Pangenome, h5f: tables.File, disable_bar: boo :param disable_bar: Disable the progress bar """ if pangenome.status["genomesAnnotated"] not in ["Computed", "Loaded"]: - raise Exception("It's not possible to read the pangenome gene dna sequences " - "if the annotations have not been loaded.") + raise Exception( + "It's not possible to read the pangenome gene dna sequences " + "if the annotations have not been loaded." + ) table = h5f.root.annotations.geneSequences seqid2seq = read_sequences(h5f) - for row in tqdm(read_chunks(table, chunk=20000), total=table.nrows, unit="gene", disable=disable_bar): - gene = pangenome.get_gene(row['gene'].decode()) - gene.add_sequence(seqid2seq[row['seqid']]) + for row in tqdm( + read_chunks(table, chunk=20000), + total=table.nrows, + unit="gene", + disable=disable_bar, + ): + gene = pangenome.get_gene(row["gene"].decode()) + gene.add_sequence(seqid2seq[row["seqid"]]) pangenome.status["geneSequences"] = "Loaded" @@ -754,13 +951,22 @@ def read_rgp(pangenome: Pangenome, h5f: tables.File, disable_bar: bool = False): :param h5f: Pangenome HDF5 file with RGP computed :param disable_bar: Disable the progress bar """ - if pangenome.status["genomesAnnotated"] not in ["Computed", "Loaded"] or \ - pangenome.status["genesClustered"] not in ["Computed", "Loaded"]: - raise Exception("It's not possible to read the RGP " - "if the annotations and the gene families have not been loaded.") + if pangenome.status["genomesAnnotated"] not in [ + "Computed", + "Loaded", + ] or pangenome.status["genesClustered"] not in ["Computed", "Loaded"]: + raise Exception( + "It's not possible to read the RGP " + "if the annotations and the gene families have not been loaded." + ) table = h5f.root.RGP - for row in tqdm(read_chunks(table, chunk=20000), total=table.nrows, unit="region", disable=disable_bar): + for row in tqdm( + read_chunks(table, chunk=20000), + total=table.nrows, + unit="region", + disable=disable_bar, + ): try: region = pangenome.get_region(row["RGP"].decode()) except KeyError: @@ -781,7 +987,12 @@ def read_spots(pangenome: Pangenome, h5f: tables.File, disable_bar: bool = False """ table = h5f.root.spots spots = {} - for row in tqdm(read_chunks(table, chunk=20000), total=table.nrows, unit="spot", disable=disable_bar): + for row in tqdm( + read_chunks(table, chunk=20000), + total=table.nrows, + unit="spot", + disable=disable_bar, + ): curr_spot = spots.get(int(row["spot"])) if curr_spot is None: curr_spot = Spot(int(row["spot"])) @@ -803,23 +1014,34 @@ def read_modules(pangenome: Pangenome, h5f: tables.File, disable_bar: bool = Fal :param disable_bar: Disable the progress bar """ if pangenome.status["genesClustered"] not in ["Computed", "Loaded"]: - raise Exception("It's not possible to read the modules if the gene families have not been loaded.") + raise Exception( + "It's not possible to read the modules if the gene families have not been loaded." + ) table = h5f.root.modules modules = {} # id2mod - for row in tqdm(read_chunks(table, chunk=20000), total=table.nrows, unit="module", disable=disable_bar): - curr_module = modules.get(int(row['module'])) + for row in tqdm( + read_chunks(table, chunk=20000), + total=table.nrows, + unit="module", + disable=disable_bar, + ): + curr_module = modules.get(int(row["module"])) if curr_module is None: - curr_module = Module(int(row['module'])) + curr_module = Module(int(row["module"])) modules[row["module"]] = curr_module - family = pangenome.get_gene_family(row['geneFam'].decode()) + family = pangenome.get_gene_family(row["geneFam"].decode()) curr_module.add(family) for module in modules.values(): pangenome.add_module(module) pangenome.status["modules"] = "Loaded" -def read_organisms(pangenome: Pangenome, table: tables.Table, chunk_size: int = 20000, - disable_bar: bool = False): +def read_organisms( + pangenome: Pangenome, + table: tables.Table, + chunk_size: int = 20000, + disable_bar: bool = False, +): """Read organism table in pangenome file to add them to the pangenome object :param pangenome: Pangenome object @@ -827,13 +1049,22 @@ def read_organisms(pangenome: Pangenome, table: tables.Table, chunk_size: int = :param chunk_size: Size of the chunk reading :param disable_bar: Disable progress bar """ - for row in tqdm(read_chunks(table, chunk=chunk_size), total=table.nrows, unit="genome", disable=disable_bar): + for row in tqdm( + read_chunks(table, chunk=chunk_size), + total=table.nrows, + unit="genome", + disable=disable_bar, + ): organism = Organism(row["name"].decode()) pangenome.add_organism(organism) -def read_contigs(pangenome: Pangenome, table: tables.Table, chunk_size: int = 20000, - disable_bar: bool = False): +def read_contigs( + pangenome: Pangenome, + table: tables.Table, + chunk_size: int = 20000, + disable_bar: bool = False, +): """Read contig table in pangenome file to add them to the pangenome object :param pangenome: Pangenome object @@ -841,8 +1072,17 @@ def read_contigs(pangenome: Pangenome, table: tables.Table, chunk_size: int = 20 :param chunk_size: Size of the chunk reading :param disable_bar: Disable progress bar """ - for row in tqdm(read_chunks(table, chunk=chunk_size), total=table.nrows, unit="contig", disable=disable_bar): - contig = Contig(identifier=int(row["ID"]), name=row["name"].decode(), is_circular=row["is_circular"]) + for row in tqdm( + read_chunks(table, chunk=chunk_size), + total=table.nrows, + unit="contig", + disable=disable_bar, + ): + contig = Contig( + identifier=int(row["ID"]), + name=row["name"].decode(), + is_circular=row["is_circular"], + ) contig.length = int(row["length"]) try: organism = pangenome.get_organism(row["genome"].decode()) @@ -852,8 +1092,14 @@ def read_contigs(pangenome: Pangenome, table: tables.Table, chunk_size: int = 20 organism.add(contig) -def read_genes(pangenome: Pangenome, table: tables.Table, genedata_dict: Dict[int, Genedata], - link: bool = True, chunk_size: int = 20000, disable_bar: bool = False): +def read_genes( + pangenome: Pangenome, + table: tables.Table, + genedata_dict: Dict[int, Genedata], + link: bool = True, + chunk_size: int = 20000, + disable_bar: bool = False, +): """Read genes in pangenome file to add them to the pangenome object :param pangenome: Pangenome object @@ -863,17 +1109,30 @@ def read_genes(pangenome: Pangenome, table: tables.Table, genedata_dict: Dict[in :param chunk_size: Size of the chunk reading :param disable_bar: Disable progress bar """ - for row in tqdm(read_chunks(table, chunk=chunk_size), total=table.nrows, unit="gene", disable=disable_bar): + for row in tqdm( + read_chunks(table, chunk=chunk_size), + total=table.nrows, + unit="gene", + disable=disable_bar, + ): gene = Gene(row["ID"].decode()) genedata = genedata_dict[row["genedata_id"]] try: local = row["local"].decode() except ValueError: local = "" - gene.fill_annotations(start=genedata.start, stop=genedata.stop, strand=genedata.strand, - gene_type=genedata.gene_type, name=genedata.name, position=genedata.position, - genetic_code=genedata.genetic_code, product=genedata.product, local_identifier=local, - coordinates=genedata.coordinates) + gene.fill_annotations( + start=genedata.start, + stop=genedata.stop, + strand=genedata.strand, + gene_type=genedata.gene_type, + name=genedata.name, + position=genedata.position, + genetic_code=genedata.genetic_code, + product=genedata.product, + local_identifier=local, + coordinates=genedata.coordinates, + ) gene.is_fragment = row["is_fragment"] if link: contig = pangenome.get_contig(identifier=int(row["contig"])) @@ -881,8 +1140,14 @@ def read_genes(pangenome: Pangenome, table: tables.Table, genedata_dict: Dict[in contig.add(gene) -def read_rnas(pangenome: Pangenome, table: tables.Table, genedata_dict: Dict[int, Genedata], - link: bool = True, chunk_size: int = 20000, disable_bar: bool = False): +def read_rnas( + pangenome: Pangenome, + table: tables.Table, + genedata_dict: Dict[int, Genedata], + link: bool = True, + chunk_size: int = 20000, + disable_bar: bool = False, +): """Read RNAs in pangenome file to add them to the pangenome object :param pangenome: Pangenome object @@ -892,28 +1157,49 @@ def read_rnas(pangenome: Pangenome, table: tables.Table, genedata_dict: Dict[int :param chunk_size: Size of the chunk reading :param disable_bar: Disable progress bar """ - for row in tqdm(read_chunks(table, chunk=chunk_size), total=table.nrows, unit="gene", disable=disable_bar): + for row in tqdm( + read_chunks(table, chunk=chunk_size), + total=table.nrows, + unit="gene", + disable=disable_bar, + ): rna = RNA(row["ID"].decode()) genedata = genedata_dict[row["genedata_id"]] if genedata.start > genedata.stop: - logging.warning(f"Wrong coordinates in RNA gene {genedata.name}: Start ({genedata.start}) should not be greater than stop ({genedata.stop}). This gene is ignored.") + logging.warning( + f"Wrong coordinates in RNA gene {genedata.name}: Start ({genedata.start}) should not be greater than stop ({genedata.stop}). This gene is ignored." + ) continue if genedata.start < 1 or genedata.stop < 1: - logging.warning(f"Wrong coordinates in RNA gene {genedata.name}: Start ({genedata.start}) and stop ({genedata.stop}) should be greater than 0. This gene is ignored.") + logging.warning( + f"Wrong coordinates in RNA gene {genedata.name}: Start ({genedata.start}) and stop ({genedata.stop}) should be greater than 0. This gene is ignored." + ) continue - rna.fill_annotations(start=genedata.start, stop=genedata.stop, strand=genedata.strand, - gene_type=genedata.gene_type, name=genedata.name, - product=genedata.product) + rna.fill_annotations( + start=genedata.start, + stop=genedata.stop, + strand=genedata.strand, + gene_type=genedata.gene_type, + name=genedata.name, + product=genedata.product, + ) if link: contig = pangenome.get_contig(int(row["contig"])) rna.fill_parents(contig.organism, contig) contig.add_rna(rna) -def read_annotation(pangenome: Pangenome, h5f: tables.File, load_organisms: bool = True, load_contigs: bool = True, - load_genes: bool = True, load_rnas: bool = True, chunk_size: int = 20000, - disable_bar: bool = False): +def read_annotation( + pangenome: Pangenome, + h5f: tables.File, + load_organisms: bool = True, + load_contigs: bool = True, + load_genes: bool = True, + load_rnas: bool = True, + chunk_size: int = 20000, + disable_bar: bool = False, +): """ Read annotation in pangenome hdf5 file to add in pangenome object @@ -929,18 +1215,40 @@ def read_annotation(pangenome: Pangenome, h5f: tables.File, load_organisms: bool annotations = h5f.root.annotations genedata_dict = None if load_organisms: - read_organisms(pangenome, annotations.genomes, chunk_size=chunk_size, disable_bar=disable_bar) + read_organisms( + pangenome, + annotations.genomes, + chunk_size=chunk_size, + disable_bar=disable_bar, + ) if load_contigs: - read_contigs(pangenome, annotations.contigs, chunk_size=chunk_size, disable_bar=disable_bar) + read_contigs( + pangenome, + annotations.contigs, + chunk_size=chunk_size, + disable_bar=disable_bar, + ) if load_genes: genedata_dict = read_genedata(h5f) - read_genes(pangenome, annotations.genes, genedata_dict, - all([load_organisms, load_contigs]), chunk_size=chunk_size, disable_bar=disable_bar) + read_genes( + pangenome, + annotations.genes, + genedata_dict, + all([load_organisms, load_contigs]), + chunk_size=chunk_size, + disable_bar=disable_bar, + ) if load_rnas: - read_rnas(pangenome, annotations.RNAs, read_genedata(h5f) if genedata_dict is None else genedata_dict, - all([load_organisms, load_contigs]), chunk_size=chunk_size, disable_bar=disable_bar) + read_rnas( + pangenome, + annotations.RNAs, + read_genedata(h5f) if genedata_dict is None else genedata_dict, + all([load_organisms, load_contigs]), + chunk_size=chunk_size, + disable_bar=disable_bar, + ) pangenome.status["genomesAnnotated"] = "Loaded" @@ -952,60 +1260,70 @@ def create_info_dict(info_group: tables.group.Group): """ attributes = info_group._v_attrs._f_list() - info_dict = {"Genes": int(info_group._v_attrs['numberOfGenes'])} + info_dict = {"Genes": int(info_group._v_attrs["numberOfGenes"])} if "numberOfGenomes" in attributes: - info_dict["Genomes"] = int(info_group._v_attrs['numberOfGenomes']) + info_dict["Genomes"] = int(info_group._v_attrs["numberOfGenomes"]) if "numberOfClusters" in attributes: - info_dict["Families"] = int(info_group._v_attrs['numberOfClusters']) + info_dict["Families"] = int(info_group._v_attrs["numberOfClusters"]) if "numberOfEdges" in attributes: - info_dict["Edges"] = int(info_group._v_attrs['numberOfEdges']) + info_dict["Edges"] = int(info_group._v_attrs["numberOfEdges"]) - if 'numberOfCloud' in attributes: # then all the others are there + if "numberOfCloud" in attributes: # then all the others are there - persistent_stat = {"Family_count": int(info_group._v_attrs['numberOfPersistent'])} - persistent_stat.update(info_group._v_attrs['persistentStats']) + persistent_stat = { + "Family_count": int(info_group._v_attrs["numberOfPersistent"]) + } + persistent_stat.update(info_group._v_attrs["persistentStats"]) info_dict["Persistent"] = persistent_stat - shell_stat = {"Family_count": int(info_group._v_attrs['numberOfShell'])} - shell_stat.update(info_group._v_attrs['shellStats']) + shell_stat = {"Family_count": int(info_group._v_attrs["numberOfShell"])} + shell_stat.update(info_group._v_attrs["shellStats"]) info_dict["Shell"] = shell_stat - cloud_stat = {"Family_count": int(info_group._v_attrs['numberOfCloud'])} - cloud_stat.update(info_group._v_attrs['cloudStats']) + cloud_stat = {"Family_count": int(info_group._v_attrs["numberOfCloud"])} + cloud_stat.update(info_group._v_attrs["cloudStats"]) info_dict["Cloud"] = cloud_stat - info_dict["Number_of_partitions"] = int(info_group._v_attrs['numberOfPartitions']) + info_dict["Number_of_partitions"] = int( + info_group._v_attrs["numberOfPartitions"] + ) - if info_group._v_attrs['numberOfPartitions'] != 3: - subpartition_stat = {f"Shell_{key}": int(val) for key, val in - info_group._v_attrs['numberOfSubpartitions'].items()} + if info_group._v_attrs["numberOfPartitions"] != 3: + subpartition_stat = { + f"Shell_{key}": int(val) + for key, val in info_group._v_attrs["numberOfSubpartitions"].items() + } info_dict.update(subpartition_stat) - if 'genomes_fluidity' in attributes: - info_dict["Genomes_fluidity"] = {key: round(val, 3) for key, val in - info_group._v_attrs['genomes_fluidity'].items()} + if "genomes_fluidity" in attributes: + info_dict["Genomes_fluidity"] = { + key: round(val, 3) + for key, val in info_group._v_attrs["genomes_fluidity"].items() + } - if 'family_fluidity' in attributes: - info_dict["Family_fluidity"] = info_group._v_attrs['family_fluidity'] + if "family_fluidity" in attributes: + info_dict["Family_fluidity"] = info_group._v_attrs["family_fluidity"] - if 'numberOfRGP' in attributes: - info_dict["RGP"] = int(info_group._v_attrs['numberOfRGP']) + if "numberOfRGP" in attributes: + info_dict["RGP"] = int(info_group._v_attrs["numberOfRGP"]) - if 'numberOfSpots' in attributes: - info_dict["Spots"] = int(info_group._v_attrs['numberOfSpots']) + if "numberOfSpots" in attributes: + info_dict["Spots"] = int(info_group._v_attrs["numberOfSpots"]) - if 'numberOfModules' in attributes: + if "numberOfModules" in attributes: info_dict["Modules"] = { - 'Number_of_modules': int(info_group._v_attrs['numberOfModules']), - 'Families_in_Modules': int(info_group._v_attrs['numberOfFamiliesInModules']), - 'Partition_composition': { - "Persistent": info_group._v_attrs['PersistentSpecInModules']['percent'], - "Shell": info_group._v_attrs['ShellSpecInModules']['percent'], - "Cloud": info_group._v_attrs['CloudSpecInModules']['percent'] - } + "Number_of_modules": int(info_group._v_attrs["numberOfModules"]), + "Families_in_Modules": int( + info_group._v_attrs["numberOfFamiliesInModules"] + ), + "Partition_composition": { + "Persistent": info_group._v_attrs["PersistentSpecInModules"]["percent"], + "Shell": info_group._v_attrs["ShellSpecInModules"]["percent"], + "Cloud": info_group._v_attrs["CloudSpecInModules"]["percent"], + }, } return info_dict @@ -1022,8 +1340,13 @@ def read_info(h5f): return {"Content": content} -def read_metadata(pangenome: Pangenome, h5f: tables.File, metatype: str, - sources: Set[str] = None, disable_bar: bool = False): +def read_metadata( + pangenome: Pangenome, + h5f: tables.File, + metatype: str, + sources: Set[str] = None, + disable_bar: bool = False, +): """Read metadata to add them to the pangenome object :param pangenome: Pangenome object @@ -1035,13 +1358,22 @@ def read_metadata(pangenome: Pangenome, h5f: tables.File, metatype: str, metadata_group = h5f.root.metadata._f_get_child(metatype) for source in sources: source_table = metadata_group._f_get_child(source) - for row in tqdm(read_chunks(source_table), total=source_table.nrows, unit='metadata', disable=disable_bar): - meta_dict = {'source': source} + for row in tqdm( + read_chunks(source_table), + total=source_table.nrows, + unit="metadata", + disable=disable_bar, + ): + meta_dict = {"source": source} try: meta_id = int(row["metadata_id"]) except KeyError: meta_id = None - identifier = row["ID"].decode("utf-8") if isinstance(row["ID"], bytes) else int(row["ID"]) + identifier = ( + row["ID"].decode("utf-8") + if isinstance(row["ID"], bytes) + else int(row["ID"]) + ) # else: # identifier = row["name"].decode() if metatype == "families": @@ -1059,12 +1391,25 @@ def read_metadata(pangenome: Pangenome, h5f: tables.File, metatype: str, elif metatype == "contigs": element = pangenome.get_contig(identifier) else: - expected_types = ["families", "genomes", "contigs", "genes", "RGPs", "spots", "modules"] + expected_types = [ + "families", + "genomes", + "contigs", + "genes", + "RGPs", + "spots", + "modules", + ] raise KeyError( - f'The metatype {metatype} is unexpected. Object associated with metadata are {expected_types}') + f"The metatype {metatype} is unexpected. Object associated with metadata are {expected_types}" + ) for field in row.dtype.names: if field not in ["ID", "name"]: - meta_dict[field] = row[field].decode() if isinstance(row[field], bytes) else row[field] + meta_dict[field] = ( + row[field].decode() + if isinstance(row[field], bytes) + else row[field] + ) element.add_metadata(metadata=Metadata(**meta_dict), metadata_id=meta_id) pangenome.status["metadata"][metatype] = "Loaded" @@ -1102,10 +1447,20 @@ def get_pangenome_parameters(h5f: tables.File) -> Dict[str, Dict[str, Any]]: return info_group._v_attrs["parameters"] -def read_pangenome(pangenome, annotation: bool = False, gene_families: bool = False, graph: bool = False, - rgp: bool = False, spots: bool = False, gene_sequences: bool = False, modules: bool = False, - metadata: bool = False, metatypes: Set[str] = None, sources: Set[str] = None, - disable_bar: bool = False): +def read_pangenome( + pangenome, + annotation: bool = False, + gene_families: bool = False, + graph: bool = False, + rgp: bool = False, + spots: bool = False, + gene_sequences: bool = False, + modules: bool = False, + metadata: bool = False, + metatypes: Set[str] = None, + sources: Set[str] = None, + disable_bar: bool = False, +): """ Reads a previously written pangenome, with all of its parts, depending on what is asked, with regard to what is filled in the 'status' field of the hdf5 file. @@ -1124,25 +1479,35 @@ def read_pangenome(pangenome, annotation: bool = False, gene_families: bool = Fa :param disable_bar: Allow to disable the progress bar """ if pangenome.file is None: - raise FileNotFoundError("Your pangenome object has not been associated to any file.") + raise FileNotFoundError( + "Your pangenome object has not been associated to any file." + ) filename = pangenome.file h5f = tables.open_file(filename, "r") - if annotation: # I place annotation here, to link gene to gene families if organism are not loaded + if ( + annotation + ): # I place annotation here, to link gene to gene families if organism are not loaded if h5f.root.status._v_attrs.genomesAnnotated: logging.getLogger("PPanGGOLiN").info("Reading pangenome annotations...") read_annotation(pangenome, h5f, disable_bar=disable_bar) else: - raise Exception(f"The pangenome in file '{filename}' has not been annotated, or has been improperly filled") + raise Exception( + f"The pangenome in file '{filename}' has not been annotated, or has been improperly filled" + ) if gene_sequences: if h5f.root.status._v_attrs.geneSequences: - logging.getLogger("PPanGGOLiN").info("Reading pangenome gene dna sequences...") + logging.getLogger("PPanGGOLiN").info( + "Reading pangenome gene dna sequences..." + ) read_gene_sequences(pangenome, h5f, disable_bar=disable_bar) else: - raise Exception(f"The pangenome in file '{filename}' does not have gene sequences, " - f"or has been improperly filled") + raise Exception( + f"The pangenome in file '{filename}' does not have gene sequences, " + f"or has been improperly filled" + ) if gene_families: if h5f.root.status._v_attrs.genesClustered: @@ -1151,39 +1516,48 @@ def read_pangenome(pangenome, annotation: bool = False, gene_families: bool = Fa read_gene_families_info(pangenome, h5f, disable_bar=disable_bar) else: raise Exception( - f"The pangenome in file '{filename}' does not have gene families, or has been improperly filled") + f"The pangenome in file '{filename}' does not have gene families, or has been improperly filled" + ) if graph: if h5f.root.status._v_attrs.NeighborsGraph: logging.getLogger("PPanGGOLiN").info("Reading the neighbors graph edges...") read_graph(pangenome, h5f, disable_bar=disable_bar) else: - raise Exception(f"The pangenome in file '{filename}' does not have graph information, " - f"or has been improperly filled") + raise Exception( + f"The pangenome in file '{filename}' does not have graph information, " + f"or has been improperly filled" + ) if rgp: if h5f.root.status._v_attrs.predictedRGP: logging.getLogger("PPanGGOLiN").info("Reading the RGP...") read_rgp(pangenome, h5f, disable_bar=disable_bar) else: - raise Exception(f"The pangenome in file '{filename}' does not have RGP information, " - f"or has been improperly filled") + raise Exception( + f"The pangenome in file '{filename}' does not have RGP information, " + f"or has been improperly filled" + ) if spots: if h5f.root.status._v_attrs.spots: logging.getLogger("PPanGGOLiN").info("Reading the spots...") read_spots(pangenome, h5f, disable_bar=disable_bar) else: - raise Exception(f"The pangenome in file '{filename}' does not have spots information, " - f"or has been improperly filled") + raise Exception( + f"The pangenome in file '{filename}' does not have spots information, " + f"or has been improperly filled" + ) if modules: if h5f.root.status._v_attrs.modules: logging.getLogger("PPanGGOLiN").info("Reading the modules...") read_modules(pangenome, h5f, disable_bar=disable_bar) else: - raise Exception(f"The pangenome in file '{filename}' does not have modules information, " - f"or has been improperly filled") + raise Exception( + f"The pangenome in file '{filename}' does not have modules information, " + f"or has been improperly filled" + ) if metadata: for metatype in metatypes: @@ -1195,83 +1569,133 @@ def read_pangenome(pangenome, annotation: bool = False, gene_families: bool = Fa metatype_sources = set(metasources._v_attrs[metatype]) & sources if metastatus._v_attrs[metatype] and len(metatype_sources) > 0: logging.getLogger("PPanGGOLiN").info( - f"Reading the {metatype} metadata from sources {metatype_sources}...") - read_metadata(pangenome, h5f, metatype, metatype_sources, disable_bar=disable_bar) + f"Reading the {metatype} metadata from sources {metatype_sources}..." + ) + read_metadata( + pangenome, + h5f, + metatype, + metatype_sources, + disable_bar=disable_bar, + ) else: - raise KeyError(f"The pangenome in file '{filename}' does not have metadata associated to {metatype}, ") + raise KeyError( + f"The pangenome in file '{filename}' does not have metadata associated to {metatype}, " + ) h5f.close() -def get_need_info(pangenome, need_annotations: bool = False, need_families: bool = False, need_graph: bool = False, - need_partitions: bool = False, need_rgp: bool = False, need_spots: bool = False, - need_gene_sequences: bool = False, need_modules: bool = False, need_metadata: bool = False, - metatypes: Set[str] = None, sources: Set[str] = None): - need_info = {"annotation": False, - "gene_families": False, - "graph": False, - "rgp": False, - "spots": False, - "gene_sequences": False, - "modules": False, - "metadata": False, - "metatypes": metatypes, - "sources": sources} +def get_need_info( + pangenome, + need_annotations: bool = False, + need_families: bool = False, + need_graph: bool = False, + need_partitions: bool = False, + need_rgp: bool = False, + need_spots: bool = False, + need_gene_sequences: bool = False, + need_modules: bool = False, + need_metadata: bool = False, + metatypes: Set[str] = None, + sources: Set[str] = None, +): + need_info = { + "annotation": False, + "gene_families": False, + "graph": False, + "rgp": False, + "spots": False, + "gene_sequences": False, + "modules": False, + "metadata": False, + "metatypes": metatypes, + "sources": sources, + } # TODO Automate call if one need another if need_annotations: if pangenome.status["genomesAnnotated"] == "inFile": need_info["annotation"] = True elif pangenome.status["genomesAnnotated"] not in ["Computed", "Loaded"]: - raise Exception("Your pangenome has no genes. See the 'annotate' subcommand.") + raise Exception( + "Your pangenome has no genes. See the 'annotate' subcommand." + ) if need_families: if pangenome.status["genesClustered"] == "inFile": need_info["gene_families"] = True elif pangenome.status["genesClustered"] not in ["Computed", "Loaded"]: - raise Exception("Your pangenome has no gene families. See the 'cluster' subcommand.") + raise Exception( + "Your pangenome has no gene families. See the 'cluster' subcommand." + ) if need_graph: if pangenome.status["neighborsGraph"] == "inFile": need_info["graph"] = True elif pangenome.status["neighborsGraph"] not in ["Computed", "Loaded"]: - raise Exception("Your pangenome does not have a graph (no edges). See the 'graph' subcommand.") - if need_partitions and pangenome.status["partitioned"] not in ["Computed", "Loaded", "inFile"]: - raise Exception("Your pangenome has not been partitioned. See the 'partition' subcommand") + raise Exception( + "Your pangenome does not have a graph (no edges). See the 'graph' subcommand." + ) + if need_partitions and pangenome.status["partitioned"] not in [ + "Computed", + "Loaded", + "inFile", + ]: + raise Exception( + "Your pangenome has not been partitioned. See the 'partition' subcommand" + ) if need_rgp: if pangenome.status["predictedRGP"] == "inFile": need_info["rgp"] = True elif pangenome.status["predictedRGP"] not in ["Computed", "Loaded"]: raise Exception( - "Your pangenome regions of genomic plasticity have not been predicted. See the 'rgp' subcommand") + "Your pangenome regions of genomic plasticity have not been predicted. See the 'rgp' subcommand" + ) if need_spots: if pangenome.status["spots"] == "inFile": need_info["spots"] = True elif pangenome.status["spots"] not in ["Computed", "Loaded"]: - raise Exception("Your pangenome spots of insertion have not been predicted. See the 'spot' subcommand") + raise Exception( + "Your pangenome spots of insertion have not been predicted. See the 'spot' subcommand" + ) if need_gene_sequences: if pangenome.status["geneSequences"] == "inFile": need_info["gene_sequences"] = True elif pangenome.status["geneSequences"] not in ["Computed", "Loaded"]: - raise Exception("Your pangenome does not include gene sequences. " - "This is possible only if you provided your own cluster file with the 'cluster' subcommand") + raise Exception( + "Your pangenome does not include gene sequences. " + "This is possible only if you provided your own cluster file with the 'cluster' subcommand" + ) if need_modules: if pangenome.status["modules"] == "inFile": need_info["modules"] = True elif pangenome.status["modules"] not in ["Computed", "Loaded"]: - raise Exception("Your pangenome modules have not been predicted. See the 'module' subcommand") + raise Exception( + "Your pangenome modules have not been predicted. See the 'module' subcommand" + ) metatypes_to_load = set() sources_to_load = set() if need_metadata: if metatypes is None: # load all metadata contained in the pangenome - metatypes = [metatype for metatype, status in pangenome.status["metadata"].items() if status == 'inFile'] + metatypes = [ + metatype + for metatype, status in pangenome.status["metadata"].items() + if status == "inFile" + ] else: # check that specified types have metadata associated for metatype in metatypes: - if pangenome.status["metadata"][metatype] not in ["Computed", "Loaded", "inFile"]: - logging.getLogger("PPanGGOLiN").warning("The pangenome does not have any metadata associated " - f"with {metatype}. See the 'metadata' subcommand") + if pangenome.status["metadata"][metatype] not in [ + "Computed", + "Loaded", + "inFile", + ]: + logging.getLogger("PPanGGOLiN").warning( + "The pangenome does not have any metadata associated " + f"with {metatype}. See the 'metadata' subcommand" + ) if sources is None: # load all metadata sources for each metatype @@ -1280,12 +1704,16 @@ def get_need_info(pangenome, need_annotations: bool = False, need_families: bool else: # check that specified source exist for at least one metatype for source in set(sources): - if any(source in pangenome.status["metasources"][metatype] for metatype in metatypes): + if any( + source in pangenome.status["metasources"][metatype] + for metatype in metatypes + ): sources_to_load.add(source) else: logging.getLogger("PPanGGOLiN").warning( f"There is no metadata assigned to any element of the pangenome with " - f"source={source}. This source is ignored") + f"source={source}. This source is ignored" + ) # select only metatypes that have a requested source . for metatype in metatypes: @@ -1294,10 +1722,15 @@ def get_need_info(pangenome, need_annotations: bool = False, need_families: bool else: logging.getLogger("PPanGGOLiN").debug( f"There is no metadata assigned to {metatype} with specified sources:" - f" {', '.join(sources_to_load)} in the pangenome. This metatype is ignored.") + f" {', '.join(sources_to_load)} in the pangenome. This metatype is ignored." + ) if metatypes_to_load and sources_to_load: - logging.getLogger("PPanGGOLiN").debug(f"metadata types to load: {', '.join(metatypes_to_load)}") - logging.getLogger("PPanGGOLiN").debug(f"metadata sources to load: {', '.join(sources_to_load)}") + logging.getLogger("PPanGGOLiN").debug( + f"metadata types to load: {', '.join(metatypes_to_load)}" + ) + logging.getLogger("PPanGGOLiN").debug( + f"metadata sources to load: {', '.join(sources_to_load)}" + ) need_info["metadata"] = True need_info["metatypes"] = metatypes_to_load need_info["sources"] = sources_to_load @@ -1305,11 +1738,21 @@ def get_need_info(pangenome, need_annotations: bool = False, need_families: bool return need_info -def check_pangenome_info(pangenome, need_annotations: bool = False, need_families: bool = False, - need_graph: bool = False, need_partitions: bool = False, need_rgp: bool = False, - need_spots: bool = False, need_gene_sequences: bool = False, need_modules: bool = False, - need_metadata: bool = False, metatypes: Optional[Set[str]] = None, sources: Optional[Set[str]] = None, - disable_bar: bool = False): +def check_pangenome_info( + pangenome, + need_annotations: bool = False, + need_families: bool = False, + need_graph: bool = False, + need_partitions: bool = False, + need_rgp: bool = False, + need_spots: bool = False, + need_gene_sequences: bool = False, + need_modules: bool = False, + need_metadata: bool = False, + metatypes: Optional[Set[str]] = None, + sources: Optional[Set[str]] = None, + disable_bar: bool = False, +): """ Defines what needs to be read depending on what is needed, and automatically checks if the required elements have been computed with regard to the `pangenome.status` @@ -1328,9 +1771,20 @@ def check_pangenome_info(pangenome, need_annotations: bool = False, need_familie :param sources: sources of the metadata to get (None means all possible sources) :param disable_bar: Allow to disable the progress bar """ - need_info = get_need_info(pangenome, need_annotations, need_families, need_graph, need_partitions, - need_rgp, need_spots, need_gene_sequences, need_modules, need_metadata, - metatypes, sources) + need_info = get_need_info( + pangenome, + need_annotations, + need_families, + need_graph, + need_partitions, + need_rgp, + need_spots, + need_gene_sequences, + need_modules, + need_metadata, + metatypes, + sources, + ) if any([v for k, v in need_info.items() if k not in ["metatypes", "sources"]]): # if no flag is true, then nothing is needed. read_pangenome(pangenome, disable_bar=disable_bar, **need_info) diff --git a/ppanggolin/formats/writeAnnotations.py b/ppanggolin/formats/writeAnnotations.py index efdaa204..c98d805f 100644 --- a/ppanggolin/formats/writeAnnotations.py +++ b/ppanggolin/formats/writeAnnotations.py @@ -25,7 +25,13 @@ def get_max_len_annotations(pangenome: Pangenome) -> Tuple[int, int, int, int, i :return: Maximum size of each annotation """ - max_org_len, max_contig_len, max_gene_id_len, max_rna_id_len, max_gene_local_id = 1, 1, 1, 1, 1 + max_org_len, max_contig_len, max_gene_id_len, max_rna_id_len, max_gene_local_id = ( + 1, + 1, + 1, + 1, + 1, + ) for org in pangenome.organisms: if len(org.name) > max_org_len: max_org_len = len(org.name) @@ -41,7 +47,13 @@ def get_max_len_annotations(pangenome: Pangenome) -> Tuple[int, int, int, int, i if len(rna.ID) > max_rna_id_len: max_rna_id_len = len(rna.ID) - return max_org_len, max_contig_len, max_gene_id_len, max_rna_id_len, max_gene_local_id + return ( + max_org_len, + max_contig_len, + max_gene_id_len, + max_rna_id_len, + max_gene_local_id, + ) def organism_desc(org_len: int) -> Dict[str, tables.StringCol]: @@ -52,11 +64,16 @@ def organism_desc(org_len: int) -> Dict[str, tables.StringCol]: :return: Formatted table """ - return {'name': tables.StringCol(itemsize=org_len)} + return {"name": tables.StringCol(itemsize=org_len)} -def write_organisms(pangenome: Pangenome, h5f: tables.File, annotation: tables.Group, - organism_desc: Dict[str, tables.StringCol], disable_bar=False): +def write_organisms( + pangenome: Pangenome, + h5f: tables.File, + annotation: tables.Group, + organism_desc: Dict[str, tables.StringCol], + disable_bar=False, +): """Write organisms information in the pangenome file :param pangenome: Annotated pangenome object @@ -65,17 +82,27 @@ def write_organisms(pangenome: Pangenome, h5f: tables.File, annotation: tables.G :param organism_desc: Organisms table description. :param disable_bar: Allow disabling progress bar """ - organism_table = h5f.create_table(annotation, "genomes", organism_desc, - expectedrows=pangenome.number_of_organisms) - logging.getLogger("PPanGGOLiN").debug(f"Writing {pangenome.number_of_organisms} genomes") + organism_table = h5f.create_table( + annotation, "genomes", organism_desc, expectedrows=pangenome.number_of_organisms + ) + logging.getLogger("PPanGGOLiN").debug( + f"Writing {pangenome.number_of_organisms} genomes" + ) organism_row = organism_table.row - for org in tqdm(pangenome.organisms, total=pangenome.number_of_organisms, unit="genome", disable=disable_bar): + for org in tqdm( + pangenome.organisms, + total=pangenome.number_of_organisms, + unit="genome", + disable=disable_bar, + ): organism_row["name"] = org.name organism_row.append() organism_table.flush() -def contig_desc(contig_len: int, org_len: int) -> Dict[str, Union[tables.StringCol, tables.BoolCol, tables.UInt32Col]]: +def contig_desc( + contig_len: int, org_len: int +) -> Dict[str, Union[tables.StringCol, tables.BoolCol, tables.UInt32Col]]: """Table description to save contig-related information :param contig_len: Maximum size of contig name @@ -83,16 +110,22 @@ def contig_desc(contig_len: int, org_len: int) -> Dict[str, Union[tables.StringC :return: Formatted table """ - return {'ID': tables.UInt32Col(), - 'name': tables.StringCol(itemsize=contig_len), - "is_circular": tables.BoolCol(dflt=False), - 'length': tables.UInt32Col(), - "genome": tables.StringCol(itemsize=org_len)} + return { + "ID": tables.UInt32Col(), + "name": tables.StringCol(itemsize=contig_len), + "is_circular": tables.BoolCol(dflt=False), + "length": tables.UInt32Col(), + "genome": tables.StringCol(itemsize=org_len), + } -def write_contigs(pangenome: Pangenome, h5f: tables.File, annotation: tables.Group, - contig_desc: Dict[str, Union[tables.StringCol, tables.BoolCol, tables.UInt32Col]], - disable_bar=False): +def write_contigs( + pangenome: Pangenome, + h5f: tables.File, + annotation: tables.Group, + contig_desc: Dict[str, Union[tables.StringCol, tables.BoolCol, tables.UInt32Col]], + disable_bar=False, +): """Write contigs information in the pangenome file :param pangenome: Annotated pangenome object :param h5f: Pangenome file @@ -100,10 +133,19 @@ def write_contigs(pangenome: Pangenome, h5f: tables.File, annotation: tables.Gro :param contig_desc: Contigs table description :param disable_bar: Allow disabling progress bar """ - contig_table = h5f.create_table(annotation, "contigs", contig_desc, expectedrows=pangenome.number_of_contigs) - logging.getLogger("PPanGGOLiN").debug(f"Writing {pangenome.number_of_contigs} contigs") + contig_table = h5f.create_table( + annotation, "contigs", contig_desc, expectedrows=pangenome.number_of_contigs + ) + logging.getLogger("PPanGGOLiN").debug( + f"Writing {pangenome.number_of_contigs} contigs" + ) contig_row = contig_table.row - for contig in tqdm(pangenome.contigs, total=pangenome.number_of_contigs, unit="contigs", disable=disable_bar): + for contig in tqdm( + pangenome.contigs, + total=pangenome.number_of_contigs, + unit="contigs", + disable=disable_bar, + ): contig_row["ID"] = contig.ID contig_row["name"] = contig.name contig_row["is_circular"] = contig.is_circular @@ -113,7 +155,9 @@ def write_contigs(pangenome: Pangenome, h5f: tables.File, annotation: tables.Gro contig_table.flush() -def gene_desc(id_len: int, max_local_id: int) -> Dict[str, Union[tables.StringCol, tables.UInt32Col, tables.BoolCol]]: +def gene_desc( + id_len: int, max_local_id: int +) -> Dict[str, Union[tables.StringCol, tables.UInt32Col, tables.BoolCol]]: """Table description to save gene-related information :param id_len: Maximum size of gene name @@ -121,16 +165,22 @@ def gene_desc(id_len: int, max_local_id: int) -> Dict[str, Union[tables.StringCo :return: Formatted table """ - return {'ID': tables.StringCol(itemsize=id_len), - 'genedata_id': tables.UInt32Col(), - 'local': tables.StringCol(itemsize=max_local_id), - 'is_fragment': tables.BoolCol(dflt=False), - 'contig': tables.UInt32Col()} + return { + "ID": tables.StringCol(itemsize=id_len), + "genedata_id": tables.UInt32Col(), + "local": tables.StringCol(itemsize=max_local_id), + "is_fragment": tables.BoolCol(dflt=False), + "contig": tables.UInt32Col(), + } -def write_genes(pangenome: Pangenome, h5f: tables.File, annotation: tables.Group, - gene_desc: Dict[str, Union[tables.StringCol, tables.UInt32Col, tables.BoolCol]], - disable_bar=False) -> Dict[Genedata, int]: +def write_genes( + pangenome: Pangenome, + h5f: tables.File, + annotation: tables.Group, + gene_desc: Dict[str, Union[tables.StringCol, tables.UInt32Col, tables.BoolCol]], + disable_bar=False, +) -> Dict[Genedata, int]: """Write genes information in the pangenome file :param pangenome: Annotated pangenome object @@ -143,10 +193,17 @@ def write_genes(pangenome: Pangenome, h5f: tables.File, annotation: tables.Grou """ global genedata_counter genedata2gene = {} - gene_table = h5f.create_table(annotation, "genes", gene_desc, expectedrows=pangenome.number_of_genes) + gene_table = h5f.create_table( + annotation, "genes", gene_desc, expectedrows=pangenome.number_of_genes + ) logging.getLogger("PPanGGOLiN").debug(f"Writing {pangenome.number_of_genes} genes") gene_row = gene_table.row - for gene in tqdm(pangenome.genes, total=pangenome.number_of_genes, unit="gene", disable=disable_bar): + for gene in tqdm( + pangenome.genes, + total=pangenome.number_of_genes, + unit="gene", + disable=disable_bar, + ): gene_row["ID"] = gene.ID gene_row["is_fragment"] = gene.is_fragment gene_row["local"] = gene.local_identifier @@ -171,14 +228,20 @@ def rna_desc(id_len: int) -> Dict[str, Union[tables.StringCol, tables.UInt32Col] :return: Formatted table """ - return {'ID': tables.StringCol(itemsize=id_len), - 'genedata_id': tables.UInt32Col(), - 'contig': tables.UInt32Col()} + return { + "ID": tables.StringCol(itemsize=id_len), + "genedata_id": tables.UInt32Col(), + "contig": tables.UInt32Col(), + } -def write_rnas(pangenome: Pangenome, h5f: tables.File, annotation: tables.Group, - rna_desc: Dict[str, Union[tables.StringCol, tables.UInt32Col]], - disable_bar=False) -> Dict[Genedata, int]: +def write_rnas( + pangenome: Pangenome, + h5f: tables.File, + annotation: tables.Group, + rna_desc: Dict[str, Union[tables.StringCol, tables.UInt32Col]], + disable_bar=False, +) -> Dict[Genedata, int]: """Write RNAs information in the pangenome file :param pangenome: Annotated pangenome object @@ -191,10 +254,14 @@ def write_rnas(pangenome: Pangenome, h5f: tables.File, annotation: tables.Group """ global genedata_counter genedata2rna = {} - rna_table = h5f.create_table(annotation, "RNAs", rna_desc, expectedrows=pangenome.number_of_genes) + rna_table = h5f.create_table( + annotation, "RNAs", rna_desc, expectedrows=pangenome.number_of_genes + ) logging.getLogger("PPanGGOLiN").debug(f"Writing {pangenome.number_of_genes} genes") rna_row = rna_table.row - for rna in tqdm(pangenome.RNAs, total=pangenome.number_of_rnas, unit="RNA", disable=disable_bar): + for rna in tqdm( + pangenome.RNAs, total=pangenome.number_of_rnas, unit="RNA", disable=disable_bar + ): rna_row["ID"] = rna.ID rna_row["contig"] = rna.contig.ID genedata = get_genedata(rna) @@ -209,7 +276,9 @@ def write_rnas(pangenome: Pangenome, h5f: tables.File, annotation: tables.Group return genedata2rna -def genedata_desc(type_len: int, name_len: int, product_len: int) -> Dict[str, Union[tables.UIntCol, tables.StringCol]]: +def genedata_desc( + type_len: int, name_len: int, product_len: int +) -> Dict[str, Union[tables.UIntCol, tables.StringCol]]: """ Creates a table for gene-related data @@ -219,19 +288,22 @@ def genedata_desc(type_len: int, name_len: int, product_len: int) -> Dict[str, U :return: Formatted table for gene metadata """ return { - 'genedata_id': tables.UInt32Col(), - 'start': tables.UInt32Col(), - 'stop': tables.UInt32Col(), - 'strand': tables.StringCol(itemsize=1), - 'gene_type': tables.StringCol(itemsize=type_len), - 'position': tables.UInt32Col(), - 'name': tables.StringCol(itemsize=name_len), - 'product': tables.StringCol(itemsize=product_len), - 'genetic_code': tables.UInt32Col(dflt=11), - 'has_joined_coordinates':tables.BoolCol(dflt=False), + "genedata_id": tables.UInt32Col(), + "start": tables.UInt32Col(), + "stop": tables.UInt32Col(), + "strand": tables.StringCol(itemsize=1), + "gene_type": tables.StringCol(itemsize=type_len), + "position": tables.UInt32Col(), + "name": tables.StringCol(itemsize=name_len), + "product": tables.StringCol(itemsize=product_len), + "genetic_code": tables.UInt32Col(dflt=11), + "has_joined_coordinates": tables.BoolCol(dflt=False), } -def gene_joined_coordinates_desc() -> Dict[str, Union[tables.UIntCol, tables.StringCol]]: + +def gene_joined_coordinates_desc() -> ( + Dict[str, Union[tables.UIntCol, tables.StringCol]] +): """ Creates a table for gene-related data @@ -241,12 +313,13 @@ def gene_joined_coordinates_desc() -> Dict[str, Union[tables.UIntCol, tables.Str :return: Formatted table for gene metadata """ return { - 'genedata_id': tables.UInt32Col(), - 'start': tables.UInt32Col(), - 'stop': tables.UInt32Col(), - 'coordinate_rank': tables.UInt32Col(), + "genedata_id": tables.UInt32Col(), + "start": tables.UInt32Col(), + "stop": tables.UInt32Col(), + "coordinate_rank": tables.UInt32Col(), } + def get_max_len_genedata(pangenome: Pangenome) -> Tuple[int, int, int]: """ Get the maximum size of each gene data information to optimize disk space @@ -290,10 +363,22 @@ def get_genedata(feature: Union[Gene, RNA]) -> Genedata: if isinstance(feature, Gene): position = feature.position genetic_code = feature.genetic_code - return Genedata(feature.start, feature.stop, feature.strand, feature.type, position, feature.name, - feature.product, genetic_code, coordinates = feature.coordinates) - -def write_gene_joined_coordinates(h5f, annotation, genes_with_joined_coordinates_2_id, disable_bar): + return Genedata( + feature.start, + feature.stop, + feature.strand, + feature.type, + position, + feature.name, + feature.product, + genetic_code, + coordinates=feature.coordinates, + ) + + +def write_gene_joined_coordinates( + h5f, annotation, genes_with_joined_coordinates_2_id, disable_bar +): """Writing genedata information in pangenome file :param h5f: Pangenome file @@ -301,34 +386,48 @@ def write_gene_joined_coordinates(h5f, annotation, genes_with_joined_coordinates :param genedata2gene: Dictionary linking genedata to gene identifier. :param disable_bar: Allow disabling progress bar """ - number_of_gene_pieces = sum([len(gene.coordinates) for gene in genes_with_joined_coordinates_2_id]) + number_of_gene_pieces = sum( + [len(gene.coordinates) for gene in genes_with_joined_coordinates_2_id] + ) try: joined_coordinates_tables = annotation.joinedCoordinates except tables.exceptions.NoSuchNodeError: - joined_coordinates_tables = h5f.create_table(annotation, "joinedCoordinates", gene_joined_coordinates_desc(), - expectedrows=number_of_gene_pieces) - - - logging.getLogger("PPanGGOLiN").debug(f"Writing {number_of_gene_pieces} piece of genes from " - f"{len(genes_with_joined_coordinates_2_id)} genes that have joined coordinates ") + joined_coordinates_tables = h5f.create_table( + annotation, + "joinedCoordinates", + gene_joined_coordinates_desc(), + expectedrows=number_of_gene_pieces, + ) + + logging.getLogger("PPanGGOLiN").debug( + f"Writing {number_of_gene_pieces} piece of genes from " + f"{len(genes_with_joined_coordinates_2_id)} genes that have joined coordinates " + ) genedata_row = joined_coordinates_tables.row - for genedata, genedata_id in tqdm(genes_with_joined_coordinates_2_id.items(), unit="genedata", disable=disable_bar): + for genedata, genedata_id in tqdm( + genes_with_joined_coordinates_2_id.items(), unit="genedata", disable=disable_bar + ): for index, (start, stop) in enumerate(genedata.coordinates): genedata_row["genedata_id"] = genedata_id genedata_row["start"] = start genedata_row["stop"] = stop - genedata_row['coordinate_rank'] = index + genedata_row["coordinate_rank"] = index genedata_row.append() joined_coordinates_tables.flush() -def write_genedata(pangenome: Pangenome, h5f: tables.File, annotation: tables.Group, - genedata2gene: Dict[Genedata, int], disable_bar=False): +def write_genedata( + pangenome: Pangenome, + h5f: tables.File, + annotation: tables.Group, + genedata2gene: Dict[Genedata, int], + disable_bar=False, +): """Writing genedata information in pangenome file :param pangenome: Pangenome object filled with annotation. @@ -340,13 +439,21 @@ def write_genedata(pangenome: Pangenome, h5f: tables.File, annotation: tables.G try: genedata_table = annotation.genedata except tables.exceptions.NoSuchNodeError: - genedata_table = h5f.create_table(annotation, "genedata", genedata_desc(*get_max_len_genedata(pangenome)), - expectedrows=len(genedata2gene)) - - logging.getLogger("PPanGGOLiN").debug(f"Writing {len(genedata2gene)} gene-related data " - "(can be lower than the number of genes)") + genedata_table = h5f.create_table( + annotation, + "genedata", + genedata_desc(*get_max_len_genedata(pangenome)), + expectedrows=len(genedata2gene), + ) + + logging.getLogger("PPanGGOLiN").debug( + f"Writing {len(genedata2gene)} gene-related data " + "(can be lower than the number of genes)" + ) genedata_row = genedata_table.row - for genedata, genedata_id in tqdm(genedata2gene.items(), unit="genedata", disable=disable_bar): + for genedata, genedata_id in tqdm( + genedata2gene.items(), unit="genedata", disable=disable_bar + ): genedata_row["genedata_id"] = genedata_id genedata_row["start"] = genedata.start genedata_row["stop"] = genedata.stop @@ -366,8 +473,15 @@ def write_genedata(pangenome: Pangenome, h5f: tables.File, annotation: tables.G genedata_table.flush() -def write_annotations(pangenome: Pangenome, h5f: tables.File, rec_organisms: bool = True, rec_contigs: bool = True, - rec_genes: bool = True, rec_rnas: bool = True, disable_bar: bool = False): +def write_annotations( + pangenome: Pangenome, + h5f: tables.File, + rec_organisms: bool = True, + rec_contigs: bool = True, + rec_genes: bool = True, + rec_rnas: bool = True, + disable_bar: bool = False, +): """Function writing all the pangenome annotations :param pangenome: Annotated pangenome @@ -378,9 +492,13 @@ def write_annotations(pangenome: Pangenome, h5f: tables.File, rec_organisms: boo :param rec_rnas: Allow writing RNAs in pangenomes :param disable_bar: Allow to disable progress bar """ - annotation = h5f.create_group("/", "annotations", "Annotations of the pangenome organisms") + annotation = h5f.create_group( + "/", "annotations", "Annotations of the pangenome organisms" + ) - org_len, contig_len, gene_id_len, rna_id_len, gene_local_id = get_max_len_annotations(pangenome) + org_len, contig_len, gene_id_len, rna_id_len, gene_local_id = ( + get_max_len_annotations(pangenome) + ) # I add these boolean in case we would one day only load organism, contig or genes, without the other. @@ -400,10 +518,23 @@ def write_annotations(pangenome: Pangenome, h5f: tables.File, rec_organisms: boo genedata2rna = write_rnas(pangenome, h5f, annotation, desc, disable_bar) write_genedata(pangenome, h5f, annotation, genedata2rna, disable_bar) - genes_with_joined_coordinates_2_id = {gene : gene_id for gene, gene_id in genedata2gene.items() if gene.has_joined_coordinates} - genes_with_joined_coordinates_2_id.update({gene : gene_id for gene, gene_id in genedata2rna.items() if gene.has_joined_coordinates}) + genes_with_joined_coordinates_2_id = { + gene: gene_id + for gene, gene_id in genedata2gene.items() + if gene.has_joined_coordinates + } + genes_with_joined_coordinates_2_id.update( + { + gene: gene_id + for gene, gene_id in genedata2rna.items() + if gene.has_joined_coordinates + } + ) + + write_gene_joined_coordinates( + h5f, annotation, genes_with_joined_coordinates_2_id, disable_bar + ) - write_gene_joined_coordinates(h5f, annotation, genes_with_joined_coordinates_2_id, disable_bar) def get_gene_sequences_len(pangenome: Pangenome) -> Tuple[int, int]: """ @@ -421,7 +552,9 @@ def get_gene_sequences_len(pangenome: Pangenome) -> Tuple[int, int]: return max_gene_id_len, max_gene_type -def gene_sequences_desc(gene_id_len: int, gene_type_len: int) -> Dict[str, Union[tables.UIntCol, tables.StringCol]]: +def gene_sequences_desc( + gene_id_len: int, gene_type_len: int +) -> Dict[str, Union[tables.UIntCol, tables.StringCol]]: """ Create table to save gene sequences @@ -433,7 +566,7 @@ def gene_sequences_desc(gene_id_len: int, gene_type_len: int) -> Dict[str, Union return { "gene": tables.StringCol(itemsize=gene_id_len), "seqid": tables.UInt32Col(), - "type": tables.StringCol(itemsize=gene_type_len) + "type": tables.StringCol(itemsize=gene_type_len), } @@ -450,33 +583,42 @@ def get_sequence_len(pangenome: Pangenome) -> int: return max_seq_len -def sequence_desc(max_seq_len: int) -> Dict[str, Union[tables.UIntCol, tables.StringCol]]: +def sequence_desc( + max_seq_len: int, +) -> Dict[str, Union[tables.UIntCol, tables.StringCol]]: """ Table description to save sequences :param max_seq_len: Maximum size of gene type :return: Formatted table """ - return { - "seqid": tables.UInt32Col(), - "dna": tables.StringCol(itemsize=max_seq_len) - } + return {"seqid": tables.UInt32Col(), "dna": tables.StringCol(itemsize=max_seq_len)} -def write_gene_sequences(pangenome: Pangenome, h5f: tables.File, disable_bar: bool = False): +def write_gene_sequences( + pangenome: Pangenome, h5f: tables.File, disable_bar: bool = False +): """ Function writing all the pangenome gene sequences :param pangenome: Pangenome with gene sequences :param h5f: Pangenome HDF5 file without sequences :param disable_bar: Disable progress bar """ - gene_seq = h5f.create_table("/annotations", "geneSequences", gene_sequences_desc(*get_gene_sequences_len(pangenome)), - expectedrows=pangenome.number_of_genes) + gene_seq = h5f.create_table( + "/annotations", + "geneSequences", + gene_sequences_desc(*get_gene_sequences_len(pangenome)), + expectedrows=pangenome.number_of_genes, + ) # process sequences to save them only once seq2seqid = {} id_counter = 0 gene_row = gene_seq.row - for gene in tqdm(sorted(pangenome.genes, key=lambda x: x.ID), total=pangenome.number_of_genes, unit="gene", - disable=disable_bar): + for gene in tqdm( + sorted(pangenome.genes, key=lambda x: x.ID), + total=pangenome.number_of_genes, + unit="gene", + disable=disable_bar, + ): curr_seq_id = seq2seqid.get(gene.dna) if curr_seq_id is None: curr_seq_id = id_counter @@ -488,8 +630,12 @@ def write_gene_sequences(pangenome: Pangenome, h5f: tables.File, disable_bar: bo gene_row.append() gene_seq.flush() - seq_table = h5f.create_table("/annotations", "sequences", sequence_desc(get_sequence_len(pangenome)), - expectedrows=len(seq2seqid)) + seq_table = h5f.create_table( + "/annotations", + "sequences", + sequence_desc(get_sequence_len(pangenome)), + expectedrows=len(seq2seqid), + ) seq_row = seq_table.row for seq, seqid in seq2seqid.items(): diff --git a/ppanggolin/formats/writeBinaries.py b/ppanggolin/formats/writeBinaries.py index d682a201..17ba76ab 100644 --- a/ppanggolin/formats/writeBinaries.py +++ b/ppanggolin/formats/writeBinaries.py @@ -15,14 +15,17 @@ # local libraries from ppanggolin.pangenome import Pangenome from ppanggolin.formats.writeAnnotations import write_annotations, write_gene_sequences -from ppanggolin.formats.writeMetadata import write_metadata, erase_metadata, write_metadata_status +from ppanggolin.formats.writeMetadata import ( + write_metadata, + erase_metadata, + write_metadata_status, +) from ppanggolin.genome import Feature, Gene from ppanggolin.formats.readBinaries import read_genedata, Genedata - def getmean(arg: iter) -> float: - """ Compute the mean of arguments if exist 0 else + """Compute the mean of arguments if exist 0 else :param arg: list of values @@ -30,8 +33,9 @@ def getmean(arg: iter) -> float: """ return 0 if len(arg) == 0 else round(statistics.mean(arg), 2) + def getstdev(arg: iter) -> float: - """ Compute the standard deviation of arguments if exist 0 else + """Compute the standard deviation of arguments if exist 0 else :param arg: list of values @@ -39,8 +43,9 @@ def getstdev(arg: iter) -> float: """ return 0 if len(arg) <= 1 else round(statistics.stdev(arg), 2) + def getmax(arg: iter) -> float: - """ Get the maximum of arguments if exist 0 else + """Get the maximum of arguments if exist 0 else :param arg: list of values @@ -48,8 +53,9 @@ def getmax(arg: iter) -> float: """ return 0 if len(arg) == 0 else round(max(arg), 2) + def getmin(arg: iter) -> float: - """ Get the minimum of arguments if exist 0 else + """Get the minimum of arguments if exist 0 else :param arg: list of values @@ -57,7 +63,10 @@ def getmin(arg: iter) -> float: """ return 0 if len(arg) == 0 else round(min(arg), 2) -def gene_fam_desc(max_name_len: int, max_sequence_length: int, max_part_len: int) -> dict: + +def gene_fam_desc( + max_name_len: int, max_sequence_length: int, max_part_len: int +) -> dict: """ Create a formatted table for gene families description @@ -70,7 +79,7 @@ def gene_fam_desc(max_name_len: int, max_sequence_length: int, max_part_len: int return { "name": tables.StringCol(itemsize=max_name_len), "protein": tables.StringCol(itemsize=max_sequence_length), - "partition": tables.StringCol(itemsize=max_part_len) + "partition": tables.StringCol(itemsize=max_part_len), } @@ -95,7 +104,12 @@ def get_gene_fam_len(pangenome: Pangenome) -> Tuple[int, int, int]: return max_gene_fam_name_len, max_gene_fam_seq_len, max_part_len -def write_gene_fam_info(pangenome: Pangenome, h5f: tables.File, force: bool = False, disable_bar: bool = False): +def write_gene_fam_info( + pangenome: Pangenome, + h5f: tables.File, + force: bool = False, + disable_bar: bool = False, +): """ Writing a table containing the protein sequences of each family @@ -104,15 +118,27 @@ def write_gene_fam_info(pangenome: Pangenome, h5f: tables.File, force: bool = Fa :param force: force to write information if precedent information exist :param disable_bar: Disable progress bar """ - if '/geneFamiliesInfo' in h5f and force is True: - logging.getLogger("PPanGGOLiN").info("Erasing the formerly computed gene family representative sequences...") - h5f.remove_node('/', 'geneFamiliesInfo') # erasing the table, and rewriting a new one. - gene_fam_seq = h5f.create_table("/", "geneFamiliesInfo", gene_fam_desc(*get_gene_fam_len(pangenome)), - expectedrows=pangenome.number_of_gene_families) + if "/geneFamiliesInfo" in h5f and force is True: + logging.getLogger("PPanGGOLiN").info( + "Erasing the formerly computed gene family representative sequences..." + ) + h5f.remove_node( + "/", "geneFamiliesInfo" + ) # erasing the table, and rewriting a new one. + gene_fam_seq = h5f.create_table( + "/", + "geneFamiliesInfo", + gene_fam_desc(*get_gene_fam_len(pangenome)), + expectedrows=pangenome.number_of_gene_families, + ) row = gene_fam_seq.row - for fam in tqdm(pangenome.gene_families, total=pangenome.number_of_gene_families, - unit="gene family", disable=disable_bar): + for fam in tqdm( + pangenome.gene_families, + total=pangenome.number_of_gene_families, + unit="gene family", + disable=disable_bar, + ): row["name"] = fam.name row["protein"] = fam.sequence row["partition"] = fam.partition @@ -131,7 +157,7 @@ def gene_to_fam_desc(gene_fam_name_len: int, gene_id_len: int) -> dict: """ return { "geneFam": tables.StringCol(itemsize=gene_fam_name_len), - "gene": tables.StringCol(itemsize=gene_id_len) + "gene": tables.StringCol(itemsize=gene_id_len), } @@ -154,7 +180,12 @@ def get_gene_to_fam_len(pangenome: Pangenome): return max_gene_fam_name, max_gene_id -def write_gene_families(pangenome: Pangenome, h5f: tables.File, force: bool = False, disable_bar: bool = False): +def write_gene_families( + pangenome: Pangenome, + h5f: tables.File, + force: bool = False, + disable_bar: bool = False, +): """ Function writing all the pangenome gene families @@ -163,13 +194,23 @@ def write_gene_families(pangenome: Pangenome, h5f: tables.File, force: bool = Fa :param force: Force to write gene families in hdf5 file if there is already gene families :param disable_bar: Disable progress bar """ - if '/geneFamilies' in h5f and force is True: - logging.getLogger("PPanGGOLiN").info("Erasing the formerly computed gene family to gene associations...") - h5f.remove_node('/', 'geneFamilies') # erasing the table, and rewriting a new one. - gene_families = h5f.create_table("/", "geneFamilies", gene_to_fam_desc(*get_gene_to_fam_len(pangenome))) + if "/geneFamilies" in h5f and force is True: + logging.getLogger("PPanGGOLiN").info( + "Erasing the formerly computed gene family to gene associations..." + ) + h5f.remove_node( + "/", "geneFamilies" + ) # erasing the table, and rewriting a new one. + gene_families = h5f.create_table( + "/", "geneFamilies", gene_to_fam_desc(*get_gene_to_fam_len(pangenome)) + ) gene_row = gene_families.row - for family in tqdm(pangenome.gene_families, total=pangenome.number_of_gene_families, unit="gene family", - disable=disable_bar): + for family in tqdm( + pangenome.gene_families, + total=pangenome.number_of_gene_families, + unit="gene family", + disable=disable_bar, + ): for gene in family.genes: gene_row["gene"] = gene.ID gene_row["geneFam"] = family.name @@ -186,8 +227,8 @@ def graph_desc(max_gene_id_len): :return: formatted table """ return { - 'geneTarget': tables.StringCol(itemsize=max_gene_id_len), - 'geneSource': tables.StringCol(itemsize=max_gene_id_len) + "geneTarget": tables.StringCol(itemsize=max_gene_id_len), + "geneSource": tables.StringCol(itemsize=max_gene_id_len), } @@ -206,7 +247,12 @@ def get_gene_id_len(pangenome: Pangenome) -> int: return max_gene_len -def write_graph(pangenome: Pangenome, h5f: tables.File, force: bool = False, disable_bar: bool = False): +def write_graph( + pangenome: Pangenome, + h5f: tables.File, + force: bool = False, + disable_bar: bool = False, +): """ Function writing the pangenome graph @@ -218,13 +264,22 @@ def write_graph(pangenome: Pangenome, h5f: tables.File, force: bool = False, dis # TODO if we want to be able to read the graph without reading the annotations (because it's one of the most time # consumming parts to read), it might be good to add the organism name in the table here. # for now, forcing the read of annotations. - if '/edges' in h5f and force is True: + if "/edges" in h5f and force is True: logging.getLogger("PPanGGOLiN").info("Erasing the formerly computed edges") h5f.remove_node("/", "edges") - edge_table = h5f.create_table("/", "edges", graph_desc(get_gene_id_len(pangenome)), - expectedrows=pangenome.number_of_edges) + edge_table = h5f.create_table( + "/", + "edges", + graph_desc(get_gene_id_len(pangenome)), + expectedrows=pangenome.number_of_edges, + ) edge_row = edge_table.row - for edge in tqdm(pangenome.edges, total=pangenome.number_of_edges, unit="edge", disable=disable_bar): + for edge in tqdm( + pangenome.edges, + total=pangenome.number_of_edges, + unit="edge", + disable=disable_bar, + ): for gene1, gene2 in edge.gene_pairs: edge_row["geneTarget"] = gene1.ID edge_row["geneSource"] = gene2.ID @@ -242,8 +297,8 @@ def rgp_desc(max_rgp_len, max_gene_len): :return: formatted table """ return { - 'RGP': tables.StringCol(itemsize=max_rgp_len), - 'gene': tables.StringCol(itemsize=max_gene_len) + "RGP": tables.StringCol(itemsize=max_rgp_len), + "gene": tables.StringCol(itemsize=max_gene_len), } @@ -266,7 +321,12 @@ def get_rgp_len(pangenome: Pangenome) -> Tuple[int, int]: return max_rgp_len, max_gene_len -def write_rgp(pangenome: Pangenome, h5f: tables.File, force: bool = False, disable_bar: bool = False): +def write_rgp( + pangenome: Pangenome, + h5f: tables.File, + force: bool = False, + disable_bar: bool = False, +): """ Function writing all the region of genomic plasticity in pangenome @@ -275,14 +335,23 @@ def write_rgp(pangenome: Pangenome, h5f: tables.File, force: bool = False, disab :param force: Force to write gene families in hdf5 file if there is already RGP :param disable_bar: Disable progress bar """ - if '/RGP' in h5f and force is True: + if "/RGP" in h5f and force is True: logging.getLogger("PPanGGOLiN").info("Erasing the formerly computer RGP") - h5f.remove_node('/', 'RGP') - - rgp_table = h5f.create_table('/', 'RGP', rgp_desc(*get_rgp_len(pangenome)), - expectedrows=sum([len(region) for region in pangenome.regions])) + h5f.remove_node("/", "RGP") + + rgp_table = h5f.create_table( + "/", + "RGP", + rgp_desc(*get_rgp_len(pangenome)), + expectedrows=sum([len(region) for region in pangenome.regions]), + ) rgp_row = rgp_table.row - for region in tqdm(pangenome.regions, total=pangenome.number_of_rgp, unit="region", disable=disable_bar): + for region in tqdm( + pangenome.regions, + total=pangenome.number_of_rgp, + unit="region", + disable=disable_bar, + ): for gene in region.genes: rgp_row["RGP"] = region.name rgp_row["gene"] = gene.ID @@ -298,10 +367,7 @@ def spot_desc(max_rgp_len): :return: formatted table """ - return { - 'spot': tables.UInt32Col(), - 'RGP': tables.StringCol(itemsize=max_rgp_len) - } + return {"spot": tables.UInt32Col(), "RGP": tables.StringCol(itemsize=max_rgp_len)} def get_spot_desc(pangenome: Pangenome) -> int: @@ -320,7 +386,12 @@ def get_spot_desc(pangenome: Pangenome) -> int: return max_rgp_len -def write_spots(pangenome: Pangenome, h5f: tables.File, force: bool = False, disable_bar: bool = False): +def write_spots( + pangenome: Pangenome, + h5f: tables.File, + force: bool = False, + disable_bar: bool = False, +): """ Function writing all the pangenome hotspot @@ -329,14 +400,23 @@ def write_spots(pangenome: Pangenome, h5f: tables.File, force: bool = False, dis :param force: Force to write gene families in hdf5 file if there is already spot :param disable_bar: Disable progress bar """ - if '/spots' in h5f and force is True: + if "/spots" in h5f and force is True: logging.getLogger("PPanGGOLiN").info("Erasing the formerly computed spots") h5f.remove_node("/", "spots") - spot_table = h5f.create_table("/", "spots", spot_desc(get_spot_desc(pangenome)), - expectedrows=sum([len(spot) for spot in pangenome.spots])) + spot_table = h5f.create_table( + "/", + "spots", + spot_desc(get_spot_desc(pangenome)), + expectedrows=sum([len(spot) for spot in pangenome.spots]), + ) spot_row = spot_table.row - for spot in tqdm(pangenome.spots, total=pangenome.number_of_spots, unit="spot", disable=disable_bar): + for spot in tqdm( + pangenome.spots, + total=pangenome.number_of_spots, + unit="spot", + disable=disable_bar, + ): for region in spot.regions: spot_row["spot"] = spot.ID spot_row["RGP"] = region.name @@ -374,7 +454,12 @@ def get_mod_desc(pangenome: Pangenome) -> int: return max_fam_len -def write_modules(pangenome: Pangenome, h5f: tables.File, force: bool = False, disable_bar: bool = False): +def write_modules( + pangenome: Pangenome, + h5f: tables.File, + force: bool = False, + disable_bar: bool = False, +): """ Function writing all the pangenome modules @@ -383,15 +468,24 @@ def write_modules(pangenome: Pangenome, h5f: tables.File, force: bool = False, d :param force: Force to write gene families in hdf5 file if there is already spot :param disable_bar: Disable progress bar """ - if '/modules' in h5f and force is True: + if "/modules" in h5f and force is True: logging.getLogger("PPanGGOLiN").info("Erasing the formerly computed modules") h5f.remove_node("/", "modules") - mod_table = h5f.create_table('/', 'modules', mod_desc(get_mod_desc(pangenome)), - expectedrows=sum([len(mod) for mod in pangenome.modules])) + mod_table = h5f.create_table( + "/", + "modules", + mod_desc(get_mod_desc(pangenome)), + expectedrows=sum([len(mod) for mod in pangenome.modules]), + ) mod_row = mod_table.row - for mod in tqdm(pangenome.modules, total=pangenome.number_of_modules, unit="modules", disable=disable_bar): + for mod in tqdm( + pangenome.modules, + total=pangenome.number_of_modules, + unit="modules", + disable=disable_bar, + ): for fam in mod.families: mod_row["geneFam"] = fam.name mod_row["module"] = mod.ID @@ -400,6 +494,7 @@ def write_modules(pangenome: Pangenome, h5f: tables.File, force: bool = False, d write_info_modules(pangenome, h5f) + def write_status(pangenome: Pangenome, h5f: tables.File): """ Write pangenome status in HDF5 file @@ -410,26 +505,57 @@ def write_status(pangenome: Pangenome, h5f: tables.File): if "/status" in h5f: # if statuses are already written status_group = h5f.root.status else: # else create the status group. - status_group = h5f.create_group("/", "status", "Statuses of the pangenome content") - status_group._v_attrs.genomesAnnotated = True if pangenome.status["genomesAnnotated"] in ["Computed", "Loaded", - "inFile"] else False - status_group._v_attrs.geneSequences = True if pangenome.status["geneSequences"] in ["Computed", "Loaded", - "inFile"] else False - status_group._v_attrs.genesClustered = True if pangenome.status["genesClustered"] in ["Computed", "Loaded", - "inFile"] else False - status_group._v_attrs.geneFamilySequences = True if pangenome.status["geneFamilySequences"] in ["Computed", - "Loaded", - "inFile"] else False - status_group._v_attrs.NeighborsGraph = True if pangenome.status["neighborsGraph"] in ["Computed", "Loaded", - "inFile"] else False - status_group._v_attrs.Partitioned = True if pangenome.status["partitioned"] in ["Computed", "Loaded", - "inFile"] else False - status_group._v_attrs.defragmented = True if pangenome.status["defragmented"] in ["Computed", "Loaded", - "inFile"] else False - status_group._v_attrs.predictedRGP = True if pangenome.status["predictedRGP"] in ["Computed", "Loaded", - "inFile"] else False - status_group._v_attrs.spots = True if pangenome.status["spots"] in ["Computed", "Loaded", "inFile"] else False - status_group._v_attrs.modules = True if pangenome.status["modules"] in ["Computed", "Loaded", "inFile"] else False + status_group = h5f.create_group( + "/", "status", "Statuses of the pangenome content" + ) + status_group._v_attrs.genomesAnnotated = ( + True + if pangenome.status["genomesAnnotated"] in ["Computed", "Loaded", "inFile"] + else False + ) + status_group._v_attrs.geneSequences = ( + True + if pangenome.status["geneSequences"] in ["Computed", "Loaded", "inFile"] + else False + ) + status_group._v_attrs.genesClustered = ( + True + if pangenome.status["genesClustered"] in ["Computed", "Loaded", "inFile"] + else False + ) + status_group._v_attrs.geneFamilySequences = ( + True + if pangenome.status["geneFamilySequences"] in ["Computed", "Loaded", "inFile"] + else False + ) + status_group._v_attrs.NeighborsGraph = ( + True + if pangenome.status["neighborsGraph"] in ["Computed", "Loaded", "inFile"] + else False + ) + status_group._v_attrs.Partitioned = ( + True + if pangenome.status["partitioned"] in ["Computed", "Loaded", "inFile"] + else False + ) + status_group._v_attrs.defragmented = ( + True + if pangenome.status["defragmented"] in ["Computed", "Loaded", "inFile"] + else False + ) + status_group._v_attrs.predictedRGP = ( + True + if pangenome.status["predictedRGP"] in ["Computed", "Loaded", "inFile"] + else False + ) + status_group._v_attrs.spots = ( + True if pangenome.status["spots"] in ["Computed", "Loaded", "inFile"] else False + ) + status_group._v_attrs.modules = ( + True + if pangenome.status["modules"] in ["Computed", "Loaded", "inFile"] + else False + ) status_group._v_attrs.metadata = write_metadata_status(pangenome, h5f, status_group) status_group._v_attrs.version = distribution("ppanggolin").version @@ -445,7 +571,9 @@ def write_info(pangenome: Pangenome, h5f: tables.File): if "/info" in h5f: info_group = h5f.root.info else: - info_group = h5f.create_group("/", "info", "Information about the pangenome content") + info_group = h5f.create_group( + "/", "info", "Information about the pangenome content" + ) if pangenome.status["genomesAnnotated"] in ["Computed", "Loaded"]: info_group._v_attrs.numberOfGenes = pangenome.number_of_genes info_group._v_attrs.numberOfGenomes = pangenome.number_of_organisms @@ -460,29 +588,37 @@ def write_info(pangenome: Pangenome, h5f: tables.File): part_set = set() for fam in pangenome.gene_families: named_part_counter[fam.named_partition] += 1 - part_distribs[fam.named_partition].append(fam.number_of_organisms / pangenome.number_of_organisms) + part_distribs[fam.named_partition].append( + fam.number_of_organisms / pangenome.number_of_organisms + ) if fam.named_partition == "shell": subpart_counter[fam.partition] += 1 if fam.partition != "S_": part_set.add(fam.partition) info_group._v_attrs.numberOfPersistent = named_part_counter["persistent"] - info_group._v_attrs.persistentStats = {"min_genomes_frequency": getmin(part_distribs["persistent"]), - "max_genomes_frequency": getmax(part_distribs["persistent"]), - "sd_genomes_frequency": getstdev(part_distribs["persistent"]), - "mean_genomes_frequency": getmean(part_distribs["persistent"])} + info_group._v_attrs.persistentStats = { + "min_genomes_frequency": getmin(part_distribs["persistent"]), + "max_genomes_frequency": getmax(part_distribs["persistent"]), + "sd_genomes_frequency": getstdev(part_distribs["persistent"]), + "mean_genomes_frequency": getmean(part_distribs["persistent"]), + } info_group._v_attrs.numberOfShell = named_part_counter["shell"] - info_group._v_attrs.shellStats = {"min_genomes_frequency": getmin(part_distribs["shell"]), - "max_genomes_frequency": getmax(part_distribs["shell"]), - "sd_genomes_frequency": getstdev(part_distribs["shell"]), - "mean_genomes_frequency": getmean(part_distribs["shell"])} + info_group._v_attrs.shellStats = { + "min_genomes_frequency": getmin(part_distribs["shell"]), + "max_genomes_frequency": getmax(part_distribs["shell"]), + "sd_genomes_frequency": getstdev(part_distribs["shell"]), + "mean_genomes_frequency": getmean(part_distribs["shell"]), + } info_group._v_attrs.numberOfCloud = named_part_counter["cloud"] - info_group._v_attrs.cloudStats = {"min_genomes_frequency": getmin(part_distribs["cloud"]), - "max_genomes_frequency": getmax(part_distribs["cloud"]), - "sd_genomes_frequency": getstdev(part_distribs["cloud"]), - "mean_genomes_frequency": getmean(part_distribs["cloud"])} + info_group._v_attrs.cloudStats = { + "min_genomes_frequency": getmin(part_distribs["cloud"]), + "max_genomes_frequency": getmax(part_distribs["cloud"]), + "sd_genomes_frequency": getstdev(part_distribs["cloud"]), + "mean_genomes_frequency": getmean(part_distribs["cloud"]), + } info_group._v_attrs.numberOfPartitions = len(part_set) info_group._v_attrs.numberOfSubpartitions = subpart_counter @@ -495,9 +631,14 @@ def write_info(pangenome: Pangenome, h5f: tables.File): if pangenome.status["modules"] in ["Computed", "Loaded"]: info_group._v_attrs.numberOfModules = pangenome.number_of_modules - info_group._v_attrs.numberOfFamiliesInModules = sum([len(mod) for mod in pangenome.modules]) + info_group._v_attrs.numberOfFamiliesInModules = sum( + [len(mod) for mod in pangenome.modules] + ) + + info_group._v_attrs.parameters = ( + pangenome.parameters + ) # saving the pangenome parameters - info_group._v_attrs.parameters = pangenome.parameters # saving the pangenome parameters def write_info_modules(pangenome: Pangenome, h5f: tables.File): """ @@ -518,43 +659,58 @@ def part_spec(part: str) -> list: pangenome.compute_mod_bitarrays(part) return [popcount(module.bitarray) for module in pangenome.modules] - if "/info" not in h5f: write_info(pangenome, h5f) info_group = h5f.root.info - mod_fam = [len(module) for module in pangenome.modules] sum_mod_fam = sum(mod_fam) - info_group._v_attrs.StatOfFamiliesInModules = {"min": getmin(mod_fam), - "max": getmax(mod_fam), - "sd": getstdev(mod_fam), - "mean": getmean(mod_fam)} + info_group._v_attrs.StatOfFamiliesInModules = { + "min": getmin(mod_fam), + "max": getmax(mod_fam), + "sd": getstdev(mod_fam), + "mean": getmean(mod_fam), + } - spec_pers = part_spec(part='persistent') - spec_shell = part_spec(part='shell') - spec_cloud = part_spec(part='cloud') + spec_pers = part_spec(part="persistent") + spec_shell = part_spec(part="shell") + spec_cloud = part_spec(part="cloud") + + info_group._v_attrs.PersistentSpecInModules = { + "percent": ( + round((sum(spec_pers) / sum_mod_fam) * 100, 2) if sum_mod_fam > 0 else 0 + ), + "min": getmin(spec_pers), + "max": getmax(spec_pers), + "sd": getstdev(spec_pers), + "mean": getmean(spec_pers), + } - info_group._v_attrs.PersistentSpecInModules = {"percent": round((sum(spec_pers) / sum_mod_fam) * 100, 2) if sum_mod_fam > 0 else 0, - "min": getmin(spec_pers), - "max": getmax(spec_pers), - "sd": getstdev(spec_pers), - "mean": getmean(spec_pers)} + info_group._v_attrs.ShellSpecInModules = { + "percent": ( + round((sum(spec_shell) / sum_mod_fam) * 100, 2) if sum_mod_fam > 0 else 0 + ), + "min": getmin(spec_shell), + "max": getmax(spec_shell), + "sd": getstdev(spec_shell), + "mean": getmean(spec_shell), + } - info_group._v_attrs.ShellSpecInModules = {"percent": round((sum(spec_shell) / sum_mod_fam) * 100, 2) if sum_mod_fam > 0 else 0, - "min": getmin(spec_shell), - "max": getmax(spec_shell), - "sd": getstdev(spec_shell), - "mean": getmean(spec_shell)} + info_group._v_attrs.CloudSpecInModules = { + "percent": ( + round((sum(spec_cloud) / sum_mod_fam) * 100, 2) if sum_mod_fam > 0 else 0 + ), + "min": getmin(spec_cloud), + "max": getmax(spec_cloud), + "sd": getstdev(spec_cloud), + "mean": getmean(spec_cloud), + } - info_group._v_attrs.CloudSpecInModules = {"percent": round((sum(spec_cloud) / sum_mod_fam) * 100, 2) if sum_mod_fam > 0 else 0, - "min": getmin(spec_cloud), - "max": getmax(spec_cloud), - "sd": getstdev(spec_cloud), - "mean": getmean(spec_cloud)} -def update_gene_fam_partition(pangenome: Pangenome, h5f: tables.File, disable_bar: bool = False): +def update_gene_fam_partition( + pangenome: Pangenome, h5f: tables.File, disable_bar: bool = False +): """ Update the gene families table with partition information @@ -562,14 +718,18 @@ def update_gene_fam_partition(pangenome: Pangenome, h5f: tables.File, disable_ba :param h5f: HDF5 file with gene families :param disable_bar: Allow to disable progress bar """ - logging.getLogger("PPanGGOLiN").info("Updating gene families with partition information") + logging.getLogger("PPanGGOLiN").info( + "Updating gene families with partition information" + ) table = h5f.root.geneFamiliesInfo for row in tqdm(table, total=table.nrows, unit="gene family", disable=disable_bar): row["partition"] = pangenome.get_gene_family(row["name"].decode()).partition row.update() -def update_gene_fragments(pangenome: Pangenome, h5f: tables.File, disable_bar: bool = False): +def update_gene_fragments( + pangenome: Pangenome, h5f: tables.File, disable_bar: bool = False +): """ Updates the annotation table with the fragmentation information from the defrag pipeline @@ -577,21 +737,32 @@ def update_gene_fragments(pangenome: Pangenome, h5f: tables.File, disable_bar: b :param h5f: HDF5 pangenome file :param disable_bar: Allow to disable progress bar """ - logging.getLogger("PPanGGOLiN").info("Updating annotations with fragment information") + logging.getLogger("PPanGGOLiN").info( + "Updating annotations with fragment information" + ) genedataid2genedata = read_genedata(h5f) table = h5f.root.annotations.genes for row in tqdm(table, total=table.nrows, unit="gene", disable=disable_bar): - genedata_id = row['genedata_id'] - if genedataid2genedata[genedata_id].gene_type == 'CDS': - row['is_fragment'] = pangenome.get_gene(row['ID'].decode()).is_fragment + genedata_id = row["genedata_id"] + if genedataid2genedata[genedata_id].gene_type == "CDS": + row["is_fragment"] = pangenome.get_gene(row["ID"].decode()).is_fragment row.update() table.flush() -def erase_pangenome(pangenome: Pangenome, graph: bool = False, gene_families: bool = False, partition: bool = False, - rgp: bool = False, spots: bool = False, modules: bool = False, - metadata: bool = False, metatype: str = None, source: str = None): +def erase_pangenome( + pangenome: Pangenome, + graph: bool = False, + gene_families: bool = False, + partition: bool = False, + rgp: bool = False, + spots: bool = False, + modules: bool = False, + metadata: bool = False, + metatype: str = None, + source: str = None, +): """ Erases tables from a pangenome .h5 file @@ -614,15 +785,19 @@ def erase_pangenome(pangenome: Pangenome, graph: bool = False, gene_families: bo status_group = h5f.root.status info_group = h5f.root.info - if '/edges' in h5f and (graph or gene_families): + if "/edges" in h5f and (graph or gene_families): logging.getLogger("PPanGGOLiN").info("Erasing the formerly computed edges") h5f.remove_node("/", "edges") status_group._v_attrs.NeighborsGraph = False pangenome.status["neighborsGraph"] = "No" h5f.del_node_attr(info_group, "numberOfEdges") - if '/geneFamilies' in h5f and gene_families: - logging.getLogger("PPanGGOLiN").info("Erasing the formerly computed gene family to gene associations...") - h5f.remove_node('/', 'geneFamilies') # erasing the table, and rewriting a new one. + if "/geneFamilies" in h5f and gene_families: + logging.getLogger("PPanGGOLiN").info( + "Erasing the formerly computed gene family to gene associations..." + ) + h5f.remove_node( + "/", "geneFamilies" + ) # erasing the table, and rewriting a new one. pangenome.status["defragmented"] = "No" pangenome.status["genesClustered"] = "No" status_group._v_attrs.defragmented = False @@ -630,16 +805,20 @@ def erase_pangenome(pangenome: Pangenome, graph: bool = False, gene_families: bo h5f.del_node_attr(info_group, "numberOfClusters") - if '/geneFamiliesInfo' in h5f and gene_families: - logging.getLogger("PPanGGOLiN").info("Erasing the formerly computed gene family representative sequences...") - h5f.remove_node('/', 'geneFamiliesInfo') # erasing the table, and rewriting a new one. + if "/geneFamiliesInfo" in h5f and gene_families: + logging.getLogger("PPanGGOLiN").info( + "Erasing the formerly computed gene family representative sequences..." + ) + h5f.remove_node( + "/", "geneFamiliesInfo" + ) # erasing the table, and rewriting a new one. pangenome.status["geneFamilySequences"] = "No" status_group._v_attrs.geneFamilySequences = False if partition: logging.getLogger("PPanGGOLiN").info("Erasing former partitions...") pangenome.status["partitioned"] = "No" status_group._v_attrs.Partitioned = False - if 'Partitioned' in status_group._v_attrs._f_list(): + if "Partitioned" in status_group._v_attrs._f_list(): status_group._v_attrs.Partitioned = False h5f.del_node_attr(info_group, "numberOfPersistent") @@ -651,7 +830,7 @@ def erase_pangenome(pangenome: Pangenome, graph: bool = False, gene_families: bo h5f.del_node_attr(info_group, "numberOfPartitions") h5f.del_node_attr(info_group, "numberOfSubpartitions") - if '/RGP' in h5f and (gene_families or partition or rgp): + if "/RGP" in h5f and (gene_families or partition or rgp): logging.getLogger("PPanGGOLiN").info("Erasing the formerly computer RGP...") pangenome.status["predictedRGP"] = "No" status_group._v_attrs.predictedRGP = False @@ -659,32 +838,43 @@ def erase_pangenome(pangenome: Pangenome, graph: bool = False, gene_families: bo h5f.del_node_attr(info_group, "numberOfRGP") - if '/spots' in h5f and (gene_families or partition or rgp or spots): - logging.getLogger("PPanGGOLiN").info("Erasing the formerly computed spots...") + if "/spots" in h5f and (gene_families or partition or rgp or spots): + logging.getLogger("PPanGGOLiN").info( + "Erasing the formerly computed spots..." + ) pangenome.status["spots"] = "No" status_group._v_attrs.spots = False h5f.remove_node("/", "spots") h5f.del_node_attr(info_group, "numberOfSpots") - if '/modules' in h5f and (gene_families or partition or modules): - logging.getLogger("PPanGGOLiN").info("Erasing the formerly computed modules...") + if "/modules" in h5f and (gene_families or partition or modules): + logging.getLogger("PPanGGOLiN").info( + "Erasing the formerly computed modules..." + ) pangenome.status["modules"] = "No" status_group._v_attrs.modules = False h5f.remove_node("/", "modules") h5f.del_node_attr(info_group, "numberOfModules") h5f.del_node_attr(info_group, "numberOfFamiliesInModules") - for info in ['CloudSpecInModules', 'PersistentSpecInModules', 'ShellSpecInModules', 'numberOfFamiliesInModules', - 'StatOfFamiliesInModules']: + for info in [ + "CloudSpecInModules", + "PersistentSpecInModules", + "ShellSpecInModules", + "numberOfFamiliesInModules", + "StatOfFamiliesInModules", + ]: if info in info_group._v_attrs._f_list(): h5f.del_node_attr(info_group, info) - if '/metadata/' in h5f and metadata: + if "/metadata/" in h5f and metadata: erase_metadata(pangenome, h5f, status_group, metatype, source) -def write_pangenome(pangenome: Pangenome, filename, force: bool = False, disable_bar: bool = False): +def write_pangenome( + pangenome: Pangenome, filename, force: bool = False, disable_bar: bool = False +): """ Writes or updates a pangenome file @@ -696,12 +886,16 @@ def write_pangenome(pangenome: Pangenome, filename, force: bool = False, disable try: assert pangenome.status["genomesAnnotated"] in ["Computed", "Loaded", "inFile"] except AssertionError: - raise AssertionError("Something REALLY unexpected and unplanned for happened here. " - "Please post an issue on github with what you did to reach this error.") + raise AssertionError( + "Something REALLY unexpected and unplanned for happened here. " + "Please post an issue on github with what you did to reach this error." + ) if pangenome.status["genomesAnnotated"] in ["Computed", "Loaded", "inFile"]: if pangenome.status["genomesAnnotated"] == "Computed": - compression_filter = tables.Filters(complevel=1, shuffle=True, bitshuffle=True, complib='blosc:zstd') + compression_filter = tables.Filters( + complevel=1, shuffle=True, bitshuffle=True, complib="blosc:zstd" + ) h5f = tables.open_file(filename, "w", filters=compression_filter) logging.getLogger("PPanGGOLiN").info("Writing genome annotations...") @@ -714,39 +908,57 @@ def write_pangenome(pangenome: Pangenome, filename, force: bool = False, disable h5f = tables.open_file(filename, "a") if pangenome.status["geneSequences"] == "Computed": - logging.getLogger("PPanGGOLiN").info("writing the protein coding gene dna sequences in pangenome...") + logging.getLogger("PPanGGOLiN").info( + "writing the protein coding gene dna sequences in pangenome..." + ) write_gene_sequences(pangenome, h5f, disable_bar=disable_bar) pangenome.status["geneSequences"] = "Loaded" if pangenome.status["genesClustered"] == "Computed": - logging.getLogger("PPanGGOLiN").info("Writing gene families and gene associations in pangenome...") + logging.getLogger("PPanGGOLiN").info( + "Writing gene families and gene associations in pangenome..." + ) write_gene_families(pangenome, h5f, force, disable_bar=disable_bar) - logging.getLogger("PPanGGOLiN").info("Writing gene families information in pangenome...") + logging.getLogger("PPanGGOLiN").info( + "Writing gene families information in pangenome..." + ) write_gene_fam_info(pangenome, h5f, force, disable_bar=disable_bar) - if pangenome.status["genomesAnnotated"] in ["Loaded", "inFile"] and \ - pangenome.status["defragmented"] == "Computed": + if ( + pangenome.status["genomesAnnotated"] in ["Loaded", "inFile"] + and pangenome.status["defragmented"] == "Computed" + ): # if the annotations have not been computed in this run, # and there has been a clustering with defragmentation, then the annotations can be updated update_gene_fragments(pangenome, h5f, disable_bar=disable_bar) pangenome.status["genesClustered"] = "Loaded" if pangenome.status["neighborsGraph"] == "Computed": - logging.getLogger("PPanGGOLiN").info("Writing the edges of neighbors graph in pangenome...") + logging.getLogger("PPanGGOLiN").info( + "Writing the edges of neighbors graph in pangenome..." + ) write_graph(pangenome, h5f, force, disable_bar=disable_bar) pangenome.status["neighborsGraph"] = "Loaded" - if pangenome.status["partitioned"] == "Computed" and \ - pangenome.status["genesClustered"] in ["Loaded", "inFile"]: # otherwise, it's been written already. + if pangenome.status["partitioned"] == "Computed" and pangenome.status[ + "genesClustered" + ] in [ + "Loaded", + "inFile", + ]: # otherwise, it's been written already. update_gene_fam_partition(pangenome, h5f, disable_bar=disable_bar) pangenome.status["partitioned"] = "Loaded" - if pangenome.status['predictedRGP'] == "Computed": - logging.getLogger("PPanGGOLiN").info("Writing Regions of Genomic Plasticity in pangenome...") + if pangenome.status["predictedRGP"] == "Computed": + logging.getLogger("PPanGGOLiN").info( + "Writing Regions of Genomic Plasticity in pangenome..." + ) write_rgp(pangenome, h5f, force, disable_bar=disable_bar) - pangenome.status['predictedRGP'] = "Loaded" + pangenome.status["predictedRGP"] = "Loaded" if pangenome.status["spots"] == "Computed": - logging.getLogger("PPanGGOLiN").info("Writing Spots of Insertion in pangenome...") + logging.getLogger("PPanGGOLiN").info( + "Writing Spots of Insertion in pangenome..." + ) write_spots(pangenome, h5f, force, disable_bar=disable_bar) - pangenome.status['spots'] = "Loaded" + pangenome.status["spots"] = "Loaded" if pangenome.status["modules"] == "Computed": logging.getLogger("PPanGGOLiN").info("Writing Modules in pangenome...") @@ -759,6 +971,6 @@ def write_pangenome(pangenome: Pangenome, filename, force: bool = False, disable write_info(pangenome, h5f) h5f.close() - logging.getLogger("PPanGGOLiN").info(f"Done writing the pangenome. It is in file : {filename}") - - + logging.getLogger("PPanGGOLiN").info( + f"Done writing the pangenome. It is in file : {filename}" + ) diff --git a/ppanggolin/formats/writeFlatGenomes.py b/ppanggolin/formats/writeFlatGenomes.py index cd9082f1..8f8a78f8 100644 --- a/ppanggolin/formats/writeFlatGenomes.py +++ b/ppanggolin/formats/writeFlatGenomes.py @@ -22,7 +22,12 @@ from ppanggolin.genome import Organism, Gene, RNA from ppanggolin.region import Region, Module from ppanggolin.pangenome import Pangenome -from ppanggolin.utils import write_compressed_or_not, mk_outdir, extract_contig_window, parse_input_paths_file +from ppanggolin.utils import ( + write_compressed_or_not, + mk_outdir, + extract_contig_window, + parse_input_paths_file, +) from ppanggolin.formats.readBinaries import check_pangenome_info from ppanggolin.formats.write_proksee import write_proksee_organism from ppanggolin.formats.writeSequences import read_genome_file, write_spaced_fasta @@ -50,8 +55,15 @@ def count_neighbors_partitions(gene_family: GeneFamily): return nb_pers, nb_shell, nb_cloud -def write_tsv_genome_file(organism: Organism, output: Path, compress: bool = False, metadata_sep:str = "|", - need_regions: bool = False, need_spots: bool = False, need_modules: bool = False): +def write_tsv_genome_file( + organism: Organism, + output: Path, + compress: bool = False, + metadata_sep: str = "|", + need_regions: bool = False, + need_spots: bool = False, + need_modules: bool = False, +): """ Write the table of genes with pangenome annotation for one organism in tsv @@ -70,13 +82,17 @@ def write_tsv_genome_file(organism: Organism, output: Path, compress: bool = Fal gene_info = {} - gene_info["gene"] = gene.ID if gene.local_identifier == "" else gene.local_identifier + gene_info["gene"] = ( + gene.ID if gene.local_identifier == "" else gene.local_identifier + ) gene_info["contig"] = gene.contig.name gene_info["start"] = gene.start gene_info["stop"] = gene.stop gene_info["strand"] = gene.strand gene_info["family"] = gene.family.name - gene_info["nb_copy_in_genome"] = len(list(gene.family.get_genes_per_org(organism))) + gene_info["nb_copy_in_genome"] = len( + list(gene.family.get_genes_per_org(organism)) + ) gene_info["partition"] = gene.family.named_partition gene_info["persistent_neighbors"] = nb_pers gene_info["shell_neighbors"] = nb_shell @@ -85,34 +101,53 @@ def write_tsv_genome_file(organism: Organism, output: Path, compress: bool = Fal if need_regions: gene_info["RGP"] = str(gene.RGP) if gene.RGP is not None else None if need_spots: - gene_info['Spot'] = str(gene.spot) if gene.spot is not None else None + gene_info["Spot"] = str(gene.spot) if gene.spot is not None else None if need_modules: - gene_info['Module'] = str(gene.family.module) if gene.family.has_module else None + gene_info["Module"] = ( + str(gene.family.module) if gene.family.has_module else None + ) # Add metadata - gene_metadata = {f"gene_{key}":value for key, value in gene.formatted_metadata_dict(metadata_sep).items()} + gene_metadata = { + f"gene_{key}": value + for key, value in gene.formatted_metadata_dict(metadata_sep).items() + } gene_info.update(gene_metadata) - family_metadata = {f"family_{key}":value for key, value in gene.family.formatted_metadata_dict(metadata_sep).items()} + family_metadata = { + f"family_{key}": value + for key, value in gene.family.formatted_metadata_dict(metadata_sep).items() + } gene_info.update(family_metadata) if need_regions and gene.RGP: - rgp_metadata = {f"rgp_{key}":value for key, value in gene.RGP.formatted_metadata_dict(metadata_sep).items()} + rgp_metadata = { + f"rgp_{key}": value + for key, value in gene.RGP.formatted_metadata_dict(metadata_sep).items() + } gene_info.update(rgp_metadata) rows.append(gene_info) - pd.DataFrame(rows).to_csv(output / f"{organism.name}.tsv{'.gz' if compress else ''}", sep="\t", index=False) + pd.DataFrame(rows).to_csv( + output / f"{organism.name}.tsv{'.gz' if compress else ''}", + sep="\t", + index=False, + ) - logging.getLogger("PPangGGOLiN").debug(f"Done writing the table with pangenome annotation for {organism.name}") + logging.getLogger("PPangGGOLiN").debug( + f"Done writing the table with pangenome annotation for {organism.name}" + ) -def manage_module_colors(modules: Set[Module], window_size: int = 100) -> Dict[Module, str]: +def manage_module_colors( + modules: Set[Module], window_size: int = 100 +) -> Dict[Module, str]: """ Manages colors for a list of modules based on gene positions and a specified window size. :param modules: A list of module objects for which you want to determine colors. - :param window_size: Minimum number of genes between two modules to color them with the same color. + :param window_size: Minimum number of genes between two modules to color them with the same color. A higher value results in more module colors. :return: A dictionary that maps each module to its assigned color. """ @@ -132,23 +167,29 @@ def manage_module_colors(modules: Set[Module], window_size: int = 100) -> Dict[M for contig, mod_genes in contig_to_mod_genes.items(): gene_positions = (gene.position for gene in mod_genes) - contig_windows = extract_contig_window(contig.number_of_genes, - gene_positions, - window_size=window_size, - is_circular=contig.is_circular) + contig_windows = extract_contig_window( + contig.number_of_genes, + gene_positions, + window_size=window_size, + is_circular=contig.is_circular, + ) contig_windows = list(contig_windows) - for (start, end) in contig_windows: - module_in_window = {gene_to_module[gene] for gene in mod_genes if start <= gene.position <= end} + for start, end in contig_windows: + module_in_window = { + gene_to_module[gene] + for gene in mod_genes + if start <= gene.position <= end + } # Add edges between closely located modules - module_edges = [(mod_a, mod_b) for mod_a, mod_b in combinations(module_in_window, 2)] + module_edges = [ + (mod_a, mod_b) for mod_a, mod_b in combinations(module_in_window, 2) + ] color_mod_graph.add_edges_from(module_edges) - module_to_group = nx.coloring.greedy_color(color_mod_graph) - # Attempt to have always the same color associated with the same module... module_to_color_int = {} group_with_color = [] @@ -158,13 +199,14 @@ def manage_module_colors(modules: Set[Module], window_size: int = 100) -> Dict[M group_with_color.append(group) module_to_color_int[module] = group_with_color.index(group) - # If you want to export the graph to see the coloring: # nx.set_node_attributes(color_mod_graph, module_to_color_int, name="color") # nx.readwrite.graphml.write_graphml(color_mod_graph, f"module_graph_window_size{window_size}.graphml") nb_colors = len(set(module_to_color_int.values())) - logging.getLogger().debug(f"We have found that {nb_colors} colors were necessary to color Modules.") + logging.getLogger().debug( + f"We have found that {nb_colors} colors were necessary to color Modules." + ) colors = palette(nb_colors) module_to_color = {mod: colors[col_i] for mod, col_i in module_to_color_int.items()} @@ -185,8 +227,10 @@ def palette(nb_colors: int) -> List[str]: if len(colors) < nb_colors: # Generate random colors if not enough predefined colors are available - random_colors = ["#" + ''.join([random.choice('0123456789ABCDEF') for _ in range(6)]) for _ in - range(nb_colors - len(colors))] + random_colors = [ + "#" + "".join([random.choice("0123456789ABCDEF") for _ in range(6)]) + for _ in range(nb_colors - len(colors)) + ] colors += random_colors else: colors = colors[:nb_colors] @@ -197,20 +241,20 @@ def palette(nb_colors: int) -> List[str]: def encode_attribute_val(product: str) -> str: """ Encode special characters forbidden in column 9 of the GFF3 format. - + :param product: The input string to encode. :return: The encoded string with special characters replaced. - + Reference: - GFF3 format requirement: https://github.com/The-Sequence-Ontology/Specifications/blob/master/gff3.md - Code source taken from Bakta: https://github.com/oschwengers/bakta """ product = str(product) - product = product.replace('%', '%25') - product = product.replace(';', '%3B') - product = product.replace('=', '%3D') - product = product.replace('&', '%26') - product = product.replace(',', '%2C') + product = product.replace("%", "%25") + product = product.replace(";", "%3B") + product = product.replace("=", "%3D") + product = product.replace("&", "%26") + product = product.replace(",", "%2C") return product @@ -221,12 +265,23 @@ def encode_attributes(attributes: List[Tuple]) -> str: :param attributes: A list of attribute key-value pairs represented as tuples. :return: The encoded attributes as a semicolon-separated string. """ - return ';'.join( - [f"{encode_attribute_val(k)}={encode_attribute_val(v)}" for k, v in attributes if str(v) != "" and v is not None]) - - -def write_gff_file(organism: Organism, outdir: Path, annotation_sources: Dict[str, str], - genome_sequences: Dict[str, str], metadata_sep: str = "|", compress: bool = False): + return ";".join( + [ + f"{encode_attribute_val(k)}={encode_attribute_val(v)}" + for k, v in attributes + if str(v) != "" and v is not None + ] + ) + + +def write_gff_file( + organism: Organism, + outdir: Path, + annotation_sources: Dict[str, str], + genome_sequences: Dict[str, str], + metadata_sep: str = "|", + compress: bool = False, +): """ Write the GFF file of the provided organism. @@ -241,39 +296,53 @@ def write_gff_file(organism: Organism, outdir: Path, annotation_sources: Dict[st # sort contig by their name sorted_contigs = sorted(organism.contigs, key=lambda x: x.name) - organism_metadata = [(f"genome_{key}", value) for key, value in organism.formatted_metadata_dict(metadata_sep).items()] + organism_metadata = [ + (f"genome_{key}", value) + for key, value in organism.formatted_metadata_dict(metadata_sep).items() + ] - with write_compressed_or_not(outdir / F"{organism.name}.gff", compress) as outfile: + with write_compressed_or_not(outdir / f"{organism.name}.gff", compress) as outfile: # write gff header - outfile.write('##gff-version 3\n') + outfile.write("##gff-version 3\n") for contig in sorted_contigs: if contig.length is None: - raise AttributeError(f'Contig {contig.name} has no length defined.') + raise AttributeError(f"Contig {contig.name} has no length defined.") - outfile.write(f'##sequence-region {contig.name} 1 {contig.length}\n') + outfile.write(f"##sequence-region {contig.name} 1 {contig.length}\n") for contig in sorted_contigs: - contig_metadata = [(f"contig_{key}", value) for key, value in - contig.formatted_metadata_dict(metadata_sep).items()] - attributes = [("ID", contig.name), - ("Is_circular", - "true" if contig.is_circular else "false")] + organism_metadata + contig_metadata + contig_metadata = [ + (f"contig_{key}", value) + for key, value in contig.formatted_metadata_dict(metadata_sep).items() + ] + attributes = ( + [ + ("ID", contig.name), + ("Is_circular", "true" if contig.is_circular else "false"), + ] + + organism_metadata + + contig_metadata + ) attributes_str = encode_attributes(attributes) - contig_line = [contig.name, - ".", - "region", - "1", - contig.length, - ".", - "+", - ".", - attributes_str] - contig_line_str = '\t'.join(map(str, contig_line)) + contig_line = [ + contig.name, + ".", + "region", + "1", + contig.length, + ".", + "+", + ".", + attributes_str, + ] + contig_line_str = "\t".join(map(str, contig_line)) outfile.write(contig_line_str + "\n") - contig_elements = sorted(list(contig.regions) + list(contig.genes) + list(contig.RNAs), - key=lambda x: x.start) + contig_elements = sorted( + list(contig.regions) + list(contig.genes) + list(contig.RNAs), + key=lambda x: x.start, + ) for feature in contig_elements: phase = "." @@ -288,13 +357,14 @@ def write_gff_file(organism: Organism, outdir: Path, annotation_sources: Dict[st # before the CDS or RNA line a gene line is created. with the following id parent_gene_id = f"gene-{feature.ID}" - attributes = [("ID", feature.ID), - ("Name", feature.name), - ('Parent', parent_gene_id), - ("product", feature.product), - ] + attributes = [ + ("ID", feature.ID), + ("Name", feature.name), + ("Parent", parent_gene_id), + ("product", feature.product), + ] - score = '.' + score = "." if isinstance(feature, Gene): rgp = feature.RGP.name if feature.RGP else "" @@ -303,15 +373,26 @@ def write_gff_file(organism: Organism, outdir: Path, annotation_sources: Dict[st attributes += [ ("family", feature.family.name), ("partition", feature.family.named_partition), - ('rgp', rgp), - ('module', feature.family.module) # family.module can be None... + ("rgp", rgp), + ( + "module", + feature.family.module, + ), # family.module can be None... ] # adding attributes - gene_metadata = [(f"gene_{key}", value) for key, value in - feature.formatted_metadata_dict(metadata_sep).items()] - family_metadata = [(f"family_{key}", value) for key, value in - feature.family.formatted_metadata_dict(metadata_sep).items()] + gene_metadata = [ + (f"gene_{key}", value) + for key, value in feature.formatted_metadata_dict( + metadata_sep + ).items() + ] + family_metadata = [ + (f"family_{key}", value) + for key, value in feature.family.formatted_metadata_dict( + metadata_sep + ).items() + ] attributes += gene_metadata attributes += family_metadata @@ -321,17 +402,18 @@ def write_gff_file(organism: Organism, outdir: Path, annotation_sources: Dict[st if feature.overlaps_contig_edge: stop = contig.length + feature.stop - gene_line = [contig.name, - source, - 'gene', - feature.start, - stop, - '.', - strand, - ".", - f'ID={encode_attribute_val(parent_gene_id)}' - ] - line_str = '\t'.join(map(str, gene_line)) + gene_line = [ + contig.name, + source, + "gene", + feature.start, + stop, + ".", + strand, + ".", + f"ID={encode_attribute_val(parent_gene_id)}", + ] + line_str = "\t".join(map(str, gene_line)) outfile.write(line_str + "\n") elif isinstance(feature, Region): @@ -340,51 +422,68 @@ def write_gff_file(organism: Organism, outdir: Path, annotation_sources: Dict[st strand = "." score = "." - rgp_metadata = [(f"rgp_{key}", value) for key, value in - feature.formatted_metadata_dict(metadata_sep).items()] + rgp_metadata = [ + (f"rgp_{key}", value) + for key, value in feature.formatted_metadata_dict( + metadata_sep + ).items() + ] attributes = [ ("Name", feature.name), - ("spot", feature.spot.ID if feature.spot is not None else "No_spot"), - ("Note", "Region of Genomic Plasticity (RGP)") + ( + "spot", + feature.spot.ID if feature.spot is not None else "No_spot", + ), + ("Note", "Region of Genomic Plasticity (RGP)"), ] attributes += rgp_metadata else: raise TypeError( - f'The feature to write in gff file does not have an expected types. {type(feature)}') + f"The feature to write in gff file does not have an expected types. {type(feature)}" + ) attributes_str = encode_attributes(attributes) coordinates = feature.coordinates if feature.overlaps_contig_edge: - coordinates = convert_overlapping_coordinates_for_gff(feature.coordinates, len(contig)) + coordinates = convert_overlapping_coordinates_for_gff( + feature.coordinates, len(contig) + ) for start, stop in coordinates: - line = [contig.name, - source, # Source - feat_type, - start, - stop, - score, - strand, - phase, - attributes_str, - ] - - line_str = '\t'.join(map(str, line)) + line = [ + contig.name, + source, # Source + feat_type, + start, + stop, + score, + strand, + phase, + attributes_str, + ] + + line_str = "\t".join(map(str, line)) outfile.write(line_str + "\n") if genome_sequences: - logging.getLogger("PPanGGOLiN").debug("Writing fasta section of gff file...") + logging.getLogger("PPanGGOLiN").debug( + "Writing fasta section of gff file..." + ) outfile.write("##FASTA\n") for contig in sorted_contigs: outfile.write(f">{contig.name}\n") - outfile.write(write_spaced_fasta(genome_sequences[contig.name], space=60)) + outfile.write( + write_spaced_fasta(genome_sequences[contig.name], space=60) + ) -def convert_overlapping_coordinates_for_gff(coordinates: List[Tuple[int, int]], contig_length: int): +def convert_overlapping_coordinates_for_gff( + coordinates: List[Tuple[int, int]], contig_length: int +): """ Converts overlapping gene coordinates in GFF format for circular contigs. @@ -393,11 +492,11 @@ def convert_overlapping_coordinates_for_gff(coordinates: List[Tuple[int, int]], """ start, stop = coordinates[0] - new_coordinates = [(start, stop )] + new_coordinates = [(start, stop)] # convert all coordinates that are at the beginning # of the contig to the extent of the contig for start_n, stop_n in coordinates[1:]: - if start_n < start: # we are on the beginning of the contig + if start_n < start: # we are on the beginning of the contig new_start = contig_length + start_n new_stop = contig_length + stop_n new_coordinates.append((new_start, new_stop)) @@ -413,7 +512,7 @@ def convert_overlapping_coordinates_for_gff(coordinates: List[Tuple[int, int]], start, stop = new_coordinates[0] for start_n, stop_n in new_coordinates[1:]: - if stop +1 == start_n: + if stop + 1 == start_n: stop = stop_n else: merged_coordinates.append((start, stop)) @@ -434,17 +533,25 @@ def get_organism_list(organisms_filt: str, pangenome: Pangenome) -> Set[Organism :return: A set of selected Organism objects. """ if organisms_filt == "all": - logging.getLogger("PPanGGOLiN").info("Writing output for all genomes of the pangenome.") + logging.getLogger("PPanGGOLiN").info( + "Writing output for all genomes of the pangenome." + ) organisms_list = set(pangenome.organisms) else: if Path(organisms_filt).is_file(): - logging.getLogger("PPanGGOLiN").debug("Parsing the list of genomes from a file " - "to determine which genomes should be included in the output.") + logging.getLogger("PPanGGOLiN").debug( + "Parsing the list of genomes from a file " + "to determine which genomes should be included in the output." + ) with open(organisms_filt) as fl: - org_names = [line.strip() for line in fl if line and not line.startswith("#")] + org_names = [ + line.strip() for line in fl if line and not line.startswith("#") + ] else: - org_names = [name.strip() for name in organisms_filt.split(',') if name.strip()] + org_names = [ + name.strip() for name in organisms_filt.split(",") if name.strip() + ] organisms_list = set() org_not_in_pangenome = set() @@ -455,17 +562,27 @@ def get_organism_list(organisms_filt: str, pangenome: Pangenome) -> Set[Organism except KeyError: org_not_in_pangenome.add(org_name) if org_not_in_pangenome: - raise KeyError(f"{len(org_not_in_pangenome)} organism(s) specified with '--genomes' parameter were " - f"not found in the pangenome: {', '.join(org_not_in_pangenome)}") + raise KeyError( + f"{len(org_not_in_pangenome)} organism(s) specified with '--genomes' parameter were " + f"not found in the pangenome: {', '.join(org_not_in_pangenome)}" + ) logging.getLogger("PPanGGOLiN").info( - f"Writing output for {len(organisms_list)}/{pangenome.number_of_organisms} genomes of the pangenome.") + f"Writing output for {len(organisms_list)}/{pangenome.number_of_organisms} genomes of the pangenome." + ) return organisms_list -def mp_write_genomes_file(organism: Organism, output: Path, organisms_file: Path = None, - proksee: bool = False, gff: bool = False, table: bool = False, **kwargs) -> str: +def mp_write_genomes_file( + organism: Organism, + output: Path, + organisms_file: Path = None, + proksee: bool = False, + gff: bool = False, + table: bool = False, + **kwargs, +) -> str: """Wrapper for the write_genomes_file function that allows it to be used in multiprocessing. :param organism: Specify the organism to be written @@ -490,33 +607,72 @@ def mp_write_genomes_file(organism: Organism, output: Path, organisms_file: Path output_file = proksee_outdir / f"{organism.name}.json" # Write ProkSee data for the organism - write_proksee_organism(organism, output_file, features=['all'], genome_sequences=genome_sequences, - **{arg: kwargs[arg] for arg in kwargs.keys() & {'module_to_colors', 'compress', 'metadata_sep', 'multigenics'}}) + write_proksee_organism( + organism, + output_file, + features=["all"], + genome_sequences=genome_sequences, + **{ + arg: kwargs[arg] + for arg in kwargs.keys() + & {"module_to_colors", "compress", "metadata_sep", "multigenics"} + }, + ) if gff: gff_outdir = output / "gff" mk_outdir(gff_outdir, force=True, exist_ok=True) - write_gff_file(organism, outdir=gff_outdir, genome_sequences=genome_sequences, - **{arg: kwargs[arg] for arg in kwargs.keys() & {'compress', 'annotation_sources', - 'metadata_sep'}}) + write_gff_file( + organism, + outdir=gff_outdir, + genome_sequences=genome_sequences, + **{ + arg: kwargs[arg] + for arg in kwargs.keys() + & {"compress", "annotation_sources", "metadata_sep"} + }, + ) if table: table_outdir = output / "table" mk_outdir(table_outdir, force=True, exist_ok=True) - write_tsv_genome_file(organism=organism, output=table_outdir, **{arg: kwargs[arg] for arg in kwargs.keys() & - {'need_regions', 'need_modules', 'need_spots', - 'compress', 'metadata_sep'}}) + write_tsv_genome_file( + organism=organism, + output=table_outdir, + **{ + arg: kwargs[arg] + for arg in kwargs.keys() + & { + "need_regions", + "need_modules", + "need_spots", + "compress", + "metadata_sep", + } + }, + ) return organism.name -def write_flat_genome_files(pangenome: Pangenome, output: Path, table: bool = False, gff: bool = False, - proksee: bool = False, compress: bool = False, fasta: Path = None, - anno: Path = None, organisms_filt: str = "all", - add_metadata: bool = False, metadata_sep: str = "|", metadata_sources: List[str] = None, - cpu: int = 1, disable_bar: bool = False): +def write_flat_genome_files( + pangenome: Pangenome, + output: Path, + table: bool = False, + gff: bool = False, + proksee: bool = False, + compress: bool = False, + fasta: Path = None, + anno: Path = None, + organisms_filt: str = "all", + add_metadata: bool = False, + metadata_sep: str = "|", + metadata_sources: List[str] = None, + cpu: int = 1, + disable_bar: bool = False, +): """ Main function to write flat files from pangenome @@ -537,19 +693,21 @@ def write_flat_genome_files(pangenome: Pangenome, output: Path, table: bool = Fa """ if not any(x for x in [table, gff, proksee]): - raise argparse.ArgumentError(argument=None, message="You did not indicate what file you wanted to write.") - - need_dict = {"need_annotations": True, - "need_families": True, - "need_partitions": True, - "need_rgp": True if pangenome.status["predictedRGP"] != "No" else False, - "need_spots": True if pangenome.status["spots"] != "No" else False, - "need_modules": True if pangenome.status["modules"] != "No" else False, - "need_graph": True if table else False, - "need_metadata": add_metadata, - "sources": metadata_sources - } - + raise argparse.ArgumentError( + argument=None, message="You did not indicate what file you wanted to write." + ) + + need_dict = { + "need_annotations": True, + "need_families": True, + "need_partitions": True, + "need_rgp": True if pangenome.status["predictedRGP"] != "No" else False, + "need_spots": True if pangenome.status["spots"] != "No" else False, + "need_modules": True if pangenome.status["modules"] != "No" else False, + "need_graph": True if table else False, + "need_metadata": add_metadata, + "sources": metadata_sources, + } # Place here to raise an error if file doesn't found before to read pangenome organisms_file = fasta if fasta is not None else anno @@ -558,33 +716,55 @@ def write_flat_genome_files(pangenome: Pangenome, output: Path, table: bool = Fa organisms_list = get_organism_list(organisms_filt, pangenome) if not organisms_list: - raise ValueError("No genomes are selected for output. Please check the '--genomes' parameter.") + raise ValueError( + "No genomes are selected for output. Please check the '--genomes' parameter." + ) multigenics = None if need_dict["need_rgp"]: - multigenics = pangenome.get_multigenics(pangenome.parameters["rgp"]["dup_margin"]) + multigenics = pangenome.get_multigenics( + pangenome.parameters["rgp"]["dup_margin"] + ) - org_dict = parse_input_paths_file(organisms_file) if organisms_file and (gff or proksee) else None + org_dict = ( + parse_input_paths_file(organisms_file) + if organisms_file and (gff or proksee) + else None + ) if proksee: # Generate a color mapping for modules module_to_colors = manage_module_colors(set(pangenome.modules)) - organism2args = defaultdict(lambda: {"output": output, "table": table, "gff": gff, - "proksee": proksee, "compress": compress, "multigenics":multigenics}) + organism2args = defaultdict( + lambda: { + "output": output, + "table": table, + "gff": gff, + "proksee": proksee, + "compress": compress, + "multigenics": multigenics, + } + ) for organism in organisms_list: - organism_args = {"genome_file": org_dict[organism.name]['path'] if org_dict else None, - "metadata_sep": metadata_sep} + organism_args = { + "genome_file": org_dict[organism.name]["path"] if org_dict else None, + "metadata_sep": metadata_sep, + } if proksee: - organism_args["module_to_colors"] = {module: module_to_colors[module] for module in organism.modules} + organism_args["module_to_colors"] = { + module: module_to_colors[module] for module in organism.modules + } if gff: # prepare variable for gff output if pangenome.parameters["annotate"]["# read_annotations_from_file"]: - organism_args['annotation_sources'] = {"rRNA": "external", - "tRNA": "external", - "CDS": "external"} + organism_args["annotation_sources"] = { + "rRNA": "external", + "tRNA": "external", + "CDS": "external", + } else: organism_args["annotation_sources"] = {} @@ -594,28 +774,39 @@ def write_flat_genome_files(pangenome: Pangenome, output: Path, table: bool = Fa for family in pangenome.gene_families: family.get_org_dict() - organism_args.update({"need_regions": need_dict['need_rgp'], - "need_modules": need_dict['need_modules'], - "need_spots": need_dict['need_spots']}) + organism_args.update( + { + "need_regions": need_dict["need_rgp"], + "need_modules": need_dict["need_modules"], + "need_spots": need_dict["need_spots"], + } + ) organism2args[organism].update(organism_args) start_writing = time.time() with ThreadPoolExecutor(max_workers=cpu) as executor: - with tqdm(total=(len(organisms_list)), unit="genome", disable=disable_bar) as progress: + with tqdm( + total=(len(organisms_list)), unit="genome", disable=disable_bar + ) as progress: futures = [] for organism, kwargs in organism2args.items(): - logging.getLogger("PPanGGOLiN").debug(f"Writing genome annotations for {organism.name}") + logging.getLogger("PPanGGOLiN").debug( + f"Writing genome annotations for {organism.name}" + ) future = executor.submit(mp_write_genomes_file, organism, **kwargs) future.add_done_callback(lambda p: progress.update()) futures.append(future) for future in futures: org_name = future.result() - logging.getLogger("PPanGGOLiN").debug(f"Done writing the GFF file with pangenome annotation for {org_name}.") + logging.getLogger("PPanGGOLiN").debug( + f"Done writing the GFF file with pangenome annotation for {org_name}." + ) writing_time = time.time() - start_writing logging.getLogger("PPanGGOLiN").debug( - f"writing_time for {pangenome.number_of_organisms} genomes: {writing_time} seconds") + f"writing_time for {pangenome.number_of_organisms} genomes: {writing_time} seconds" + ) def launch(args: argparse.Namespace): @@ -629,10 +820,22 @@ def launch(args: argparse.Namespace): pangenome = Pangenome() pangenome.add_file(args.pangenome) - write_flat_genome_files(pangenome, args.output, table=args.table, gff=args.gff, proksee=args.proksee, - compress=args.compress, fasta=args.fasta, anno=args.anno, organisms_filt=args.genomes, - add_metadata=args.add_metadata, metadata_sep=args.metadata_sep, - metadata_sources=args.metadata_sources, cpu=args.cpu, disable_bar=args.disable_prog_bar) + write_flat_genome_files( + pangenome, + args.output, + table=args.table, + gff=args.gff, + proksee=args.proksee, + compress=args.compress, + fasta=args.fasta, + anno=args.anno, + organisms_filt=args.genomes, + add_metadata=args.add_metadata, + metadata_sep=args.metadata_sep, + metadata_sources=args.metadata_sources, + cpu=args.cpu, + disable_bar=args.disable_prog_bar, + ) def subparser(sub_parser: argparse._SubParsersAction) -> argparse.ArgumentParser: @@ -643,7 +846,9 @@ def subparser(sub_parser: argparse._SubParsersAction) -> argparse.ArgumentParser :return : parser arguments for align command """ - parser = sub_parser.add_parser("write_genomes", formatter_class=argparse.RawTextHelpFormatter) + parser = sub_parser.add_parser( + "write_genomes", formatter_class=argparse.RawTextHelpFormatter + ) parser_flat(parser) return parser @@ -654,76 +859,126 @@ def parser_flat(parser: argparse.ArgumentParser): :param parser: parser for align argument """ - required = parser.add_argument_group(title="Required arguments", - description="One of the following arguments is required :") - required.add_argument('-p', '--pangenome', required=False, type=Path, help="The pangenome .h5 file") - required.add_argument('-o', '--output', required=True, type=Path, - help="Output directory where the file(s) will be written") + required = parser.add_argument_group( + title="Required arguments", + description="One of the following arguments is required :", + ) + required.add_argument( + "-p", "--pangenome", required=False, type=Path, help="The pangenome .h5 file" + ) + required.add_argument( + "-o", + "--output", + required=True, + type=Path, + help="Output directory where the file(s) will be written", + ) optional = parser.add_argument_group(title="Optional arguments") - optional.add_argument("--table", required=False, action="store_true", - help="Generate a tsv file for each genome with pangenome annotations.") - - optional.add_argument("--gff", required=False, action="store_true", - help="Generate a gff file for each genome containing pangenome annotations.") - - optional.add_argument("--proksee", required=False, action="store_true", - help="Generate JSON map files for PROKSEE for each genome containing pangenome annotations " - "to be used in proksee.") - - optional.add_argument("--compress", required=False, action="store_true", - help="Compress the files in .gz") - - optional.add_argument("--genomes", - required=False, - default="all", - help="Specify the genomes for which to generate output. " - "You can provide a list of genome names either directly in the command line separated " - "by commas, or by referencing a file containing the list of genome names, " - "with one name per line.") - - optional.add_argument("--add_metadata", - required=False, - action="store_true", - help="Include metadata information in the output files " - "if any have been added to pangenome elements (see ppanggolin metadata command).") - - optional.add_argument("--metadata_sources", - default=None, - nargs="+", - help="Which source of metadata should be written. " - "By default all metadata sources are included.") - - optional.add_argument("--metadata_sep", - required=False, - default='|', - help="The separator used to join multiple metadata values for elements with multiple metadata" - " values from the same source. This character should not appear in metadata values.") - - optional.add_argument("-c", "--cpu", required=False, default=1, type=int, - help="Number of available cpus") - - context = parser.add_argument_group(title="Contextually required arguments", - description="With --proksee and --gff, the following arguments can be " - "used to add sequence information to the output file:") - - context.add_argument('--fasta', required=False, type=Path, - help="A tab-separated file listing the genome names, and the fasta filepath of its genomic " - "sequence(s) (the fastas can be compressed with gzip). One line per genome.") - - context.add_argument('--anno', required=False, type=Path, - help="A tab-separated file listing the genome names, and the gff/gbff filepath of its " - "annotations (the files can be compressed with gzip). One line per genome. " - "If this is provided, those annotations will be used.") - - -if __name__ == '__main__': + optional.add_argument( + "--table", + required=False, + action="store_true", + help="Generate a tsv file for each genome with pangenome annotations.", + ) + + optional.add_argument( + "--gff", + required=False, + action="store_true", + help="Generate a gff file for each genome containing pangenome annotations.", + ) + + optional.add_argument( + "--proksee", + required=False, + action="store_true", + help="Generate JSON map files for PROKSEE for each genome containing pangenome annotations " + "to be used in proksee.", + ) + + optional.add_argument( + "--compress", + required=False, + action="store_true", + help="Compress the files in .gz", + ) + + optional.add_argument( + "--genomes", + required=False, + default="all", + help="Specify the genomes for which to generate output. " + "You can provide a list of genome names either directly in the command line separated " + "by commas, or by referencing a file containing the list of genome names, " + "with one name per line.", + ) + + optional.add_argument( + "--add_metadata", + required=False, + action="store_true", + help="Include metadata information in the output files " + "if any have been added to pangenome elements (see ppanggolin metadata command).", + ) + + optional.add_argument( + "--metadata_sources", + default=None, + nargs="+", + help="Which source of metadata should be written. " + "By default all metadata sources are included.", + ) + + optional.add_argument( + "--metadata_sep", + required=False, + default="|", + help="The separator used to join multiple metadata values for elements with multiple metadata" + " values from the same source. This character should not appear in metadata values.", + ) + + optional.add_argument( + "-c", + "--cpu", + required=False, + default=1, + type=int, + help="Number of available cpus", + ) + + context = parser.add_argument_group( + title="Contextually required arguments", + description="With --proksee and --gff, the following arguments can be " + "used to add sequence information to the output file:", + ) + + context.add_argument( + "--fasta", + required=False, + type=Path, + help="A tab-separated file listing the genome names, and the fasta filepath of its genomic " + "sequence(s) (the fastas can be compressed with gzip). One line per genome.", + ) + + context.add_argument( + "--anno", + required=False, + type=Path, + help="A tab-separated file listing the genome names, and the gff/gbff filepath of its " + "annotations (the files can be compressed with gzip). One line per genome. " + "If this is provided, those annotations will be used.", + ) + + +if __name__ == "__main__": """To test local change and allow using debugger""" from ppanggolin.utils import set_verbosity_level, add_common_arguments main_parser = argparse.ArgumentParser( description="Depicting microbial species diversity via a Partitioned PanGenome Graph Of Linked Neighbors", - formatter_class=argparse.RawTextHelpFormatter) + formatter_class=argparse.RawTextHelpFormatter, + ) parser_flat(main_parser) add_common_arguments(main_parser) diff --git a/ppanggolin/formats/writeFlatMetadata.py b/ppanggolin/formats/writeFlatMetadata.py index 5e8066cc..8c4fae46 100644 --- a/ppanggolin/formats/writeFlatMetadata.py +++ b/ppanggolin/formats/writeFlatMetadata.py @@ -16,13 +16,18 @@ from ppanggolin.formats.readBinaries import check_pangenome_info -def write_flat_metadata_files(pangenome: Pangenome, output: Path, - pangenome_elements: List[str] = None, metadata_sources: List[str] = None, - compress: bool = False, disable_bar: bool = False) -> None: +def write_flat_metadata_files( + pangenome: Pangenome, + output: Path, + pangenome_elements: List[str] = None, + metadata_sources: List[str] = None, + compress: bool = False, + disable_bar: bool = False, +) -> None: """ Main function to write flat metadata files from a pangenome. :todo: Split the function in subfunction - + :param pangenome: Pangenome object :param output: Path to output directory :param pangenome_elements: List of pangenome elements to include metadata for @@ -32,33 +37,47 @@ def write_flat_metadata_files(pangenome: Pangenome, output: Path, """ if not pangenome.has_metadata(): - logging.getLogger("PPanGGOLiN").warning("No metadata is assigned to any pangenome element. Writing metadata is not possible.") + logging.getLogger("PPanGGOLiN").warning( + "No metadata is assigned to any pangenome element. Writing metadata is not possible." + ) return if pangenome_elements is None: pangenome_elements = [] - if all(pangenome.status['metadata'][element] == "No" for element in pangenome_elements): - logging.getLogger("PPanGGOLiN").warning(f"No metadata is assigned to any of the requested pangenome elements: {', '.join(pangenome_elements)}.") + if all( + pangenome.status["metadata"][element] == "No" for element in pangenome_elements + ): + logging.getLogger("PPanGGOLiN").warning( + f"No metadata is assigned to any of the requested pangenome elements: {', '.join(pangenome_elements)}." + ) return if metadata_sources is None: # Use all available sources if none are specified - element_to_sources = {element: sources for element, sources in pangenome.status['metasources'].items() if sources} + element_to_sources = { + element: sources + for element, sources in pangenome.status["metasources"].items() + if sources + } else: # Use only the specified sources, if they match available sources element_to_sources = {} for element in pangenome_elements: - existing_sources = pangenome.status['metasources'][element] + existing_sources = pangenome.status["metasources"][element] matching_sources = set(existing_sources) & set(metadata_sources) if matching_sources: element_to_sources[element] = matching_sources if not element_to_sources: - logging.getLogger("PPanGGOLiN").warning(f"None of the specified metadata sources ({metadata_sources}) match the requested pangenome elements: {pangenome_elements}.") + logging.getLogger("PPanGGOLiN").warning( + f"None of the specified metadata sources ({metadata_sources}) match the requested pangenome elements: {pangenome_elements}." + ) return - logging.getLogger("PPanGGOLiN").info(f"Writing metadata for {', '.join(element_to_sources.keys())} from {len([s for sources in element_to_sources.values() for s in sources])} sources.") + logging.getLogger("PPanGGOLiN").info( + f"Writing metadata for {', '.join(element_to_sources.keys())} from {len([s for sources in element_to_sources.values() for s in sources])} sources." + ) need_dict = { "need_annotations": True, @@ -67,7 +86,7 @@ def write_flat_metadata_files(pangenome: Pangenome, output: Path, "need_spots": "spots" in element_to_sources, "need_modules": "modules" in element_to_sources, "need_metadata": True, - "sources": metadata_sources + "sources": metadata_sources, } check_pangenome_info(pangenome, disable_bar=disable_bar, **need_dict) @@ -79,7 +98,7 @@ def write_flat_metadata_files(pangenome: Pangenome, output: Path, "genes": "genes", "modules": "modules", "spots": "spots", - "contigs": "contigs" + "contigs": "contigs", } for element_type, sources in element_to_sources.items(): @@ -96,26 +115,33 @@ def write_flat_metadata_files(pangenome: Pangenome, output: Path, metadata_dict[element_type] = f"module_{element.ID}" elif element_type in ["genes"]: metadata_dict[element_type] = element.ID - elif element_type in ["families", 'genomes', "RGPs", "contigs"]: + elif element_type in ["families", "genomes", "RGPs", "contigs"]: metadata_dict[element_type] = element.name # Add genome name for genome-specific elements if genome is not already a metadata - if element_type in ["genes", "contigs", "RGPs"] and "genomes" not in metadata_dict: + if ( + element_type in ["genes", "contigs", "RGPs"] + and "genomes" not in metadata_dict + ): metadata_dict["genomes"] = element.organism.name - first_columns = ["genomes", element_type ] + first_columns = ["genomes", element_type] source_to_metadata[source].append(metadata_dict) for source, metadata_list in source_to_metadata.items(): df_source = pd.DataFrame(metadata_list) - columns_order = first_columns + [col for col in df_source.columns if col not in first_columns] + columns_order = first_columns + [ + col for col in df_source.columns if col not in first_columns + ] df_source = df_source.reindex(columns_order, axis=1) tsv_file_name = f"{element_type}_metadata_from_{source}.tsv" if compress: tsv_file_name += ".gz" tsv_path = output / tsv_file_name - logging.getLogger("PPanGGOLiN").info(f"Writing {element_type} metadata from source '{source}' to '{tsv_path}'") + logging.getLogger("PPanGGOLiN").info( + f"Writing {element_type} metadata from source '{source}' to '{tsv_path}'" + ) df_source.to_csv(tsv_path, sep="\t", index=False) logging.getLogger("PPanGGOLiN").info("Finished writing metadata in TSV format.") @@ -132,9 +158,14 @@ def launch(args: argparse.Namespace): pangenome = Pangenome() pangenome.add_file(args.pangenome) - write_flat_metadata_files(pangenome, metadata_sources=args.metadata_sources, - pangenome_elements=args.pangenome_elements, - output=args.output, compress=args.compress, disable_bar=args.disable_prog_bar) + write_flat_metadata_files( + pangenome, + metadata_sources=args.metadata_sources, + pangenome_elements=args.pangenome_elements, + output=args.output, + compress=args.compress, + disable_bar=args.disable_prog_bar, + ) def subparser(sub_parser: argparse._SubParsersAction) -> argparse.ArgumentParser: @@ -145,7 +176,9 @@ def subparser(sub_parser: argparse._SubParsersAction) -> argparse.ArgumentParser :return : parser arguments for align command """ - parser = sub_parser.add_parser("write_metadata", formatter_class=argparse.RawTextHelpFormatter) + parser = sub_parser.add_parser( + "write_metadata", formatter_class=argparse.RawTextHelpFormatter + ) parser_flat(parser) return parser @@ -156,39 +189,67 @@ def parser_flat(parser: argparse.ArgumentParser): :param parser: parser for align argument """ - pangenome_elements = {"families", "genomes", "contigs", "genes", "RGPs", "spots", "modules"} - required = parser.add_argument_group(title="Required arguments", - description="One of the following arguments is required :") - required.add_argument('-p', '--pangenome', required=False, type=Path, help="The pangenome .h5 file") - required.add_argument('-o', '--output', required=True, type=Path, - help="Output directory where the file(s) will be written") + pangenome_elements = { + "families", + "genomes", + "contigs", + "genes", + "RGPs", + "spots", + "modules", + } + required = parser.add_argument_group( + title="Required arguments", + description="One of the following arguments is required :", + ) + required.add_argument( + "-p", "--pangenome", required=False, type=Path, help="The pangenome .h5 file" + ) + required.add_argument( + "-o", + "--output", + required=True, + type=Path, + help="Output directory where the file(s) will be written", + ) optional = parser.add_argument_group(title="Optional arguments") - optional.add_argument("--compress", required=False, action="store_true", - help="Compress the files in .gz") - - optional.add_argument("-e", "--pangenome_elements", - required=False, - nargs="+", - choices=pangenome_elements, - default=pangenome_elements, - help="Specify pangenome elements for which to write metadata. " - "default is all element with metadata. ") - - optional.add_argument("-s", "--metadata_sources", - default=None, - nargs="+", - help="Which source of metadata should be written. " - "By default all metadata sources are included.") - - -if __name__ == '__main__': + optional.add_argument( + "--compress", + required=False, + action="store_true", + help="Compress the files in .gz", + ) + + optional.add_argument( + "-e", + "--pangenome_elements", + required=False, + nargs="+", + choices=pangenome_elements, + default=pangenome_elements, + help="Specify pangenome elements for which to write metadata. " + "default is all element with metadata. ", + ) + + optional.add_argument( + "-s", + "--metadata_sources", + default=None, + nargs="+", + help="Which source of metadata should be written. " + "By default all metadata sources are included.", + ) + + +if __name__ == "__main__": """To test local change and allow using debugger""" from ppanggolin.utils import set_verbosity_level, add_common_arguments main_parser = argparse.ArgumentParser( description="Depicting microbial species diversity via a Partitioned PanGenome Graph Of Linked Neighbors", - formatter_class=argparse.RawTextHelpFormatter) + formatter_class=argparse.RawTextHelpFormatter, + ) parser_flat(main_parser) add_common_arguments(main_parser) diff --git a/ppanggolin/formats/writeFlatPangenome.py b/ppanggolin/formats/writeFlatPangenome.py index 563d0c2e..5ef84f4b 100644 --- a/ppanggolin/formats/writeFlatPangenome.py +++ b/ppanggolin/formats/writeFlatPangenome.py @@ -6,7 +6,7 @@ from multiprocessing import get_context from collections import Counter, defaultdict import logging -from typing import TextIO,List, Dict, Set, Any +from typing import TextIO, List, Dict, Set, Any from pathlib import Path from typing import TextIO from importlib.metadata import distribution @@ -24,7 +24,12 @@ from ppanggolin.genome import Organism from ppanggolin.region import Region from ppanggolin.pangenome import Pangenome -from ppanggolin.utils import write_compressed_or_not, mk_outdir, restricted_float, flatten_nested_dict +from ppanggolin.utils import ( + write_compressed_or_not, + mk_outdir, + restricted_float, + flatten_nested_dict, +) from ppanggolin.formats.readBinaries import check_pangenome_info # global variable to store the pangenome @@ -54,13 +59,17 @@ def write_json_header(json: TextIO): orgstr.append('"' + org.name + '": {') contigstr = [] for contig in org.contigs: - contigstr.append(f'"{contig.name}": ' + '{"is_circular": ' + - ('true' if contig.is_circular else 'false') + '}') - orgstr[-1] += ', '.join(contigstr) + "}" + contigstr.append( + f'"{contig.name}": ' + + '{"is_circular": ' + + ("true" if contig.is_circular else "false") + + "}" + ) + orgstr[-1] += ", ".join(contigstr) + "}" - json.write(', '.join(orgstr) + "}") + json.write(", ".join(orgstr) + "}") # if other things are to be written such as the parameters, write them here - json.write('},') + json.write("},") def write_json_gene_fam(gene_fam: GeneFamily, json: TextIO): @@ -69,8 +78,10 @@ def write_json_gene_fam(gene_fam: GeneFamily, json: TextIO): :param gene_fam: file-like object, compressed or not :param json: file-like object, compressed or not """ - json.write('{' + f'"id": "{gene_fam.name}", "nb_genes": {len(gene_fam)}, ' - f'"partition": "{gene_fam.named_partition}", "subpartition": "{gene_fam.partition}"' ) + json.write( + "{" + f'"id": "{gene_fam.name}", "nb_genes": {len(gene_fam)}, ' + f'"partition": "{gene_fam.named_partition}", "subpartition": "{gene_fam.partition}"' + ) org_dict = {} name_counts = Counter() product_counts = Counter() @@ -87,8 +98,10 @@ def write_json_gene_fam(gene_fam: GeneFamily, json: TextIO): except KeyError: org_dict[gene.organism] = {gene.contig: [gene]} - json.write(f', "name": "{name_counts.most_common(1)[0][0]}", "product": "{product_counts.most_common(1)[0][0]}", ' - f'"length": {length_counts.most_common(1)[0][0]}') + json.write( + f', "name": "{name_counts.most_common(1)[0][0]}", "product": "{product_counts.most_common(1)[0][0]}", ' + f'"length": {length_counts.most_common(1)[0][0]}' + ) json.write(', "genomes": {') orgstr = [] @@ -99,11 +112,18 @@ def write_json_gene_fam(gene_fam: GeneFamily, json: TextIO): contigstr.append('"' + contig.name + '": {') genestr = [] for gene in org_dict[org][contig]: - identifier = gene.ID if gene.local_identifier == "" else gene.local_identifier - genestr.append('"' + identifier + '": {' + f'"name": "{gene.name}", "product": "{gene.product}", ' - f'"is_fragment": {"true" if gene.is_fragment else "false"},' - f' "position": {gene.position}, "strand": "{gene.strand}",' - f' "end": {gene.stop}, "start": {gene.start}' + '}') + identifier = ( + gene.ID if gene.local_identifier == "" else gene.local_identifier + ) + genestr.append( + '"' + + identifier + + '": {' + + f'"name": "{gene.name}", "product": "{gene.product}", ' + f'"is_fragment": {"true" if gene.is_fragment else "false"},' + f' "position": {gene.position}, "strand": "{gene.strand}",' + f' "end": {gene.stop}, "start": {gene.start}' + "}" + ) contigstr[-1] += ", ".join(genestr) + "}" orgstr[-1] += ", ".join(contigstr) + "}" json.write(", ".join(orgstr) + "}}") @@ -119,9 +139,9 @@ def write_json_nodes(json: TextIO): first_fam = fam_list[0] write_json_gene_fam(first_fam, json) for family in fam_list[1:]: - json.write(', ') + json.write(", ") write_json_gene_fam(family, json) - json.write(']') + json.write("]") def write_json_edge(edge: Edge, json: TextIO): @@ -131,17 +151,25 @@ def write_json_edge(edge: Edge, json: TextIO): :param json: file-like object, compressed or not """ json.write("{") - json.write(f'"weight": {len(edge.gene_pairs)}, "source": "{edge.source.name}", "target": "{edge.target.name}"') + json.write( + f'"weight": {len(edge.gene_pairs)}, "source": "{edge.source.name}", "target": "{edge.target.name}"' + ) json.write(', "genomes": {') orgstr = [] for org in edge.organisms: orgstr.append('"' + org.name + '": [') genepairstr = [] for gene_pair in edge.get_organism_genes_pairs(org): - genepairstr.append('{"source": "' + gene_pair[0].ID + '", "target": "' + gene_pair[ - 1].ID + f'", "length": {gene_pair[0].start - gene_pair[1].stop}' + '}') - orgstr[-1] += ', '.join(genepairstr) + ']' - json.write(', '.join(orgstr) + "}}") + genepairstr.append( + '{"source": "' + + gene_pair[0].ID + + '", "target": "' + + gene_pair[1].ID + + f'", "length": {gene_pair[0].start - gene_pair[1].stop}' + + "}" + ) + orgstr[-1] += ", ".join(genepairstr) + "]" + json.write(", ".join(orgstr) + "}}") def write_json_edges(json): @@ -155,7 +183,7 @@ def write_json_edges(json): for edge in edge_list[1:]: json.write(", ") write_json_edge(edge, json) - json.write(']') + json.write("]") def write_json(output: Path, compress: bool = False): @@ -164,14 +192,18 @@ def write_json(output: Path, compress: bool = False): :param output: Path to output directory :param compress: Compress the file in .gz """ - logging.getLogger("PPanGGOLiN").info("Writing the json file for the pangenome graph...") + logging.getLogger("PPanGGOLiN").info( + "Writing the json file for the pangenome graph..." + ) outname = output / "pangenomeGraph.json" with write_compressed_or_not(outname, compress) as json: write_json_header(json) write_json_nodes(json) write_json_edges(json) json.write("}") - logging.getLogger("PPanGGOLiN").info(f"Done writing the json file : '{outname.as_posix()}'") + logging.getLogger("PPanGGOLiN").info( + f"Done writing the json file : '{outname.as_posix()}'" + ) def write_gexf_header(gexf: TextIO, light: bool = True): @@ -183,8 +215,10 @@ def write_gexf_header(gexf: TextIO, light: bool = True): index = None if not light: index = pan.get_org_index() # has been computed already - gexf.write('\n\n') # TODO update link + gexf.write( + '\n\n' + ) # TODO update link gexf.write(' \n') gexf.write(' \n') gexf.write(' \n') @@ -205,24 +239,37 @@ def write_gexf_header(gexf: TextIO, light: bool = True): gexf.write(' \n') shift = 14 - source_fields = {m.source: m.fields for f in pan.gene_families if len(list(f.metadata)) > 0 for m in f.metadata} + source_fields = { + m.source: m.fields + for f in pan.gene_families + if len(list(f.metadata)) > 0 + for m in f.metadata + } for source_metadata_families in pan.metadata_sources("families"): for field in source_fields[source_metadata_families]: - gexf.write(f' \n') + gexf.write( + f' \n' + ) shift += 1 if not light: for org, org_idx in index.items(): - gexf.write(f' \n') - gexf.write(' \n') + gexf.write( + f' \n' + ) + gexf.write(" \n") gexf.write(' \n') gexf.write(' \n') if not light: for org, org_idx in index.items(): - gexf.write(f' \n') - gexf.write(' \n') - gexf.write(' \n') - gexf.write(f' PPanGGOLiN {distribution("ppanggolin").version}\n') - gexf.write(' \n') + gexf.write( + f' \n' + ) + gexf.write(" \n") + gexf.write(" \n") + gexf.write( + f' PPanGGOLiN {distribution("ppanggolin").version}\n' + ) + gexf.write(" \n") def write_gexf_nodes(gexf: TextIO, light: bool = True, soft_core: False = 0.95): @@ -233,9 +280,12 @@ def write_gexf_nodes(gexf: TextIO, light: bool = True, soft_core: False = 0.95): :param soft_core: Soft core threshold to use """ index = None - gexf.write(' \n') - colors = {"persistent": 'a="0" b="7" g="165" r="247"', 'shell': 'a="0" b="96" g="216" r="0"', - 'cloud': 'a="0" b="255" g="222" r="121"'} + gexf.write(" \n") + colors = { + "persistent": 'a="0" b="7" g="165" r="247"', + "shell": 'a="0" b="96" g="216" r="0"', + "cloud": 'a="0" b="255" g="222" r="121"', + } if not light: index = pan.get_org_index() @@ -248,28 +298,42 @@ def write_gexf_nodes(gexf: TextIO, light: bool = True, soft_core: False = 0.95): lis = [] for gene in fam.genes: name[gene.name] += 1 - product[gene.product.replace('&', 'and')] += 1 + product[gene.product.replace("&", "and")] += 1 gtype[gene.type] += 1 lis.append(gene.stop - gene.start) gexf.write(f' \n') - gexf.write(f' \n') + gexf.write(f" \n") gexf.write(f' \n') - gexf.write(' \n') + gexf.write(" \n") gexf.write(f' \n') - gexf.write(f' \n') - gexf.write(f' \n') - gexf.write(f' \n') + gexf.write( + f' \n' + ) + gexf.write( + f' \n' + ) + gexf.write( + f' \n' + ) gexf.write(f' \n') gexf.write(f' \n') - gexf.write(f' \n') - gexf.write(f' = (pan.number_of_organisms * soft_core) else "soft_accessory"}"' - f' />\n') - gexf.write(f' \n') + gexf.write( + f' \n' + ) + gexf.write( + f' = (pan.number_of_organisms * soft_core) else "soft_accessory"}"' + f" />\n" + ) + gexf.write( + f' \n' + ) gexf.write(f' \n') - gexf.write(f' \n') + gexf.write( + f' \n' + ) if pan.number_of_spots > 0: str_spot = "|".join([str(s) for s in list(fam.spots)]) gexf.write(f' \n') @@ -277,26 +341,34 @@ def write_gexf_nodes(gexf: TextIO, light: bool = True, soft_core: False = 0.95): str_module = str(fam.module) if fam.has_module else "" gexf.write(f' \n') shift = 14 - source_fields = {m.source: m.fields for f in pan.gene_families if len(list(f.metadata)) > 0 for m in f.metadata} - for source_metadata_families in pan_metadata_sources: + source_fields = { + m.source: m.fields + for f in pan.gene_families + if len(list(f.metadata)) > 0 + for m in f.metadata + } + for source_metadata_families in pan_metadata_sources: to_concat = defaultdict(list) for m in fam.metadata: if m.source == source_metadata_families: for field in m.fields: to_concat[field].append(str(getattr(m, field))) for field in source_fields[source_metadata_families]: - concatenated_fields = '|'.join(to_concat[field]) - gexf.write(f' \n') + concatenated_fields = "|".join(to_concat[field]) + gexf.write( + f' \n' + ) shift += 1 if not light: for org, genes in fam.get_org_dict().items(): gexf.write( f' \n') - gexf.write(' \n') - gexf.write(' \n') - gexf.write(' \n') + f'value="{"|".join([gene.ID if gene.local_identifier == "" else gene.local_identifier for gene in genes])}" />\n' + ) + gexf.write(" \n") + gexf.write(" \n") + gexf.write(" \n") def write_gexf_edges(gexf: TextIO, light: bool = True): @@ -305,24 +377,28 @@ def write_gexf_edges(gexf: TextIO, light: bool = True): :param gexf: file-like object, compressed or not :param light: save the light version of the pangenome graph """ - gexf.write(' \n') + gexf.write(" \n") edgeids = 0 index = pan.get_org_index() shift = 14 metadata_count = len(pan.metadata_sources("families")) for edge in pan.edges: - gexf.write(f' \n') + gexf.write( + f' \n' + ) gexf.write(f' \n') - gexf.write(' \n') + gexf.write(" \n") gexf.write(f' \n') if not light: for org, genes_pairs in edge.get_organisms_dict().items(): - gexf.write(f' \n') - gexf.write(' \n') - gexf.write(' \n') + gexf.write( + f' \n' + ) + gexf.write(" \n") + gexf.write(" \n") edgeids += 1 - gexf.write(' \n') + gexf.write(" \n") def write_gexf_end(gexf: TextIO): @@ -342,12 +418,16 @@ def write_gexf(output: Path, light: bool = True, compress: bool = False): :param compress: Compress the file in .gz """ txt = "Writing the " - txt += "light gexf file for the pangenome graph..." if light else "gexf file for the pangenome graph..." + txt += ( + "light gexf file for the pangenome graph..." + if light + else "gexf file for the pangenome graph..." + ) logging.getLogger("PPanGGOLiN").info(txt) outname = output / f"pangenomeGraph{'_light' if light else ''}.gexf" with write_compressed_or_not(outname, compress) as gexf: - graph_type = 'ligth gexf' if light else 'gexf' + graph_type = "ligth gexf" if light else "gexf" logging.getLogger("PPanGGOLiN").debug(f"Writing the {graph_type} header...") write_gexf_header(gexf, light) logging.getLogger("PPanGGOLiN").debug(f"Writing the {graph_type} nodes...") @@ -356,10 +436,18 @@ def write_gexf(output: Path, light: bool = True, compress: bool = False): write_gexf_edges(gexf, light) logging.getLogger("PPanGGOLiN").debug(f"Writing the {graph_type} ends...") write_gexf_end(gexf) - logging.getLogger("PPanGGOLiN").info(f"Done writing the gexf file : '{gexf.name}'") - - -def write_matrix(output: Path, sep: str = ',', ext: str = 'csv', compress: bool = False, gene_names: bool = False): + logging.getLogger("PPanGGOLiN").info( + f"Done writing the gexf file : '{gexf.name}'" + ) + + +def write_matrix( + output: Path, + sep: str = ",", + ext: str = "csv", + compress: bool = False, + gene_names: bool = False, +): """ Write a csv file format as used by Roary, among others. The alternative gene ID will be the partition, if there is one @@ -377,25 +465,36 @@ def write_matrix(output: Path, sep: str = ',', ext: str = 'csv', compress: bool index_org = {} default_dat = [] for index, org in enumerate(pan.organisms): - default_dat.append('0') + default_dat.append("0") index_org[org] = index - matrix.write(sep.join(['"Gene"', # 1 - '"Non-unique Gene name"', # 2 - '"Annotation"', # 3 - '"No. isolates"', # 4 - '"No. sequences"', # 5 - '"Avg sequences per isolate"', # 6 - '"Accessory Fragment"', # 7 - '"Genome Fragment"', # 8 - '"Order within Fragment"', # 9 - '"Accessory Order with Fragment"', # 10 - '"QC"', # 11 - '"Min group size nuc"', # 12 - '"Max group size nuc"', # 13 - '"Avg group size nuc"'] # 14 - + ['"' + str(org) + '"' for org in pan.organisms]) + "\n") # 15 - default_genes = ['""'] * pan.number_of_organisms if gene_names else ["0"] * pan.number_of_organisms + matrix.write( + sep.join( + [ + '"Gene"', # 1 + '"Non-unique Gene name"', # 2 + '"Annotation"', # 3 + '"No. isolates"', # 4 + '"No. sequences"', # 5 + '"Avg sequences per isolate"', # 6 + '"Accessory Fragment"', # 7 + '"Genome Fragment"', # 8 + '"Order within Fragment"', # 9 + '"Accessory Order with Fragment"', # 10 + '"QC"', # 11 + '"Min group size nuc"', # 12 + '"Max group size nuc"', # 13 + '"Avg group size nuc"', + ] # 14 + + ['"' + str(org) + '"' for org in pan.organisms] + ) + + "\n" + ) # 15 + default_genes = ( + ['""'] * pan.number_of_organisms + if gene_names + else ["0"] * pan.number_of_organisms + ) org_index = pan.get_org_index() # should just return things for fam in pan.gene_families: genes = default_genes.copy() @@ -403,8 +502,11 @@ def write_matrix(output: Path, sep: str = ',', ext: str = 'csv', compress: bool genenames = Counter() product = Counter() for org, gene_list in fam.get_org_dict().items(): - genes[org_index[org]] = " ".join(['"' + str(gene) + - '"' for gene in gene_list]) if gene_names else str(len(gene_list)) + genes[org_index[org]] = ( + " ".join(['"' + str(gene) + '"' for gene in gene_list]) + if gene_names + else str(len(gene_list)) + ) for gene in gene_list: lis.append(gene.stop - gene.start) product[gene.product] += 1 @@ -416,22 +518,33 @@ def write_matrix(output: Path, sep: str = ',', ext: str = 'csv', compress: bool alt = str(product.most_common(1)[0][0]) lis = [gene.stop - gene.start for gene in fam.genes] - matrix.write(sep.join(['"' + fam.name + '"', # 1 - '"' + alt + '"', # 2 - '"' + str(product.most_common(1)[0][0]) + '"', # 3 - '"' + str(fam.number_of_organisms) + '"', # 4 - '"' + str(len(fam)) + '"', # 5 - '"' + str(round(len(fam) / fam.number_of_organisms, 2)) + '"', # 6 - '"NA"', # 7 - '"NA"', # 8 - '""', # 9 - '""', # 10 - '""', # 11 - '"' + str(min(lis)) + '"', # 12 - '"' + str(max(lis)) + '"', # 13 - '"' + str(round(sum(lis) / len(lis), 2)) + '"'] # 14 - + genes) + "\n") # 15 - logging.getLogger("PPanGGOLiN").info(f"Done writing the matrix : '{outname.as_posix()}'") + matrix.write( + sep.join( + [ + '"' + fam.name + '"', # 1 + '"' + alt + '"', # 2 + '"' + str(product.most_common(1)[0][0]) + '"', # 3 + '"' + str(fam.number_of_organisms) + '"', # 4 + '"' + str(len(fam)) + '"', # 5 + '"' + + str(round(len(fam) / fam.number_of_organisms, 2)) + + '"', # 6 + '"NA"', # 7 + '"NA"', # 8 + '""', # 9 + '""', # 10 + '""', # 11 + '"' + str(min(lis)) + '"', # 12 + '"' + str(max(lis)) + '"', # 13 + '"' + str(round(sum(lis) / len(lis), 2)) + '"', + ] # 14 + + genes + ) + + "\n" + ) # 15 + logging.getLogger("PPanGGOLiN").info( + f"Done writing the matrix : '{outname.as_posix()}'" + ) def write_gene_presence_absence(output: Path, compress: bool = False): @@ -447,11 +560,12 @@ def write_gene_presence_absence(output: Path, compress: bool = False): index_org = {} default_dat = [] for index, org in enumerate(pan.organisms): - default_dat.append('0') + default_dat.append("0") index_org[org] = index - matrix.write('\t'.join(['Gene'] + # 14 - [str(org) for org in pan.organisms]) + "\n") # 15 + matrix.write( + "\t".join(["Gene"] + [str(org) for org in pan.organisms]) + "\n" # 14 + ) # 15 default_genes = ["0"] * pan.number_of_organisms org_index = pan.get_org_index() # should just return things for fam in pan.gene_families: @@ -459,19 +573,22 @@ def write_gene_presence_absence(output: Path, compress: bool = False): for org in fam.organisms: genes[org_index[org]] = "1" - matrix.write('\t'.join([fam.name] # 14 - + genes) + "\n") # 15 - logging.getLogger("PPanGGOLiN").info(f"Done writing the gene presence absence file : '{outname.as_posix()}'") - - -def summarize_genome(organism: Organism, - pangenome_persistent_count: int, - pangenome_persistent_single_copy_families: Set[GeneFamily], - soft_core_families:Set[GeneFamily], - exact_core_families:Set[GeneFamily], - rgp_count: int, - spot_count: int, - module_count: int) -> Dict[str, any]: + matrix.write("\t".join([fam.name] + genes) + "\n") # 14 # 15 + logging.getLogger("PPanGGOLiN").info( + f"Done writing the gene presence absence file : '{outname.as_posix()}'" + ) + + +def summarize_genome( + organism: Organism, + pangenome_persistent_count: int, + pangenome_persistent_single_copy_families: Set[GeneFamily], + soft_core_families: Set[GeneFamily], + exact_core_families: Set[GeneFamily], + rgp_count: int, + spot_count: int, + module_count: int, +) -> Dict[str, any]: """ Summarizes genomic information of an organism. @@ -489,39 +606,51 @@ def summarize_genome(organism: Organism, partition_to_genes = organism.group_genes_by_partition() - persistent_gene_count = len(partition_to_genes['persistent']) - shell_gene_count = len(partition_to_genes['shell']) - cloud_gene_count = len(partition_to_genes['cloud']) + persistent_gene_count = len(partition_to_genes["persistent"]) + shell_gene_count = len(partition_to_genes["shell"]) + cloud_gene_count = len(partition_to_genes["cloud"]) gene_count = persistent_gene_count + shell_gene_count + cloud_gene_count - persistent_family_count = len({g.family for g in partition_to_genes['persistent']}) - shell_family_count = len({g.family for g in partition_to_genes['shell']}) - cloud_family_count = len({g.family for g in partition_to_genes['cloud']}) + persistent_family_count = len({g.family for g in partition_to_genes["persistent"]}) + shell_family_count = len({g.family for g in partition_to_genes["shell"]}) + cloud_family_count = len({g.family for g in partition_to_genes["cloud"]}) - persistent_fragmented_genes = {g for g in partition_to_genes['persistent'] if g.is_fragment} - shell_fragmented_genes = {g for g in partition_to_genes['shell'] if g.is_fragment} - cloud_fragmented_genes = {g for g in partition_to_genes['cloud'] if g.is_fragment} + persistent_fragmented_genes = { + g for g in partition_to_genes["persistent"] if g.is_fragment + } + shell_fragmented_genes = {g for g in partition_to_genes["shell"] if g.is_fragment} + cloud_fragmented_genes = {g for g in partition_to_genes["cloud"] if g.is_fragment} persistent_fragmented_genes_count = len(persistent_fragmented_genes) shell_fragmented_genes_count = len(shell_fragmented_genes) cloud_fragmented_genes_count = len(cloud_fragmented_genes) - fragmented_genes_count = persistent_fragmented_genes_count + shell_fragmented_genes_count + cloud_fragmented_genes_count + fragmented_genes_count = ( + persistent_fragmented_genes_count + + shell_fragmented_genes_count + + cloud_fragmented_genes_count + ) - persistent_fragmented_family_count = len({g.family for g in persistent_fragmented_genes}) + persistent_fragmented_family_count = len( + {g.family for g in persistent_fragmented_genes} + ) shell_fragmented_family_count = len({g.family for g in shell_fragmented_genes}) cloud_fragmented_family_count = len({g.family for g in cloud_fragmented_genes}) - families_with_fragment_count = persistent_fragmented_family_count + shell_fragmented_family_count + cloud_fragmented_family_count + families_with_fragment_count = ( + persistent_fragmented_family_count + + shell_fragmented_family_count + + cloud_fragmented_family_count + ) families_count = persistent_family_count + shell_family_count + cloud_family_count - completeness = "NA" if pangenome_persistent_count > 0: - completeness = round((persistent_family_count / pangenome_persistent_count) * 100, 2) - + completeness = round( + (persistent_family_count / pangenome_persistent_count) * 100, 2 + ) orgs_families_in_multicopy_by_part = defaultdict(set) for family in organism.families: @@ -529,24 +658,45 @@ def summarize_genome(organism: Organism, # the family has more than one gene in the genome orgs_families_in_multicopy_by_part[family.named_partition].add(family) - - orgs_persistent_families_in_multicopy_count = len(orgs_families_in_multicopy_by_part['persistent']) - orgs_shell_families_in_multicopy_count = len(orgs_families_in_multicopy_by_part['shell']) - orgs_cloud_families_in_multicopy_count = len(orgs_families_in_multicopy_by_part['cloud']) - - orgs_families_in_multicopy_count = orgs_persistent_families_in_multicopy_count + orgs_shell_families_in_multicopy_count + orgs_cloud_families_in_multicopy_count - - single_copy_families_found_in_multicopy_count = len(pangenome_persistent_single_copy_families & orgs_families_in_multicopy_by_part['persistent']) - contamination = 'NA' + orgs_persistent_families_in_multicopy_count = len( + orgs_families_in_multicopy_by_part["persistent"] + ) + orgs_shell_families_in_multicopy_count = len( + orgs_families_in_multicopy_by_part["shell"] + ) + orgs_cloud_families_in_multicopy_count = len( + orgs_families_in_multicopy_by_part["cloud"] + ) + + orgs_families_in_multicopy_count = ( + orgs_persistent_families_in_multicopy_count + + orgs_shell_families_in_multicopy_count + + orgs_cloud_families_in_multicopy_count + ) + + single_copy_families_found_in_multicopy_count = len( + pangenome_persistent_single_copy_families + & orgs_families_in_multicopy_by_part["persistent"] + ) + contamination = "NA" if len(pangenome_persistent_single_copy_families) > 0: - contamination = round(100 * single_copy_families_found_in_multicopy_count / len(pangenome_persistent_single_copy_families) , 2) - - fragmentation = 'NA' + contamination = round( + 100 + * single_copy_families_found_in_multicopy_count + / len(pangenome_persistent_single_copy_families), + 2, + ) + + fragmentation = "NA" if families_count > 0: fragmentation = round(100.0 * families_with_fragment_count / families_count, 2) - soft_core_genes = {gene for gene in organism.genes if gene.family in soft_core_families} - exact_core_genes = {gene for gene in organism.genes if gene.family in exact_core_families} + soft_core_genes = { + gene for gene in organism.genes if gene.family in soft_core_families + } + exact_core_genes = { + gene for gene in organism.genes if gene.family in exact_core_families + } soft_core_families_count = len({gene.family for gene in soft_core_genes}) exact_core_families_count = len({gene.family for gene in exact_core_genes}) @@ -561,41 +711,50 @@ def summarize_genome(organism: Organism, "Genes": gene_count, "Fragmented_genes": fragmented_genes_count, "Families": families_count, - "Families_with_fragments":families_with_fragment_count, + "Families_with_fragments": families_with_fragment_count, "Families_in_multicopy": orgs_families_in_multicopy_count, - "Soft_core": {"families":soft_core_families_count, - "genes": len(soft_core_genes) }, - 'Exact_core':{"families":exact_core_families_count, - "genes": len(exact_core_genes) }, + "Soft_core": { + "families": soft_core_families_count, + "genes": len(soft_core_genes), + }, + "Exact_core": { + "families": exact_core_families_count, + "genes": len(exact_core_genes), + }, "Persistent": { "genes": persistent_gene_count, "fragmented_genes": persistent_fragmented_genes_count, "families": persistent_family_count, "families_with_fragments": persistent_fragmented_family_count, - "families_in_multicopy": orgs_persistent_families_in_multicopy_count}, + "families_in_multicopy": orgs_persistent_families_in_multicopy_count, + }, "Shell": { "genes": shell_gene_count, "fragmented_genes": shell_fragmented_genes_count, "families": shell_family_count, "families_with_fragments": shell_fragmented_family_count, - "families_in_multicopy": orgs_shell_families_in_multicopy_count}, + "families_in_multicopy": orgs_shell_families_in_multicopy_count, + }, "Cloud": { "genes": cloud_gene_count, "fragmented_genes": cloud_fragmented_genes_count, "families": cloud_family_count, "families_with_fragments": cloud_fragmented_family_count, - "families_in_multicopy": orgs_cloud_families_in_multicopy_count}, + "families_in_multicopy": orgs_cloud_families_in_multicopy_count, + }, "Completeness": completeness, "Contamination": contamination, "Fragmentation": fragmentation, "RGPs": rgp_count, "Spots": spot_count, - "Modules": module_count + "Modules": module_count, } return summary_info -def write_persistent_duplication_statistics(pangenome: Pangenome, output: Path, dup_margin: float, compress: bool) -> Set[GeneFamily]: +def write_persistent_duplication_statistics( + pangenome: Pangenome, output: Path, dup_margin: float, compress: bool +) -> Set[GeneFamily]: """ Writes statistics on persistent duplications in gene families to a specified output file. @@ -606,13 +765,22 @@ def write_persistent_duplication_statistics(pangenome: Pangenome, output: Path, :return : """ - logging.getLogger("PPanGGOLiN").info("Writing statistics on persistent duplication...") + logging.getLogger("PPanGGOLiN").info( + "Writing statistics on persistent duplication..." + ) single_copy_persistent = set() # Could use bitarrays if speed is needed - with write_compressed_or_not(output / "mean_persistent_duplication.tsv", compress) as outfile: - fieldnames = ["persistent_family", "duplication_ratio", "mean_presence", "is_single_copy_marker"] - writer = csv.DictWriter(outfile, fieldnames=fieldnames, delimiter='\t') + with write_compressed_or_not( + output / "mean_persistent_duplication.tsv", compress + ) as outfile: + fieldnames = [ + "persistent_family", + "duplication_ratio", + "mean_presence", + "is_single_copy_marker", + ] + writer = csv.DictWriter(outfile, fieldnames=fieldnames, delimiter="\t") writer.writeheader() for fam in pangenome.gene_families: @@ -624,18 +792,26 @@ def write_persistent_duplication_statistics(pangenome: Pangenome, output: Path, if is_scm: single_copy_persistent.add(fam) - writer.writerow({ - "persistent_family": fam.name, - "duplication_ratio": round(dup_ratio, 3), - "mean_presence": round(mean_pres, 3), - "is_single_copy_marker": is_scm - }) + writer.writerow( + { + "persistent_family": fam.name, + "duplication_ratio": round(dup_ratio, 3), + "mean_presence": round(mean_pres, 3), + "is_single_copy_marker": is_scm, + } + ) logging.getLogger("PPanGGOLiN").info("Done writing stats on persistent duplication") return single_copy_persistent -def write_summaries_in_tsv(summaries: List[Dict[str, Any]], output_file: Path, - dup_margin:float, soft_core:float, compress:bool = False): + +def write_summaries_in_tsv( + summaries: List[Dict[str, Any]], + output_file: Path, + dup_margin: float, + soft_core: float, + compress: bool = False, +): """ Writes summaries of organisms stored in a dictionary into a Tab-Separated Values (TSV) file. @@ -656,9 +832,15 @@ def write_summaries_in_tsv(summaries: List[Dict[str, Any]], output_file: Path, flout.write(f"#duplication_margin={round(dup_margin, 3)}\n") # Write the DataFrame to a TSV file - df_summary.to_csv(flout, sep='\t', index=False) + df_summary.to_csv(flout, sep="\t", index=False) + -def write_stats(output: Path, soft_core: float = 0.95, dup_margin: float = 0.05, compress: bool = False): +def write_stats( + output: Path, + soft_core: float = 0.95, + dup_margin: float = 0.05, + compress: bool = False, +): """ Write pangenome statistics for each genomes @@ -671,43 +853,60 @@ def write_stats(output: Path, soft_core: float = 0.95, dup_margin: float = 0.05, """ logging.getLogger("PPanGGOLiN").info("Writing pangenome statistics...") - single_copy_persistent = write_persistent_duplication_statistics(pangenome=pan, output=output, - dup_margin=dup_margin, compress=compress) + single_copy_persistent = write_persistent_duplication_statistics( + pangenome=pan, output=output, dup_margin=dup_margin, compress=compress + ) - logging.getLogger("PPanGGOLiN").info("Writing genome per genome statistics (completeness and counts)...") + logging.getLogger("PPanGGOLiN").info( + "Writing genome per genome statistics (completeness and counts)..." + ) soft_core_families = pan.soft_core_families(soft_core) exact_core_families = pan.exact_core_families() - pangenome_persistent_single_copy_families = pan.get_single_copy_persistent_families(dup_margin = dup_margin, exclude_fragments=True) + pangenome_persistent_single_copy_families = pan.get_single_copy_persistent_families( + dup_margin=dup_margin, exclude_fragments=True + ) assert pangenome_persistent_single_copy_families == single_copy_persistent - pangenome_persistent_count = len([fam for fam in pan.gene_families if fam.named_partition == "persistent"]) + pangenome_persistent_count = len( + [fam for fam in pan.gene_families if fam.named_partition == "persistent"] + ) summaries = [] for organism in pan.organisms: - - rgp_count = organism.number_of_regions if pan.status["predictedRGP"] != "No" else None + rgp_count = ( + organism.number_of_regions if pan.status["predictedRGP"] != "No" else None + ) spot_count = organism.number_of_spots if pan.status["spots"] != "No" else None - module_count = organism.number_of_modules if pan.status["modules"] != "No" else None - - organism_summary = summarize_genome(organism=organism, - pangenome_persistent_count=pangenome_persistent_count, - pangenome_persistent_single_copy_families=pangenome_persistent_single_copy_families, - soft_core_families=soft_core_families, - exact_core_families=exact_core_families, - rgp_count=rgp_count, - spot_count=spot_count, - module_count=module_count) + module_count = ( + organism.number_of_modules if pan.status["modules"] != "No" else None + ) + + organism_summary = summarize_genome( + organism=organism, + pangenome_persistent_count=pangenome_persistent_count, + pangenome_persistent_single_copy_families=pangenome_persistent_single_copy_families, + soft_core_families=soft_core_families, + exact_core_families=exact_core_families, + rgp_count=rgp_count, + spot_count=spot_count, + module_count=module_count, + ) summaries.append(organism_summary) - write_summaries_in_tsv(summaries, output_file= output / "genomes_statistics.tsv", dup_margin=dup_margin, soft_core=soft_core, compress=compress) + write_summaries_in_tsv( + summaries, + output_file=output / "genomes_statistics.tsv", + dup_margin=dup_margin, + soft_core=soft_core, + compress=compress, + ) logging.getLogger("PPanGGOLiN").info("Done writing genome per genome statistics") - def write_partitions(output: Path, soft_core: float = 0.95): """ Write the list of gene families for each partition @@ -715,14 +914,23 @@ def write_partitions(output: Path, soft_core: float = 0.95): :param output: Path to output directory :param soft_core: Soft core threshold to use """ - logging.getLogger("PPanGGOLiN").info("Writing the list of gene families for each partition ...") + logging.getLogger("PPanGGOLiN").info( + "Writing the list of gene families for each partition ..." + ) if not os.path.exists(output / "partitions"): os.makedirs(output / "partitions") part_sets = defaultdict(set) # initializing key, value pairs so that files exist even if they are empty - for needed_key in ["soft_core", "exact_core", "exact_accessory", - "soft_accessory", "persistent", "shell", "cloud"]: + for needed_key in [ + "soft_core", + "exact_core", + "exact_accessory", + "soft_accessory", + "persistent", + "shell", + "cloud", + ]: part_sets[needed_key] = set() for fam in pan.gene_families: @@ -745,12 +953,16 @@ def write_partitions(output: Path, soft_core: float = 0.95): for key, val in part_sets.items(): with open(output / f"partitions/{key}.txt", "w") as curr_key_file: if len(val) > 0: - curr_key_file.write('\n'.join(val) + "\n") + curr_key_file.write("\n".join(val) + "\n") - logging.getLogger("PPanGGOLiN").info("Done writing the list of gene families for each partition") + logging.getLogger("PPanGGOLiN").info( + "Done writing the list of gene families for each partition" + ) -def write_gene_families_tsv(output: Path, compress: bool = False, disable_bar: bool = False): +def write_gene_families_tsv( + output: Path, compress: bool = False, disable_bar: bool = False +): """ Write the file providing the association between genes and gene families @@ -759,22 +971,47 @@ def write_gene_families_tsv(output: Path, compress: bool = False, disable_bar: b :param disable_bar: Flag to disable progress bar """ logging.getLogger("PPanGGOLiN").info( - "Writing the file providing the association between genes and gene families...") + "Writing the file providing the association between genes and gene families..." + ) outname = output / f"gene_families.tsv{'.gz' if compress else ''}" out_list = [] - for fam in tqdm(pan.gene_families, total=pan.number_of_gene_families, unit='family', disable=disable_bar): + for fam in tqdm( + pan.gene_families, + total=pan.number_of_gene_families, + unit="family", + disable=disable_bar, + ): for gene in fam.genes: - out_list.append([fam.name, gene.ID, gene.local_identifier, "F" if gene.is_fragment else ""]) + out_list.append( + [ + fam.name, + gene.ID, + gene.local_identifier, + "F" if gene.is_fragment else "", + ] + ) out_df = pd.DataFrame(out_list, columns=["GeneFam", "Gene", "local_id", "is_frag"]) - out_df["count"] = out_df.groupby("GeneFam")["GeneFam"].transform('count') - out_df = out_df.sort_values(by=["count", "Gene", "local_id", "is_frag"], ascending=[False, True, True, True]) - out_df = out_df.drop(columns=['count']) - out_df.to_csv(outname, sep="\t", index=False, header=False, compression='infer' if compress else None) - logging.getLogger("PPanGGOLiN").info("Done writing the file providing the association between genes and " - f"gene families: '{outname}'") + out_df["count"] = out_df.groupby("GeneFam")["GeneFam"].transform("count") + out_df = out_df.sort_values( + by=["count", "Gene", "local_id", "is_frag"], ascending=[False, True, True, True] + ) + out_df = out_df.drop(columns=["count"]) + out_df.to_csv( + outname, + sep="\t", + index=False, + header=False, + compression="infer" if compress else None, + ) + logging.getLogger("PPanGGOLiN").info( + "Done writing the file providing the association between genes and " + f"gene families: '{outname}'" + ) -def summarize_spots(spots: set, output: Path, compress: bool = False, file_name="summarize_spots.tsv"): +def summarize_spots( + spots: set, output: Path, compress: bool = False, file_name="summarize_spots.tsv" +): """ Write a file providing summarize information about hotspots @@ -788,12 +1025,13 @@ def r_and_s(value: float): """rounds to dp figures and returns a str of the provided value""" return str(round(value, 3)) if isinstance(value, float) else str(value) - file_path = output / file_name with write_compressed_or_not(file_path, compress) as fout: - fout.write("spot\tnb_rgp\tnb_families\tnb_unique_family_sets\tmean_nb_genes\t" - "stdev_nb_genes\tmax_nb_genes\tmin_nb_genes\n") + fout.write( + "spot\tnb_rgp\tnb_families\tnb_unique_family_sets\tmean_nb_genes\t" + "stdev_nb_genes\tmax_nb_genes\tmin_nb_genes\n" + ) for spot in sorted(spots, key=lambda x: len(x), reverse=True): tot_fams = set() len_uniq_content = len(spot.get_uniq_content()) @@ -805,8 +1043,24 @@ def r_and_s(value: float): stdev_size = stdev(size_list) if len(size_list) > 1 else 0 max_size = max(size_list) min_size = min(size_list) - fout.write("\t".join(map(r_and_s, [f"{str(spot)}", len(spot), len(tot_fams), len_uniq_content, - mean_size, stdev_size, max_size, min_size])) + "\n") + fout.write( + "\t".join( + map( + r_and_s, + [ + f"{str(spot)}", + len(spot), + len(tot_fams), + len_uniq_content, + mean_size, + stdev_size, + max_size, + min_size, + ], + ) + ) + + "\n" + ) logging.getLogger("PPanGGOLiN").info(f"Done writing spots in '{file_path}'") @@ -821,9 +1075,7 @@ def write_regions(output: Path, compress: bool = False): write_rgp_table(pan.regions, output, compress) - -def write_rgp_table(regions: Set[Region], - output: Path, compress: bool = False): +def write_rgp_table(regions: Set[Region], output: Path, compress: bool = False): """ Write the file providing information about regions of genomic plasticity. @@ -833,14 +1085,25 @@ def write_rgp_table(regions: Set[Region], """ fname = output / "regions_of_genomic_plasticity.tsv" with write_compressed_or_not(fname, compress) as tab: - fieldnames = ["region", "genome", "contig", "genes", "first_gene", "last_gene", - "start", "stop", "length", "coordinates", "contigBorder", "wholeContig"] - - writer = csv.DictWriter(tab, fieldnames=fieldnames, delimiter='\t') + fieldnames = [ + "region", + "genome", + "contig", + "genes", + "first_gene", + "last_gene", + "start", + "stop", + "length", + "coordinates", + "contigBorder", + "wholeContig", + ] + + writer = csv.DictWriter(tab, fieldnames=fieldnames, delimiter="\t") writer.writeheader() - regions = sorted(regions, key=lambda x: ( - x.organism.name, x.contig.name, x.ID)) + regions = sorted(regions, key=lambda x: (x.organism.name, x.contig.name, x.ID)) for region in regions: row = { @@ -855,7 +1118,7 @@ def write_rgp_table(regions: Set[Region], "length": region.length, "coordinates": region.string_coordinates(), "contigBorder": region.is_contig_border, - "wholeContig": region.is_whole_contig + "wholeContig": region.is_whole_contig, } writer.writerow(row) @@ -875,7 +1138,7 @@ def spot2rgp(spots: set, output: Path, compress: bool = False): def write_spots(output: Path, compress: bool = False): - """ Write tsv files providing spots information and association with RGP + """Write tsv files providing spots information and association with RGP :param output: Path to output directory :param compress: Compress the file in .gz @@ -905,7 +1168,9 @@ def write_borders(output: Path, dup_margin: float = 0.05, compress: bool = False all_fams |= set(border[1]) fout.write(f"{spot.ID}\t{c}\t{famstring1}\t{famstring2}\n") - with write_compressed_or_not(output / "border_protein_genes.fasta", compress) as fout: + with write_compressed_or_not( + output / "border_protein_genes.fasta", compress + ) as fout: for fam in all_fams: fout.write(f">{fam.name}\n") fout.write(f"{fam.sequence}\n") @@ -920,7 +1185,9 @@ def write_module_summary(output: Path, compress: bool = False): """ logging.getLogger("PPanGGOLiN").info("Writing functional modules summary...") with write_compressed_or_not(output / "modules_summary.tsv", compress) as fout: - fout.write("module_id\tnb_families\tnb_genomes\tpartition\tmean_number_of_occurrence\n") + fout.write( + "module_id\tnb_families\tnb_genomes\tpartition\tmean_number_of_occurrence\n" + ) for mod in pan.modules: org_dict = defaultdict(set) partition_counter = Counter() @@ -930,10 +1197,13 @@ def write_module_summary(output: Path, compress: bool = False): org_dict[gene.organism].add(gene) fout.write( f"module_{mod.ID}\t{len(mod)}\t{len(org_dict)}\t{partition_counter.most_common(1)[0][0]}\t" - f"{round((sum([len(genes) for genes in org_dict.values()]) / len(org_dict)) / len(mod), 3)}\n") + f"{round((sum([len(genes) for genes in org_dict.values()]) / len(org_dict)) / len(mod), 3)}\n" + ) fout.close() - logging.getLogger("PPanGGOLiN").info(f"Done writing module summary: '{output.as_posix() + '/modules_summary.tsv'}'") + logging.getLogger("PPanGGOLiN").info( + f"Done writing module summary: '{output.as_posix() + '/modules_summary.tsv'}'" + ) def write_modules(output: Path, compress: bool = False): @@ -951,7 +1221,8 @@ def write_modules(output: Path, compress: bool = False): fout.close() logging.getLogger("PPanGGOLiN").info( - f"Done writing functional modules to: '{output.as_posix() + '/functional_modules.tsv'}'") + f"Done writing functional modules to: '{output.as_posix() + '/functional_modules.tsv'}'" + ) def write_org_modules(output: Path, compress: bool = False): @@ -972,7 +1243,8 @@ def write_org_modules(output: Path, compress: bool = False): fout.write(f"module_{mod.ID}\t{org.name}\t{completion:.2}\n") fout.close() logging.getLogger("PPanGGOLiN").info( - f"Done writing modules to genomes associations to: '{output.as_posix() + '/modules_in_genomes.tsv'}'") + f"Done writing modules to genomes associations to: '{output.as_posix() + '/modules_in_genomes.tsv'}'" + ) def write_spot_modules(output: Path, compress: bool = False): @@ -1000,7 +1272,8 @@ def write_spot_modules(output: Path, compress: bool = False): fout.write(f"module_{module.ID}\tspot_{spot.ID}\n") logging.getLogger("PPanGGOLiN").info( - f"Done writing module to spot associations to: {output.as_posix() + '/modules_spots.tsv'}") + f"Done writing module to spot associations to: {output.as_posix() + '/modules_spots.tsv'}" + ) def write_rgp_modules(output: Path, compress: bool = False): @@ -1040,21 +1313,39 @@ def write_rgp_modules(output: Path, compress: bool = False): myspot = region2spot.get(region) if myspot is not None: spot_list.add(region2spot[region]) - lists.write(f"{regions[0].name}\t{len(spot_list)}\t{','.join(['module_' + str(mod.ID) for mod in mod_list])}\t" - f"{','.join([reg.name for reg in regions])}\n") + lists.write( + f"{regions[0].name}\t{len(spot_list)}\t{','.join(['module_' + str(mod.ID) for mod in mod_list])}\t" + f"{','.join([reg.name for reg in regions])}\n" + ) lists.close() logging.getLogger("PPanGGOLiN").info( - f"RGP and associated modules are listed in : {output.as_posix() + '/modules_RGP_lists.tsv'}") - - -def write_pangenome_flat_files(pangenome: Pangenome, output: Path, cpu: int = 1, soft_core: float = 0.95, - dup_margin: float = 0.05, csv: bool = False, gene_pa: bool = False, gexf: bool = False, - light_gexf: bool = False, - stats: bool = False, json: bool = False, - partitions: bool = False, families_tsv: bool = False, regions: bool = False, spots: bool = False, - borders: bool = False, modules: bool = False, spot_modules: bool = False, compress: bool = False, - disable_bar: bool = False): + f"RGP and associated modules are listed in : {output.as_posix() + '/modules_RGP_lists.tsv'}" + ) + + +def write_pangenome_flat_files( + pangenome: Pangenome, + output: Path, + cpu: int = 1, + soft_core: float = 0.95, + dup_margin: float = 0.05, + csv: bool = False, + gene_pa: bool = False, + gexf: bool = False, + light_gexf: bool = False, + stats: bool = False, + json: bool = False, + partitions: bool = False, + families_tsv: bool = False, + regions: bool = False, + spots: bool = False, + borders: bool = False, + modules: bool = False, + spot_modules: bool = False, + compress: bool = False, + disable_bar: bool = False, +): """ Main function to write flat files from pangenome @@ -1080,8 +1371,24 @@ def write_pangenome_flat_files(pangenome: Pangenome, output: Path, cpu: int = 1, :param disable_bar: Disable progress bar """ # TODO Add force parameter to check if output already exist - if not any(x for x in [csv, gene_pa, gexf, light_gexf, stats, json, partitions, spots, borders, - families_tsv, modules, spot_modules, regions]): + if not any( + x + for x in [ + csv, + gene_pa, + gexf, + light_gexf, + stats, + json, + partitions, + spots, + borders, + families_tsv, + modules, + spot_modules, + regions, + ] + ): raise Exception("You did not indicate what file you wanted to write.") processes = [] @@ -1099,8 +1406,21 @@ def write_pangenome_flat_files(pangenome: Pangenome, output: Path, cpu: int = 1, pan = pangenome - if csv or gene_pa or gexf or light_gexf or stats or json or partitions or spots or \ - families_tsv or borders or modules or spot_modules or regions: + if ( + csv + or gene_pa + or gexf + or light_gexf + or stats + or json + or partitions + or spots + or families_tsv + or borders + or modules + or spot_modules + or regions + ): needAnnotations = True needFamilies = True if stats or partitions or spots or borders: @@ -1122,41 +1442,81 @@ def write_pangenome_flat_files(pangenome: Pangenome, output: Path, cpu: int = 1, if modules or spot_modules: # or projection: needModules = True - check_pangenome_info(pangenome, need_annotations=needAnnotations, need_families=needFamilies, need_graph=needGraph, - need_partitions=needPartitions, need_rgp=needRegions, need_spots=needSpots, - need_modules=needModules, need_metadata=needMetadata, metatypes=[metatype], sources=None, - disable_bar=disable_bar) + check_pangenome_info( + pangenome, + need_annotations=needAnnotations, + need_families=needFamilies, + need_graph=needGraph, + need_partitions=needPartitions, + need_rgp=needRegions, + need_spots=needSpots, + need_modules=needModules, + need_metadata=needMetadata, + metatypes=[metatype], + sources=None, + disable_bar=disable_bar, + ) pan.get_org_index() # make the index because it will be used most likely - with get_context('fork').Pool(processes=cpu) as p: + with get_context("fork").Pool(processes=cpu) as p: if csv: - processes.append(p.apply_async(func=write_matrix, args=(output, ',', "csv", compress, True))) + processes.append( + p.apply_async( + func=write_matrix, args=(output, ",", "csv", compress, True) + ) + ) if gene_pa: - processes.append(p.apply_async(func=write_gene_presence_absence, args=(output, compress))) + processes.append( + p.apply_async(func=write_gene_presence_absence, args=(output, compress)) + ) if gexf: - processes.append(p.apply_async(func=write_gexf, args=(output, False, compress))) + processes.append( + p.apply_async(func=write_gexf, args=(output, False, compress)) + ) if light_gexf: - processes.append(p.apply_async(func=write_gexf, args=(output, True, compress))) + processes.append( + p.apply_async(func=write_gexf, args=(output, True, compress)) + ) if stats: - processes.append(p.apply_async(func=write_stats, args=(output, soft_core, dup_margin, compress))) + processes.append( + p.apply_async( + func=write_stats, args=(output, soft_core, dup_margin, compress) + ) + ) if json: processes.append(p.apply_async(func=write_json, args=(output, compress))) if partitions: - processes.append(p.apply_async(func=write_partitions, args=(output, soft_core))) + processes.append( + p.apply_async(func=write_partitions, args=(output, soft_core)) + ) if families_tsv: - processes.append(p.apply_async(func=write_gene_families_tsv, args=(output, compress, disable_bar))) + processes.append( + p.apply_async( + func=write_gene_families_tsv, args=(output, compress, disable_bar) + ) + ) if spots: processes.append(p.apply_async(func=write_spots, args=(output, compress))) if regions: processes.append(p.apply_async(func=write_regions, args=(output, compress))) if borders: - processes.append(p.apply_async(func=write_borders, args=(output, dup_margin, compress))) + processes.append( + p.apply_async(func=write_borders, args=(output, dup_margin, compress)) + ) if modules: processes.append(p.apply_async(func=write_modules, args=(output, compress))) - processes.append(p.apply_async(func=write_module_summary, args=(output, compress))) - processes.append(p.apply_async(func=write_org_modules, args=(output, compress))) + processes.append( + p.apply_async(func=write_module_summary, args=(output, compress)) + ) + processes.append( + p.apply_async(func=write_org_modules, args=(output, compress)) + ) if spot_modules: - processes.append(p.apply_async(func=write_spot_modules, args=(output, compress))) - processes.append(p.apply_async(func=write_rgp_modules, args=(output, compress))) + processes.append( + p.apply_async(func=write_spot_modules, args=(output, compress)) + ) + processes.append( + p.apply_async(func=write_rgp_modules, args=(output, compress)) + ) for process in processes: process.get() # get all the results @@ -1171,11 +1531,28 @@ def launch(args: argparse.Namespace): mk_outdir(args.output, args.force) global pan pan.add_file(args.pangenome) - write_pangenome_flat_files(pan, args.output, cpu=args.cpu, soft_core=args.soft_core, dup_margin=args.dup_margin, csv=args.csv, - gene_pa=args.Rtab, gexf=args.gexf, light_gexf=args.light_gexf, - stats=args.stats, json=args.json, partitions=args.partitions, - families_tsv=args.families_tsv, regions=args.regions, spots=args.spots, borders=args.borders, modules=args.modules, - spot_modules=args.spot_modules, compress=args.compress, disable_bar=args.disable_prog_bar) + write_pangenome_flat_files( + pan, + args.output, + cpu=args.cpu, + soft_core=args.soft_core, + dup_margin=args.dup_margin, + csv=args.csv, + gene_pa=args.Rtab, + gexf=args.gexf, + light_gexf=args.light_gexf, + stats=args.stats, + json=args.json, + partitions=args.partitions, + families_tsv=args.families_tsv, + regions=args.regions, + spots=args.spots, + borders=args.borders, + modules=args.modules, + spot_modules=args.spot_modules, + compress=args.compress, + disable_bar=args.disable_prog_bar, + ) def subparser(sub_parser: argparse._SubParsersAction) -> argparse.ArgumentParser: @@ -1186,7 +1563,9 @@ def subparser(sub_parser: argparse._SubParsersAction) -> argparse.ArgumentParser :return : parser arguments for align command """ - parser = sub_parser.add_parser("write_pangenome", formatter_class=argparse.RawTextHelpFormatter) + parser = sub_parser.add_parser( + "write_pangenome", formatter_class=argparse.RawTextHelpFormatter + ) parser_flat(parser) return parser @@ -1197,65 +1576,150 @@ def parser_flat(parser: argparse.ArgumentParser): :param parser: parser for align argument """ - required = parser.add_argument_group(title="Required arguments", - description="One of the following arguments is required :") - required.add_argument('-p', '--pangenome', required=False, type=Path, help="The pangenome .h5 file") - required.add_argument('-o', '--output', required=True, type=Path, - help="Output directory where the file(s) will be written") + required = parser.add_argument_group( + title="Required arguments", + description="One of the following arguments is required :", + ) + required.add_argument( + "-p", "--pangenome", required=False, type=Path, help="The pangenome .h5 file" + ) + required.add_argument( + "-o", + "--output", + required=True, + type=Path, + help="Output directory where the file(s) will be written", + ) optional = parser.add_argument_group(title="Optional arguments") - optional.add_argument("--soft_core", required=False, type=restricted_float, default=0.95, - help="Soft core threshold to use") - - optional.add_argument("--dup_margin", required=False, type=restricted_float, default=0.05, - help="minimum ratio of genomes in which the family must have multiple genes " - "for it to be considered 'duplicated'") - - - optional.add_argument("--gexf", required=False, action="store_true", - help="write a gexf file with all the annotations and all the genes of each gene family") - optional.add_argument("--light_gexf", required=False, action="store_true", - help="write a gexf file with the gene families and basic information about them") - - optional.add_argument("--json", required=False, action="store_true", help="Writes the graph in a json file format") - - optional.add_argument("--csv", required=False, action="store_true", - help="csv file format as used by Roary, among others. " - "The alternative gene ID will be the partition, if there is one") - optional.add_argument("--Rtab", required=False, action="store_true", - help="tabular file for the gene binary presence absence matrix") - - optional.add_argument("--stats", required=False, action="store_true", - help="tsv files with some statistics for each each gene family") - - optional.add_argument("--partitions", required=False, action="store_true", - help="list of families belonging to each partition, with one file per partitions and " - "one family per line") - - optional.add_argument("--families_tsv", required=False, action="store_true", - help="Write a tsv file providing the association between genes and gene families") - - optional.add_argument("--regions", required=False, action="store_true", - help="Writes the predicted RGP and descriptive metrics in 'plastic_regions.tsv'") - optional.add_argument("--spots", required=False, action="store_true", - help="Write spot summary and a list of all RGP in each spot") - optional.add_argument("--borders", required=False, action="store_true", help="List all borders of each spot") - optional.add_argument("--modules", required=False, action="store_true", - help="Write a tsv file listing functional modules and the families that belong to them") - optional.add_argument("--spot_modules", required=False, action="store_true", - help="writes 2 files comparing the presence of modules within spots") - - optional.add_argument("--compress", required=False, action="store_true", help="Compress the files in .gz") - optional.add_argument("-c", "--cpu", required=False, default=1, type=int, help="Number of available cpus") - - -if __name__ == '__main__': + optional.add_argument( + "--soft_core", + required=False, + type=restricted_float, + default=0.95, + help="Soft core threshold to use", + ) + + optional.add_argument( + "--dup_margin", + required=False, + type=restricted_float, + default=0.05, + help="minimum ratio of genomes in which the family must have multiple genes " + "for it to be considered 'duplicated'", + ) + + optional.add_argument( + "--gexf", + required=False, + action="store_true", + help="write a gexf file with all the annotations and all the genes of each gene family", + ) + optional.add_argument( + "--light_gexf", + required=False, + action="store_true", + help="write a gexf file with the gene families and basic information about them", + ) + + optional.add_argument( + "--json", + required=False, + action="store_true", + help="Writes the graph in a json file format", + ) + + optional.add_argument( + "--csv", + required=False, + action="store_true", + help="csv file format as used by Roary, among others. " + "The alternative gene ID will be the partition, if there is one", + ) + optional.add_argument( + "--Rtab", + required=False, + action="store_true", + help="tabular file for the gene binary presence absence matrix", + ) + + optional.add_argument( + "--stats", + required=False, + action="store_true", + help="tsv files with some statistics for each each gene family", + ) + + optional.add_argument( + "--partitions", + required=False, + action="store_true", + help="list of families belonging to each partition, with one file per partitions and " + "one family per line", + ) + + optional.add_argument( + "--families_tsv", + required=False, + action="store_true", + help="Write a tsv file providing the association between genes and gene families", + ) + + optional.add_argument( + "--regions", + required=False, + action="store_true", + help="Writes the predicted RGP and descriptive metrics in 'plastic_regions.tsv'", + ) + optional.add_argument( + "--spots", + required=False, + action="store_true", + help="Write spot summary and a list of all RGP in each spot", + ) + optional.add_argument( + "--borders", + required=False, + action="store_true", + help="List all borders of each spot", + ) + optional.add_argument( + "--modules", + required=False, + action="store_true", + help="Write a tsv file listing functional modules and the families that belong to them", + ) + optional.add_argument( + "--spot_modules", + required=False, + action="store_true", + help="writes 2 files comparing the presence of modules within spots", + ) + + optional.add_argument( + "--compress", + required=False, + action="store_true", + help="Compress the files in .gz", + ) + optional.add_argument( + "-c", + "--cpu", + required=False, + default=1, + type=int, + help="Number of available cpus", + ) + + +if __name__ == "__main__": """To test local change and allow using debugger""" from ppanggolin.utils import set_verbosity_level, add_common_arguments main_parser = argparse.ArgumentParser( description="Depicting microbial species diversity via a Partitioned PanGenome Graph Of Linked Neighbors", - formatter_class=argparse.RawTextHelpFormatter) + formatter_class=argparse.RawTextHelpFormatter, + ) parser_flat(main_parser) add_common_arguments(main_parser) diff --git a/ppanggolin/formats/writeMSA.py b/ppanggolin/formats/writeMSA.py index c4b37414..50bf9925 100644 --- a/ppanggolin/formats/writeMSA.py +++ b/ppanggolin/formats/writeMSA.py @@ -21,8 +21,13 @@ from ppanggolin.genetic_codes import genetic_codes -def get_families_to_write(pangenome: Pangenome, partition_filter: str = "core", soft_core: float = 0.95, - dup_margin: float = 0.95, single_copy: bool = True) -> Set[GeneFamily]: +def get_families_to_write( + pangenome: Pangenome, + partition_filter: str = "core", + soft_core: float = 0.95, + dup_margin: float = 0.95, + single_copy: bool = True, +) -> Set[GeneFamily]: """ Get families corresponding to the given partition @@ -43,7 +48,9 @@ def get_families_to_write(pangenome: Pangenome, partition_filter: str = "core", for family in pangenome.gene_families: if family.named_partition == partition_filter: if single_copy: - if family.is_single_copy(dup_margin=dup_margin, exclude_fragment=True): + if family.is_single_copy( + dup_margin=dup_margin, exclude_fragment=True + ): families.add(family) else: families.add(family) @@ -52,7 +59,9 @@ def get_families_to_write(pangenome: Pangenome, partition_filter: str = "core", for family in pangenome.gene_families: if family.number_of_organisms == nb_org: if single_copy: - if family.is_single_copy(dup_margin=dup_margin, exclude_fragment=False): + if family.is_single_copy( + dup_margin=dup_margin, exclude_fragment=False + ): families.add(family) else: families.add(family) @@ -60,7 +69,9 @@ def get_families_to_write(pangenome: Pangenome, partition_filter: str = "core", for family in pangenome.gene_families: if family.number_of_organisms < nb_org: if single_copy: - if family.is_single_copy(dup_margin=dup_margin, exclude_fragment=False): + if family.is_single_copy( + dup_margin=dup_margin, exclude_fragment=False + ): families.add(family) else: families.add(family) @@ -68,7 +79,9 @@ def get_families_to_write(pangenome: Pangenome, partition_filter: str = "core", for family in pangenome.gene_families: if family.number_of_organisms >= nb_org * soft_core: if single_copy: - if family.is_single_copy(dup_margin=dup_margin, exclude_fragment=False): + if family.is_single_copy( + dup_margin=dup_margin, exclude_fragment=False + ): families.add(family) else: families.add(family) @@ -92,20 +105,26 @@ def translate(gene: Gene, code: Dict[str, Dict[str, str]]) -> Tuple[str, bool]: partial = True msg = ( f"Gene {gene.ID} {'' if gene.local_identifier == '' else 'with local identifier ' + gene.local_identifier}" - f" has a sequence length of {len(gene.dna)} which modulo 3 was different than 0.") + f" has a sequence length of {len(gene.dna)} which modulo 3 was different than 0." + ) logging.getLogger("PPANGGOLIN").debug(msg) - protein = start_table[gene.dna[0: 3]] + protein = start_table[gene.dna[0:3]] for i in range(3, len(gene.dna) - mod, 3): - codon = gene.dna[i: i + 3] + codon = gene.dna[i : i + 3] try: protein += table[codon] except KeyError: # codon was not planned for. Probably can't determine it. - protein += 'X' # X is for unknown + protein += "X" # X is for unknown return protein, partial -def write_fasta_families(family: GeneFamily, tmpdir: tempfile.TemporaryDirectory, code_table: Dict[str, Dict[str, str]], - source: str = 'protein', use_gene_id: bool = False) -> Tuple[Path, bool]: +def write_fasta_families( + family: GeneFamily, + tmpdir: tempfile.TemporaryDirectory, + code_table: Dict[str, Dict[str, str]], + source: str = "protein", + use_gene_id: bool = False, +) -> Tuple[Path, bool]: """Write fasta files for each gene family :param family: gene family to write @@ -134,14 +153,16 @@ def write_fasta_families(family: GeneFamily, tmpdir: tempfile.TemporaryDirectory else: f_obj.write(f">{gene.organism.name}\n") if source == "dna": - f_obj.write(gene.dna + '\n') + f_obj.write(gene.dna + "\n") elif source == "protein": protein, part = translate(gene, code_table) if not partial: partial = part f_obj.write(protein + "\n") else: - raise ValueError(f"Unknown sequence source '{source}' provided. Expected 'dna' or 'protein'.") + raise ValueError( + f"Unknown sequence source '{source}' provided. Expected 'dna' or 'protein'." + ) return f_name, partial @@ -161,7 +182,7 @@ def launch_mafft(fname: Path, output: Path, fam_name: str): def launch_multi_mafft(args: List[Tuple[Path, Path, str]]): - """ Allow to launch mafft in multiprocessing + """Allow to launch mafft in multiprocessing :param args: Pack of argument for launch_mafft @@ -170,8 +191,16 @@ def launch_multi_mafft(args: List[Tuple[Path, Path, str]]): launch_mafft(*args) -def compute_msa(families: Set[GeneFamily], output: Path, tmpdir: Path, cpu: int = 1, source: str = "protein", - use_gene_id: bool = False, code: str = "11", disable_bar: bool = False): +def compute_msa( + families: Set[GeneFamily], + output: Path, + tmpdir: Path, + cpu: int = 1, + source: str = "protein", + use_gene_id: bool = False, + code: str = "11", + disable_bar: bool = False, +): """ Compute MSA between pangenome gene families @@ -194,25 +223,34 @@ def compute_msa(families: Set[GeneFamily], output: Path, tmpdir: Path, cpu: int partial = False for family in tqdm(families, unit="family", disable=disable_bar): start_write = time.time() - fname, part = write_fasta_families(family, newtmpdir, code_table, source, use_gene_id) + fname, part = write_fasta_families( + family, newtmpdir, code_table, source, use_gene_id + ) if not partial: partial = part write_total = write_total + (time.time() - start_write) args.append((fname, output, family.name)) if partial: - logging.getLogger("PPanGGOLiN").warning("Partial gene was found during translation. " - "Last nucleotides were removed to translate. " - "Use --verbose 2 to see genes that are partial") + logging.getLogger("PPanGGOLiN").warning( + "Partial gene was found during translation. " + "Last nucleotides were removed to translate. " + "Use --verbose 2 to see genes that are partial" + ) logging.getLogger("PPanGGOLiN").info("Computing the MSA ...") - with get_context('fork').Pool(cpu) as p: + with get_context("fork").Pool(cpu) as p: with tqdm(total=len(families), unit="family", disable=disable_bar) as bar: for _ in p.imap_unordered(launch_multi_mafft, args): bar.update() -def write_whole_genome_msa(pangenome: Pangenome, families: set, phylo_name: Path, outdir: Path, - use_gene_id: bool = False): +def write_whole_genome_msa( + pangenome: Pangenome, + families: set, + phylo_name: Path, + outdir: Path, + use_gene_id: bool = False, +): """ Writes a whole genome msa file for additional phylogenetic analysis @@ -238,7 +276,7 @@ def write_whole_genome_msa(pangenome: Pangenome, families: set, phylo_name: Path curr_phylo_dict = {} for line in fin: - if line.startswith('>'): + if line.startswith(">"): # Save sequence of previous record if genome_id != "": if genome_id in observed_genomes: @@ -267,7 +305,9 @@ def write_whole_genome_msa(pangenome: Pangenome, families: set, phylo_name: Path observed_genomes.add(genome_id) # write gaps for all missing genomes - missing_genomes = [g for g in set(phylo_dict.keys()) if g not in observed_genomes] + missing_genomes = [ + g for g in set(phylo_dict.keys()) if g not in observed_genomes + ] for genome in missing_genomes: curr_phylo_dict[genome] = "-" * curr_len @@ -280,10 +320,22 @@ def write_whole_genome_msa(pangenome: Pangenome, families: set, phylo_name: Path fout.write(val + "\n") -def write_msa_files(pangenome: Pangenome, output: Path, cpu: int = 1, partition: str = "core", tmpdir: Path = None, - source: str = "protein", soft_core: float = 0.95, phylo: bool = False, use_gene_id: bool = False, - translation_table: str = "11", dup_margin: float = 0.95, single_copy: bool = True, - force: bool = False, disable_bar: bool = False): +def write_msa_files( + pangenome: Pangenome, + output: Path, + cpu: int = 1, + partition: str = "core", + tmpdir: Path = None, + source: str = "protein", + soft_core: float = 0.95, + phylo: bool = False, + use_gene_id: bool = False, + translation_table: str = "11", + dup_margin: float = 0.95, + single_copy: bool = True, + force: bool = False, + disable_bar: bool = False, +): """ Main function to write MSA files @@ -311,22 +363,47 @@ def write_msa_files(pangenome: Pangenome, output: Path, cpu: int = 1, partition: outdir = output / f"msa_{partition}_{source}/" mk_outdir(outdir, force=force) - check_pangenome_info(pangenome, need_annotations=True, need_families=True, need_partitions=need_partitions, - need_gene_sequences=True, disable_bar=disable_bar) + check_pangenome_info( + pangenome, + need_annotations=True, + need_families=True, + need_partitions=need_partitions, + need_gene_sequences=True, + disable_bar=disable_bar, + ) logging.getLogger("PPanGGOLiN").info(f"Doing MSA for {partition} families...") - families = get_families_to_write(pangenome, partition_filter=partition, soft_core=soft_core, dup_margin=dup_margin, - single_copy=single_copy) + families = get_families_to_write( + pangenome, + partition_filter=partition, + soft_core=soft_core, + dup_margin=dup_margin, + single_copy=single_copy, + ) # check that the code is similar than the one used previously, if there is one - if 'translation_table' in pangenome.parameters["cluster"]: - if pangenome.parameters["cluster"]["translation_table"] != str(translation_table): - logging.getLogger("PPanGGOLiN").warning("The translation table used during clustering " - f"('{pangenome.parameters['cluster']['translation_table']}') " - f"is different than the one provided now ('{translation_table}')") - - compute_msa(families, outdir, cpu=cpu, tmpdir=tmpdir, source=source, use_gene_id=use_gene_id, - code=str(translation_table), disable_bar=disable_bar) - logging.getLogger("PPanGGOLiN").info(f"Done writing all {partition} MSA in: {outdir}") + if "translation_table" in pangenome.parameters["cluster"]: + if pangenome.parameters["cluster"]["translation_table"] != str( + translation_table + ): + logging.getLogger("PPanGGOLiN").warning( + "The translation table used during clustering " + f"('{pangenome.parameters['cluster']['translation_table']}') " + f"is different than the one provided now ('{translation_table}')" + ) + + compute_msa( + families, + outdir, + cpu=cpu, + tmpdir=tmpdir, + source=source, + use_gene_id=use_gene_id, + code=str(translation_table), + disable_bar=disable_bar, + ) + logging.getLogger("PPanGGOLiN").info( + f"Done writing all {partition} MSA in: {outdir}" + ) if phylo: logging.getLogger("PPanGGOLiN").info("Writing the whole genome msa file") @@ -334,8 +411,12 @@ def write_msa_files(pangenome: Pangenome, output: Path, cpu: int = 1, partition: phylo_name = output / f"{partition}_{soft_core}_genome_alignment.aln" else: phylo_name = output / f"{partition}_genome_alignment.aln" - write_whole_genome_msa(pangenome, families, phylo_name, outdir, use_gene_id=use_gene_id) - logging.getLogger("PPanGGOLiN").info(f"Done writing the {partition} genome alignment in: '{phylo_name}'") + write_whole_genome_msa( + pangenome, families, phylo_name, outdir, use_gene_id=use_gene_id + ) + logging.getLogger("PPanGGOLiN").info( + f"Done writing the {partition} genome alignment in: '{phylo_name}'" + ) def launch(args: argparse.Namespace): @@ -347,10 +428,22 @@ def launch(args: argparse.Namespace): mk_outdir(args.output, args.force) pangenome = Pangenome() pangenome.add_file(args.pangenome) - write_msa_files(pangenome, args.output, cpu=args.cpu, partition=args.partition, tmpdir=args.tmpdir, - source=args.source, soft_core=args.soft_core, phylo=args.phylo, use_gene_id=args.use_gene_id, - translation_table=args.translation_table, dup_margin=args.dup_margin, single_copy=args.single_copy, - force=args.force, disable_bar=args.disable_prog_bar) + write_msa_files( + pangenome, + args.output, + cpu=args.cpu, + partition=args.partition, + tmpdir=args.tmpdir, + source=args.source, + soft_core=args.soft_core, + phylo=args.phylo, + use_gene_id=args.use_gene_id, + translation_table=args.translation_table, + dup_margin=args.dup_margin, + single_copy=args.single_copy, + force=args.force, + disable_bar=args.disable_prog_bar, + ) def subparser(sub_parser: argparse._SubParsersAction) -> argparse.ArgumentParser: @@ -372,48 +465,116 @@ def parser_msa(parser: argparse.ArgumentParser): :param parser: parser for align argument """ - required = parser.add_argument_group(title="Required arguments", - description="The following arguments are required :") - required.add_argument('-p', '--pangenome', required=False, type=Path, help="The pangenome .h5 file") - required.add_argument('-o', '--output', required=True, type=Path, - help="Output directory where the file(s) will be written") - - optional = parser.add_argument_group(title="Optional arguments. Indicating 'all' writes all elements. " - "Writing a partition ('persistent', 'shell', 'cloud', 'core' or " - "'accessory') write the elements associated to said partition.") + required = parser.add_argument_group( + title="Required arguments", description="The following arguments are required :" + ) + required.add_argument( + "-p", "--pangenome", required=False, type=Path, help="The pangenome .h5 file" + ) + required.add_argument( + "-o", + "--output", + required=True, + type=Path, + help="Output directory where the file(s) will be written", + ) + + optional = parser.add_argument_group( + title="Optional arguments. Indicating 'all' writes all elements. " + "Writing a partition ('persistent', 'shell', 'cloud', 'core' or " + "'accessory') write the elements associated to said partition." + ) # could make choice to allow customization - optional.add_argument("--soft_core", required=False, type=restricted_float, default=0.95, - help="Soft core threshold to use if 'softcore' partition is chosen") - optional.add_argument("--dup_margin", required=False, type=restricted_float, default=0.05, - help="minimum ratio of genomes in which the family must have multiple genes " - "for it to be considered 'duplicated'") - optional.add_argument("--single_copy", required=False, action="store_true", default=False, - help="Use report gene families that are considered 'single copy', for details see " - "option --dup_margin") - optional.add_argument("--partition", required=False, default="core", - choices=["all", "persistent", "shell", "cloud", "core", "accessory", 'softcore'], - help="compute Multiple Sequence Alignment of the gene families in the given partition") - optional.add_argument("--source", required=False, default="protein", choices=["dna", "protein"], - help="indicates whether to use protein or dna sequences to compute the msa") - optional.add_argument("--phylo", required=False, action='store_true', - help="Writes a whole genome msa file for additional phylogenetic analysis") - optional.add_argument("--use_gene_id", required=False, action='store_true', - help="Use gene identifiers rather than genome names for sequences in the family MSA" - " (genome names are used by default)") - optional.add_argument("--translation_table", required=False, default=11, type=int, - help="Translation table (genetic code) to use.") - optional.add_argument("-c", "--cpu", required=False, default=1, type=int, help="Number of available cpus") - optional.add_argument("--tmpdir", required=False, type=str, default=Path(tempfile.gettempdir()), - help="directory for storing temporary files") - - -if __name__ == '__main__': + optional.add_argument( + "--soft_core", + required=False, + type=restricted_float, + default=0.95, + help="Soft core threshold to use if 'softcore' partition is chosen", + ) + optional.add_argument( + "--dup_margin", + required=False, + type=restricted_float, + default=0.05, + help="minimum ratio of genomes in which the family must have multiple genes " + "for it to be considered 'duplicated'", + ) + optional.add_argument( + "--single_copy", + required=False, + action="store_true", + default=False, + help="Use report gene families that are considered 'single copy', for details see " + "option --dup_margin", + ) + optional.add_argument( + "--partition", + required=False, + default="core", + choices=[ + "all", + "persistent", + "shell", + "cloud", + "core", + "accessory", + "softcore", + ], + help="compute Multiple Sequence Alignment of the gene families in the given partition", + ) + optional.add_argument( + "--source", + required=False, + default="protein", + choices=["dna", "protein"], + help="indicates whether to use protein or dna sequences to compute the msa", + ) + optional.add_argument( + "--phylo", + required=False, + action="store_true", + help="Writes a whole genome msa file for additional phylogenetic analysis", + ) + optional.add_argument( + "--use_gene_id", + required=False, + action="store_true", + help="Use gene identifiers rather than genome names for sequences in the family MSA" + " (genome names are used by default)", + ) + optional.add_argument( + "--translation_table", + required=False, + default=11, + type=int, + help="Translation table (genetic code) to use.", + ) + optional.add_argument( + "-c", + "--cpu", + required=False, + default=1, + type=int, + help="Number of available cpus", + ) + optional.add_argument( + "--tmpdir", + required=False, + type=str, + default=Path(tempfile.gettempdir()), + help="directory for storing temporary files", + ) + + +if __name__ == "__main__": """To test local change and allow using debugger""" from ppanggolin.utils import set_verbosity_level, add_common_arguments main_parser = argparse.ArgumentParser( description="Depicting microbial species diversity via a Partitioned PanGenome Graph Of Linked Neighbors", - formatter_class=argparse.RawTextHelpFormatter) + formatter_class=argparse.RawTextHelpFormatter, + ) parser_msa(main_parser) add_common_arguments(main_parser) diff --git a/ppanggolin/formats/writeMetadata.py b/ppanggolin/formats/writeMetadata.py index 32d4e602..e21cb7b5 100644 --- a/ppanggolin/formats/writeMetadata.py +++ b/ppanggolin/formats/writeMetadata.py @@ -16,7 +16,9 @@ from ppanggolin.region import Region, Spot, Module -def write_metadata_status(pangenome: Pangenome, h5f: tables.File, status_group: tables.Group) -> bool: +def write_metadata_status( + pangenome: Pangenome, h5f: tables.File, status_group: tables.Group +) -> bool: """Write status of metadata in pangenome file :param pangenome: pangenome with metadata @@ -26,14 +28,18 @@ def write_metadata_status(pangenome: Pangenome, h5f: tables.File, status_group: """ metastatus = pangenome.status["metadata"] metasources = pangenome.status["metasources"] - if 'metastatus' in status_group: + if "metastatus" in status_group: metadata_group = status_group.metastatus else: - metadata_group = h5f.create_group(status_group, "metastatus", "Statuses of the pangenome metadata") - if 'metasources' in status_group: + metadata_group = h5f.create_group( + status_group, "metastatus", "Statuses of the pangenome metadata" + ) + if "metasources" in status_group: metasources_group = status_group.metasources else: - metasources_group = h5f.create_group(status_group, "metasources", "Sources of the pangenome metadata") + metasources_group = h5f.create_group( + status_group, "metasources", "Sources of the pangenome metadata" + ) if metastatus["families"] in ["Computed", "Loaded", "inFile"]: metadata_group._v_attrs.families = True @@ -68,28 +74,37 @@ def write_metadata_group(h5f: tables.File, metatype: str) -> tables.Group: :return: Metadata group of the corresponding metatype """ - if '/metadata' not in h5f: + if "/metadata" not in h5f: metadata_group = h5f.create_group("/", "metadata", "Pangenome metadata") else: metadata_group = h5f.root.metadata if metatype not in metadata_group: - metatype_group = h5f.create_group(metadata_group, metatype, f"{metatype} metadata") + metatype_group = h5f.create_group( + metadata_group, metatype, f"{metatype} metadata" + ) else: metatype_group = metadata_group._f_get_child(metatype) return metatype_group -def desc_metadata(max_len_dict: Dict[str, int], type_dict: Dict[str, tables.Col]) -> dict: +def desc_metadata( + max_len_dict: Dict[str, int], type_dict: Dict[str, tables.Col] +) -> dict: """Create a formatted table for metadata description :return: Formatted table """ - desc_dict = {attr: tables.StringCol(itemsize=max_value) for attr, max_value in max_len_dict.items()} + desc_dict = { + attr: tables.StringCol(itemsize=max_value) + for attr, max_value in max_len_dict.items() + } desc_dict.update(dict(type_dict.items())) return desc_dict -def get_metadata_contig_len(select_ctg: List[Contig], source: str) -> Tuple[Dict[str, int], Dict[str, tables.Col], int]: +def get_metadata_contig_len( + select_ctg: List[Contig], source: str +) -> Tuple[Dict[str, int], Dict[str, tables.Col], int]: """Get maximum size of contig metadata information :param select_ctg: selected elements from source @@ -97,16 +112,17 @@ def get_metadata_contig_len(select_ctg: List[Contig], source: str) -> Tuple[Dict :return: Maximum type and size of each element """ - type_dict = {"metadata_id": tables.Int64Col(), - "ID": tables.Int64Col()} + type_dict = {"metadata_id": tables.Int64Col(), "ID": tables.Int64Col()} max_len_dict = {} expected_rows = 0 for contig in select_ctg: for metadata in contig.get_metadata_by_source(source).values(): - for attr, value in ((k, v) for k, v in metadata.__dict__.items() if k != "source"): + for attr, value in ( + (k, v) for k, v in metadata.__dict__.items() if k != "source" + ): if isinstance(value, bytes): - value = value.decode('UTF-8') + value = value.decode("UTF-8") if isinstance(value, float) or isinstance(value, int): if attr in type_dict: if type_dict[attr] != type(value): @@ -124,14 +140,21 @@ def get_metadata_contig_len(select_ctg: List[Contig], source: str) -> Tuple[Dict else: max_len_dict[attr] = len(value) else: - logging.getLogger("PPanGGOLiN").debug(f"attr: {attr}, value: {value}") + logging.getLogger("PPanGGOLiN").debug( + f"attr: {attr}, value: {value}" + ) raise TypeError(f"{type(value)} is not acceptable") expected_rows += 1 return max_len_dict, type_dict, expected_rows -def write_metadata_contig(h5f: tables.File, source: str, select_contigs: List[Contig], disable_bar: bool = False): +def write_metadata_contig( + h5f: tables.File, + source: str, + select_contigs: List[Contig], + disable_bar: bool = False, +): """Writing a table containing the metadata associated to contig :param h5f: HDF5 file to write gene families @@ -142,9 +165,13 @@ def write_metadata_contig(h5f: tables.File, source: str, select_contigs: List[Co metatype_group = write_metadata_group(h5f, "contigs") meta_len = get_metadata_contig_len(select_contigs, source) # h5f.remove_node(metatype_group, source) - source_table = h5f.create_table(metatype_group, source, desc_metadata(*meta_len[:-1]), expectedrows=meta_len[-1]) + source_table = h5f.create_table( + metatype_group, source, desc_metadata(*meta_len[:-1]), expectedrows=meta_len[-1] + ) meta_row = source_table.row - for contig in tqdm(select_contigs, unit="contigs", desc=f'Source = {source}', disable=disable_bar): + for contig in tqdm( + select_contigs, unit="contigs", desc=f"Source = {source}", disable=disable_bar + ): for meta_id, metadata in contig.get_metadata_by_source(source).items(): meta_row["metadata_id"] = meta_id for desc in source_table.colnames: @@ -156,7 +183,7 @@ def write_metadata_contig(h5f: tables.File, source: str, select_contigs: List[Co if hasattr(metadata, desc): value = metadata.__getattribute__(desc) if isinstance(value, bytes): - value = value.decode('UTF-8') + value = value.decode("UTF-8") meta_row[desc] = value else: meta_row[desc] = None @@ -164,9 +191,17 @@ def write_metadata_contig(h5f: tables.File, source: str, select_contigs: List[Co source_table.flush() -def get_metadata_len(select_elem: Union[List[Gene], List[Organism], List[GeneFamily], - List[Region], List[Spot], List[Module]], - source: str) -> Tuple[Dict[str, int], Dict[str, tables.Col], int]: +def get_metadata_len( + select_elem: Union[ + List[Gene], + List[Organism], + List[GeneFamily], + List[Region], + List[Spot], + List[Module], + ], + source: str, +) -> Tuple[Dict[str, int], Dict[str, tables.Col], int]: """Get maximum size of metadata information :param select_elem: selected elements from source @@ -179,12 +214,14 @@ def get_metadata_len(select_elem: Union[List[Gene], List[Organism], List[GeneFam expected_rows = 0 for element in select_elem: - if hasattr(element, 'name') and element.name: - max_len_dict['ID'] = max(max_len_dict.get('ID', 0), len(element.name)) - elif hasattr(element, 'ID'): + if hasattr(element, "name") and element.name: + max_len_dict["ID"] = max(max_len_dict.get("ID", 0), len(element.name)) + elif hasattr(element, "ID"): if isinstance(element.ID, str): - max_len_dict['ID'] = max(max_len_dict.get('ID', 0), len(element.ID)) - elif isinstance(element.ID, (int, numpy.uint8, numpy.uint16, numpy.uint32, numpy.uint64)): + max_len_dict["ID"] = max(max_len_dict.get("ID", 0), len(element.ID)) + elif isinstance( + element.ID, (int, numpy.uint8, numpy.uint16, numpy.uint32, numpy.uint64) + ): type_dict["ID"] = tables.Int64Col() else: raise TypeError( @@ -198,13 +235,17 @@ def get_metadata_len(select_elem: Union[List[Gene], List[Organism], List[GeneFam ) for metadata in element.get_metadata_by_source(source).values(): - for attr, value in ((k, v) for k, v in metadata.__dict__.items() if k != "source"): + for attr, value in ( + (k, v) for k, v in metadata.__dict__.items() if k != "source" + ): if isinstance(value, bytes): - value = value.decode('UTF-8') + value = value.decode("UTF-8") if isinstance(value, float) or isinstance(value, int): if attr in type_dict: - if isinstance(type_dict[attr] , type(value)): - if isinstance(value, float) and isinstance(type_dict[attr], int): + if isinstance(type_dict[attr], type(value)): + if isinstance(value, float) and isinstance( + type_dict[attr], int + ): type_dict[attr] = tables.Float64Col() else: if isinstance(value, float): @@ -218,11 +259,13 @@ def get_metadata_len(select_elem: Union[List[Gene], List[Organism], List[GeneFam else: max_len_dict[attr] = len(value) else: - logging.getLogger("PPanGGOLiN").debug(f"attr: {attr}, value: {value}") + logging.getLogger("PPanGGOLiN").debug( + f"attr: {attr}, value: {value}" + ) raise TypeError( - f"Invalid metadata type: The attribute '{attr}' from the pangenome element '{element}' " - f"has an unexpected value '{value}' of type '{type(value).__name__}'." - ) + f"Invalid metadata type: The attribute '{attr}' from the pangenome element '{element}' " + f"has an unexpected value '{value}' of type '{type(value).__name__}'." + ) expected_rows += 1 @@ -232,14 +275,23 @@ def get_metadata_len(select_elem: Union[List[Gene], List[Organism], List[GeneFam f"Metadata attribute '{attribute}' has a length of 0, which is not allowed." ) - return max_len_dict, type_dict, expected_rows -def write_metadata_metatype(h5f: tables.File, source: str, metatype: str, - select_elements: Union[List[Gene], List[Organism], List[GeneFamily], - List[Region], List[Spot], List[Module]], - disable_bar: bool = False): +def write_metadata_metatype( + h5f: tables.File, + source: str, + metatype: str, + select_elements: Union[ + List[Gene], + List[Organism], + List[GeneFamily], + List[Region], + List[Spot], + List[Module], + ], + disable_bar: bool = False, +): """Writing a table containing the metadata associated to element from the metatype :param h5f: HDF5 file to write gene families @@ -253,13 +305,20 @@ def write_metadata_metatype(h5f: tables.File, source: str, metatype: str, desc_metadata(max_len_dict, type_dict) - source_table = h5f.create_table(metatype_group, source, desc_metadata(max_len_dict, type_dict), expectedrows=expected_rows) + source_table = h5f.create_table( + metatype_group, + source, + desc_metadata(max_len_dict, type_dict), + expectedrows=expected_rows, + ) meta_row = source_table.row - for element in tqdm(select_elements, unit=metatype, desc=f'Source = {source}', disable=disable_bar): + for element in tqdm( + select_elements, unit=metatype, desc=f"Source = {source}", disable=disable_bar + ): for meta_id, metadata in element.get_metadata_by_source(source).items(): for desc in source_table.colnames: if desc == "ID": - if hasattr(element, 'name') and len(element.name) > 0: + if hasattr(element, "name") and len(element.name) > 0: meta_row[desc] = element.name else: meta_row[desc] = element.ID @@ -269,14 +328,19 @@ def write_metadata_metatype(h5f: tables.File, source: str, metatype: str, if hasattr(metadata, desc): value = metadata.__getattribute__(desc) if isinstance(value, bytes): - value = value.decode('UTF-8') + value = value.decode("UTF-8") meta_row[desc] = value meta_row.append() source_table.flush() -def erase_metadata(pangenome: Pangenome, h5f: tables.File, status_group: tables.Group, - metatype: str = None, source: str = None): +def erase_metadata( + pangenome: Pangenome, + h5f: tables.File, + status_group: tables.Group, + metatype: str = None, + source: str = None, +): """ Erase metadata in pangenome @@ -293,18 +357,24 @@ def erase_metadata(pangenome: Pangenome, h5f: tables.File, status_group: tables. if metatype in metadata_group: metatype_group = metadata_group._f_get_child(metatype) if source in metatype_group: - logging.getLogger("PPanGGOLiN").info(f"Erasing metadata assign to {metatype} from source {source}...") + logging.getLogger("PPanGGOLiN").info( + f"Erasing metadata assign to {metatype} from source {source}..." + ) metasources[metatype].remove(source) status_group.metasources._v_attrs[metatype].remove(source) h5f.remove_node(metatype_group, source) if metatype_group._v_nchildren == 0: - logging.getLogger("PPanGGOLiN").debug(f"No more source of metadata in {metatype}. " - f"Erasing node {metatype} in metadata") - metastatus[metatype] = 'No' + logging.getLogger("PPanGGOLiN").debug( + f"No more source of metadata in {metatype}. " + f"Erasing node {metatype} in metadata" + ) + metastatus[metatype] = "No" status_group.metastatus.families = False h5f.remove_node(metadata_group, metatype) if metadata_group._v_nchildren == 0: - logging.getLogger("PPanGGOLiN").debug("No more metadata in pangenome. Erasing node metadata") + logging.getLogger("PPanGGOLiN").debug( + "No more metadata in pangenome. Erasing node metadata" + ) status_group._v_attrs.metadata = False h5f.remove_node("/", "metadata") h5f.remove_node(status_group, "metasources") @@ -319,56 +389,118 @@ def write_metadata(pangenome: Pangenome, h5f: tables.File, disable_bar: bool = F :param disable_bar: Disable progress bar """ if pangenome.status["metadata"]["families"] == "Computed": - logging.getLogger("PPanGGOLiN").info("Writing gene families metadata in pangenome") - select_gf = list(pangenome.get_elem_by_source(source=pangenome.status["metasources"]["families"][-1], - metatype="families")) - write_metadata_metatype(h5f, pangenome.status["metasources"]["families"][-1], - "families", select_gf, disable_bar) + logging.getLogger("PPanGGOLiN").info( + "Writing gene families metadata in pangenome" + ) + select_gf = list( + pangenome.get_elem_by_source( + source=pangenome.status["metasources"]["families"][-1], + metatype="families", + ) + ) + write_metadata_metatype( + h5f, + pangenome.status["metasources"]["families"][-1], + "families", + select_gf, + disable_bar, + ) pangenome.status["metadata"]["families"] = "Loaded" if pangenome.status["metadata"]["genomes"] == "Computed": logging.getLogger("PPanGGOLiN").info("Writing genomes metadata in pangenome") - select_genomes = list(pangenome.get_elem_by_source(source=pangenome.status["metasources"]["genomes"][-1], - metatype="genomes")) - write_metadata_metatype(h5f, pangenome.status["metasources"]["genomes"][-1], - "genomes", select_genomes, disable_bar) + select_genomes = list( + pangenome.get_elem_by_source( + source=pangenome.status["metasources"]["genomes"][-1], + metatype="genomes", + ) + ) + write_metadata_metatype( + h5f, + pangenome.status["metasources"]["genomes"][-1], + "genomes", + select_genomes, + disable_bar, + ) pangenome.status["metadata"]["genomes"] = "Loaded" if pangenome.status["metadata"]["contigs"] == "Computed": logging.getLogger("PPanGGOLiN").info("Writing contigs metadata in pangenome") - select_contigs = list(pangenome.get_elem_by_source(source=pangenome.status["metasources"]["contigs"][-1], - metatype="contigs")) - write_metadata_contig(h5f, pangenome.status["metasources"]["contigs"][-1], select_contigs, disable_bar) + select_contigs = list( + pangenome.get_elem_by_source( + source=pangenome.status["metasources"]["contigs"][-1], + metatype="contigs", + ) + ) + write_metadata_contig( + h5f, + pangenome.status["metasources"]["contigs"][-1], + select_contigs, + disable_bar, + ) pangenome.status["metadata"]["contigs"] = "Loaded" if pangenome.status["metadata"]["genes"] == "Computed": logging.getLogger("PPanGGOLiN").info("Writing genes metadata in pangenome") - select_genes = list(pangenome.get_elem_by_source(source=pangenome.status["metasources"]["genes"][-1], - metatype="genes")) - write_metadata_metatype(h5f, pangenome.status["metasources"]["genes"][-1], - "genes", select_genes, disable_bar) + select_genes = list( + pangenome.get_elem_by_source( + source=pangenome.status["metasources"]["genes"][-1], metatype="genes" + ) + ) + write_metadata_metatype( + h5f, + pangenome.status["metasources"]["genes"][-1], + "genes", + select_genes, + disable_bar, + ) pangenome.status["metadata"]["genes"] = "Loaded" if pangenome.status["metadata"]["RGPs"] == "Computed": logging.getLogger("PPanGGOLiN").info("Writing RGPs metadata in pangenome") - select_rgps = list(pangenome.get_elem_by_source(source=pangenome.status["metasources"]["RGPs"][-1], - metatype="RGPs")) - write_metadata_metatype(h5f, pangenome.status["metasources"]["RGPs"][-1], - "RGPs", select_rgps, disable_bar) + select_rgps = list( + pangenome.get_elem_by_source( + source=pangenome.status["metasources"]["RGPs"][-1], metatype="RGPs" + ) + ) + write_metadata_metatype( + h5f, + pangenome.status["metasources"]["RGPs"][-1], + "RGPs", + select_rgps, + disable_bar, + ) pangenome.status["metadata"]["RGPs"] = "Loaded" if pangenome.status["metadata"]["spots"] == "Computed": logging.getLogger("PPanGGOLiN").info("Writing spots metadata in pangenome") - select_spots = list(pangenome.get_elem_by_source(source=pangenome.status["metasources"]["spots"][-1], - metatype="spots")) - write_metadata_metatype(h5f, pangenome.status["metasources"]["spots"][-1], - "spots", select_spots, disable_bar) + select_spots = list( + pangenome.get_elem_by_source( + source=pangenome.status["metasources"]["spots"][-1], metatype="spots" + ) + ) + write_metadata_metatype( + h5f, + pangenome.status["metasources"]["spots"][-1], + "spots", + select_spots, + disable_bar, + ) pangenome.status["metadata"]["spots"] = "Loaded" if pangenome.status["metadata"]["modules"] == "Computed": logging.getLogger("PPanGGOLiN").info("Writing modules metadata in pangenome") - select_modules = list(pangenome.get_elem_by_source(source=pangenome.status["metasources"]["modules"][-1], - metatype="modules")) - write_metadata_metatype(h5f, pangenome.status["metasources"]["modules"][-1], - "modules", select_modules, disable_bar) + select_modules = list( + pangenome.get_elem_by_source( + source=pangenome.status["metasources"]["modules"][-1], + metatype="modules", + ) + ) + write_metadata_metatype( + h5f, + pangenome.status["metasources"]["modules"][-1], + "modules", + select_modules, + disable_bar, + ) pangenome.status["metadata"]["modules"] = "Loaded" diff --git a/ppanggolin/formats/writeSequences.py b/ppanggolin/formats/writeSequences.py index e69f3a5a..734ec9dc 100644 --- a/ppanggolin/formats/writeSequences.py +++ b/ppanggolin/formats/writeSequences.py @@ -16,12 +16,33 @@ from ppanggolin.pangenome import Pangenome from ppanggolin.genome import Gene, Organism -from ppanggolin.utils import (write_compressed_or_not, mk_outdir, create_tmpdir, read_compressed_or_not, - restricted_float, detect_filetype, run_subprocess) -from ppanggolin.formats.readBinaries import check_pangenome_info, write_genes_from_pangenome_file, write_fasta_gene_fam_from_pangenome_file, write_fasta_prot_fam_from_pangenome_file - -module_regex = re.compile(r'^module_\d+') # \d == [0-9] -poss_values = ['all', 'persistent', 'shell', 'cloud', 'rgp', 'softcore', 'core', module_regex] +from ppanggolin.utils import ( + write_compressed_or_not, + mk_outdir, + create_tmpdir, + read_compressed_or_not, + restricted_float, + detect_filetype, + run_subprocess, +) +from ppanggolin.formats.readBinaries import ( + check_pangenome_info, + write_genes_from_pangenome_file, + write_fasta_gene_fam_from_pangenome_file, + write_fasta_prot_fam_from_pangenome_file, +) + +module_regex = re.compile(r"^module_\d+") # \d == [0-9] +poss_values = [ + "all", + "persistent", + "shell", + "cloud", + "rgp", + "softcore", + "core", + module_regex, +] poss_values_log = f"Possible values are {', '.join(poss_values[:-1])}, module_X with X being a module id." @@ -33,13 +54,20 @@ def check_write_sequences_args(args: argparse.Namespace) -> None: :raises argparse.ArgumentTypeError: if region is given but neither fasta nor anno is given """ if args.regions is not None and args.fasta is None and args.anno is None: - raise argparse.ArgumentError(argument=None, - message="The --regions options requires the use of --anno or --fasta " - "(You need to provide the same file used to compute the pangenome)") - - -def write_gene_sequences_from_annotations(genes_to_write: Iterable[Gene], output: Path, add: str = '', - compress: bool = False, disable_bar: bool = False): + raise argparse.ArgumentError( + argument=None, + message="The --regions options requires the use of --anno or --fasta " + "(You need to provide the same file used to compute the pangenome)", + ) + + +def write_gene_sequences_from_annotations( + genes_to_write: Iterable[Gene], + output: Path, + add: str = "", + compress: bool = False, + disable_bar: bool = False, +): """ Writes the CDS sequences to a File object, and adds the string provided through `add` in front of it. @@ -51,15 +79,23 @@ def write_gene_sequences_from_annotations(genes_to_write: Iterable[Gene], output :param compress: Compress the file in .gz :param disable_bar: Disable progress bar. """ - logging.getLogger("PPanGGOLiN").info(f"Writing all CDS sequences in {output.absolute()}") + logging.getLogger("PPanGGOLiN").info( + f"Writing all CDS sequences in {output.absolute()}" + ) with write_compressed_or_not(output, compress) as file_obj: for gene in tqdm(genes_to_write, unit="gene", disable=disable_bar): if gene.type == "CDS": - file_obj.write(f'>{add}{gene.ID}\n') - file_obj.write(f'{gene.dna}\n') + file_obj.write(f">{add}{gene.ID}\n") + file_obj.write(f"{gene.dna}\n") -def create_mmseqs_db(sequences: Iterable[Path], db_name: str, tmpdir: Path, db_mode: int = 0, db_type: int = 0) -> Path: +def create_mmseqs_db( + sequences: Iterable[Path], + db_name: str, + tmpdir: Path, + db_mode: int = 0, + db_type: int = 0, +) -> Path: """Create a MMseqs2 database from a sequences file. :param sequences: File with the sequences @@ -82,8 +118,13 @@ def create_mmseqs_db(sequences: Iterable[Path], db_name: str, tmpdir: Path, db_m return seq_nucdb -def translate_genes(sequences: Union[Path, Iterable[Path]], tmpdir: Path, cpu: int = 1, - is_single_line_fasta: bool = False, code: int = 11) -> Path: +def translate_genes( + sequences: Union[Path, Iterable[Path]], + tmpdir: Path, + cpu: int = 1, + is_single_line_fasta: bool = False, + code: int = 11, +) -> Path: """Translate nucleotide sequences into MMSeqs2 amino acid sequences database :param sequences: File with the nucleotide sequences @@ -94,20 +135,47 @@ def translate_genes(sequences: Union[Path, Iterable[Path]], tmpdir: Path, cpu: i :return: Path to the MMSeqs2 database """ - seq_nucdb = create_mmseqs_db([sequences] if isinstance(sequences, Path) else sequences, 'nucleotides_db', - tmpdir, db_mode=1 if is_single_line_fasta else 0, db_type=2) + seq_nucdb = create_mmseqs_db( + [sequences] if isinstance(sequences, Path) else sequences, + "nucleotides_db", + tmpdir, + db_mode=1 if is_single_line_fasta else 0, + db_type=2, + ) logging.getLogger("PPanGGOLiN").debug("Translate sequence ...") - seqdb = tmpdir / 'translate_db' - cmd = list(map(str, ["mmseqs", "translatenucs", seq_nucdb, seqdb, "--threads", cpu, "--translation-table", code])) + seqdb = tmpdir / "translate_db" + cmd = list( + map( + str, + [ + "mmseqs", + "translatenucs", + seq_nucdb, + seqdb, + "--threads", + cpu, + "--translation-table", + code, + ], + ) + ) run_subprocess(cmd, msg="MMSeqs translatenucs failed with the following error:\n") return seqdb - -def write_gene_protein_sequences(pangenome_filename: str, output: Path, gene_filter: str, soft_core: float = 0.95, - compress: bool = False, keep_tmp: bool = False, tmp: Path = None, - cpu: int = 1, code: int = 11, disable_bar: bool = False): - """ Write all amino acid sequences from given genes in pangenome +def write_gene_protein_sequences( + pangenome_filename: str, + output: Path, + gene_filter: str, + soft_core: float = 0.95, + compress: bool = False, + keep_tmp: bool = False, + tmp: Path = None, + cpu: int = 1, + code: int = 11, + disable_bar: bool = False, +): + """Write all amino acid sequences from given genes in pangenome :param pangenome: Pangenome object with gene families sequences :param output: Path to output directory @@ -120,31 +188,53 @@ def write_gene_protein_sequences(pangenome_filename: str, output: Path, gene_fil :param code: Genetic code use to translate nucleotide sequences to protein sequences :param disable_bar: Disable progress bar """ - with create_tmpdir(tmp if tmp is not None else Path(tempfile.gettempdir()), - basename="translateGenes", keep_tmp=keep_tmp) as tmpdir: + with create_tmpdir( + tmp if tmp is not None else Path(tempfile.gettempdir()), + basename="translateGenes", + keep_tmp=keep_tmp, + ) as tmpdir: + + write_genes_from_pangenome_file( + pangenome_filename=pangenome_filename, + gene_filter=gene_filter, + output=tmpdir, + compress=compress, + disable_bar=disable_bar, + ) + + genes_sequence_tmp_file = ( + tmpdir / f"{gene_filter}_genes.fna{'.gz' if compress else ''}" + ) + translate_db = translate_genes( + sequences=genes_sequence_tmp_file, + tmpdir=tmpdir, + cpu=cpu, + is_single_line_fasta=True, + code=code, + ) - write_genes_from_pangenome_file(pangenome_filename=pangenome_filename, gene_filter = gene_filter, - output=tmpdir, compress=compress, disable_bar=disable_bar) - - genes_sequence_tmp_file = tmpdir / f"{gene_filter}_genes.fna{'.gz' if compress else ''}" - translate_db = translate_genes(sequences=genes_sequence_tmp_file, tmpdir=tmpdir, - cpu=cpu, is_single_line_fasta=True, code=code) - outpath = output / f"{gene_filter}_protein_genes.faa" - - logging.getLogger("PPanGGOLiN").info("Translating nucleotide gene sequence in protein sequences with mmseqs convert2fasta") + + logging.getLogger("PPanGGOLiN").info( + "Translating nucleotide gene sequence in protein sequences with mmseqs convert2fasta" + ) cmd = list(map(str, ["mmseqs", "convert2fasta", translate_db, outpath])) - run_subprocess(cmd, msg="MMSeqs convert2fasta failed with the following error:\n") + run_subprocess( + cmd, msg="MMSeqs convert2fasta failed with the following error:\n" + ) if compress: with write_compressed_or_not(outpath, compress) as compress_file: with open(outpath) as sequence_file: shutil.copyfileobj(sequence_file, compress_file) outpath.unlink() - logging.getLogger("PPanGGOLiN").info(f"Done writing the gene protein sequences : '{outpath}.gz'") + logging.getLogger("PPanGGOLiN").info( + f"Done writing the gene protein sequences : '{outpath}.gz'" + ) else: - logging.getLogger("PPanGGOLiN").info(f"Done writing the gene protein sequences : '{outpath}'") - + logging.getLogger("PPanGGOLiN").info( + f"Done writing the gene protein sequences : '{outpath}'" + ) def read_fasta_or_gff(file_path: Path) -> Dict[str, str]: @@ -164,7 +254,7 @@ def read_fasta_or_gff(file_path: Path) -> Dict[str, str]: if line.startswith(">"): in_fasta_part = True if in_fasta_part: - if line.startswith('>'): + if line.startswith(">"): if seq != "": sequence_dict[seqname] = seq seq = "" @@ -191,12 +281,12 @@ def read_fasta_gbk(file_path: Path) -> Dict[str, str]: while len(lines) != 0: line = lines.pop() # beginning of contig - if line.startswith('LOCUS'): + if line.startswith("LOCUS"): contig_locus_id = line.split()[1] # If contig_id is not specified in VERSION afterward like with Prokka, # in that case we use the one in LOCUS. - while not line.startswith('FEATURES'): - if line.startswith('VERSION'): + while not line.startswith("FEATURES"): + if line.startswith("VERSION"): contig_id = line[12:].strip() line = lines.pop() if contig_id == "": @@ -205,7 +295,7 @@ def read_fasta_gbk(file_path: Path) -> Dict[str, str]: line = lines.pop() # stuff line = lines.pop() # first sequence line. sequence = "" - while not line.startswith('//'): + while not line.startswith("//"): sequence += line[10:].replace(" ", "").strip().upper() line = lines.pop() # get each gene's sequence. @@ -236,8 +326,10 @@ def read_genome_file(genome_file: Path, organism: Organism) -> Dict[str, str]: # check_contig_names if set(contig_to_sequence) != {contig.name for contig in organism.contigs}: - raise KeyError(f"Contig name inconsistency detected in genome '{organism.name}' between the " - f"information stored in the pangenome file and the contigs found in '{genome_file}'.") + raise KeyError( + f"Contig name inconsistency detected in genome '{organism.name}' between the " + f"information stored in the pangenome file and the contigs found in '{genome_file}'." + ) return contig_to_sequence @@ -254,13 +346,20 @@ def write_spaced_fasta(sequence: str, space: int = 60) -> str: seq = "" j = 0 while j < len(sequence): - seq += sequence[j:j + space] + "\n" + seq += sequence[j : j + space] + "\n" j += space return seq -def write_regions_sequences(pangenome: Pangenome, output: Path, regions: str, fasta: Path = None, anno: Path = None, - compress: bool = False, disable_bar: bool = False): +def write_regions_sequences( + pangenome: Pangenome, + output: Path, + regions: str, + fasta: Path = None, + anno: Path = None, + compress: bool = False, + disable_bar: bool = False, +): """ Write representative amino acid sequences of gene families. @@ -274,23 +373,32 @@ def write_regions_sequences(pangenome: Pangenome, output: Path, regions: str, fa :raises SyntaxError: if no tabulation are found in list genomes file """ - assert fasta is not None or anno is not None, "Write regions requires to use anno or fasta, not any provided" + assert ( + fasta is not None or anno is not None + ), "Write regions requires to use anno or fasta, not any provided" organisms_file = fasta if fasta is not None else anno org_dict = {} for line in read_compressed_or_not(organisms_file): elements = [el.strip() for el in line.split("\t")] if len(elements) <= 1: - raise ValueError(f"No tabulation separator found in given --fasta or --anno file: '{organisms_file}'") + raise ValueError( + f"No tabulation separator found in given --fasta or --anno file: '{organisms_file}'" + ) org_dict[elements[0]] = Path(elements[1]) - if not org_dict[elements[0]].exists(): # Check tsv sanity test if it's not one it's the other - org_dict[elements[0]] = organisms_file.parent.joinpath(org_dict[elements[0]]) + if not org_dict[ + elements[0] + ].exists(): # Check tsv sanity test if it's not one it's the other + org_dict[elements[0]] = organisms_file.parent.joinpath( + org_dict[elements[0]] + ) logging.getLogger("PPanGGOLiN").info(f"Writing {regions} rgp genomic sequences...") if regions == "complete": - regions_to_write = (region for region in pangenome.regions - if not region.is_contig_border) + regions_to_write = ( + region for region in pangenome.regions if not region.is_contig_border + ) else: regions_to_write = pangenome.regions @@ -306,15 +414,31 @@ def write_regions_sequences(pangenome: Pangenome, output: Path, regions: str, fa genome_sequence = read_genome_file(org_dict[organism.name], organism) fasta.write(f">{region.name}\n") fasta.write( - write_spaced_fasta(genome_sequence[region.contig.name][region.start:region.stop], 60)) - logging.getLogger("PPanGGOLiN").info(f"Done writing the regions nucleotide sequences: " - f"'{outname}{'.gz' if compress else ''}'") - - -def write_sequence_files(pangenome: Pangenome, output: Path, fasta: Path = None, anno: Path = None, - soft_core: float = 0.95, regions: str = None, genes: str = None, proteins: str = None, - gene_families: str = None, prot_families: str = None, compress: bool = False, - disable_bar: bool = False, **translate_kwgs): + write_spaced_fasta( + genome_sequence[region.contig.name][region.start : region.stop], 60 + ) + ) + logging.getLogger("PPanGGOLiN").info( + f"Done writing the regions nucleotide sequences: " + f"'{outname}{'.gz' if compress else ''}'" + ) + + +def write_sequence_files( + pangenome: Pangenome, + output: Path, + fasta: Path = None, + anno: Path = None, + soft_core: float = 0.95, + regions: str = None, + genes: str = None, + proteins: str = None, + gene_families: str = None, + prot_families: str = None, + compress: bool = False, + disable_bar: bool = False, + **translate_kwgs, +): """ Main function to write sequence file from pangenome @@ -332,49 +456,87 @@ def write_sequence_files(pangenome: Pangenome, output: Path, fasta: Path = None, :param disable_bar: Disable progress bar """ - if gene_families is not None: - logging.getLogger("PPanGGOLiN").info("Writing the representative nucleotide sequences " - "of the gene families by reading the pangenome file directly.") - - write_fasta_gene_fam_from_pangenome_file(pangenome_filename=pangenome.file, family_filter= gene_families, soft_core=soft_core, - output=output, compress=compress, disable_bar=disable_bar) + logging.getLogger("PPanGGOLiN").info( + "Writing the representative nucleotide sequences " + "of the gene families by reading the pangenome file directly." + ) + + write_fasta_gene_fam_from_pangenome_file( + pangenome_filename=pangenome.file, + family_filter=gene_families, + soft_core=soft_core, + output=output, + compress=compress, + disable_bar=disable_bar, + ) gene_families = None - + if prot_families is not None: - logging.getLogger("PPanGGOLiN").info("Writing the representative protein sequences " - "of the gene families by reading the pangenome file directly.") - write_fasta_prot_fam_from_pangenome_file(pangenome_filename=pangenome.file, family_filter = prot_families, soft_core=soft_core, - output=output, compress=compress, disable_bar=disable_bar) + logging.getLogger("PPanGGOLiN").info( + "Writing the representative protein sequences " + "of the gene families by reading the pangenome file directly." + ) + write_fasta_prot_fam_from_pangenome_file( + pangenome_filename=pangenome.file, + family_filter=prot_families, + soft_core=soft_core, + output=output, + compress=compress, + disable_bar=disable_bar, + ) prot_families = None - if genes is not None: - logging.getLogger("PPanGGOLiN").info("Writing gene nucleotide sequences by reading the pangenome file directly.") - write_genes_from_pangenome_file(pangenome_filename=pangenome.file, gene_filter = genes, soft_core=soft_core, - output=output, compress=compress, disable_bar=disable_bar) + logging.getLogger("PPanGGOLiN").info( + "Writing gene nucleotide sequences by reading the pangenome file directly." + ) + write_genes_from_pangenome_file( + pangenome_filename=pangenome.file, + gene_filter=genes, + soft_core=soft_core, + output=output, + compress=compress, + disable_bar=disable_bar, + ) genes = None if proteins is not None: - - logging.getLogger("PPanGGOLiN").info("Writing gene protein sequences by reading the pangenome file directly.") - write_gene_protein_sequences(pangenome_filename=pangenome.file, output=output, gene_filter=proteins, soft_core=soft_core, compress=compress, disable_bar=disable_bar, - **translate_kwgs) - + logging.getLogger("PPanGGOLiN").info( + "Writing gene protein sequences by reading the pangenome file directly." + ) + write_gene_protein_sequences( + pangenome_filename=pangenome.file, + output=output, + gene_filter=proteins, + soft_core=soft_core, + compress=compress, + disable_bar=disable_bar, + **translate_kwgs, + ) + proteins = None if regions is not None: # load pangenome when writing region sequence - check_pangenome_info(pangenome, need_annotations=True, need_families=True, need_rgp=True, disable_bar=disable_bar) + check_pangenome_info( + pangenome, + need_annotations=True, + need_families=True, + need_rgp=True, + disable_bar=disable_bar, + ) + + write_regions_sequences( + pangenome, output, regions, fasta, anno, compress, disable_bar + ) - write_regions_sequences(pangenome, output, regions, fasta, anno, compress, disable_bar) - def launch(args: argparse.Namespace): """ @@ -383,19 +545,31 @@ def launch(args: argparse.Namespace): :param args: All arguments provide by user """ check_write_sequences_args(args) - translate_kwgs = {"code": args.translation_table, - "cpu": args.cpu, - "tmp": args.tmpdir, - "keep_tmp": args.keep_tmp} + translate_kwgs = { + "code": args.translation_table, + "cpu": args.cpu, + "tmp": args.tmpdir, + "keep_tmp": args.keep_tmp, + } mk_outdir(args.output, args.force) pangenome = Pangenome() pangenome.add_file(args.pangenome) - - write_sequence_files(pangenome, args.output, fasta=args.fasta, anno=args.anno, soft_core=args.soft_core, - regions=args.regions, genes=args.genes, proteins=args.proteins, - gene_families=args.gene_families, prot_families=args.prot_families, compress=args.compress, - disable_bar=args.disable_prog_bar, **translate_kwgs) + write_sequence_files( + pangenome, + args.output, + fasta=args.fasta, + anno=args.anno, + soft_core=args.soft_core, + regions=args.regions, + genes=args.genes, + proteins=args.proteins, + gene_families=args.gene_families, + prot_families=args.prot_families, + compress=args.compress, + disable_bar=args.disable_prog_bar, + **translate_kwgs, + ) def subparser(sub_parser: argparse._SubParsersAction) -> argparse.ArgumentParser: @@ -406,7 +580,9 @@ def subparser(sub_parser: argparse._SubParsersAction) -> argparse.ArgumentParser :return : parser arguments for align command """ - parser = sub_parser.add_parser("fasta", formatter_class=argparse.RawTextHelpFormatter) + parser = sub_parser.add_parser( + "fasta", formatter_class=argparse.RawTextHelpFormatter + ) parser_seq(parser) return parser @@ -424,7 +600,9 @@ def filter_values(arg_value: str): if arg_value in poss_values or module_regex.match(arg_value): return arg_value else: - raise argparse.ArgumentTypeError(f"Invalid choice '{arg_value}'. {poss_values_log}") + raise argparse.ArgumentTypeError( + f"Invalid choice '{arg_value}'. {poss_values_log}" + ) def parser_seq(parser: argparse.ArgumentParser): @@ -434,61 +612,129 @@ def parser_seq(parser: argparse.ArgumentParser): :param parser: parser for align argument """ - required = parser.add_argument_group(title="Required arguments", - description="One of the following arguments is required :") - required.add_argument('-p', '--pangenome', required=False, type=Path, help="The pangenome .h5 file") - required.add_argument('-o', '--output', required=True, type=Path, - help="Output directory where the file(s) will be written") - - context = parser.add_argument_group(title="Contextually required arguments", - description="With --regions, the following arguments are required:") - context.add_argument('--fasta', required=False, type=Path, - help="A tab-separated file listing the genome names, and the fasta filepath of its genomic " - "sequence(s) (the fastas can be compressed with gzip). One line per genome.") - context.add_argument('--anno', required=False, type=Path, - help="A tab-separated file listing the genome names, and the gff/gbff filepath of its " - "annotations (the files can be compressed with gzip). One line per genome. " - "If this is provided, those annotations will be used.") - - onereq = parser.add_argument_group(title="Output file", - description="At least one of the following argument is required. " - "Indicating 'all' writes all elements. Writing a partition " - "('persistent', 'shell' or 'cloud') write the elements associated " - "to said partition. Writing 'rgp' writes elements associated to RGPs" - ) - onereq.add_argument("--genes", required=False, type=filter_values, - help=f"Write all nucleotide CDS sequences. {poss_values_log}") - onereq.add_argument("--proteins", required=False, type=filter_values, - help=f"Write representative amino acid sequences of genes. {poss_values_log}") - onereq.add_argument("--prot_families", required=False, type=filter_values, - help=f"Write representative amino acid sequences of gene families. {poss_values_log}") - onereq.add_argument("--gene_families", required=False, type=filter_values, - help=f"Write representative nucleotide sequences of gene families. {poss_values_log}") + required = parser.add_argument_group( + title="Required arguments", + description="One of the following arguments is required :", + ) + required.add_argument( + "-p", "--pangenome", required=False, type=Path, help="The pangenome .h5 file" + ) + required.add_argument( + "-o", + "--output", + required=True, + type=Path, + help="Output directory where the file(s) will be written", + ) + + context = parser.add_argument_group( + title="Contextually required arguments", + description="With --regions, the following arguments are required:", + ) + context.add_argument( + "--fasta", + required=False, + type=Path, + help="A tab-separated file listing the genome names, and the fasta filepath of its genomic " + "sequence(s) (the fastas can be compressed with gzip). One line per genome.", + ) + context.add_argument( + "--anno", + required=False, + type=Path, + help="A tab-separated file listing the genome names, and the gff/gbff filepath of its " + "annotations (the files can be compressed with gzip). One line per genome. " + "If this is provided, those annotations will be used.", + ) + + onereq = parser.add_argument_group( + title="Output file", + description="At least one of the following argument is required. " + "Indicating 'all' writes all elements. Writing a partition " + "('persistent', 'shell' or 'cloud') write the elements associated " + "to said partition. Writing 'rgp' writes elements associated to RGPs", + ) + onereq.add_argument( + "--genes", + required=False, + type=filter_values, + help=f"Write all nucleotide CDS sequences. {poss_values_log}", + ) + onereq.add_argument( + "--proteins", + required=False, + type=filter_values, + help=f"Write representative amino acid sequences of genes. {poss_values_log}", + ) + onereq.add_argument( + "--prot_families", + required=False, + type=filter_values, + help=f"Write representative amino acid sequences of gene families. {poss_values_log}", + ) + onereq.add_argument( + "--gene_families", + required=False, + type=filter_values, + help=f"Write representative nucleotide sequences of gene families. {poss_values_log}", + ) optional = parser.add_argument_group(title="Optional arguments") # could make choice to allow customization - optional.add_argument("--regions", required=False, type=str, choices=["all", "complete"], - help="Write the RGP nucleotide sequences (requires --anno or --fasta used to compute " - "the pangenome to be given)") - optional.add_argument("--soft_core", required=False, type=restricted_float, default=0.95, - help="Soft core threshold to use if 'softcore' partition is chosen") - optional.add_argument("--compress", required=False, action="store_true", help="Compress the files in .gz") - optional.add_argument("--translation_table", required=False, default="11", - help="Translation table (genetic code) to use.") - optional.add_argument("--cpu", required=False, default=1, type=int, help="Number of available threads") - optional.add_argument("--tmpdir", required=False, type=Path, default=Path(tempfile.gettempdir()), - help="directory for storing temporary files") - optional.add_argument("--keep_tmp", required=False, default=False, action="store_true", - help="Keeping temporary files (useful for debugging).") - - -if __name__ == '__main__': + optional.add_argument( + "--regions", + required=False, + type=str, + choices=["all", "complete"], + help="Write the RGP nucleotide sequences (requires --anno or --fasta used to compute " + "the pangenome to be given)", + ) + optional.add_argument( + "--soft_core", + required=False, + type=restricted_float, + default=0.95, + help="Soft core threshold to use if 'softcore' partition is chosen", + ) + optional.add_argument( + "--compress", + required=False, + action="store_true", + help="Compress the files in .gz", + ) + optional.add_argument( + "--translation_table", + required=False, + default="11", + help="Translation table (genetic code) to use.", + ) + optional.add_argument( + "--cpu", required=False, default=1, type=int, help="Number of available threads" + ) + optional.add_argument( + "--tmpdir", + required=False, + type=Path, + default=Path(tempfile.gettempdir()), + help="directory for storing temporary files", + ) + optional.add_argument( + "--keep_tmp", + required=False, + default=False, + action="store_true", + help="Keeping temporary files (useful for debugging).", + ) + + +if __name__ == "__main__": """To test local change and allow using debugger""" from ppanggolin.utils import set_verbosity_level, add_common_arguments main_parser = argparse.ArgumentParser( description="Depicting microbial species diversity via a Partitioned PanGenome Graph Of Linked Neighbors", - formatter_class=argparse.RawTextHelpFormatter) + formatter_class=argparse.RawTextHelpFormatter, + ) parser_seq(main_parser) add_common_arguments(main_parser) diff --git a/ppanggolin/formats/write_proksee.py b/ppanggolin/formats/write_proksee.py index b183932c..6e90fe75 100644 --- a/ppanggolin/formats/write_proksee.py +++ b/ppanggolin/formats/write_proksee.py @@ -38,22 +38,49 @@ def write_legend_items(features: List[str], module_to_color: Dict[Module, str] = "dark red": "#ca5c55", } - legend_data = {"items": [ - {"name": "persistent", "swatchColor": main_colors['orange'], "decoration": "arrow"}, - {"name": "shell", "swatchColor": main_colors['light green'], "decoration": "arrow"}, - {"name": "cloud", "swatchColor": main_colors['light blue'], "decoration": "arrow"}, - {"name": "RNA", "swatchColor": main_colors['purple'], "decoration": "arrow"}, - ] + legend_data = { + "items": [ + { + "name": "persistent", + "swatchColor": main_colors["orange"], + "decoration": "arrow", + }, + { + "name": "shell", + "swatchColor": main_colors["light green"], + "decoration": "arrow", + }, + { + "name": "cloud", + "swatchColor": main_colors["light blue"], + "decoration": "arrow", + }, + { + "name": "RNA", + "swatchColor": main_colors["purple"], + "decoration": "arrow", + }, + ] } if "rgp" in features or "all" in features: - legend_data["items"].append({"name": "RGP", "swatchColor": main_colors['dark green'], "decoration": "arc"}), + legend_data["items"].append( + { + "name": "RGP", + "swatchColor": main_colors["dark green"], + "decoration": "arc", + } + ), if module_to_color is not None and ("modules" in features or "all" in features): for mod, color in sorted(module_to_color.items(), key=lambda x: x[0].ID): - legend_data["items"].append({"name": str(mod), - "decoration": "arc", - "swatchColor": color, - "visible": False}) + legend_data["items"].append( + { + "name": str(mod), + "decoration": "arc", + "swatchColor": color, + "visible": False, + } + ) return legend_data @@ -74,36 +101,42 @@ def write_tracks(features: List[str]): "thicknessRatio": 1, "dataType": "feature", "dataMethod": "source", - "dataKeys": "Gene" + "dataKeys": "Gene", } ] if "rgp" in features or "all" in features: - tracks.append({ - "name": "RGP", - "separateFeaturesBy": "None", - "position": "inside", - "thicknessRatio": 1, - "dataType": "feature", - "dataMethod": "source", - "dataKeys": "RGP" - }) + tracks.append( + { + "name": "RGP", + "separateFeaturesBy": "None", + "position": "inside", + "thicknessRatio": 1, + "dataType": "feature", + "dataMethod": "source", + "dataKeys": "RGP", + } + ) if "modules" in features or "all" in features: - tracks.append({ - "name": "Module", - "separateFeaturesBy": "None", - "position": "inside", - "thicknessRatio": 1, - "dataType": "feature", - "dataMethod": "source", - "dataKeys": "Module" - }) + tracks.append( + { + "name": "Module", + "separateFeaturesBy": "None", + "position": "inside", + "thicknessRatio": 1, + "dataType": "feature", + "dataMethod": "source", + "dataKeys": "Module", + } + ) return tracks -def initiate_proksee_data(features: List[str], organism: Organism, module_to_color: Dict[Module, str] = None): +def initiate_proksee_data( + features: List[str], organism: Organism, module_to_color: Dict[Module, str] = None +): """ Initializes ProkSee data structure with legends, tracks, and captions. @@ -120,24 +153,26 @@ def initiate_proksee_data(features: List[str], organism: Organism, module_to_col "name": f"{organism.name} annotated with PPanGGOLiN", "position": "bottom-center", "font": "sans-serif,plain,18", - "backgroundColor": "rgba(255,255,255,0.4)" + "backgroundColor": "rgba(255,255,255,0.4)", } cgview_data = { "name": "PPanGGOLiN annotation at genome level", "version": "1.5.0", - 'settings': {}, + "settings": {}, "legend": proksee_legends, "tracks": proksee_tracks, "sequence": {}, - 'captions': [proksee_captions], - "meta": organism.formatted_metadata_dict() # metadata + "captions": [proksee_captions], + "meta": organism.formatted_metadata_dict(), # metadata } return {"cgview": cgview_data} -def write_contig(organism: Organism, genome_sequences: Dict[str, str] = None, metadata_sep: str = "|") -> List[Dict]: +def write_contig( + organism: Organism, genome_sequences: Dict[str, str] = None, metadata_sep: str = "|" +) -> List[Dict]: """ Writes contig data for a given organism in proksee format. @@ -157,7 +192,11 @@ def write_contig(organism: Organism, genome_sequences: Dict[str, str] = None, me metadata_for_proksee.update(genome_metadata) metadata_for_proksee.update(contig.formatted_metadata_dict(metadata_sep)) - metadata_for_proksee = {key:val for key,val in metadata_for_proksee.items() if val not in ["None", '']} + metadata_for_proksee = { + key: val + for key, val in metadata_for_proksee.items() + if val not in ["None", ""] + } contig_info = { "name": contig.name, @@ -167,110 +206,142 @@ def write_contig(organism: Organism, genome_sequences: Dict[str, str] = None, me } if genome_sequences: - contig_info['seq'] = genome_sequences.get(contig.name, "") + contig_info["seq"] = genome_sequences.get(contig.name, "") contigs_data_list.append(contig_info) return contigs_data_list -def write_genes(organism: Organism, multigenics: Set[GeneFamily], metadata_sep: str = "|", disable_bar: bool = True) -> Tuple[List[Dict], Dict[str, List[Gene]]]: + +def write_genes( + organism: Organism, + multigenics: Set[GeneFamily], + metadata_sep: str = "|", + disable_bar: bool = True, +) -> Tuple[List[Dict], Dict[str, List[Gene]]]: """ Writes gene data for a given organism, including both protein-coding genes and RNA genes. :param organism: The organism for which gene data will be written. :param metadata_sep: The separator used to join multiple metadata values :param disable_bar: A flag to disable the progress bar when processing genes (default: True). - + :return: List of gene data in a structured format and a dictionary mapping gene families to genes. """ genes_data_list = [] gf2gene = defaultdict(list) # Process protein-coding genes - for gene in tqdm(organism.genes, total=organism.number_of_genes(), unit="genes", disable=disable_bar): + for gene in tqdm( + organism.genes, + total=organism.number_of_genes(), + unit="genes", + disable=disable_bar, + ): gf = gene.family gf2gene[gf.name].append(gene) # Add gene info in meta of proksee - metadata_for_proksee = {"ID":gene.ID , - "family":gene.family.name} + metadata_for_proksee = {"ID": gene.ID, "family": gene.family.name} if multigenics and gf in multigenics: - metadata_for_proksee['multigenic'] = True + metadata_for_proksee["multigenic"] = True if gene.name: - metadata_for_proksee['name'] = gene.name + metadata_for_proksee["name"] = gene.name if gene.product: - metadata_for_proksee['product'] = gene.product + metadata_for_proksee["product"] = gene.product if gene.spot: - metadata_for_proksee['spot'] = gene.spot.ID + metadata_for_proksee["spot"] = gene.spot.ID if gene.module: - metadata_for_proksee['module'] = gene.module.ID + metadata_for_proksee["module"] = gene.module.ID if gene.has_joined_coordinates: - metadata_for_proksee['coordinates'] = gene.string_coordinates() + metadata_for_proksee["coordinates"] = gene.string_coordinates() if gene.overlaps_contig_edge: - metadata_for_proksee['overlaps_contig_edge'] = gene.overlaps_contig_edge - - metadata_for_proksee.update({f"gene_{k}": v for k, v in gene.formatted_metadata_dict(metadata_sep).items()}) - metadata_for_proksee.update({f"family_{k}": v for k, v in gene.family.formatted_metadata_dict(metadata_sep).items()}) - + metadata_for_proksee["overlaps_contig_edge"] = gene.overlaps_contig_edge + + metadata_for_proksee.update( + { + f"gene_{k}": v + for k, v in gene.formatted_metadata_dict(metadata_sep).items() + } + ) + metadata_for_proksee.update( + { + f"family_{k}": v + for k, v in gene.family.formatted_metadata_dict(metadata_sep).items() + } + ) # Proksee handles circularity effectively. When a gene extends beyond the edge of the contig, # Proksee correctly displays the gene with its initial start (at the end of the contig) and final stop (at the beginning of the contig). # However, this only applies when there's a single contig. If there are multiple contigs, the feature overlaps all contigs, causing confusion. - #In case of frameshift we don't want to split the gene by its coordinates + # In case of frameshift we don't want to split the gene by its coordinates # When the gene overlaps_contig_edge the gene is split in two piece for correct visualisation - coordinates_to_display = gene.coordinates if gene.overlaps_contig_edge else [(gene.start, gene.stop)] + coordinates_to_display = ( + gene.coordinates if gene.overlaps_contig_edge else [(gene.start, gene.stop)] + ) for start, stop in coordinates_to_display: - genes_data_list.append({ - "name": gene.name, - "type": "Gene", - "contig": gene.contig.name, - "start": start, - "stop": stop, - "strand": 1 if gene.strand == "+" else -1, - "product": gene.product, - "tags": [gene.family.named_partition], - "source": "Gene", - "legend": gene.family.named_partition, - "meta": metadata_for_proksee - }) + genes_data_list.append( + { + "name": gene.name, + "type": "Gene", + "contig": gene.contig.name, + "start": start, + "stop": stop, + "strand": 1 if gene.strand == "+" else -1, + "product": gene.product, + "tags": [gene.family.named_partition], + "source": "Gene", + "legend": gene.family.named_partition, + "meta": metadata_for_proksee, + } + ) # Process RNA genes - for gene in tqdm(organism.rna_genes, total=organism.number_of_rnas(), unit="rnas", disable=disable_bar): - - metadata_for_proksee = {"ID":gene.ID} + for gene in tqdm( + organism.rna_genes, + total=organism.number_of_rnas(), + unit="rnas", + disable=disable_bar, + ): + + metadata_for_proksee = {"ID": gene.ID} if gene.product: - metadata_for_proksee['product'] = gene.product + metadata_for_proksee["product"] = gene.product metadata_for_proksee.update(gene.formatted_metadata_dict(metadata_sep)) - coordinates_to_display = gene.coordinates if gene.overlaps_contig_edge else [(gene.start, gene.stop)] + coordinates_to_display = ( + gene.coordinates if gene.overlaps_contig_edge else [(gene.start, gene.stop)] + ) for start, stop in coordinates_to_display: - genes_data_list.append({ - "name": gene.name, - "type": "Gene", - "contig": gene.contig.name, - "start": start, - "stop": stop, - "strand": 1 if gene.strand == "+" else -1, - "product": gene.product, - "tags": [], - "source": "Gene", - "legend": "RNA", - "meta": metadata_for_proksee - }) + genes_data_list.append( + { + "name": gene.name, + "type": "Gene", + "contig": gene.contig.name, + "start": start, + "stop": stop, + "strand": 1 if gene.strand == "+" else -1, + "product": gene.product, + "tags": [], + "source": "Gene", + "legend": "RNA", + "meta": metadata_for_proksee, + } + ) return genes_data_list, gf2gene -def write_rgp(organism: Organism, metadata_sep:str = "|"): +def write_rgp(organism: Organism, metadata_sep: str = "|"): """ Writes RGP (Region of Genomic Plasticity) data for a given organism in proksee format. :param organism: The specific organism for which RGP data will be written. @@ -283,28 +354,32 @@ def write_rgp(organism: Organism, metadata_sep:str = "|"): # Iterate through each RGP in the pangenome for rgp in organism.regions: # Create an entry for the RGP in the data list - metadata_for_proksee = {"spot":f"{rgp.spot.ID}" if rgp.spot else "No_spot"} + metadata_for_proksee = {"spot": f"{rgp.spot.ID}" if rgp.spot else "No_spot"} if rgp.overlaps_contig_edge: - metadata_for_proksee['overlaps_contig_edge'] = rgp.overlaps_contig_edge + metadata_for_proksee["overlaps_contig_edge"] = rgp.overlaps_contig_edge metadata_for_proksee.update(rgp.formatted_metadata_dict(metadata_sep)) for start, stop in rgp.coordinates: - rgp_data_list.append({ - "name": rgp.name, - "contig": rgp.contig.name, - "start": start, - "stop": stop, - "legend": "RGP", - "source": "RGP", - "tags": [f"spot_{rgp.spot.ID}" if rgp.spot else "No_spot"], - "meta": metadata_for_proksee - }) + rgp_data_list.append( + { + "name": rgp.name, + "contig": rgp.contig.name, + "start": start, + "stop": stop, + "legend": "RGP", + "source": "RGP", + "tags": [f"spot_{rgp.spot.ID}" if rgp.spot else "No_spot"], + "meta": metadata_for_proksee, + } + ) return rgp_data_list -def write_modules(organism: Organism, gf2genes: Dict[str, List[Gene]], metadata_sep:str = "|"): +def write_modules( + organism: Organism, gf2genes: Dict[str, List[Gene]], metadata_sep: str = "|" +): """ Writes module data in proksee format for a list of modules associated with a given organism. @@ -322,37 +397,44 @@ def write_modules(organism: Organism, gf2genes: Dict[str, List[Gene]], metadata_ if gf_intersection: # Calculate the completion percentage - metadata_for_proksee = {'completion': round(100 * len(gf_intersection) / len(set(module.families)), 1)} + metadata_for_proksee = { + "completion": round( + 100 * len(gf_intersection) / len(set(module.families)), 1 + ) + } metadata_for_proksee.update(module.formatted_metadata_dict(metadata_sep)) # Create module data entries for genes within intersecting gene families for gf in gf_intersection: for gene in gf2genes[gf.name]: for start, stop in gene.coordinates: - modules_data_list.append({ - "name": str(module), - "presence": "Module", - "start": start, - "stop": stop, - "contig": gene.contig.name, - "legend": str(module), - "source": "Module", - "tags": [], - "meta": metadata_for_proksee - }) - - + modules_data_list.append( + { + "name": str(module), + "presence": "Module", + "start": start, + "stop": stop, + "contig": gene.contig.name, + "legend": str(module), + "source": "Module", + "tags": [], + "meta": metadata_for_proksee, + } + ) return modules_data_list -def write_proksee_organism(organism: Organism, output_file: Path, - features: List[str] = None, - module_to_colors: Dict[Module, str] = None, - genome_sequences: Dict[str, str] = None, - multigenics: Set[GeneFamily] = [], - metadata_sep: str = "|", - compress: bool = False): +def write_proksee_organism( + organism: Organism, + output_file: Path, + features: List[str] = None, + module_to_colors: Dict[Module, str] = None, + genome_sequences: Dict[str, str] = None, + multigenics: Set[GeneFamily] = [], + metadata_sep: str = "|", + compress: bool = False, +): """ Writes ProkSee data for a given organism, including contig information, genes colored by partition, RGPs, and modules. The resulting data is saved as a JSON file in the specified output file. @@ -367,17 +449,25 @@ def write_proksee_organism(organism: Organism, output_file: Path, """ proksee_data = initiate_proksee_data(features, organism, module_to_colors) - proksee_data["cgview"]["sequence"]["contigs"] = write_contig(organism, genome_sequences, metadata_sep=metadata_sep) + proksee_data["cgview"]["sequence"]["contigs"] = write_contig( + organism, genome_sequences, metadata_sep=metadata_sep + ) - genes_features, gf2genes = write_genes(organism, multigenics=multigenics, metadata_sep=metadata_sep) + genes_features, gf2genes = write_genes( + organism, multigenics=multigenics, metadata_sep=metadata_sep + ) proksee_data["cgview"]["features"] = genes_features if ("rgp" in features or "all" in features) and organism.regions is not None: - proksee_data["cgview"]["features"] += write_rgp(organism=organism, metadata_sep=metadata_sep) + proksee_data["cgview"]["features"] += write_rgp( + organism=organism, metadata_sep=metadata_sep + ) if module_to_colors is not None and ("modules" in features or "all" in features): - proksee_data["cgview"]["features"] += write_modules(organism=organism, gf2genes=gf2genes, metadata_sep=metadata_sep) + proksee_data["cgview"]["features"] += write_modules( + organism=organism, gf2genes=gf2genes, metadata_sep=metadata_sep + ) logging.debug(f"Write ProkSee for {organism.name}") with write_compressed_or_not(output_file, compress=compress) as out_json: diff --git a/ppanggolin/geneFamily.py b/ppanggolin/geneFamily.py index 6f1504d0..e9f843db 100644 --- a/ppanggolin/geneFamily.py +++ b/ppanggolin/geneFamily.py @@ -59,7 +59,7 @@ def __init__(self, family_id: int, name: str): """ assert isinstance(family_id, int), "GeneFamily object id should be an integer" assert isinstance(name, str), "GeneFamily object name should be a string" - assert name != '', "GeneFamily object cannot be created with an empty name" + assert name != "", "GeneFamily object cannot be created with an empty name" super().__init__() self.name = str(name) @@ -76,12 +76,9 @@ def __init__(self, family_id: int, name: str): self.bitarray = None def __repr__(self) -> str: - """Family representation - """ + """Family representation""" return f"{self.ID}: {self.name}" - - def __len__(self) -> int: """Get the number of genes in the family @@ -90,7 +87,7 @@ def __len__(self) -> int: return len(self._genes_getter) def __setitem__(self, identifier: str, gene: Gene): - """ Set gene to Gene Family + """Set gene to Gene Family :param identifier: ID of the gene :param gene: Gene object to add @@ -102,11 +99,17 @@ def __setitem__(self, identifier: str, gene: Gene): # TODO look at change start for position if not isinstance(gene, Gene): - raise TypeError(f"'Gene' type was expected but you provided a '{type(gene)}' type object") + raise TypeError( + f"'Gene' type was expected but you provided a '{type(gene)}' type object" + ) if not isinstance(identifier, str): - raise TypeError(f"Gene ID should be a string. You provided a '{type(identifier)}' type object") + raise TypeError( + f"Gene ID should be a string. You provided a '{type(identifier)}' type object" + ) if identifier in self._genes_getter: - raise KeyError(f"Gene with name {identifier} already exists in the gene family") + raise KeyError( + f"Gene with name {identifier} already exists in the gene family" + ) self._genes_getter[identifier] = gene # TODO define eq function @@ -123,11 +126,15 @@ def __getitem__(self, identifier: str) -> Gene: :raises KeyError: Gene with the given identifier does not exist in the contig """ if not isinstance(identifier, str): - raise TypeError(f"Gene ID should be a string. You provided a '{type(identifier)}' type object") + raise TypeError( + f"Gene ID should be a string. You provided a '{type(identifier)}' type object" + ) try: gene = self._genes_getter[identifier] except KeyError: - raise KeyError(f"Gene with the ID: {identifier} does not exist in the family") + raise KeyError( + f"Gene with the ID: {identifier} does not exist in the family" + ) else: return gene @@ -140,11 +147,15 @@ def __delitem__(self, identifier: str): :raises KeyError: Gene with the given identifier does not exist in the contig """ if not isinstance(identifier, str): - raise TypeError(f"Gene ID should be a string. You provided a '{type(identifier)}' type object") + raise TypeError( + f"Gene ID should be a string. You provided a '{type(identifier)}' type object" + ) try: del self._genes_getter[identifier] except KeyError: - raise KeyError(f"Gene with the name: {identifier} does not exist in the family") + raise KeyError( + f"Gene with the name: {identifier} does not exist in the family" + ) def add(self, gene: Gene): """Add a gene to the gene family, and sets the gene's :attr:family accordingly. @@ -154,7 +165,9 @@ def add(self, gene: Gene): :raises TypeError: If the provided `gene` is of the wrong type """ if not isinstance(gene, Gene): - raise TypeError(f"'Gene' type object was expected, but '{type(gene)}' type object was provided.") + raise TypeError( + f"'Gene' type object was expected, but '{type(gene)}' type object was provided." + ) self[gene.ID] = gene gene.family = self if gene.organism is not None and gene.organism in self._genePerOrg: @@ -171,7 +184,9 @@ def get(self, identifier: str) -> Gene: :raises TypeError: If the identifier is not instance string """ if not isinstance(identifier, str): - raise TypeError(f"Gene ID should be a string. You provided a '{type(identifier)}' type object") + raise TypeError( + f"Gene ID should be a string. You provided a '{type(identifier)}' type object" + ) return self[identifier] def remove(self, identifier): @@ -184,10 +199,11 @@ def remove(self, identifier): :raises TypeError: If the identifier is not instance string """ if not isinstance(identifier, str): - raise TypeError(f"Gene ID should be a string. You provided a '{type(identifier)}' type object") + raise TypeError( + f"Gene ID should be a string. You provided a '{type(identifier)}' type object" + ) del self[identifier] - @property def representative(self) -> Gene: """Get the representative gene of the family @@ -200,13 +216,13 @@ def representative(self) -> Gene: @representative.setter def representative(self, gene: Gene) -> None: - """Set the representative gene of the family - """ + """Set the representative gene of the family""" if not isinstance(gene, Gene): - raise TypeError(f"Representative gene should be a Gene. Found a '{type(gene)}' type object") + raise TypeError( + f"Representative gene should be a Gene. Found a '{type(gene)}' type object" + ) self._representative = gene - def contains_gene_id(self, identifier): """ Check if the family contains already a gene id @@ -218,12 +234,13 @@ def contains_gene_id(self, identifier): :raises TypeError: If the identifier is not instance string """ if not isinstance(identifier, str): - raise TypeError(f"Gene ID should be a string. You provided a '{type(identifier)}' type object") + raise TypeError( + f"Gene ID should be a string. You provided a '{type(identifier)}' type object" + ) return identifier in self._genes_getter - - #TODO define __eq__ + # TODO define __eq__ @property def partition(self): return self._partition if self._partition is not None else "" @@ -251,7 +268,6 @@ def named_partition(self) -> str: else: return "undefined" - @property def edges(self) -> Generator[Edge, None, None]: """Returns all Edges that are linked to this gene family @@ -313,34 +329,29 @@ def module(self, module: Module): @property def number_of_neighbors(self) -> int: - """Get the number of neighbor for the current gene family - """ + """Get the number of neighbor for the current gene family""" return len(self._edges_getter.keys()) @property def number_of_edges(self) -> int: - """Get the number of edges for the current gene family - """ + """Get the number of edges for the current gene family""" return len(self._edges_getter.values()) @property def number_of_genes(self) -> int: - """Get the number of genes for the current gene family - """ + """Get the number of genes for the current gene family""" return len(self._genes_getter) @property def number_of_organisms(self) -> int: - """Get the number of organisms for the current gene family - """ + """Get the number of organisms for the current gene family""" if len(self._genePerOrg) == 0: _ = self.get_org_dict() return len(self._genePerOrg.keys()) @property def number_of_spots(self) -> int: - """Get the number of spots for the current gene family - """ + """Get the number of spots for the current gene family""" return len(self._spots) @property @@ -361,8 +372,7 @@ def set_edge(self, target: GeneFamily, edge: Edge): self._edges_getter[target] = edge def get_edge(self, target: GeneFamily) -> Edge: - """Get the edge by the target gene family neighbor - """ + """Get the edge by the target gene family neighbor""" return self._edges_getter[target] def add_sequence(self, seq: str): @@ -379,7 +389,8 @@ def add_spot(self, spot: Spot): :param spot: Spot belonging to the family """ - from ppanggolin.region import Spot # prevent circular import error + from ppanggolin.region import Spot # prevent circular import error + if not isinstance(spot, Spot): raise TypeError(f"A spot object is expected, you give a {type(spot)}") self._spots.add(spot) @@ -389,12 +400,13 @@ def set_module(self, module: Module): :param module: Module belonging to the family """ - from ppanggolin.region import Module # prevent circular import error + from ppanggolin.region import Module # prevent circular import error + if not isinstance(module, Module): raise TypeError(f"A module object is expected, you give a {type(module)}") self._module = module - def mk_bitarray(self, index: Dict[Organism, int], partition: str = 'all'): + def mk_bitarray(self, index: Dict[Organism, int], partition: str = "all"): """Produces a bitarray representing the presence/absence of the family in the pangenome using the provided index The bitarray is stored in the :attr:`bitarray` attribute and is a :class:`gmpy2.xmpz` type. @@ -402,18 +414,18 @@ def mk_bitarray(self, index: Dict[Organism, int], partition: str = 'all'): :param partition: partition used to compute bitarray """ self.bitarray = gmpy2.xmpz() # pylint: disable=no-member - if partition == 'all': + if partition == "all": logging.getLogger("PPanGGOLiN").debug("all") for org in self.organisms: self.bitarray[index[org]] = 1 - elif partition in ['shell', 'cloud']: + elif partition in ["shell", "cloud"]: logging.getLogger("PPanGGOLiN").debug("shell, cloud") if self.named_partition == partition: for org in self.organisms: self.bitarray[index[org]] = 1 - elif partition == 'accessory': + elif partition == "accessory": logging.getLogger("PPanGGOLiN").debug("accessory") - if self.named_partition in ['shell', 'cloud']: + if self.named_partition in ["shell", "cloud"]: for org in self.organisms: self.bitarray[index[org]] = 1 @@ -439,10 +451,11 @@ def get_genes_per_org(self, org: Organism) -> Generator[Gene, None, None]: if len(self._genePerOrg) == 0: _ = self.get_org_dict() if org not in self._genePerOrg: - raise KeyError(f"Genome {org.name} does not have the gene family: {self.name}") + raise KeyError( + f"Genome {org.name} does not have the gene family: {self.name}" + ) yield from self._genePerOrg[org] - def is_single_copy(self, dup_margin: float, exclude_fragment: bool) -> bool: """ Checks if the gene family is considered single copy based on the provided criteria. @@ -467,7 +480,9 @@ def duplication_ratio(self, exclude_fragment: bool) -> bool: # Check if the family is in multicopy in all organisms for fam_genes_in_org in self.get_org_dict().values(): if exclude_fragment: - genes_count = len([gene for gene in fam_genes_in_org if not gene.is_fragment]) + genes_count = len( + [gene for gene in fam_genes_in_org if not gene.is_fragment] + ) else: genes_count = len(fam_genes_in_org) diff --git a/ppanggolin/genetic_codes.py b/ppanggolin/genetic_codes.py index af69157a..cdbf7ac2 100644 --- a/ppanggolin/genetic_codes.py +++ b/ppanggolin/genetic_codes.py @@ -1,6 +1,8945 @@ #!/usr/bin/env python3 -def genetic_codes(code): - return {'1': {'trans_table': {'CCB': 'P', 'CCD': 'P', 'CCH': 'P', 'CCK': 'P', 'CCN': 'P', 'CCW': 'P', 'CCC': 'P', 'CCR': 'P', 'CCG': 'P', 'CCA': 'P', 'CCM': 'P', 'CCV': 'P', 'CCY': 'P', 'CCS': 'P', 'CCT': 'P', 'CGB': 'R', 'CGD': 'R', 'CGH': 'R', 'CGK': 'R', 'CGN': 'R', 'CGW': 'R', 'CGC': 'R', 'CGR': 'R', 'CGG': 'R', 'CGA': 'R', 'CGM': 'R', 'CGV': 'R', 'CGY': 'R', 'CGS': 'R', 'CGT': 'R', 'CAC': 'H', 'CAR': 'Q', 'CAG': 'Q', 'CAA': 'Q', 'CAY': 'H', 'CAT': 'H', 'CTB': 'L', 'CTD': 'L', 'CTH': 'L', 'CTK': 'L', 'CTN': 'L', 'CTW': 'L', 'CTC': 'L', 'CTR': 'L', 'CTG': 'L', 'CTA': 'L', 'CTM': 'L', 'CTV': 'L', 'CTY': 'L', 'CTS': 'L', 'CTT': 'L', 'GCB': 'A', 'GCD': 'A', 'GCH': 'A', 'GCK': 'A', 'GCN': 'A', 'GCW': 'A', 'GCC': 'A', 'GCR': 'A', 'GCG': 'A', 'GCA': 'A', 'GCM': 'A', 'GCV': 'A', 'GCY': 'A', 'GCS': 'A', 'GCT': 'A', 'GGB': 'G', 'GGD': 'G', 'GGH': 'G', 'GGK': 'G', 'GGN': 'G', 'GGW': 'G', 'GGC': 'G', 'GGR': 'G', 'GGG': 'G', 'GGA': 'G', 'GGM': 'G', 'GGV': 'G', 'GGY': 'G', 'GGS': 'G', 'GGT': 'G', 'GAC': 'D', 'GAR': 'E', 'GAG': 'E', 'GAA': 'E', 'GAY': 'D', 'GAT': 'D', 'GTB': 'V', 'GTD': 'V', 'GTH': 'V', 'GTK': 'V', 'GTN': 'V', 'GTW': 'V', 'GTC': 'V', 'GTR': 'V', 'GTG': 'V', 'GTA': 'V', 'GTM': 'V', 'GTV': 'V', 'GTY': 'V', 'GTS': 'V', 'GTT': 'V', 'ACB': 'T', 'ACD': 'T', 'ACH': 'T', 'ACK': 'T', 'ACN': 'T', 'ACW': 'T', 'ACC': 'T', 'ACR': 'T', 'ACG': 'T', 'ACA': 'T', 'ACM': 'T', 'ACV': 'T', 'ACY': 'T', 'ACS': 'T', 'ACT': 'T', 'AGC': 'S', 'AGR': 'R', 'AGG': 'R', 'AGA': 'R', 'AGY': 'S', 'AGT': 'S', 'AAC': 'N', 'AAR': 'K', 'AAG': 'K', 'AAA': 'K', 'AAY': 'N', 'AAT': 'N', 'ATH': 'I', 'ATW': 'I', 'ATC': 'I', 'ATG': 'M', 'ATA': 'I', 'ATM': 'I', 'ATY': 'I', 'ATT': 'I', 'MGR': 'R', 'MGG': 'R', 'MGA': 'R', 'YTR': 'L', 'YTG': 'L', 'YTA': 'L', 'TCB': 'S', 'TCD': 'S', 'TCH': 'S', 'TCK': 'S', 'TCN': 'S', 'TCW': 'S', 'TCC': 'S', 'TCR': 'S', 'TCG': 'S', 'TCA': 'S', 'TCM': 'S', 'TCV': 'S', 'TCY': 'S', 'TCS': 'S', 'TCT': 'S', 'TRA': '*', 'TGC': 'C', 'TGG': 'W', 'TGA': '*', 'TGY': 'C', 'TGT': 'C', 'TAC': 'Y', 'TAR': '*', 'TAG': '*', 'TAA': '*', 'TAY': 'Y', 'TAT': 'Y', 'TTC': 'F', 'TTR': 'L', 'TTG': 'L', 'TTA': 'L', 'TTY': 'F', 'TTT': 'F'}, 'start_table': {'HTG': 'M', 'WTG': 'M', 'CCB': 'P', 'CCD': 'P', 'CCH': 'P', 'CCK': 'P', 'CCN': 'P', 'CCW': 'P', 'CCC': 'P', 'CCR': 'P', 'CCG': 'P', 'CCA': 'P', 'CCM': 'P', 'CCV': 'P', 'CCY': 'P', 'CCS': 'P', 'CCT': 'P', 'CGB': 'R', 'CGD': 'R', 'CGH': 'R', 'CGK': 'R', 'CGN': 'R', 'CGW': 'R', 'CGC': 'R', 'CGR': 'R', 'CGG': 'R', 'CGA': 'R', 'CGM': 'R', 'CGV': 'R', 'CGY': 'R', 'CGS': 'R', 'CGT': 'R', 'CAC': 'H', 'CAR': 'Q', 'CAG': 'Q', 'CAA': 'Q', 'CAY': 'H', 'CAT': 'H', 'CTH': 'L', 'CTW': 'L', 'CTC': 'L', 'CTG': 'M', 'CTA': 'L', 'CTM': 'L', 'CTY': 'L', 'CTT': 'L', 'GCB': 'A', 'GCD': 'A', 'GCH': 'A', 'GCK': 'A', 'GCN': 'A', 'GCW': 'A', 'GCC': 'A', 'GCR': 'A', 'GCG': 'A', 'GCA': 'A', 'GCM': 'A', 'GCV': 'A', 'GCY': 'A', 'GCS': 'A', 'GCT': 'A', 'GGB': 'G', 'GGD': 'G', 'GGH': 'G', 'GGK': 'G', 'GGN': 'G', 'GGW': 'G', 'GGC': 'G', 'GGR': 'G', 'GGG': 'G', 'GGA': 'G', 'GGM': 'G', 'GGV': 'G', 'GGY': 'G', 'GGS': 'G', 'GGT': 'G', 'GAC': 'D', 'GAR': 'E', 'GAG': 'E', 'GAA': 'E', 'GAY': 'D', 'GAT': 'D', 'GTB': 'V', 'GTD': 'V', 'GTH': 'V', 'GTK': 'V', 'GTN': 'V', 'GTW': 'V', 'GTC': 'V', 'GTR': 'V', 'GTG': 'V', 'GTA': 'V', 'GTM': 'V', 'GTV': 'V', 'GTY': 'V', 'GTS': 'V', 'GTT': 'V', 'ACB': 'T', 'ACD': 'T', 'ACH': 'T', 'ACK': 'T', 'ACN': 'T', 'ACW': 'T', 'ACC': 'T', 'ACR': 'T', 'ACG': 'T', 'ACA': 'T', 'ACM': 'T', 'ACV': 'T', 'ACY': 'T', 'ACS': 'T', 'ACT': 'T', 'AGC': 'S', 'AGR': 'R', 'AGG': 'R', 'AGA': 'R', 'AGY': 'S', 'AGT': 'S', 'AAC': 'N', 'AAR': 'K', 'AAG': 'K', 'AAA': 'K', 'AAY': 'N', 'AAT': 'N', 'ATH': 'I', 'ATW': 'I', 'ATC': 'I', 'ATG': 'M', 'ATA': 'I', 'ATM': 'I', 'ATY': 'I', 'ATT': 'I', 'MGR': 'R', 'MGG': 'R', 'MGA': 'R', 'MTG': 'M', 'YTG': 'M', 'YTA': 'L', 'TCB': 'S', 'TCD': 'S', 'TCH': 'S', 'TCK': 'S', 'TCN': 'S', 'TCW': 'S', 'TCC': 'S', 'TCR': 'S', 'TCG': 'S', 'TCA': 'S', 'TCM': 'S', 'TCV': 'S', 'TCY': 'S', 'TCS': 'S', 'TCT': 'S', 'TRA': '*', 'TGC': 'C', 'TGG': 'W', 'TGA': '*', 'TGY': 'C', 'TGT': 'C', 'TAC': 'Y', 'TAR': '*', 'TAG': '*', 'TAA': '*', 'TAY': 'Y', 'TAT': 'Y', 'TTC': 'F', 'TTG': 'M', 'TTA': 'L', 'TTY': 'F', 'TTT': 'F'}}, '2': {'trans_table': {'CCB': 'P', 'CCD': 'P', 'CCH': 'P', 'CCK': 'P', 'CCN': 'P', 'CCW': 'P', 'CCC': 'P', 'CCR': 'P', 'CCG': 'P', 'CCA': 'P', 'CCM': 'P', 'CCV': 'P', 'CCY': 'P', 'CCS': 'P', 'CCT': 'P', 'CGB': 'R', 'CGD': 'R', 'CGH': 'R', 'CGK': 'R', 'CGN': 'R', 'CGW': 'R', 'CGC': 'R', 'CGR': 'R', 'CGG': 'R', 'CGA': 'R', 'CGM': 'R', 'CGV': 'R', 'CGY': 'R', 'CGS': 'R', 'CGT': 'R', 'CAC': 'H', 'CAR': 'Q', 'CAG': 'Q', 'CAA': 'Q', 'CAY': 'H', 'CAT': 'H', 'CTB': 'L', 'CTD': 'L', 'CTH': 'L', 'CTK': 'L', 'CTN': 'L', 'CTW': 'L', 'CTC': 'L', 'CTR': 'L', 'CTG': 'L', 'CTA': 'L', 'CTM': 'L', 'CTV': 'L', 'CTY': 'L', 'CTS': 'L', 'CTT': 'L', 'GCB': 'A', 'GCD': 'A', 'GCH': 'A', 'GCK': 'A', 'GCN': 'A', 'GCW': 'A', 'GCC': 'A', 'GCR': 'A', 'GCG': 'A', 'GCA': 'A', 'GCM': 'A', 'GCV': 'A', 'GCY': 'A', 'GCS': 'A', 'GCT': 'A', 'GGB': 'G', 'GGD': 'G', 'GGH': 'G', 'GGK': 'G', 'GGN': 'G', 'GGW': 'G', 'GGC': 'G', 'GGR': 'G', 'GGG': 'G', 'GGA': 'G', 'GGM': 'G', 'GGV': 'G', 'GGY': 'G', 'GGS': 'G', 'GGT': 'G', 'GAC': 'D', 'GAR': 'E', 'GAG': 'E', 'GAA': 'E', 'GAY': 'D', 'GAT': 'D', 'GTB': 'V', 'GTD': 'V', 'GTH': 'V', 'GTK': 'V', 'GTN': 'V', 'GTW': 'V', 'GTC': 'V', 'GTR': 'V', 'GTG': 'V', 'GTA': 'V', 'GTM': 'V', 'GTV': 'V', 'GTY': 'V', 'GTS': 'V', 'GTT': 'V', 'ACB': 'T', 'ACD': 'T', 'ACH': 'T', 'ACK': 'T', 'ACN': 'T', 'ACW': 'T', 'ACC': 'T', 'ACR': 'T', 'ACG': 'T', 'ACA': 'T', 'ACM': 'T', 'ACV': 'T', 'ACY': 'T', 'ACS': 'T', 'ACT': 'T', 'AGC': 'S', 'AGR': '*', 'AGG': '*', 'AGA': '*', 'AGY': 'S', 'AGT': 'S', 'AAC': 'N', 'AAR': 'K', 'AAG': 'K', 'AAA': 'K', 'AAY': 'N', 'AAT': 'N', 'ATC': 'I', 'ATR': 'M', 'ATG': 'M', 'ATA': 'M', 'ATY': 'I', 'ATT': 'I', 'YTR': 'L', 'YTG': 'L', 'YTA': 'L', 'TCB': 'S', 'TCD': 'S', 'TCH': 'S', 'TCK': 'S', 'TCN': 'S', 'TCW': 'S', 'TCC': 'S', 'TCR': 'S', 'TCG': 'S', 'TCA': 'S', 'TCM': 'S', 'TCV': 'S', 'TCY': 'S', 'TCS': 'S', 'TCT': 'S', 'TGC': 'C', 'TGR': 'W', 'TGG': 'W', 'TGA': 'W', 'TGY': 'C', 'TGT': 'C', 'TAC': 'Y', 'TAR': '*', 'TAG': '*', 'TAA': '*', 'TAY': 'Y', 'TAT': 'Y', 'TTC': 'F', 'TTR': 'L', 'TTG': 'L', 'TTA': 'L', 'TTY': 'F', 'TTT': 'F'}, 'start_table': {'CCB': 'P', 'CCD': 'P', 'CCH': 'P', 'CCK': 'P', 'CCN': 'P', 'CCW': 'P', 'CCC': 'P', 'CCR': 'P', 'CCG': 'P', 'CCA': 'P', 'CCM': 'P', 'CCV': 'P', 'CCY': 'P', 'CCS': 'P', 'CCT': 'P', 'CGB': 'R', 'CGD': 'R', 'CGH': 'R', 'CGK': 'R', 'CGN': 'R', 'CGW': 'R', 'CGC': 'R', 'CGR': 'R', 'CGG': 'R', 'CGA': 'R', 'CGM': 'R', 'CGV': 'R', 'CGY': 'R', 'CGS': 'R', 'CGT': 'R', 'CAC': 'H', 'CAR': 'Q', 'CAG': 'Q', 'CAA': 'Q', 'CAY': 'H', 'CAT': 'H', 'CTB': 'L', 'CTD': 'L', 'CTH': 'L', 'CTK': 'L', 'CTN': 'L', 'CTW': 'L', 'CTC': 'L', 'CTR': 'L', 'CTG': 'L', 'CTA': 'L', 'CTM': 'L', 'CTV': 'L', 'CTY': 'L', 'CTS': 'L', 'CTT': 'L', 'RTG': 'M', 'GCB': 'A', 'GCD': 'A', 'GCH': 'A', 'GCK': 'A', 'GCN': 'A', 'GCW': 'A', 'GCC': 'A', 'GCR': 'A', 'GCG': 'A', 'GCA': 'A', 'GCM': 'A', 'GCV': 'A', 'GCY': 'A', 'GCS': 'A', 'GCT': 'A', 'GGB': 'G', 'GGD': 'G', 'GGH': 'G', 'GGK': 'G', 'GGN': 'G', 'GGW': 'G', 'GGC': 'G', 'GGR': 'G', 'GGG': 'G', 'GGA': 'G', 'GGM': 'G', 'GGV': 'G', 'GGY': 'G', 'GGS': 'G', 'GGT': 'G', 'GAC': 'D', 'GAR': 'E', 'GAG': 'E', 'GAA': 'E', 'GAY': 'D', 'GAT': 'D', 'GTH': 'V', 'GTW': 'V', 'GTC': 'V', 'GTG': 'M', 'GTA': 'V', 'GTM': 'V', 'GTY': 'V', 'GTT': 'V', 'ACB': 'T', 'ACD': 'T', 'ACH': 'T', 'ACK': 'T', 'ACN': 'T', 'ACW': 'T', 'ACC': 'T', 'ACR': 'T', 'ACG': 'T', 'ACA': 'T', 'ACM': 'T', 'ACV': 'T', 'ACY': 'T', 'ACS': 'T', 'ACT': 'T', 'AGC': 'S', 'AGR': '*', 'AGG': '*', 'AGA': '*', 'AGY': 'S', 'AGT': 'S', 'AAC': 'N', 'AAR': 'K', 'AAG': 'K', 'AAA': 'K', 'AAY': 'N', 'AAT': 'N', 'ATB': 'M', 'ATD': 'M', 'ATH': 'M', 'ATK': 'M', 'ATN': 'M', 'ATW': 'M', 'ATC': 'M', 'ATR': 'M', 'ATG': 'M', 'ATA': 'M', 'ATM': 'M', 'ATV': 'M', 'ATY': 'M', 'ATS': 'M', 'ATT': 'M', 'YTR': 'L', 'YTG': 'L', 'YTA': 'L', 'TCB': 'S', 'TCD': 'S', 'TCH': 'S', 'TCK': 'S', 'TCN': 'S', 'TCW': 'S', 'TCC': 'S', 'TCR': 'S', 'TCG': 'S', 'TCA': 'S', 'TCM': 'S', 'TCV': 'S', 'TCY': 'S', 'TCS': 'S', 'TCT': 'S', 'TGC': 'C', 'TGR': 'W', 'TGG': 'W', 'TGA': 'W', 'TGY': 'C', 'TGT': 'C', 'TAC': 'Y', 'TAR': '*', 'TAG': '*', 'TAA': '*', 'TAY': 'Y', 'TAT': 'Y', 'TTC': 'F', 'TTR': 'L', 'TTG': 'L', 'TTA': 'L', 'TTY': 'F', 'TTT': 'F'}}, '3': {'trans_table': {'CCB': 'P', 'CCD': 'P', 'CCH': 'P', 'CCK': 'P', 'CCN': 'P', 'CCW': 'P', 'CCC': 'P', 'CCR': 'P', 'CCG': 'P', 'CCA': 'P', 'CCM': 'P', 'CCV': 'P', 'CCY': 'P', 'CCS': 'P', 'CCT': 'P', 'CGB': 'R', 'CGD': 'R', 'CGH': 'R', 'CGK': 'R', 'CGN': 'R', 'CGW': 'R', 'CGC': 'R', 'CGR': 'R', 'CGG': 'R', 'CGA': 'R', 'CGM': 'R', 'CGV': 'R', 'CGY': 'R', 'CGS': 'R', 'CGT': 'R', 'CAC': 'H', 'CAR': 'Q', 'CAG': 'Q', 'CAA': 'Q', 'CAY': 'H', 'CAT': 'H', 'CTB': 'T', 'CTD': 'T', 'CTH': 'T', 'CTK': 'T', 'CTN': 'T', 'CTW': 'T', 'CTC': 'T', 'CTR': 'T', 'CTG': 'T', 'CTA': 'T', 'CTM': 'T', 'CTV': 'T', 'CTY': 'T', 'CTS': 'T', 'CTT': 'T', 'GCB': 'A', 'GCD': 'A', 'GCH': 'A', 'GCK': 'A', 'GCN': 'A', 'GCW': 'A', 'GCC': 'A', 'GCR': 'A', 'GCG': 'A', 'GCA': 'A', 'GCM': 'A', 'GCV': 'A', 'GCY': 'A', 'GCS': 'A', 'GCT': 'A', 'GGB': 'G', 'GGD': 'G', 'GGH': 'G', 'GGK': 'G', 'GGN': 'G', 'GGW': 'G', 'GGC': 'G', 'GGR': 'G', 'GGG': 'G', 'GGA': 'G', 'GGM': 'G', 'GGV': 'G', 'GGY': 'G', 'GGS': 'G', 'GGT': 'G', 'GAC': 'D', 'GAR': 'E', 'GAG': 'E', 'GAA': 'E', 'GAY': 'D', 'GAT': 'D', 'GTB': 'V', 'GTD': 'V', 'GTH': 'V', 'GTK': 'V', 'GTN': 'V', 'GTW': 'V', 'GTC': 'V', 'GTR': 'V', 'GTG': 'V', 'GTA': 'V', 'GTM': 'V', 'GTV': 'V', 'GTY': 'V', 'GTS': 'V', 'GTT': 'V', 'ACB': 'T', 'ACD': 'T', 'ACH': 'T', 'ACK': 'T', 'ACN': 'T', 'ACW': 'T', 'ACC': 'T', 'ACR': 'T', 'ACG': 'T', 'ACA': 'T', 'ACM': 'T', 'ACV': 'T', 'ACY': 'T', 'ACS': 'T', 'ACT': 'T', 'AGC': 'S', 'AGR': 'R', 'AGG': 'R', 'AGA': 'R', 'AGY': 'S', 'AGT': 'S', 'AAC': 'N', 'AAR': 'K', 'AAG': 'K', 'AAA': 'K', 'AAY': 'N', 'AAT': 'N', 'ATC': 'I', 'ATR': 'M', 'ATG': 'M', 'ATA': 'M', 'ATY': 'I', 'ATT': 'I', 'MGR': 'R', 'MGG': 'R', 'MGA': 'R', 'TCB': 'S', 'TCD': 'S', 'TCH': 'S', 'TCK': 'S', 'TCN': 'S', 'TCW': 'S', 'TCC': 'S', 'TCR': 'S', 'TCG': 'S', 'TCA': 'S', 'TCM': 'S', 'TCV': 'S', 'TCY': 'S', 'TCS': 'S', 'TCT': 'S', 'TGC': 'C', 'TGR': 'W', 'TGG': 'W', 'TGA': 'W', 'TGY': 'C', 'TGT': 'C', 'TAC': 'Y', 'TAR': '*', 'TAG': '*', 'TAA': '*', 'TAY': 'Y', 'TAT': 'Y', 'TTC': 'F', 'TTR': 'L', 'TTG': 'L', 'TTA': 'L', 'TTY': 'F', 'TTT': 'F'}, 'start_table': {'CCB': 'P', 'CCD': 'P', 'CCH': 'P', 'CCK': 'P', 'CCN': 'P', 'CCW': 'P', 'CCC': 'P', 'CCR': 'P', 'CCG': 'P', 'CCA': 'P', 'CCM': 'P', 'CCV': 'P', 'CCY': 'P', 'CCS': 'P', 'CCT': 'P', 'CGB': 'R', 'CGD': 'R', 'CGH': 'R', 'CGK': 'R', 'CGN': 'R', 'CGW': 'R', 'CGC': 'R', 'CGR': 'R', 'CGG': 'R', 'CGA': 'R', 'CGM': 'R', 'CGV': 'R', 'CGY': 'R', 'CGS': 'R', 'CGT': 'R', 'CAC': 'H', 'CAR': 'Q', 'CAG': 'Q', 'CAA': 'Q', 'CAY': 'H', 'CAT': 'H', 'CTB': 'T', 'CTD': 'T', 'CTH': 'T', 'CTK': 'T', 'CTN': 'T', 'CTW': 'T', 'CTC': 'T', 'CTR': 'T', 'CTG': 'T', 'CTA': 'T', 'CTM': 'T', 'CTV': 'T', 'CTY': 'T', 'CTS': 'T', 'CTT': 'T', 'RTG': 'M', 'GCB': 'A', 'GCD': 'A', 'GCH': 'A', 'GCK': 'A', 'GCN': 'A', 'GCW': 'A', 'GCC': 'A', 'GCR': 'A', 'GCG': 'A', 'GCA': 'A', 'GCM': 'A', 'GCV': 'A', 'GCY': 'A', 'GCS': 'A', 'GCT': 'A', 'GGB': 'G', 'GGD': 'G', 'GGH': 'G', 'GGK': 'G', 'GGN': 'G', 'GGW': 'G', 'GGC': 'G', 'GGR': 'G', 'GGG': 'G', 'GGA': 'G', 'GGM': 'G', 'GGV': 'G', 'GGY': 'G', 'GGS': 'G', 'GGT': 'G', 'GAC': 'D', 'GAR': 'E', 'GAG': 'E', 'GAA': 'E', 'GAY': 'D', 'GAT': 'D', 'GTH': 'V', 'GTW': 'V', 'GTC': 'V', 'GTG': 'M', 'GTA': 'V', 'GTM': 'V', 'GTY': 'V', 'GTT': 'V', 'ACB': 'T', 'ACD': 'T', 'ACH': 'T', 'ACK': 'T', 'ACN': 'T', 'ACW': 'T', 'ACC': 'T', 'ACR': 'T', 'ACG': 'T', 'ACA': 'T', 'ACM': 'T', 'ACV': 'T', 'ACY': 'T', 'ACS': 'T', 'ACT': 'T', 'AGC': 'S', 'AGR': 'R', 'AGG': 'R', 'AGA': 'R', 'AGY': 'S', 'AGT': 'S', 'AAC': 'N', 'AAR': 'K', 'AAG': 'K', 'AAA': 'K', 'AAY': 'N', 'AAT': 'N', 'ATC': 'I', 'ATR': 'M', 'ATG': 'M', 'ATA': 'M', 'ATY': 'I', 'ATT': 'I', 'MGR': 'R', 'MGG': 'R', 'MGA': 'R', 'TCB': 'S', 'TCD': 'S', 'TCH': 'S', 'TCK': 'S', 'TCN': 'S', 'TCW': 'S', 'TCC': 'S', 'TCR': 'S', 'TCG': 'S', 'TCA': 'S', 'TCM': 'S', 'TCV': 'S', 'TCY': 'S', 'TCS': 'S', 'TCT': 'S', 'TGC': 'C', 'TGR': 'W', 'TGG': 'W', 'TGA': 'W', 'TGY': 'C', 'TGT': 'C', 'TAC': 'Y', 'TAR': '*', 'TAG': '*', 'TAA': '*', 'TAY': 'Y', 'TAT': 'Y', 'TTC': 'F', 'TTR': 'L', 'TTG': 'L', 'TTA': 'L', 'TTY': 'F', 'TTT': 'F'}}, '4': {'trans_table': {'CCB': 'P', 'CCD': 'P', 'CCH': 'P', 'CCK': 'P', 'CCN': 'P', 'CCW': 'P', 'CCC': 'P', 'CCR': 'P', 'CCG': 'P', 'CCA': 'P', 'CCM': 'P', 'CCV': 'P', 'CCY': 'P', 'CCS': 'P', 'CCT': 'P', 'CGB': 'R', 'CGD': 'R', 'CGH': 'R', 'CGK': 'R', 'CGN': 'R', 'CGW': 'R', 'CGC': 'R', 'CGR': 'R', 'CGG': 'R', 'CGA': 'R', 'CGM': 'R', 'CGV': 'R', 'CGY': 'R', 'CGS': 'R', 'CGT': 'R', 'CAC': 'H', 'CAR': 'Q', 'CAG': 'Q', 'CAA': 'Q', 'CAY': 'H', 'CAT': 'H', 'CTB': 'L', 'CTD': 'L', 'CTH': 'L', 'CTK': 'L', 'CTN': 'L', 'CTW': 'L', 'CTC': 'L', 'CTR': 'L', 'CTG': 'L', 'CTA': 'L', 'CTM': 'L', 'CTV': 'L', 'CTY': 'L', 'CTS': 'L', 'CTT': 'L', 'GCB': 'A', 'GCD': 'A', 'GCH': 'A', 'GCK': 'A', 'GCN': 'A', 'GCW': 'A', 'GCC': 'A', 'GCR': 'A', 'GCG': 'A', 'GCA': 'A', 'GCM': 'A', 'GCV': 'A', 'GCY': 'A', 'GCS': 'A', 'GCT': 'A', 'GGB': 'G', 'GGD': 'G', 'GGH': 'G', 'GGK': 'G', 'GGN': 'G', 'GGW': 'G', 'GGC': 'G', 'GGR': 'G', 'GGG': 'G', 'GGA': 'G', 'GGM': 'G', 'GGV': 'G', 'GGY': 'G', 'GGS': 'G', 'GGT': 'G', 'GAC': 'D', 'GAR': 'E', 'GAG': 'E', 'GAA': 'E', 'GAY': 'D', 'GAT': 'D', 'GTB': 'V', 'GTD': 'V', 'GTH': 'V', 'GTK': 'V', 'GTN': 'V', 'GTW': 'V', 'GTC': 'V', 'GTR': 'V', 'GTG': 'V', 'GTA': 'V', 'GTM': 'V', 'GTV': 'V', 'GTY': 'V', 'GTS': 'V', 'GTT': 'V', 'ACB': 'T', 'ACD': 'T', 'ACH': 'T', 'ACK': 'T', 'ACN': 'T', 'ACW': 'T', 'ACC': 'T', 'ACR': 'T', 'ACG': 'T', 'ACA': 'T', 'ACM': 'T', 'ACV': 'T', 'ACY': 'T', 'ACS': 'T', 'ACT': 'T', 'AGC': 'S', 'AGR': 'R', 'AGG': 'R', 'AGA': 'R', 'AGY': 'S', 'AGT': 'S', 'AAC': 'N', 'AAR': 'K', 'AAG': 'K', 'AAA': 'K', 'AAY': 'N', 'AAT': 'N', 'ATH': 'I', 'ATW': 'I', 'ATC': 'I', 'ATG': 'M', 'ATA': 'I', 'ATM': 'I', 'ATY': 'I', 'ATT': 'I', 'MGR': 'R', 'MGG': 'R', 'MGA': 'R', 'YTR': 'L', 'YTG': 'L', 'YTA': 'L', 'TCB': 'S', 'TCD': 'S', 'TCH': 'S', 'TCK': 'S', 'TCN': 'S', 'TCW': 'S', 'TCC': 'S', 'TCR': 'S', 'TCG': 'S', 'TCA': 'S', 'TCM': 'S', 'TCV': 'S', 'TCY': 'S', 'TCS': 'S', 'TCT': 'S', 'TGC': 'C', 'TGR': 'W', 'TGG': 'W', 'TGA': 'W', 'TGY': 'C', 'TGT': 'C', 'TAC': 'Y', 'TAR': '*', 'TAG': '*', 'TAA': '*', 'TAY': 'Y', 'TAT': 'Y', 'TTC': 'F', 'TTR': 'L', 'TTG': 'L', 'TTA': 'L', 'TTY': 'F', 'TTT': 'F'}, 'start_table': {'BTG': 'M', 'DTG': 'M', 'HTG': 'M', 'KTG': 'M', 'NTG': 'M', 'WTR': 'M', 'WTG': 'M', 'WTA': 'M', 'CCB': 'P', 'CCD': 'P', 'CCH': 'P', 'CCK': 'P', 'CCN': 'P', 'CCW': 'P', 'CCC': 'P', 'CCR': 'P', 'CCG': 'P', 'CCA': 'P', 'CCM': 'P', 'CCV': 'P', 'CCY': 'P', 'CCS': 'P', 'CCT': 'P', 'CGB': 'R', 'CGD': 'R', 'CGH': 'R', 'CGK': 'R', 'CGN': 'R', 'CGW': 'R', 'CGC': 'R', 'CGR': 'R', 'CGG': 'R', 'CGA': 'R', 'CGM': 'R', 'CGV': 'R', 'CGY': 'R', 'CGS': 'R', 'CGT': 'R', 'CAC': 'H', 'CAR': 'Q', 'CAG': 'Q', 'CAA': 'Q', 'CAY': 'H', 'CAT': 'H', 'CTH': 'L', 'CTW': 'L', 'CTC': 'L', 'CTG': 'M', 'CTA': 'L', 'CTM': 'L', 'CTY': 'L', 'CTT': 'L', 'RTG': 'M', 'GCB': 'A', 'GCD': 'A', 'GCH': 'A', 'GCK': 'A', 'GCN': 'A', 'GCW': 'A', 'GCC': 'A', 'GCR': 'A', 'GCG': 'A', 'GCA': 'A', 'GCM': 'A', 'GCV': 'A', 'GCY': 'A', 'GCS': 'A', 'GCT': 'A', 'GGB': 'G', 'GGD': 'G', 'GGH': 'G', 'GGK': 'G', 'GGN': 'G', 'GGW': 'G', 'GGC': 'G', 'GGR': 'G', 'GGG': 'G', 'GGA': 'G', 'GGM': 'G', 'GGV': 'G', 'GGY': 'G', 'GGS': 'G', 'GGT': 'G', 'GAC': 'D', 'GAR': 'E', 'GAG': 'E', 'GAA': 'E', 'GAY': 'D', 'GAT': 'D', 'GTH': 'V', 'GTW': 'V', 'GTC': 'V', 'GTG': 'M', 'GTA': 'V', 'GTM': 'V', 'GTY': 'V', 'GTT': 'V', 'ACB': 'T', 'ACD': 'T', 'ACH': 'T', 'ACK': 'T', 'ACN': 'T', 'ACW': 'T', 'ACC': 'T', 'ACR': 'T', 'ACG': 'T', 'ACA': 'T', 'ACM': 'T', 'ACV': 'T', 'ACY': 'T', 'ACS': 'T', 'ACT': 'T', 'AGC': 'S', 'AGR': 'R', 'AGG': 'R', 'AGA': 'R', 'AGY': 'S', 'AGT': 'S', 'AAC': 'N', 'AAR': 'K', 'AAG': 'K', 'AAA': 'K', 'AAY': 'N', 'AAT': 'N', 'ATB': 'M', 'ATD': 'M', 'ATH': 'M', 'ATK': 'M', 'ATN': 'M', 'ATW': 'M', 'ATC': 'M', 'ATR': 'M', 'ATG': 'M', 'ATA': 'M', 'ATM': 'M', 'ATV': 'M', 'ATY': 'M', 'ATS': 'M', 'ATT': 'M', 'MGR': 'R', 'MGG': 'R', 'MGA': 'R', 'MTG': 'M', 'VTG': 'M', 'YTG': 'M', 'STG': 'M', 'TCB': 'S', 'TCD': 'S', 'TCH': 'S', 'TCK': 'S', 'TCN': 'S', 'TCW': 'S', 'TCC': 'S', 'TCR': 'S', 'TCG': 'S', 'TCA': 'S', 'TCM': 'S', 'TCV': 'S', 'TCY': 'S', 'TCS': 'S', 'TCT': 'S', 'TGC': 'C', 'TGR': 'W', 'TGG': 'W', 'TGA': 'W', 'TGY': 'C', 'TGT': 'C', 'TAC': 'Y', 'TAR': '*', 'TAG': '*', 'TAA': '*', 'TAY': 'Y', 'TAT': 'Y', 'TTC': 'F', 'TTR': 'M', 'TTG': 'M', 'TTA': 'M', 'TTY': 'F', 'TTT': 'F'}}, '5': {'trans_table': {'CCB': 'P', 'CCD': 'P', 'CCH': 'P', 'CCK': 'P', 'CCN': 'P', 'CCW': 'P', 'CCC': 'P', 'CCR': 'P', 'CCG': 'P', 'CCA': 'P', 'CCM': 'P', 'CCV': 'P', 'CCY': 'P', 'CCS': 'P', 'CCT': 'P', 'CGB': 'R', 'CGD': 'R', 'CGH': 'R', 'CGK': 'R', 'CGN': 'R', 'CGW': 'R', 'CGC': 'R', 'CGR': 'R', 'CGG': 'R', 'CGA': 'R', 'CGM': 'R', 'CGV': 'R', 'CGY': 'R', 'CGS': 'R', 'CGT': 'R', 'CAC': 'H', 'CAR': 'Q', 'CAG': 'Q', 'CAA': 'Q', 'CAY': 'H', 'CAT': 'H', 'CTB': 'L', 'CTD': 'L', 'CTH': 'L', 'CTK': 'L', 'CTN': 'L', 'CTW': 'L', 'CTC': 'L', 'CTR': 'L', 'CTG': 'L', 'CTA': 'L', 'CTM': 'L', 'CTV': 'L', 'CTY': 'L', 'CTS': 'L', 'CTT': 'L', 'GCB': 'A', 'GCD': 'A', 'GCH': 'A', 'GCK': 'A', 'GCN': 'A', 'GCW': 'A', 'GCC': 'A', 'GCR': 'A', 'GCG': 'A', 'GCA': 'A', 'GCM': 'A', 'GCV': 'A', 'GCY': 'A', 'GCS': 'A', 'GCT': 'A', 'GGB': 'G', 'GGD': 'G', 'GGH': 'G', 'GGK': 'G', 'GGN': 'G', 'GGW': 'G', 'GGC': 'G', 'GGR': 'G', 'GGG': 'G', 'GGA': 'G', 'GGM': 'G', 'GGV': 'G', 'GGY': 'G', 'GGS': 'G', 'GGT': 'G', 'GAC': 'D', 'GAR': 'E', 'GAG': 'E', 'GAA': 'E', 'GAY': 'D', 'GAT': 'D', 'GTB': 'V', 'GTD': 'V', 'GTH': 'V', 'GTK': 'V', 'GTN': 'V', 'GTW': 'V', 'GTC': 'V', 'GTR': 'V', 'GTG': 'V', 'GTA': 'V', 'GTM': 'V', 'GTV': 'V', 'GTY': 'V', 'GTS': 'V', 'GTT': 'V', 'ACB': 'T', 'ACD': 'T', 'ACH': 'T', 'ACK': 'T', 'ACN': 'T', 'ACW': 'T', 'ACC': 'T', 'ACR': 'T', 'ACG': 'T', 'ACA': 'T', 'ACM': 'T', 'ACV': 'T', 'ACY': 'T', 'ACS': 'T', 'ACT': 'T', 'AGB': 'S', 'AGD': 'S', 'AGH': 'S', 'AGK': 'S', 'AGN': 'S', 'AGW': 'S', 'AGC': 'S', 'AGR': 'S', 'AGG': 'S', 'AGA': 'S', 'AGM': 'S', 'AGV': 'S', 'AGY': 'S', 'AGS': 'S', 'AGT': 'S', 'AAC': 'N', 'AAR': 'K', 'AAG': 'K', 'AAA': 'K', 'AAY': 'N', 'AAT': 'N', 'ATC': 'I', 'ATR': 'M', 'ATG': 'M', 'ATA': 'M', 'ATY': 'I', 'ATT': 'I', 'YTR': 'L', 'YTG': 'L', 'YTA': 'L', 'TCB': 'S', 'TCD': 'S', 'TCH': 'S', 'TCK': 'S', 'TCN': 'S', 'TCW': 'S', 'TCC': 'S', 'TCR': 'S', 'TCG': 'S', 'TCA': 'S', 'TCM': 'S', 'TCV': 'S', 'TCY': 'S', 'TCS': 'S', 'TCT': 'S', 'TGC': 'C', 'TGR': 'W', 'TGG': 'W', 'TGA': 'W', 'TGY': 'C', 'TGT': 'C', 'TAC': 'Y', 'TAR': '*', 'TAG': '*', 'TAA': '*', 'TAY': 'Y', 'TAT': 'Y', 'TTC': 'F', 'TTR': 'L', 'TTG': 'L', 'TTA': 'L', 'TTY': 'F', 'TTT': 'F'}, 'start_table': {'DTG': 'M', 'KTG': 'M', 'WTG': 'M', 'CCB': 'P', 'CCD': 'P', 'CCH': 'P', 'CCK': 'P', 'CCN': 'P', 'CCW': 'P', 'CCC': 'P', 'CCR': 'P', 'CCG': 'P', 'CCA': 'P', 'CCM': 'P', 'CCV': 'P', 'CCY': 'P', 'CCS': 'P', 'CCT': 'P', 'CGB': 'R', 'CGD': 'R', 'CGH': 'R', 'CGK': 'R', 'CGN': 'R', 'CGW': 'R', 'CGC': 'R', 'CGR': 'R', 'CGG': 'R', 'CGA': 'R', 'CGM': 'R', 'CGV': 'R', 'CGY': 'R', 'CGS': 'R', 'CGT': 'R', 'CAC': 'H', 'CAR': 'Q', 'CAG': 'Q', 'CAA': 'Q', 'CAY': 'H', 'CAT': 'H', 'CTB': 'L', 'CTD': 'L', 'CTH': 'L', 'CTK': 'L', 'CTN': 'L', 'CTW': 'L', 'CTC': 'L', 'CTR': 'L', 'CTG': 'L', 'CTA': 'L', 'CTM': 'L', 'CTV': 'L', 'CTY': 'L', 'CTS': 'L', 'CTT': 'L', 'RTG': 'M', 'GCB': 'A', 'GCD': 'A', 'GCH': 'A', 'GCK': 'A', 'GCN': 'A', 'GCW': 'A', 'GCC': 'A', 'GCR': 'A', 'GCG': 'A', 'GCA': 'A', 'GCM': 'A', 'GCV': 'A', 'GCY': 'A', 'GCS': 'A', 'GCT': 'A', 'GGB': 'G', 'GGD': 'G', 'GGH': 'G', 'GGK': 'G', 'GGN': 'G', 'GGW': 'G', 'GGC': 'G', 'GGR': 'G', 'GGG': 'G', 'GGA': 'G', 'GGM': 'G', 'GGV': 'G', 'GGY': 'G', 'GGS': 'G', 'GGT': 'G', 'GAC': 'D', 'GAR': 'E', 'GAG': 'E', 'GAA': 'E', 'GAY': 'D', 'GAT': 'D', 'GTH': 'V', 'GTW': 'V', 'GTC': 'V', 'GTG': 'M', 'GTA': 'V', 'GTM': 'V', 'GTY': 'V', 'GTT': 'V', 'ACB': 'T', 'ACD': 'T', 'ACH': 'T', 'ACK': 'T', 'ACN': 'T', 'ACW': 'T', 'ACC': 'T', 'ACR': 'T', 'ACG': 'T', 'ACA': 'T', 'ACM': 'T', 'ACV': 'T', 'ACY': 'T', 'ACS': 'T', 'ACT': 'T', 'AGB': 'S', 'AGD': 'S', 'AGH': 'S', 'AGK': 'S', 'AGN': 'S', 'AGW': 'S', 'AGC': 'S', 'AGR': 'S', 'AGG': 'S', 'AGA': 'S', 'AGM': 'S', 'AGV': 'S', 'AGY': 'S', 'AGS': 'S', 'AGT': 'S', 'AAC': 'N', 'AAR': 'K', 'AAG': 'K', 'AAA': 'K', 'AAY': 'N', 'AAT': 'N', 'ATB': 'M', 'ATD': 'M', 'ATH': 'M', 'ATK': 'M', 'ATN': 'M', 'ATW': 'M', 'ATC': 'M', 'ATR': 'M', 'ATG': 'M', 'ATA': 'M', 'ATM': 'M', 'ATV': 'M', 'ATY': 'M', 'ATS': 'M', 'ATT': 'M', 'YTA': 'L', 'TCB': 'S', 'TCD': 'S', 'TCH': 'S', 'TCK': 'S', 'TCN': 'S', 'TCW': 'S', 'TCC': 'S', 'TCR': 'S', 'TCG': 'S', 'TCA': 'S', 'TCM': 'S', 'TCV': 'S', 'TCY': 'S', 'TCS': 'S', 'TCT': 'S', 'TGC': 'C', 'TGR': 'W', 'TGG': 'W', 'TGA': 'W', 'TGY': 'C', 'TGT': 'C', 'TAC': 'Y', 'TAR': '*', 'TAG': '*', 'TAA': '*', 'TAY': 'Y', 'TAT': 'Y', 'TTC': 'F', 'TTG': 'M', 'TTA': 'L', 'TTY': 'F', 'TTT': 'F'}}, '6': {'trans_table': {'CCB': 'P', 'CCD': 'P', 'CCH': 'P', 'CCK': 'P', 'CCN': 'P', 'CCW': 'P', 'CCC': 'P', 'CCR': 'P', 'CCG': 'P', 'CCA': 'P', 'CCM': 'P', 'CCV': 'P', 'CCY': 'P', 'CCS': 'P', 'CCT': 'P', 'CGB': 'R', 'CGD': 'R', 'CGH': 'R', 'CGK': 'R', 'CGN': 'R', 'CGW': 'R', 'CGC': 'R', 'CGR': 'R', 'CGG': 'R', 'CGA': 'R', 'CGM': 'R', 'CGV': 'R', 'CGY': 'R', 'CGS': 'R', 'CGT': 'R', 'CAC': 'H', 'CAR': 'Q', 'CAG': 'Q', 'CAA': 'Q', 'CAY': 'H', 'CAT': 'H', 'CTB': 'L', 'CTD': 'L', 'CTH': 'L', 'CTK': 'L', 'CTN': 'L', 'CTW': 'L', 'CTC': 'L', 'CTR': 'L', 'CTG': 'L', 'CTA': 'L', 'CTM': 'L', 'CTV': 'L', 'CTY': 'L', 'CTS': 'L', 'CTT': 'L', 'GCB': 'A', 'GCD': 'A', 'GCH': 'A', 'GCK': 'A', 'GCN': 'A', 'GCW': 'A', 'GCC': 'A', 'GCR': 'A', 'GCG': 'A', 'GCA': 'A', 'GCM': 'A', 'GCV': 'A', 'GCY': 'A', 'GCS': 'A', 'GCT': 'A', 'GGB': 'G', 'GGD': 'G', 'GGH': 'G', 'GGK': 'G', 'GGN': 'G', 'GGW': 'G', 'GGC': 'G', 'GGR': 'G', 'GGG': 'G', 'GGA': 'G', 'GGM': 'G', 'GGV': 'G', 'GGY': 'G', 'GGS': 'G', 'GGT': 'G', 'GAC': 'D', 'GAR': 'E', 'GAG': 'E', 'GAA': 'E', 'GAY': 'D', 'GAT': 'D', 'GTB': 'V', 'GTD': 'V', 'GTH': 'V', 'GTK': 'V', 'GTN': 'V', 'GTW': 'V', 'GTC': 'V', 'GTR': 'V', 'GTG': 'V', 'GTA': 'V', 'GTM': 'V', 'GTV': 'V', 'GTY': 'V', 'GTS': 'V', 'GTT': 'V', 'ACB': 'T', 'ACD': 'T', 'ACH': 'T', 'ACK': 'T', 'ACN': 'T', 'ACW': 'T', 'ACC': 'T', 'ACR': 'T', 'ACG': 'T', 'ACA': 'T', 'ACM': 'T', 'ACV': 'T', 'ACY': 'T', 'ACS': 'T', 'ACT': 'T', 'AGC': 'S', 'AGR': 'R', 'AGG': 'R', 'AGA': 'R', 'AGY': 'S', 'AGT': 'S', 'AAC': 'N', 'AAR': 'K', 'AAG': 'K', 'AAA': 'K', 'AAY': 'N', 'AAT': 'N', 'ATH': 'I', 'ATW': 'I', 'ATC': 'I', 'ATG': 'M', 'ATA': 'I', 'ATM': 'I', 'ATY': 'I', 'ATT': 'I', 'MGR': 'R', 'MGG': 'R', 'MGA': 'R', 'YAR': 'Q', 'YAG': 'Q', 'YAA': 'Q', 'YTR': 'L', 'YTG': 'L', 'YTA': 'L', 'TCB': 'S', 'TCD': 'S', 'TCH': 'S', 'TCK': 'S', 'TCN': 'S', 'TCW': 'S', 'TCC': 'S', 'TCR': 'S', 'TCG': 'S', 'TCA': 'S', 'TCM': 'S', 'TCV': 'S', 'TCY': 'S', 'TCS': 'S', 'TCT': 'S', 'TGC': 'C', 'TGG': 'W', 'TGA': '*', 'TGY': 'C', 'TGT': 'C', 'TAC': 'Y', 'TAR': 'Q', 'TAG': 'Q', 'TAA': 'Q', 'TAY': 'Y', 'TAT': 'Y', 'TTC': 'F', 'TTR': 'L', 'TTG': 'L', 'TTA': 'L', 'TTY': 'F', 'TTT': 'F'}, 'start_table': {'CCB': 'P', 'CCD': 'P', 'CCH': 'P', 'CCK': 'P', 'CCN': 'P', 'CCW': 'P', 'CCC': 'P', 'CCR': 'P', 'CCG': 'P', 'CCA': 'P', 'CCM': 'P', 'CCV': 'P', 'CCY': 'P', 'CCS': 'P', 'CCT': 'P', 'CGB': 'R', 'CGD': 'R', 'CGH': 'R', 'CGK': 'R', 'CGN': 'R', 'CGW': 'R', 'CGC': 'R', 'CGR': 'R', 'CGG': 'R', 'CGA': 'R', 'CGM': 'R', 'CGV': 'R', 'CGY': 'R', 'CGS': 'R', 'CGT': 'R', 'CAC': 'H', 'CAR': 'Q', 'CAG': 'Q', 'CAA': 'Q', 'CAY': 'H', 'CAT': 'H', 'CTB': 'L', 'CTD': 'L', 'CTH': 'L', 'CTK': 'L', 'CTN': 'L', 'CTW': 'L', 'CTC': 'L', 'CTR': 'L', 'CTG': 'L', 'CTA': 'L', 'CTM': 'L', 'CTV': 'L', 'CTY': 'L', 'CTS': 'L', 'CTT': 'L', 'GCB': 'A', 'GCD': 'A', 'GCH': 'A', 'GCK': 'A', 'GCN': 'A', 'GCW': 'A', 'GCC': 'A', 'GCR': 'A', 'GCG': 'A', 'GCA': 'A', 'GCM': 'A', 'GCV': 'A', 'GCY': 'A', 'GCS': 'A', 'GCT': 'A', 'GGB': 'G', 'GGD': 'G', 'GGH': 'G', 'GGK': 'G', 'GGN': 'G', 'GGW': 'G', 'GGC': 'G', 'GGR': 'G', 'GGG': 'G', 'GGA': 'G', 'GGM': 'G', 'GGV': 'G', 'GGY': 'G', 'GGS': 'G', 'GGT': 'G', 'GAC': 'D', 'GAR': 'E', 'GAG': 'E', 'GAA': 'E', 'GAY': 'D', 'GAT': 'D', 'GTB': 'V', 'GTD': 'V', 'GTH': 'V', 'GTK': 'V', 'GTN': 'V', 'GTW': 'V', 'GTC': 'V', 'GTR': 'V', 'GTG': 'V', 'GTA': 'V', 'GTM': 'V', 'GTV': 'V', 'GTY': 'V', 'GTS': 'V', 'GTT': 'V', 'ACB': 'T', 'ACD': 'T', 'ACH': 'T', 'ACK': 'T', 'ACN': 'T', 'ACW': 'T', 'ACC': 'T', 'ACR': 'T', 'ACG': 'T', 'ACA': 'T', 'ACM': 'T', 'ACV': 'T', 'ACY': 'T', 'ACS': 'T', 'ACT': 'T', 'AGC': 'S', 'AGR': 'R', 'AGG': 'R', 'AGA': 'R', 'AGY': 'S', 'AGT': 'S', 'AAC': 'N', 'AAR': 'K', 'AAG': 'K', 'AAA': 'K', 'AAY': 'N', 'AAT': 'N', 'ATH': 'I', 'ATW': 'I', 'ATC': 'I', 'ATG': 'M', 'ATA': 'I', 'ATM': 'I', 'ATY': 'I', 'ATT': 'I', 'MGR': 'R', 'MGG': 'R', 'MGA': 'R', 'YAR': 'Q', 'YAG': 'Q', 'YAA': 'Q', 'YTR': 'L', 'YTG': 'L', 'YTA': 'L', 'TCB': 'S', 'TCD': 'S', 'TCH': 'S', 'TCK': 'S', 'TCN': 'S', 'TCW': 'S', 'TCC': 'S', 'TCR': 'S', 'TCG': 'S', 'TCA': 'S', 'TCM': 'S', 'TCV': 'S', 'TCY': 'S', 'TCS': 'S', 'TCT': 'S', 'TGC': 'C', 'TGG': 'W', 'TGA': '*', 'TGY': 'C', 'TGT': 'C', 'TAC': 'Y', 'TAR': 'Q', 'TAG': 'Q', 'TAA': 'Q', 'TAY': 'Y', 'TAT': 'Y', 'TTC': 'F', 'TTR': 'L', 'TTG': 'L', 'TTA': 'L', 'TTY': 'F', 'TTT': 'F'}}, '9': {'trans_table': {'CCB': 'P', 'CCD': 'P', 'CCH': 'P', 'CCK': 'P', 'CCN': 'P', 'CCW': 'P', 'CCC': 'P', 'CCR': 'P', 'CCG': 'P', 'CCA': 'P', 'CCM': 'P', 'CCV': 'P', 'CCY': 'P', 'CCS': 'P', 'CCT': 'P', 'CGB': 'R', 'CGD': 'R', 'CGH': 'R', 'CGK': 'R', 'CGN': 'R', 'CGW': 'R', 'CGC': 'R', 'CGR': 'R', 'CGG': 'R', 'CGA': 'R', 'CGM': 'R', 'CGV': 'R', 'CGY': 'R', 'CGS': 'R', 'CGT': 'R', 'CAC': 'H', 'CAR': 'Q', 'CAG': 'Q', 'CAA': 'Q', 'CAY': 'H', 'CAT': 'H', 'CTB': 'L', 'CTD': 'L', 'CTH': 'L', 'CTK': 'L', 'CTN': 'L', 'CTW': 'L', 'CTC': 'L', 'CTR': 'L', 'CTG': 'L', 'CTA': 'L', 'CTM': 'L', 'CTV': 'L', 'CTY': 'L', 'CTS': 'L', 'CTT': 'L', 'GCB': 'A', 'GCD': 'A', 'GCH': 'A', 'GCK': 'A', 'GCN': 'A', 'GCW': 'A', 'GCC': 'A', 'GCR': 'A', 'GCG': 'A', 'GCA': 'A', 'GCM': 'A', 'GCV': 'A', 'GCY': 'A', 'GCS': 'A', 'GCT': 'A', 'GGB': 'G', 'GGD': 'G', 'GGH': 'G', 'GGK': 'G', 'GGN': 'G', 'GGW': 'G', 'GGC': 'G', 'GGR': 'G', 'GGG': 'G', 'GGA': 'G', 'GGM': 'G', 'GGV': 'G', 'GGY': 'G', 'GGS': 'G', 'GGT': 'G', 'GAC': 'D', 'GAR': 'E', 'GAG': 'E', 'GAA': 'E', 'GAY': 'D', 'GAT': 'D', 'GTB': 'V', 'GTD': 'V', 'GTH': 'V', 'GTK': 'V', 'GTN': 'V', 'GTW': 'V', 'GTC': 'V', 'GTR': 'V', 'GTG': 'V', 'GTA': 'V', 'GTM': 'V', 'GTV': 'V', 'GTY': 'V', 'GTS': 'V', 'GTT': 'V', 'ACB': 'T', 'ACD': 'T', 'ACH': 'T', 'ACK': 'T', 'ACN': 'T', 'ACW': 'T', 'ACC': 'T', 'ACR': 'T', 'ACG': 'T', 'ACA': 'T', 'ACM': 'T', 'ACV': 'T', 'ACY': 'T', 'ACS': 'T', 'ACT': 'T', 'AGB': 'S', 'AGD': 'S', 'AGH': 'S', 'AGK': 'S', 'AGN': 'S', 'AGW': 'S', 'AGC': 'S', 'AGR': 'S', 'AGG': 'S', 'AGA': 'S', 'AGM': 'S', 'AGV': 'S', 'AGY': 'S', 'AGS': 'S', 'AGT': 'S', 'AAH': 'N', 'AAW': 'N', 'AAC': 'N', 'AAG': 'K', 'AAA': 'N', 'AAM': 'N', 'AAY': 'N', 'AAT': 'N', 'ATH': 'I', 'ATW': 'I', 'ATC': 'I', 'ATG': 'M', 'ATA': 'I', 'ATM': 'I', 'ATY': 'I', 'ATT': 'I', 'YTR': 'L', 'YTG': 'L', 'YTA': 'L', 'TCB': 'S', 'TCD': 'S', 'TCH': 'S', 'TCK': 'S', 'TCN': 'S', 'TCW': 'S', 'TCC': 'S', 'TCR': 'S', 'TCG': 'S', 'TCA': 'S', 'TCM': 'S', 'TCV': 'S', 'TCY': 'S', 'TCS': 'S', 'TCT': 'S', 'TGC': 'C', 'TGR': 'W', 'TGG': 'W', 'TGA': 'W', 'TGY': 'C', 'TGT': 'C', 'TAC': 'Y', 'TAR': '*', 'TAG': '*', 'TAA': '*', 'TAY': 'Y', 'TAT': 'Y', 'TTC': 'F', 'TTR': 'L', 'TTG': 'L', 'TTA': 'L', 'TTY': 'F', 'TTT': 'F'}, 'start_table': {'CCB': 'P', 'CCD': 'P', 'CCH': 'P', 'CCK': 'P', 'CCN': 'P', 'CCW': 'P', 'CCC': 'P', 'CCR': 'P', 'CCG': 'P', 'CCA': 'P', 'CCM': 'P', 'CCV': 'P', 'CCY': 'P', 'CCS': 'P', 'CCT': 'P', 'CGB': 'R', 'CGD': 'R', 'CGH': 'R', 'CGK': 'R', 'CGN': 'R', 'CGW': 'R', 'CGC': 'R', 'CGR': 'R', 'CGG': 'R', 'CGA': 'R', 'CGM': 'R', 'CGV': 'R', 'CGY': 'R', 'CGS': 'R', 'CGT': 'R', 'CAC': 'H', 'CAR': 'Q', 'CAG': 'Q', 'CAA': 'Q', 'CAY': 'H', 'CAT': 'H', 'CTB': 'L', 'CTD': 'L', 'CTH': 'L', 'CTK': 'L', 'CTN': 'L', 'CTW': 'L', 'CTC': 'L', 'CTR': 'L', 'CTG': 'L', 'CTA': 'L', 'CTM': 'L', 'CTV': 'L', 'CTY': 'L', 'CTS': 'L', 'CTT': 'L', 'RTG': 'M', 'GCB': 'A', 'GCD': 'A', 'GCH': 'A', 'GCK': 'A', 'GCN': 'A', 'GCW': 'A', 'GCC': 'A', 'GCR': 'A', 'GCG': 'A', 'GCA': 'A', 'GCM': 'A', 'GCV': 'A', 'GCY': 'A', 'GCS': 'A', 'GCT': 'A', 'GGB': 'G', 'GGD': 'G', 'GGH': 'G', 'GGK': 'G', 'GGN': 'G', 'GGW': 'G', 'GGC': 'G', 'GGR': 'G', 'GGG': 'G', 'GGA': 'G', 'GGM': 'G', 'GGV': 'G', 'GGY': 'G', 'GGS': 'G', 'GGT': 'G', 'GAC': 'D', 'GAR': 'E', 'GAG': 'E', 'GAA': 'E', 'GAY': 'D', 'GAT': 'D', 'GTH': 'V', 'GTW': 'V', 'GTC': 'V', 'GTG': 'M', 'GTA': 'V', 'GTM': 'V', 'GTY': 'V', 'GTT': 'V', 'ACB': 'T', 'ACD': 'T', 'ACH': 'T', 'ACK': 'T', 'ACN': 'T', 'ACW': 'T', 'ACC': 'T', 'ACR': 'T', 'ACG': 'T', 'ACA': 'T', 'ACM': 'T', 'ACV': 'T', 'ACY': 'T', 'ACS': 'T', 'ACT': 'T', 'AGB': 'S', 'AGD': 'S', 'AGH': 'S', 'AGK': 'S', 'AGN': 'S', 'AGW': 'S', 'AGC': 'S', 'AGR': 'S', 'AGG': 'S', 'AGA': 'S', 'AGM': 'S', 'AGV': 'S', 'AGY': 'S', 'AGS': 'S', 'AGT': 'S', 'AAH': 'N', 'AAW': 'N', 'AAC': 'N', 'AAG': 'K', 'AAA': 'N', 'AAM': 'N', 'AAY': 'N', 'AAT': 'N', 'ATH': 'I', 'ATW': 'I', 'ATC': 'I', 'ATG': 'M', 'ATA': 'I', 'ATM': 'I', 'ATY': 'I', 'ATT': 'I', 'YTR': 'L', 'YTG': 'L', 'YTA': 'L', 'TCB': 'S', 'TCD': 'S', 'TCH': 'S', 'TCK': 'S', 'TCN': 'S', 'TCW': 'S', 'TCC': 'S', 'TCR': 'S', 'TCG': 'S', 'TCA': 'S', 'TCM': 'S', 'TCV': 'S', 'TCY': 'S', 'TCS': 'S', 'TCT': 'S', 'TGC': 'C', 'TGR': 'W', 'TGG': 'W', 'TGA': 'W', 'TGY': 'C', 'TGT': 'C', 'TAC': 'Y', 'TAR': '*', 'TAG': '*', 'TAA': '*', 'TAY': 'Y', 'TAT': 'Y', 'TTC': 'F', 'TTR': 'L', 'TTG': 'L', 'TTA': 'L', 'TTY': 'F', 'TTT': 'F'}}, '10': {'trans_table': {'CCB': 'P', 'CCD': 'P', 'CCH': 'P', 'CCK': 'P', 'CCN': 'P', 'CCW': 'P', 'CCC': 'P', 'CCR': 'P', 'CCG': 'P', 'CCA': 'P', 'CCM': 'P', 'CCV': 'P', 'CCY': 'P', 'CCS': 'P', 'CCT': 'P', 'CGB': 'R', 'CGD': 'R', 'CGH': 'R', 'CGK': 'R', 'CGN': 'R', 'CGW': 'R', 'CGC': 'R', 'CGR': 'R', 'CGG': 'R', 'CGA': 'R', 'CGM': 'R', 'CGV': 'R', 'CGY': 'R', 'CGS': 'R', 'CGT': 'R', 'CAC': 'H', 'CAR': 'Q', 'CAG': 'Q', 'CAA': 'Q', 'CAY': 'H', 'CAT': 'H', 'CTB': 'L', 'CTD': 'L', 'CTH': 'L', 'CTK': 'L', 'CTN': 'L', 'CTW': 'L', 'CTC': 'L', 'CTR': 'L', 'CTG': 'L', 'CTA': 'L', 'CTM': 'L', 'CTV': 'L', 'CTY': 'L', 'CTS': 'L', 'CTT': 'L', 'GCB': 'A', 'GCD': 'A', 'GCH': 'A', 'GCK': 'A', 'GCN': 'A', 'GCW': 'A', 'GCC': 'A', 'GCR': 'A', 'GCG': 'A', 'GCA': 'A', 'GCM': 'A', 'GCV': 'A', 'GCY': 'A', 'GCS': 'A', 'GCT': 'A', 'GGB': 'G', 'GGD': 'G', 'GGH': 'G', 'GGK': 'G', 'GGN': 'G', 'GGW': 'G', 'GGC': 'G', 'GGR': 'G', 'GGG': 'G', 'GGA': 'G', 'GGM': 'G', 'GGV': 'G', 'GGY': 'G', 'GGS': 'G', 'GGT': 'G', 'GAC': 'D', 'GAR': 'E', 'GAG': 'E', 'GAA': 'E', 'GAY': 'D', 'GAT': 'D', 'GTB': 'V', 'GTD': 'V', 'GTH': 'V', 'GTK': 'V', 'GTN': 'V', 'GTW': 'V', 'GTC': 'V', 'GTR': 'V', 'GTG': 'V', 'GTA': 'V', 'GTM': 'V', 'GTV': 'V', 'GTY': 'V', 'GTS': 'V', 'GTT': 'V', 'ACB': 'T', 'ACD': 'T', 'ACH': 'T', 'ACK': 'T', 'ACN': 'T', 'ACW': 'T', 'ACC': 'T', 'ACR': 'T', 'ACG': 'T', 'ACA': 'T', 'ACM': 'T', 'ACV': 'T', 'ACY': 'T', 'ACS': 'T', 'ACT': 'T', 'AGC': 'S', 'AGR': 'R', 'AGG': 'R', 'AGA': 'R', 'AGY': 'S', 'AGT': 'S', 'AAC': 'N', 'AAR': 'K', 'AAG': 'K', 'AAA': 'K', 'AAY': 'N', 'AAT': 'N', 'ATH': 'I', 'ATW': 'I', 'ATC': 'I', 'ATG': 'M', 'ATA': 'I', 'ATM': 'I', 'ATY': 'I', 'ATT': 'I', 'MGR': 'R', 'MGG': 'R', 'MGA': 'R', 'YTR': 'L', 'YTG': 'L', 'YTA': 'L', 'TCB': 'S', 'TCD': 'S', 'TCH': 'S', 'TCK': 'S', 'TCN': 'S', 'TCW': 'S', 'TCC': 'S', 'TCR': 'S', 'TCG': 'S', 'TCA': 'S', 'TCM': 'S', 'TCV': 'S', 'TCY': 'S', 'TCS': 'S', 'TCT': 'S', 'TGH': 'C', 'TGW': 'C', 'TGC': 'C', 'TGG': 'W', 'TGA': 'C', 'TGM': 'C', 'TGY': 'C', 'TGT': 'C', 'TAC': 'Y', 'TAR': '*', 'TAG': '*', 'TAA': '*', 'TAY': 'Y', 'TAT': 'Y', 'TTC': 'F', 'TTR': 'L', 'TTG': 'L', 'TTA': 'L', 'TTY': 'F', 'TTT': 'F'}, 'start_table': {'CCB': 'P', 'CCD': 'P', 'CCH': 'P', 'CCK': 'P', 'CCN': 'P', 'CCW': 'P', 'CCC': 'P', 'CCR': 'P', 'CCG': 'P', 'CCA': 'P', 'CCM': 'P', 'CCV': 'P', 'CCY': 'P', 'CCS': 'P', 'CCT': 'P', 'CGB': 'R', 'CGD': 'R', 'CGH': 'R', 'CGK': 'R', 'CGN': 'R', 'CGW': 'R', 'CGC': 'R', 'CGR': 'R', 'CGG': 'R', 'CGA': 'R', 'CGM': 'R', 'CGV': 'R', 'CGY': 'R', 'CGS': 'R', 'CGT': 'R', 'CAC': 'H', 'CAR': 'Q', 'CAG': 'Q', 'CAA': 'Q', 'CAY': 'H', 'CAT': 'H', 'CTB': 'L', 'CTD': 'L', 'CTH': 'L', 'CTK': 'L', 'CTN': 'L', 'CTW': 'L', 'CTC': 'L', 'CTR': 'L', 'CTG': 'L', 'CTA': 'L', 'CTM': 'L', 'CTV': 'L', 'CTY': 'L', 'CTS': 'L', 'CTT': 'L', 'GCB': 'A', 'GCD': 'A', 'GCH': 'A', 'GCK': 'A', 'GCN': 'A', 'GCW': 'A', 'GCC': 'A', 'GCR': 'A', 'GCG': 'A', 'GCA': 'A', 'GCM': 'A', 'GCV': 'A', 'GCY': 'A', 'GCS': 'A', 'GCT': 'A', 'GGB': 'G', 'GGD': 'G', 'GGH': 'G', 'GGK': 'G', 'GGN': 'G', 'GGW': 'G', 'GGC': 'G', 'GGR': 'G', 'GGG': 'G', 'GGA': 'G', 'GGM': 'G', 'GGV': 'G', 'GGY': 'G', 'GGS': 'G', 'GGT': 'G', 'GAC': 'D', 'GAR': 'E', 'GAG': 'E', 'GAA': 'E', 'GAY': 'D', 'GAT': 'D', 'GTB': 'V', 'GTD': 'V', 'GTH': 'V', 'GTK': 'V', 'GTN': 'V', 'GTW': 'V', 'GTC': 'V', 'GTR': 'V', 'GTG': 'V', 'GTA': 'V', 'GTM': 'V', 'GTV': 'V', 'GTY': 'V', 'GTS': 'V', 'GTT': 'V', 'ACB': 'T', 'ACD': 'T', 'ACH': 'T', 'ACK': 'T', 'ACN': 'T', 'ACW': 'T', 'ACC': 'T', 'ACR': 'T', 'ACG': 'T', 'ACA': 'T', 'ACM': 'T', 'ACV': 'T', 'ACY': 'T', 'ACS': 'T', 'ACT': 'T', 'AGC': 'S', 'AGR': 'R', 'AGG': 'R', 'AGA': 'R', 'AGY': 'S', 'AGT': 'S', 'AAC': 'N', 'AAR': 'K', 'AAG': 'K', 'AAA': 'K', 'AAY': 'N', 'AAT': 'N', 'ATH': 'I', 'ATW': 'I', 'ATC': 'I', 'ATG': 'M', 'ATA': 'I', 'ATM': 'I', 'ATY': 'I', 'ATT': 'I', 'MGR': 'R', 'MGG': 'R', 'MGA': 'R', 'YTR': 'L', 'YTG': 'L', 'YTA': 'L', 'TCB': 'S', 'TCD': 'S', 'TCH': 'S', 'TCK': 'S', 'TCN': 'S', 'TCW': 'S', 'TCC': 'S', 'TCR': 'S', 'TCG': 'S', 'TCA': 'S', 'TCM': 'S', 'TCV': 'S', 'TCY': 'S', 'TCS': 'S', 'TCT': 'S', 'TGH': 'C', 'TGW': 'C', 'TGC': 'C', 'TGG': 'W', 'TGA': 'C', 'TGM': 'C', 'TGY': 'C', 'TGT': 'C', 'TAC': 'Y', 'TAR': '*', 'TAG': '*', 'TAA': '*', 'TAY': 'Y', 'TAT': 'Y', 'TTC': 'F', 'TTR': 'L', 'TTG': 'L', 'TTA': 'L', 'TTY': 'F', 'TTT': 'F'}}, '11': {'trans_table': {'CCB': 'P', 'CCD': 'P', 'CCH': 'P', 'CCK': 'P', 'CCN': 'P', 'CCW': 'P', 'CCC': 'P', 'CCR': 'P', 'CCG': 'P', 'CCA': 'P', 'CCM': 'P', 'CCV': 'P', 'CCY': 'P', 'CCS': 'P', 'CCT': 'P', 'CGB': 'R', 'CGD': 'R', 'CGH': 'R', 'CGK': 'R', 'CGN': 'R', 'CGW': 'R', 'CGC': 'R', 'CGR': 'R', 'CGG': 'R', 'CGA': 'R', 'CGM': 'R', 'CGV': 'R', 'CGY': 'R', 'CGS': 'R', 'CGT': 'R', 'CAC': 'H', 'CAR': 'Q', 'CAG': 'Q', 'CAA': 'Q', 'CAY': 'H', 'CAT': 'H', 'CTB': 'L', 'CTD': 'L', 'CTH': 'L', 'CTK': 'L', 'CTN': 'L', 'CTW': 'L', 'CTC': 'L', 'CTR': 'L', 'CTG': 'L', 'CTA': 'L', 'CTM': 'L', 'CTV': 'L', 'CTY': 'L', 'CTS': 'L', 'CTT': 'L', 'GCB': 'A', 'GCD': 'A', 'GCH': 'A', 'GCK': 'A', 'GCN': 'A', 'GCW': 'A', 'GCC': 'A', 'GCR': 'A', 'GCG': 'A', 'GCA': 'A', 'GCM': 'A', 'GCV': 'A', 'GCY': 'A', 'GCS': 'A', 'GCT': 'A', 'GGB': 'G', 'GGD': 'G', 'GGH': 'G', 'GGK': 'G', 'GGN': 'G', 'GGW': 'G', 'GGC': 'G', 'GGR': 'G', 'GGG': 'G', 'GGA': 'G', 'GGM': 'G', 'GGV': 'G', 'GGY': 'G', 'GGS': 'G', 'GGT': 'G', 'GAC': 'D', 'GAR': 'E', 'GAG': 'E', 'GAA': 'E', 'GAY': 'D', 'GAT': 'D', 'GTB': 'V', 'GTD': 'V', 'GTH': 'V', 'GTK': 'V', 'GTN': 'V', 'GTW': 'V', 'GTC': 'V', 'GTR': 'V', 'GTG': 'V', 'GTA': 'V', 'GTM': 'V', 'GTV': 'V', 'GTY': 'V', 'GTS': 'V', 'GTT': 'V', 'ACB': 'T', 'ACD': 'T', 'ACH': 'T', 'ACK': 'T', 'ACN': 'T', 'ACW': 'T', 'ACC': 'T', 'ACR': 'T', 'ACG': 'T', 'ACA': 'T', 'ACM': 'T', 'ACV': 'T', 'ACY': 'T', 'ACS': 'T', 'ACT': 'T', 'AGC': 'S', 'AGR': 'R', 'AGG': 'R', 'AGA': 'R', 'AGY': 'S', 'AGT': 'S', 'AAC': 'N', 'AAR': 'K', 'AAG': 'K', 'AAA': 'K', 'AAY': 'N', 'AAT': 'N', 'ATH': 'I', 'ATW': 'I', 'ATC': 'I', 'ATG': 'M', 'ATA': 'I', 'ATM': 'I', 'ATY': 'I', 'ATT': 'I', 'MGR': 'R', 'MGG': 'R', 'MGA': 'R', 'YTR': 'L', 'YTG': 'L', 'YTA': 'L', 'TCB': 'S', 'TCD': 'S', 'TCH': 'S', 'TCK': 'S', 'TCN': 'S', 'TCW': 'S', 'TCC': 'S', 'TCR': 'S', 'TCG': 'S', 'TCA': 'S', 'TCM': 'S', 'TCV': 'S', 'TCY': 'S', 'TCS': 'S', 'TCT': 'S', 'TRA': '*', 'TGC': 'C', 'TGG': 'W', 'TGA': '*', 'TGY': 'C', 'TGT': 'C', 'TAC': 'Y', 'TAR': '*', 'TAG': '*', 'TAA': '*', 'TAY': 'Y', 'TAT': 'Y', 'TTC': 'F', 'TTR': 'L', 'TTG': 'L', 'TTA': 'L', 'TTY': 'F', 'TTT': 'F'}, 'start_table': {'BTG': 'M', 'DTG': 'M', 'HTG': 'M', 'KTG': 'M', 'NTG': 'M', 'WTG': 'M', 'CCB': 'P', 'CCD': 'P', 'CCH': 'P', 'CCK': 'P', 'CCN': 'P', 'CCW': 'P', 'CCC': 'P', 'CCR': 'P', 'CCG': 'P', 'CCA': 'P', 'CCM': 'P', 'CCV': 'P', 'CCY': 'P', 'CCS': 'P', 'CCT': 'P', 'CGB': 'R', 'CGD': 'R', 'CGH': 'R', 'CGK': 'R', 'CGN': 'R', 'CGW': 'R', 'CGC': 'R', 'CGR': 'R', 'CGG': 'R', 'CGA': 'R', 'CGM': 'R', 'CGV': 'R', 'CGY': 'R', 'CGS': 'R', 'CGT': 'R', 'CAC': 'H', 'CAR': 'Q', 'CAG': 'Q', 'CAA': 'Q', 'CAY': 'H', 'CAT': 'H', 'CTH': 'L', 'CTW': 'L', 'CTC': 'L', 'CTG': 'M', 'CTA': 'L', 'CTM': 'L', 'CTY': 'L', 'CTT': 'L', 'RTG': 'M', 'GCB': 'A', 'GCD': 'A', 'GCH': 'A', 'GCK': 'A', 'GCN': 'A', 'GCW': 'A', 'GCC': 'A', 'GCR': 'A', 'GCG': 'A', 'GCA': 'A', 'GCM': 'A', 'GCV': 'A', 'GCY': 'A', 'GCS': 'A', 'GCT': 'A', 'GGB': 'G', 'GGD': 'G', 'GGH': 'G', 'GGK': 'G', 'GGN': 'G', 'GGW': 'G', 'GGC': 'G', 'GGR': 'G', 'GGG': 'G', 'GGA': 'G', 'GGM': 'G', 'GGV': 'G', 'GGY': 'G', 'GGS': 'G', 'GGT': 'G', 'GAC': 'D', 'GAR': 'E', 'GAG': 'E', 'GAA': 'E', 'GAY': 'D', 'GAT': 'D', 'GTH': 'V', 'GTW': 'V', 'GTC': 'V', 'GTG': 'M', 'GTA': 'V', 'GTM': 'V', 'GTY': 'V', 'GTT': 'V', 'ACB': 'T', 'ACD': 'T', 'ACH': 'T', 'ACK': 'T', 'ACN': 'T', 'ACW': 'T', 'ACC': 'T', 'ACR': 'T', 'ACG': 'T', 'ACA': 'T', 'ACM': 'T', 'ACV': 'T', 'ACY': 'T', 'ACS': 'T', 'ACT': 'T', 'AGC': 'S', 'AGR': 'R', 'AGG': 'R', 'AGA': 'R', 'AGY': 'S', 'AGT': 'S', 'AAC': 'N', 'AAR': 'K', 'AAG': 'K', 'AAA': 'K', 'AAY': 'N', 'AAT': 'N', 'ATB': 'M', 'ATD': 'M', 'ATH': 'M', 'ATK': 'M', 'ATN': 'M', 'ATW': 'M', 'ATC': 'M', 'ATR': 'M', 'ATG': 'M', 'ATA': 'M', 'ATM': 'M', 'ATV': 'M', 'ATY': 'M', 'ATS': 'M', 'ATT': 'M', 'MGR': 'R', 'MGG': 'R', 'MGA': 'R', 'MTG': 'M', 'VTG': 'M', 'YTG': 'M', 'YTA': 'L', 'STG': 'M', 'TCB': 'S', 'TCD': 'S', 'TCH': 'S', 'TCK': 'S', 'TCN': 'S', 'TCW': 'S', 'TCC': 'S', 'TCR': 'S', 'TCG': 'S', 'TCA': 'S', 'TCM': 'S', 'TCV': 'S', 'TCY': 'S', 'TCS': 'S', 'TCT': 'S', 'TRA': '*', 'TGC': 'C', 'TGG': 'W', 'TGA': '*', 'TGY': 'C', 'TGT': 'C', 'TAC': 'Y', 'TAR': '*', 'TAG': '*', 'TAA': '*', 'TAY': 'Y', 'TAT': 'Y', 'TTC': 'F', 'TTG': 'M', 'TTA': 'L', 'TTY': 'F', 'TTT': 'F'}}, '12': {'trans_table': {'CCB': 'P', 'CCD': 'P', 'CCH': 'P', 'CCK': 'P', 'CCN': 'P', 'CCW': 'P', 'CCC': 'P', 'CCR': 'P', 'CCG': 'P', 'CCA': 'P', 'CCM': 'P', 'CCV': 'P', 'CCY': 'P', 'CCS': 'P', 'CCT': 'P', 'CGB': 'R', 'CGD': 'R', 'CGH': 'R', 'CGK': 'R', 'CGN': 'R', 'CGW': 'R', 'CGC': 'R', 'CGR': 'R', 'CGG': 'R', 'CGA': 'R', 'CGM': 'R', 'CGV': 'R', 'CGY': 'R', 'CGS': 'R', 'CGT': 'R', 'CAC': 'H', 'CAR': 'Q', 'CAG': 'Q', 'CAA': 'Q', 'CAY': 'H', 'CAT': 'H', 'CTH': 'L', 'CTW': 'L', 'CTC': 'L', 'CTG': 'S', 'CTA': 'L', 'CTM': 'L', 'CTY': 'L', 'CTT': 'L', 'GCB': 'A', 'GCD': 'A', 'GCH': 'A', 'GCK': 'A', 'GCN': 'A', 'GCW': 'A', 'GCC': 'A', 'GCR': 'A', 'GCG': 'A', 'GCA': 'A', 'GCM': 'A', 'GCV': 'A', 'GCY': 'A', 'GCS': 'A', 'GCT': 'A', 'GGB': 'G', 'GGD': 'G', 'GGH': 'G', 'GGK': 'G', 'GGN': 'G', 'GGW': 'G', 'GGC': 'G', 'GGR': 'G', 'GGG': 'G', 'GGA': 'G', 'GGM': 'G', 'GGV': 'G', 'GGY': 'G', 'GGS': 'G', 'GGT': 'G', 'GAC': 'D', 'GAR': 'E', 'GAG': 'E', 'GAA': 'E', 'GAY': 'D', 'GAT': 'D', 'GTB': 'V', 'GTD': 'V', 'GTH': 'V', 'GTK': 'V', 'GTN': 'V', 'GTW': 'V', 'GTC': 'V', 'GTR': 'V', 'GTG': 'V', 'GTA': 'V', 'GTM': 'V', 'GTV': 'V', 'GTY': 'V', 'GTS': 'V', 'GTT': 'V', 'ACB': 'T', 'ACD': 'T', 'ACH': 'T', 'ACK': 'T', 'ACN': 'T', 'ACW': 'T', 'ACC': 'T', 'ACR': 'T', 'ACG': 'T', 'ACA': 'T', 'ACM': 'T', 'ACV': 'T', 'ACY': 'T', 'ACS': 'T', 'ACT': 'T', 'AGC': 'S', 'AGR': 'R', 'AGG': 'R', 'AGA': 'R', 'AGY': 'S', 'AGT': 'S', 'AAC': 'N', 'AAR': 'K', 'AAG': 'K', 'AAA': 'K', 'AAY': 'N', 'AAT': 'N', 'ATH': 'I', 'ATW': 'I', 'ATC': 'I', 'ATG': 'M', 'ATA': 'I', 'ATM': 'I', 'ATY': 'I', 'ATT': 'I', 'MGR': 'R', 'MGG': 'R', 'MGA': 'R', 'YTA': 'L', 'TCB': 'S', 'TCD': 'S', 'TCH': 'S', 'TCK': 'S', 'TCN': 'S', 'TCW': 'S', 'TCC': 'S', 'TCR': 'S', 'TCG': 'S', 'TCA': 'S', 'TCM': 'S', 'TCV': 'S', 'TCY': 'S', 'TCS': 'S', 'TCT': 'S', 'TRA': '*', 'TGC': 'C', 'TGG': 'W', 'TGA': '*', 'TGY': 'C', 'TGT': 'C', 'TAC': 'Y', 'TAR': '*', 'TAG': '*', 'TAA': '*', 'TAY': 'Y', 'TAT': 'Y', 'TTC': 'F', 'TTR': 'L', 'TTG': 'L', 'TTA': 'L', 'TTY': 'F', 'TTT': 'F'}, 'start_table': {'CCB': 'P', 'CCD': 'P', 'CCH': 'P', 'CCK': 'P', 'CCN': 'P', 'CCW': 'P', 'CCC': 'P', 'CCR': 'P', 'CCG': 'P', 'CCA': 'P', 'CCM': 'P', 'CCV': 'P', 'CCY': 'P', 'CCS': 'P', 'CCT': 'P', 'CGB': 'R', 'CGD': 'R', 'CGH': 'R', 'CGK': 'R', 'CGN': 'R', 'CGW': 'R', 'CGC': 'R', 'CGR': 'R', 'CGG': 'R', 'CGA': 'R', 'CGM': 'R', 'CGV': 'R', 'CGY': 'R', 'CGS': 'R', 'CGT': 'R', 'CAC': 'H', 'CAR': 'Q', 'CAG': 'Q', 'CAA': 'Q', 'CAY': 'H', 'CAT': 'H', 'CTH': 'L', 'CTW': 'L', 'CTC': 'L', 'CTG': 'M', 'CTA': 'L', 'CTM': 'L', 'CTY': 'L', 'CTT': 'L', 'GCB': 'A', 'GCD': 'A', 'GCH': 'A', 'GCK': 'A', 'GCN': 'A', 'GCW': 'A', 'GCC': 'A', 'GCR': 'A', 'GCG': 'A', 'GCA': 'A', 'GCM': 'A', 'GCV': 'A', 'GCY': 'A', 'GCS': 'A', 'GCT': 'A', 'GGB': 'G', 'GGD': 'G', 'GGH': 'G', 'GGK': 'G', 'GGN': 'G', 'GGW': 'G', 'GGC': 'G', 'GGR': 'G', 'GGG': 'G', 'GGA': 'G', 'GGM': 'G', 'GGV': 'G', 'GGY': 'G', 'GGS': 'G', 'GGT': 'G', 'GAC': 'D', 'GAR': 'E', 'GAG': 'E', 'GAA': 'E', 'GAY': 'D', 'GAT': 'D', 'GTB': 'V', 'GTD': 'V', 'GTH': 'V', 'GTK': 'V', 'GTN': 'V', 'GTW': 'V', 'GTC': 'V', 'GTR': 'V', 'GTG': 'V', 'GTA': 'V', 'GTM': 'V', 'GTV': 'V', 'GTY': 'V', 'GTS': 'V', 'GTT': 'V', 'ACB': 'T', 'ACD': 'T', 'ACH': 'T', 'ACK': 'T', 'ACN': 'T', 'ACW': 'T', 'ACC': 'T', 'ACR': 'T', 'ACG': 'T', 'ACA': 'T', 'ACM': 'T', 'ACV': 'T', 'ACY': 'T', 'ACS': 'T', 'ACT': 'T', 'AGC': 'S', 'AGR': 'R', 'AGG': 'R', 'AGA': 'R', 'AGY': 'S', 'AGT': 'S', 'AAC': 'N', 'AAR': 'K', 'AAG': 'K', 'AAA': 'K', 'AAY': 'N', 'AAT': 'N', 'ATH': 'I', 'ATW': 'I', 'ATC': 'I', 'ATG': 'M', 'ATA': 'I', 'ATM': 'I', 'ATY': 'I', 'ATT': 'I', 'MGR': 'R', 'MGG': 'R', 'MGA': 'R', 'MTG': 'M', 'YTA': 'L', 'TCB': 'S', 'TCD': 'S', 'TCH': 'S', 'TCK': 'S', 'TCN': 'S', 'TCW': 'S', 'TCC': 'S', 'TCR': 'S', 'TCG': 'S', 'TCA': 'S', 'TCM': 'S', 'TCV': 'S', 'TCY': 'S', 'TCS': 'S', 'TCT': 'S', 'TRA': '*', 'TGC': 'C', 'TGG': 'W', 'TGA': '*', 'TGY': 'C', 'TGT': 'C', 'TAC': 'Y', 'TAR': '*', 'TAG': '*', 'TAA': '*', 'TAY': 'Y', 'TAT': 'Y', 'TTC': 'F', 'TTR': 'L', 'TTG': 'L', 'TTA': 'L', 'TTY': 'F', 'TTT': 'F'}}, '13': {'trans_table': {'CCB': 'P', 'CCD': 'P', 'CCH': 'P', 'CCK': 'P', 'CCN': 'P', 'CCW': 'P', 'CCC': 'P', 'CCR': 'P', 'CCG': 'P', 'CCA': 'P', 'CCM': 'P', 'CCV': 'P', 'CCY': 'P', 'CCS': 'P', 'CCT': 'P', 'CGB': 'R', 'CGD': 'R', 'CGH': 'R', 'CGK': 'R', 'CGN': 'R', 'CGW': 'R', 'CGC': 'R', 'CGR': 'R', 'CGG': 'R', 'CGA': 'R', 'CGM': 'R', 'CGV': 'R', 'CGY': 'R', 'CGS': 'R', 'CGT': 'R', 'CAC': 'H', 'CAR': 'Q', 'CAG': 'Q', 'CAA': 'Q', 'CAY': 'H', 'CAT': 'H', 'CTB': 'L', 'CTD': 'L', 'CTH': 'L', 'CTK': 'L', 'CTN': 'L', 'CTW': 'L', 'CTC': 'L', 'CTR': 'L', 'CTG': 'L', 'CTA': 'L', 'CTM': 'L', 'CTV': 'L', 'CTY': 'L', 'CTS': 'L', 'CTT': 'L', 'RGR': 'G', 'RGG': 'G', 'RGA': 'G', 'GCB': 'A', 'GCD': 'A', 'GCH': 'A', 'GCK': 'A', 'GCN': 'A', 'GCW': 'A', 'GCC': 'A', 'GCR': 'A', 'GCG': 'A', 'GCA': 'A', 'GCM': 'A', 'GCV': 'A', 'GCY': 'A', 'GCS': 'A', 'GCT': 'A', 'GGB': 'G', 'GGD': 'G', 'GGH': 'G', 'GGK': 'G', 'GGN': 'G', 'GGW': 'G', 'GGC': 'G', 'GGR': 'G', 'GGG': 'G', 'GGA': 'G', 'GGM': 'G', 'GGV': 'G', 'GGY': 'G', 'GGS': 'G', 'GGT': 'G', 'GAC': 'D', 'GAR': 'E', 'GAG': 'E', 'GAA': 'E', 'GAY': 'D', 'GAT': 'D', 'GTB': 'V', 'GTD': 'V', 'GTH': 'V', 'GTK': 'V', 'GTN': 'V', 'GTW': 'V', 'GTC': 'V', 'GTR': 'V', 'GTG': 'V', 'GTA': 'V', 'GTM': 'V', 'GTV': 'V', 'GTY': 'V', 'GTS': 'V', 'GTT': 'V', 'ACB': 'T', 'ACD': 'T', 'ACH': 'T', 'ACK': 'T', 'ACN': 'T', 'ACW': 'T', 'ACC': 'T', 'ACR': 'T', 'ACG': 'T', 'ACA': 'T', 'ACM': 'T', 'ACV': 'T', 'ACY': 'T', 'ACS': 'T', 'ACT': 'T', 'AGC': 'S', 'AGR': 'G', 'AGG': 'G', 'AGA': 'G', 'AGY': 'S', 'AGT': 'S', 'AAC': 'N', 'AAR': 'K', 'AAG': 'K', 'AAA': 'K', 'AAY': 'N', 'AAT': 'N', 'ATC': 'I', 'ATR': 'M', 'ATG': 'M', 'ATA': 'M', 'ATY': 'I', 'ATT': 'I', 'YTR': 'L', 'YTG': 'L', 'YTA': 'L', 'TCB': 'S', 'TCD': 'S', 'TCH': 'S', 'TCK': 'S', 'TCN': 'S', 'TCW': 'S', 'TCC': 'S', 'TCR': 'S', 'TCG': 'S', 'TCA': 'S', 'TCM': 'S', 'TCV': 'S', 'TCY': 'S', 'TCS': 'S', 'TCT': 'S', 'TGC': 'C', 'TGR': 'W', 'TGG': 'W', 'TGA': 'W', 'TGY': 'C', 'TGT': 'C', 'TAC': 'Y', 'TAR': '*', 'TAG': '*', 'TAA': '*', 'TAY': 'Y', 'TAT': 'Y', 'TTC': 'F', 'TTR': 'L', 'TTG': 'L', 'TTA': 'L', 'TTY': 'F', 'TTT': 'F'}, 'start_table': {'DTG': 'M', 'KTG': 'M', 'WTG': 'M', 'CCB': 'P', 'CCD': 'P', 'CCH': 'P', 'CCK': 'P', 'CCN': 'P', 'CCW': 'P', 'CCC': 'P', 'CCR': 'P', 'CCG': 'P', 'CCA': 'P', 'CCM': 'P', 'CCV': 'P', 'CCY': 'P', 'CCS': 'P', 'CCT': 'P', 'CGB': 'R', 'CGD': 'R', 'CGH': 'R', 'CGK': 'R', 'CGN': 'R', 'CGW': 'R', 'CGC': 'R', 'CGR': 'R', 'CGG': 'R', 'CGA': 'R', 'CGM': 'R', 'CGV': 'R', 'CGY': 'R', 'CGS': 'R', 'CGT': 'R', 'CAC': 'H', 'CAR': 'Q', 'CAG': 'Q', 'CAA': 'Q', 'CAY': 'H', 'CAT': 'H', 'CTB': 'L', 'CTD': 'L', 'CTH': 'L', 'CTK': 'L', 'CTN': 'L', 'CTW': 'L', 'CTC': 'L', 'CTR': 'L', 'CTG': 'L', 'CTA': 'L', 'CTM': 'L', 'CTV': 'L', 'CTY': 'L', 'CTS': 'L', 'CTT': 'L', 'RGR': 'G', 'RGG': 'G', 'RGA': 'G', 'RTG': 'M', 'GCB': 'A', 'GCD': 'A', 'GCH': 'A', 'GCK': 'A', 'GCN': 'A', 'GCW': 'A', 'GCC': 'A', 'GCR': 'A', 'GCG': 'A', 'GCA': 'A', 'GCM': 'A', 'GCV': 'A', 'GCY': 'A', 'GCS': 'A', 'GCT': 'A', 'GGB': 'G', 'GGD': 'G', 'GGH': 'G', 'GGK': 'G', 'GGN': 'G', 'GGW': 'G', 'GGC': 'G', 'GGR': 'G', 'GGG': 'G', 'GGA': 'G', 'GGM': 'G', 'GGV': 'G', 'GGY': 'G', 'GGS': 'G', 'GGT': 'G', 'GAC': 'D', 'GAR': 'E', 'GAG': 'E', 'GAA': 'E', 'GAY': 'D', 'GAT': 'D', 'GTH': 'V', 'GTW': 'V', 'GTC': 'V', 'GTG': 'M', 'GTA': 'V', 'GTM': 'V', 'GTY': 'V', 'GTT': 'V', 'ACB': 'T', 'ACD': 'T', 'ACH': 'T', 'ACK': 'T', 'ACN': 'T', 'ACW': 'T', 'ACC': 'T', 'ACR': 'T', 'ACG': 'T', 'ACA': 'T', 'ACM': 'T', 'ACV': 'T', 'ACY': 'T', 'ACS': 'T', 'ACT': 'T', 'AGC': 'S', 'AGR': 'G', 'AGG': 'G', 'AGA': 'G', 'AGY': 'S', 'AGT': 'S', 'AAC': 'N', 'AAR': 'K', 'AAG': 'K', 'AAA': 'K', 'AAY': 'N', 'AAT': 'N', 'ATC': 'I', 'ATR': 'M', 'ATG': 'M', 'ATA': 'M', 'ATY': 'I', 'ATT': 'I', 'YTA': 'L', 'TCB': 'S', 'TCD': 'S', 'TCH': 'S', 'TCK': 'S', 'TCN': 'S', 'TCW': 'S', 'TCC': 'S', 'TCR': 'S', 'TCG': 'S', 'TCA': 'S', 'TCM': 'S', 'TCV': 'S', 'TCY': 'S', 'TCS': 'S', 'TCT': 'S', 'TGC': 'C', 'TGR': 'W', 'TGG': 'W', 'TGA': 'W', 'TGY': 'C', 'TGT': 'C', 'TAC': 'Y', 'TAR': '*', 'TAG': '*', 'TAA': '*', 'TAY': 'Y', 'TAT': 'Y', 'TTC': 'F', 'TTG': 'M', 'TTA': 'L', 'TTY': 'F', 'TTT': 'F'}}, '14': {'trans_table': {'CCB': 'P', 'CCD': 'P', 'CCH': 'P', 'CCK': 'P', 'CCN': 'P', 'CCW': 'P', 'CCC': 'P', 'CCR': 'P', 'CCG': 'P', 'CCA': 'P', 'CCM': 'P', 'CCV': 'P', 'CCY': 'P', 'CCS': 'P', 'CCT': 'P', 'CGB': 'R', 'CGD': 'R', 'CGH': 'R', 'CGK': 'R', 'CGN': 'R', 'CGW': 'R', 'CGC': 'R', 'CGR': 'R', 'CGG': 'R', 'CGA': 'R', 'CGM': 'R', 'CGV': 'R', 'CGY': 'R', 'CGS': 'R', 'CGT': 'R', 'CAC': 'H', 'CAR': 'Q', 'CAG': 'Q', 'CAA': 'Q', 'CAY': 'H', 'CAT': 'H', 'CTB': 'L', 'CTD': 'L', 'CTH': 'L', 'CTK': 'L', 'CTN': 'L', 'CTW': 'L', 'CTC': 'L', 'CTR': 'L', 'CTG': 'L', 'CTA': 'L', 'CTM': 'L', 'CTV': 'L', 'CTY': 'L', 'CTS': 'L', 'CTT': 'L', 'GCB': 'A', 'GCD': 'A', 'GCH': 'A', 'GCK': 'A', 'GCN': 'A', 'GCW': 'A', 'GCC': 'A', 'GCR': 'A', 'GCG': 'A', 'GCA': 'A', 'GCM': 'A', 'GCV': 'A', 'GCY': 'A', 'GCS': 'A', 'GCT': 'A', 'GGB': 'G', 'GGD': 'G', 'GGH': 'G', 'GGK': 'G', 'GGN': 'G', 'GGW': 'G', 'GGC': 'G', 'GGR': 'G', 'GGG': 'G', 'GGA': 'G', 'GGM': 'G', 'GGV': 'G', 'GGY': 'G', 'GGS': 'G', 'GGT': 'G', 'GAC': 'D', 'GAR': 'E', 'GAG': 'E', 'GAA': 'E', 'GAY': 'D', 'GAT': 'D', 'GTB': 'V', 'GTD': 'V', 'GTH': 'V', 'GTK': 'V', 'GTN': 'V', 'GTW': 'V', 'GTC': 'V', 'GTR': 'V', 'GTG': 'V', 'GTA': 'V', 'GTM': 'V', 'GTV': 'V', 'GTY': 'V', 'GTS': 'V', 'GTT': 'V', 'ACB': 'T', 'ACD': 'T', 'ACH': 'T', 'ACK': 'T', 'ACN': 'T', 'ACW': 'T', 'ACC': 'T', 'ACR': 'T', 'ACG': 'T', 'ACA': 'T', 'ACM': 'T', 'ACV': 'T', 'ACY': 'T', 'ACS': 'T', 'ACT': 'T', 'AGB': 'S', 'AGD': 'S', 'AGH': 'S', 'AGK': 'S', 'AGN': 'S', 'AGW': 'S', 'AGC': 'S', 'AGR': 'S', 'AGG': 'S', 'AGA': 'S', 'AGM': 'S', 'AGV': 'S', 'AGY': 'S', 'AGS': 'S', 'AGT': 'S', 'AAH': 'N', 'AAW': 'N', 'AAC': 'N', 'AAG': 'K', 'AAA': 'N', 'AAM': 'N', 'AAY': 'N', 'AAT': 'N', 'ATH': 'I', 'ATW': 'I', 'ATC': 'I', 'ATG': 'M', 'ATA': 'I', 'ATM': 'I', 'ATY': 'I', 'ATT': 'I', 'YTR': 'L', 'YTG': 'L', 'YTA': 'L', 'TCB': 'S', 'TCD': 'S', 'TCH': 'S', 'TCK': 'S', 'TCN': 'S', 'TCW': 'S', 'TCC': 'S', 'TCR': 'S', 'TCG': 'S', 'TCA': 'S', 'TCM': 'S', 'TCV': 'S', 'TCY': 'S', 'TCS': 'S', 'TCT': 'S', 'TGC': 'C', 'TGR': 'W', 'TGG': 'W', 'TGA': 'W', 'TGY': 'C', 'TGT': 'C', 'TAH': 'Y', 'TAW': 'Y', 'TAC': 'Y', 'TAG': '*', 'TAA': 'Y', 'TAM': 'Y', 'TAY': 'Y', 'TAT': 'Y', 'TTC': 'F', 'TTR': 'L', 'TTG': 'L', 'TTA': 'L', 'TTY': 'F', 'TTT': 'F'}, 'start_table': {'CCB': 'P', 'CCD': 'P', 'CCH': 'P', 'CCK': 'P', 'CCN': 'P', 'CCW': 'P', 'CCC': 'P', 'CCR': 'P', 'CCG': 'P', 'CCA': 'P', 'CCM': 'P', 'CCV': 'P', 'CCY': 'P', 'CCS': 'P', 'CCT': 'P', 'CGB': 'R', 'CGD': 'R', 'CGH': 'R', 'CGK': 'R', 'CGN': 'R', 'CGW': 'R', 'CGC': 'R', 'CGR': 'R', 'CGG': 'R', 'CGA': 'R', 'CGM': 'R', 'CGV': 'R', 'CGY': 'R', 'CGS': 'R', 'CGT': 'R', 'CAC': 'H', 'CAR': 'Q', 'CAG': 'Q', 'CAA': 'Q', 'CAY': 'H', 'CAT': 'H', 'CTB': 'L', 'CTD': 'L', 'CTH': 'L', 'CTK': 'L', 'CTN': 'L', 'CTW': 'L', 'CTC': 'L', 'CTR': 'L', 'CTG': 'L', 'CTA': 'L', 'CTM': 'L', 'CTV': 'L', 'CTY': 'L', 'CTS': 'L', 'CTT': 'L', 'GCB': 'A', 'GCD': 'A', 'GCH': 'A', 'GCK': 'A', 'GCN': 'A', 'GCW': 'A', 'GCC': 'A', 'GCR': 'A', 'GCG': 'A', 'GCA': 'A', 'GCM': 'A', 'GCV': 'A', 'GCY': 'A', 'GCS': 'A', 'GCT': 'A', 'GGB': 'G', 'GGD': 'G', 'GGH': 'G', 'GGK': 'G', 'GGN': 'G', 'GGW': 'G', 'GGC': 'G', 'GGR': 'G', 'GGG': 'G', 'GGA': 'G', 'GGM': 'G', 'GGV': 'G', 'GGY': 'G', 'GGS': 'G', 'GGT': 'G', 'GAC': 'D', 'GAR': 'E', 'GAG': 'E', 'GAA': 'E', 'GAY': 'D', 'GAT': 'D', 'GTB': 'V', 'GTD': 'V', 'GTH': 'V', 'GTK': 'V', 'GTN': 'V', 'GTW': 'V', 'GTC': 'V', 'GTR': 'V', 'GTG': 'V', 'GTA': 'V', 'GTM': 'V', 'GTV': 'V', 'GTY': 'V', 'GTS': 'V', 'GTT': 'V', 'ACB': 'T', 'ACD': 'T', 'ACH': 'T', 'ACK': 'T', 'ACN': 'T', 'ACW': 'T', 'ACC': 'T', 'ACR': 'T', 'ACG': 'T', 'ACA': 'T', 'ACM': 'T', 'ACV': 'T', 'ACY': 'T', 'ACS': 'T', 'ACT': 'T', 'AGB': 'S', 'AGD': 'S', 'AGH': 'S', 'AGK': 'S', 'AGN': 'S', 'AGW': 'S', 'AGC': 'S', 'AGR': 'S', 'AGG': 'S', 'AGA': 'S', 'AGM': 'S', 'AGV': 'S', 'AGY': 'S', 'AGS': 'S', 'AGT': 'S', 'AAH': 'N', 'AAW': 'N', 'AAC': 'N', 'AAG': 'K', 'AAA': 'N', 'AAM': 'N', 'AAY': 'N', 'AAT': 'N', 'ATH': 'I', 'ATW': 'I', 'ATC': 'I', 'ATG': 'M', 'ATA': 'I', 'ATM': 'I', 'ATY': 'I', 'ATT': 'I', 'YTR': 'L', 'YTG': 'L', 'YTA': 'L', 'TCB': 'S', 'TCD': 'S', 'TCH': 'S', 'TCK': 'S', 'TCN': 'S', 'TCW': 'S', 'TCC': 'S', 'TCR': 'S', 'TCG': 'S', 'TCA': 'S', 'TCM': 'S', 'TCV': 'S', 'TCY': 'S', 'TCS': 'S', 'TCT': 'S', 'TGC': 'C', 'TGR': 'W', 'TGG': 'W', 'TGA': 'W', 'TGY': 'C', 'TGT': 'C', 'TAH': 'Y', 'TAW': 'Y', 'TAC': 'Y', 'TAG': '*', 'TAA': 'Y', 'TAM': 'Y', 'TAY': 'Y', 'TAT': 'Y', 'TTC': 'F', 'TTR': 'L', 'TTG': 'L', 'TTA': 'L', 'TTY': 'F', 'TTT': 'F'}}, '15': {'trans_table': {'CCB': 'P', 'CCD': 'P', 'CCH': 'P', 'CCK': 'P', 'CCN': 'P', 'CCW': 'P', 'CCC': 'P', 'CCR': 'P', 'CCG': 'P', 'CCA': 'P', 'CCM': 'P', 'CCV': 'P', 'CCY': 'P', 'CCS': 'P', 'CCT': 'P', 'CGB': 'R', 'CGD': 'R', 'CGH': 'R', 'CGK': 'R', 'CGN': 'R', 'CGW': 'R', 'CGC': 'R', 'CGR': 'R', 'CGG': 'R', 'CGA': 'R', 'CGM': 'R', 'CGV': 'R', 'CGY': 'R', 'CGS': 'R', 'CGT': 'R', 'CAC': 'H', 'CAR': 'Q', 'CAG': 'Q', 'CAA': 'Q', 'CAY': 'H', 'CAT': 'H', 'CTB': 'L', 'CTD': 'L', 'CTH': 'L', 'CTK': 'L', 'CTN': 'L', 'CTW': 'L', 'CTC': 'L', 'CTR': 'L', 'CTG': 'L', 'CTA': 'L', 'CTM': 'L', 'CTV': 'L', 'CTY': 'L', 'CTS': 'L', 'CTT': 'L', 'GCB': 'A', 'GCD': 'A', 'GCH': 'A', 'GCK': 'A', 'GCN': 'A', 'GCW': 'A', 'GCC': 'A', 'GCR': 'A', 'GCG': 'A', 'GCA': 'A', 'GCM': 'A', 'GCV': 'A', 'GCY': 'A', 'GCS': 'A', 'GCT': 'A', 'GGB': 'G', 'GGD': 'G', 'GGH': 'G', 'GGK': 'G', 'GGN': 'G', 'GGW': 'G', 'GGC': 'G', 'GGR': 'G', 'GGG': 'G', 'GGA': 'G', 'GGM': 'G', 'GGV': 'G', 'GGY': 'G', 'GGS': 'G', 'GGT': 'G', 'GAC': 'D', 'GAR': 'E', 'GAG': 'E', 'GAA': 'E', 'GAY': 'D', 'GAT': 'D', 'GTB': 'V', 'GTD': 'V', 'GTH': 'V', 'GTK': 'V', 'GTN': 'V', 'GTW': 'V', 'GTC': 'V', 'GTR': 'V', 'GTG': 'V', 'GTA': 'V', 'GTM': 'V', 'GTV': 'V', 'GTY': 'V', 'GTS': 'V', 'GTT': 'V', 'ACB': 'T', 'ACD': 'T', 'ACH': 'T', 'ACK': 'T', 'ACN': 'T', 'ACW': 'T', 'ACC': 'T', 'ACR': 'T', 'ACG': 'T', 'ACA': 'T', 'ACM': 'T', 'ACV': 'T', 'ACY': 'T', 'ACS': 'T', 'ACT': 'T', 'AGC': 'S', 'AGR': 'R', 'AGG': 'R', 'AGA': 'R', 'AGY': 'S', 'AGT': 'S', 'AAC': 'N', 'AAR': 'K', 'AAG': 'K', 'AAA': 'K', 'AAY': 'N', 'AAT': 'N', 'ATH': 'I', 'ATW': 'I', 'ATC': 'I', 'ATG': 'M', 'ATA': 'I', 'ATM': 'I', 'ATY': 'I', 'ATT': 'I', 'MGR': 'R', 'MGG': 'R', 'MGA': 'R', 'YAG': 'Q', 'YTR': 'L', 'YTG': 'L', 'YTA': 'L', 'TCB': 'S', 'TCD': 'S', 'TCH': 'S', 'TCK': 'S', 'TCN': 'S', 'TCW': 'S', 'TCC': 'S', 'TCR': 'S', 'TCG': 'S', 'TCA': 'S', 'TCM': 'S', 'TCV': 'S', 'TCY': 'S', 'TCS': 'S', 'TCT': 'S', 'TRA': '*', 'TGC': 'C', 'TGG': 'W', 'TGA': '*', 'TGY': 'C', 'TGT': 'C', 'TAC': 'Y', 'TAG': 'Q', 'TAA': '*', 'TAY': 'Y', 'TAT': 'Y', 'TTC': 'F', 'TTR': 'L', 'TTG': 'L', 'TTA': 'L', 'TTY': 'F', 'TTT': 'F'}, 'start_table': {'CCB': 'P', 'CCD': 'P', 'CCH': 'P', 'CCK': 'P', 'CCN': 'P', 'CCW': 'P', 'CCC': 'P', 'CCR': 'P', 'CCG': 'P', 'CCA': 'P', 'CCM': 'P', 'CCV': 'P', 'CCY': 'P', 'CCS': 'P', 'CCT': 'P', 'CGB': 'R', 'CGD': 'R', 'CGH': 'R', 'CGK': 'R', 'CGN': 'R', 'CGW': 'R', 'CGC': 'R', 'CGR': 'R', 'CGG': 'R', 'CGA': 'R', 'CGM': 'R', 'CGV': 'R', 'CGY': 'R', 'CGS': 'R', 'CGT': 'R', 'CAC': 'H', 'CAR': 'Q', 'CAG': 'Q', 'CAA': 'Q', 'CAY': 'H', 'CAT': 'H', 'CTB': 'L', 'CTD': 'L', 'CTH': 'L', 'CTK': 'L', 'CTN': 'L', 'CTW': 'L', 'CTC': 'L', 'CTR': 'L', 'CTG': 'L', 'CTA': 'L', 'CTM': 'L', 'CTV': 'L', 'CTY': 'L', 'CTS': 'L', 'CTT': 'L', 'GCB': 'A', 'GCD': 'A', 'GCH': 'A', 'GCK': 'A', 'GCN': 'A', 'GCW': 'A', 'GCC': 'A', 'GCR': 'A', 'GCG': 'A', 'GCA': 'A', 'GCM': 'A', 'GCV': 'A', 'GCY': 'A', 'GCS': 'A', 'GCT': 'A', 'GGB': 'G', 'GGD': 'G', 'GGH': 'G', 'GGK': 'G', 'GGN': 'G', 'GGW': 'G', 'GGC': 'G', 'GGR': 'G', 'GGG': 'G', 'GGA': 'G', 'GGM': 'G', 'GGV': 'G', 'GGY': 'G', 'GGS': 'G', 'GGT': 'G', 'GAC': 'D', 'GAR': 'E', 'GAG': 'E', 'GAA': 'E', 'GAY': 'D', 'GAT': 'D', 'GTB': 'V', 'GTD': 'V', 'GTH': 'V', 'GTK': 'V', 'GTN': 'V', 'GTW': 'V', 'GTC': 'V', 'GTR': 'V', 'GTG': 'V', 'GTA': 'V', 'GTM': 'V', 'GTV': 'V', 'GTY': 'V', 'GTS': 'V', 'GTT': 'V', 'ACB': 'T', 'ACD': 'T', 'ACH': 'T', 'ACK': 'T', 'ACN': 'T', 'ACW': 'T', 'ACC': 'T', 'ACR': 'T', 'ACG': 'T', 'ACA': 'T', 'ACM': 'T', 'ACV': 'T', 'ACY': 'T', 'ACS': 'T', 'ACT': 'T', 'AGC': 'S', 'AGR': 'R', 'AGG': 'R', 'AGA': 'R', 'AGY': 'S', 'AGT': 'S', 'AAC': 'N', 'AAR': 'K', 'AAG': 'K', 'AAA': 'K', 'AAY': 'N', 'AAT': 'N', 'ATH': 'I', 'ATW': 'I', 'ATC': 'I', 'ATG': 'M', 'ATA': 'I', 'ATM': 'I', 'ATY': 'I', 'ATT': 'I', 'MGR': 'R', 'MGG': 'R', 'MGA': 'R', 'YAG': 'Q', 'YTR': 'L', 'YTG': 'L', 'YTA': 'L', 'TCB': 'S', 'TCD': 'S', 'TCH': 'S', 'TCK': 'S', 'TCN': 'S', 'TCW': 'S', 'TCC': 'S', 'TCR': 'S', 'TCG': 'S', 'TCA': 'S', 'TCM': 'S', 'TCV': 'S', 'TCY': 'S', 'TCS': 'S', 'TCT': 'S', 'TRA': '*', 'TGC': 'C', 'TGG': 'W', 'TGA': '*', 'TGY': 'C', 'TGT': 'C', 'TAC': 'Y', 'TAG': 'Q', 'TAA': '*', 'TAY': 'Y', 'TAT': 'Y', 'TTC': 'F', 'TTR': 'L', 'TTG': 'L', 'TTA': 'L', 'TTY': 'F', 'TTT': 'F'}}, '16': {'trans_table': {'CCB': 'P', 'CCD': 'P', 'CCH': 'P', 'CCK': 'P', 'CCN': 'P', 'CCW': 'P', 'CCC': 'P', 'CCR': 'P', 'CCG': 'P', 'CCA': 'P', 'CCM': 'P', 'CCV': 'P', 'CCY': 'P', 'CCS': 'P', 'CCT': 'P', 'CGB': 'R', 'CGD': 'R', 'CGH': 'R', 'CGK': 'R', 'CGN': 'R', 'CGW': 'R', 'CGC': 'R', 'CGR': 'R', 'CGG': 'R', 'CGA': 'R', 'CGM': 'R', 'CGV': 'R', 'CGY': 'R', 'CGS': 'R', 'CGT': 'R', 'CAC': 'H', 'CAR': 'Q', 'CAG': 'Q', 'CAA': 'Q', 'CAY': 'H', 'CAT': 'H', 'CTB': 'L', 'CTD': 'L', 'CTH': 'L', 'CTK': 'L', 'CTN': 'L', 'CTW': 'L', 'CTC': 'L', 'CTR': 'L', 'CTG': 'L', 'CTA': 'L', 'CTM': 'L', 'CTV': 'L', 'CTY': 'L', 'CTS': 'L', 'CTT': 'L', 'GCB': 'A', 'GCD': 'A', 'GCH': 'A', 'GCK': 'A', 'GCN': 'A', 'GCW': 'A', 'GCC': 'A', 'GCR': 'A', 'GCG': 'A', 'GCA': 'A', 'GCM': 'A', 'GCV': 'A', 'GCY': 'A', 'GCS': 'A', 'GCT': 'A', 'GGB': 'G', 'GGD': 'G', 'GGH': 'G', 'GGK': 'G', 'GGN': 'G', 'GGW': 'G', 'GGC': 'G', 'GGR': 'G', 'GGG': 'G', 'GGA': 'G', 'GGM': 'G', 'GGV': 'G', 'GGY': 'G', 'GGS': 'G', 'GGT': 'G', 'GAC': 'D', 'GAR': 'E', 'GAG': 'E', 'GAA': 'E', 'GAY': 'D', 'GAT': 'D', 'GTB': 'V', 'GTD': 'V', 'GTH': 'V', 'GTK': 'V', 'GTN': 'V', 'GTW': 'V', 'GTC': 'V', 'GTR': 'V', 'GTG': 'V', 'GTA': 'V', 'GTM': 'V', 'GTV': 'V', 'GTY': 'V', 'GTS': 'V', 'GTT': 'V', 'ACB': 'T', 'ACD': 'T', 'ACH': 'T', 'ACK': 'T', 'ACN': 'T', 'ACW': 'T', 'ACC': 'T', 'ACR': 'T', 'ACG': 'T', 'ACA': 'T', 'ACM': 'T', 'ACV': 'T', 'ACY': 'T', 'ACS': 'T', 'ACT': 'T', 'AGC': 'S', 'AGR': 'R', 'AGG': 'R', 'AGA': 'R', 'AGY': 'S', 'AGT': 'S', 'AAC': 'N', 'AAR': 'K', 'AAG': 'K', 'AAA': 'K', 'AAY': 'N', 'AAT': 'N', 'ATH': 'I', 'ATW': 'I', 'ATC': 'I', 'ATG': 'M', 'ATA': 'I', 'ATM': 'I', 'ATY': 'I', 'ATT': 'I', 'MGR': 'R', 'MGG': 'R', 'MGA': 'R', 'YTR': 'L', 'YTG': 'L', 'YTA': 'L', 'TWG': 'L', 'TCB': 'S', 'TCD': 'S', 'TCH': 'S', 'TCK': 'S', 'TCN': 'S', 'TCW': 'S', 'TCC': 'S', 'TCR': 'S', 'TCG': 'S', 'TCA': 'S', 'TCM': 'S', 'TCV': 'S', 'TCY': 'S', 'TCS': 'S', 'TCT': 'S', 'TRA': '*', 'TGC': 'C', 'TGG': 'W', 'TGA': '*', 'TGY': 'C', 'TGT': 'C', 'TAC': 'Y', 'TAG': 'L', 'TAA': '*', 'TAY': 'Y', 'TAT': 'Y', 'TTC': 'F', 'TTR': 'L', 'TTG': 'L', 'TTA': 'L', 'TTY': 'F', 'TTT': 'F'}, 'start_table': {'CCB': 'P', 'CCD': 'P', 'CCH': 'P', 'CCK': 'P', 'CCN': 'P', 'CCW': 'P', 'CCC': 'P', 'CCR': 'P', 'CCG': 'P', 'CCA': 'P', 'CCM': 'P', 'CCV': 'P', 'CCY': 'P', 'CCS': 'P', 'CCT': 'P', 'CGB': 'R', 'CGD': 'R', 'CGH': 'R', 'CGK': 'R', 'CGN': 'R', 'CGW': 'R', 'CGC': 'R', 'CGR': 'R', 'CGG': 'R', 'CGA': 'R', 'CGM': 'R', 'CGV': 'R', 'CGY': 'R', 'CGS': 'R', 'CGT': 'R', 'CAC': 'H', 'CAR': 'Q', 'CAG': 'Q', 'CAA': 'Q', 'CAY': 'H', 'CAT': 'H', 'CTB': 'L', 'CTD': 'L', 'CTH': 'L', 'CTK': 'L', 'CTN': 'L', 'CTW': 'L', 'CTC': 'L', 'CTR': 'L', 'CTG': 'L', 'CTA': 'L', 'CTM': 'L', 'CTV': 'L', 'CTY': 'L', 'CTS': 'L', 'CTT': 'L', 'GCB': 'A', 'GCD': 'A', 'GCH': 'A', 'GCK': 'A', 'GCN': 'A', 'GCW': 'A', 'GCC': 'A', 'GCR': 'A', 'GCG': 'A', 'GCA': 'A', 'GCM': 'A', 'GCV': 'A', 'GCY': 'A', 'GCS': 'A', 'GCT': 'A', 'GGB': 'G', 'GGD': 'G', 'GGH': 'G', 'GGK': 'G', 'GGN': 'G', 'GGW': 'G', 'GGC': 'G', 'GGR': 'G', 'GGG': 'G', 'GGA': 'G', 'GGM': 'G', 'GGV': 'G', 'GGY': 'G', 'GGS': 'G', 'GGT': 'G', 'GAC': 'D', 'GAR': 'E', 'GAG': 'E', 'GAA': 'E', 'GAY': 'D', 'GAT': 'D', 'GTB': 'V', 'GTD': 'V', 'GTH': 'V', 'GTK': 'V', 'GTN': 'V', 'GTW': 'V', 'GTC': 'V', 'GTR': 'V', 'GTG': 'V', 'GTA': 'V', 'GTM': 'V', 'GTV': 'V', 'GTY': 'V', 'GTS': 'V', 'GTT': 'V', 'ACB': 'T', 'ACD': 'T', 'ACH': 'T', 'ACK': 'T', 'ACN': 'T', 'ACW': 'T', 'ACC': 'T', 'ACR': 'T', 'ACG': 'T', 'ACA': 'T', 'ACM': 'T', 'ACV': 'T', 'ACY': 'T', 'ACS': 'T', 'ACT': 'T', 'AGC': 'S', 'AGR': 'R', 'AGG': 'R', 'AGA': 'R', 'AGY': 'S', 'AGT': 'S', 'AAC': 'N', 'AAR': 'K', 'AAG': 'K', 'AAA': 'K', 'AAY': 'N', 'AAT': 'N', 'ATH': 'I', 'ATW': 'I', 'ATC': 'I', 'ATG': 'M', 'ATA': 'I', 'ATM': 'I', 'ATY': 'I', 'ATT': 'I', 'MGR': 'R', 'MGG': 'R', 'MGA': 'R', 'YTR': 'L', 'YTG': 'L', 'YTA': 'L', 'TWG': 'L', 'TCB': 'S', 'TCD': 'S', 'TCH': 'S', 'TCK': 'S', 'TCN': 'S', 'TCW': 'S', 'TCC': 'S', 'TCR': 'S', 'TCG': 'S', 'TCA': 'S', 'TCM': 'S', 'TCV': 'S', 'TCY': 'S', 'TCS': 'S', 'TCT': 'S', 'TRA': '*', 'TGC': 'C', 'TGG': 'W', 'TGA': '*', 'TGY': 'C', 'TGT': 'C', 'TAC': 'Y', 'TAG': 'L', 'TAA': '*', 'TAY': 'Y', 'TAT': 'Y', 'TTC': 'F', 'TTR': 'L', 'TTG': 'L', 'TTA': 'L', 'TTY': 'F', 'TTT': 'F'}}, '21': {'trans_table': {'CCB': 'P', 'CCD': 'P', 'CCH': 'P', 'CCK': 'P', 'CCN': 'P', 'CCW': 'P', 'CCC': 'P', 'CCR': 'P', 'CCG': 'P', 'CCA': 'P', 'CCM': 'P', 'CCV': 'P', 'CCY': 'P', 'CCS': 'P', 'CCT': 'P', 'CGB': 'R', 'CGD': 'R', 'CGH': 'R', 'CGK': 'R', 'CGN': 'R', 'CGW': 'R', 'CGC': 'R', 'CGR': 'R', 'CGG': 'R', 'CGA': 'R', 'CGM': 'R', 'CGV': 'R', 'CGY': 'R', 'CGS': 'R', 'CGT': 'R', 'CAC': 'H', 'CAR': 'Q', 'CAG': 'Q', 'CAA': 'Q', 'CAY': 'H', 'CAT': 'H', 'CTB': 'L', 'CTD': 'L', 'CTH': 'L', 'CTK': 'L', 'CTN': 'L', 'CTW': 'L', 'CTC': 'L', 'CTR': 'L', 'CTG': 'L', 'CTA': 'L', 'CTM': 'L', 'CTV': 'L', 'CTY': 'L', 'CTS': 'L', 'CTT': 'L', 'GCB': 'A', 'GCD': 'A', 'GCH': 'A', 'GCK': 'A', 'GCN': 'A', 'GCW': 'A', 'GCC': 'A', 'GCR': 'A', 'GCG': 'A', 'GCA': 'A', 'GCM': 'A', 'GCV': 'A', 'GCY': 'A', 'GCS': 'A', 'GCT': 'A', 'GGB': 'G', 'GGD': 'G', 'GGH': 'G', 'GGK': 'G', 'GGN': 'G', 'GGW': 'G', 'GGC': 'G', 'GGR': 'G', 'GGG': 'G', 'GGA': 'G', 'GGM': 'G', 'GGV': 'G', 'GGY': 'G', 'GGS': 'G', 'GGT': 'G', 'GAC': 'D', 'GAR': 'E', 'GAG': 'E', 'GAA': 'E', 'GAY': 'D', 'GAT': 'D', 'GTB': 'V', 'GTD': 'V', 'GTH': 'V', 'GTK': 'V', 'GTN': 'V', 'GTW': 'V', 'GTC': 'V', 'GTR': 'V', 'GTG': 'V', 'GTA': 'V', 'GTM': 'V', 'GTV': 'V', 'GTY': 'V', 'GTS': 'V', 'GTT': 'V', 'ACB': 'T', 'ACD': 'T', 'ACH': 'T', 'ACK': 'T', 'ACN': 'T', 'ACW': 'T', 'ACC': 'T', 'ACR': 'T', 'ACG': 'T', 'ACA': 'T', 'ACM': 'T', 'ACV': 'T', 'ACY': 'T', 'ACS': 'T', 'ACT': 'T', 'AGB': 'S', 'AGD': 'S', 'AGH': 'S', 'AGK': 'S', 'AGN': 'S', 'AGW': 'S', 'AGC': 'S', 'AGR': 'S', 'AGG': 'S', 'AGA': 'S', 'AGM': 'S', 'AGV': 'S', 'AGY': 'S', 'AGS': 'S', 'AGT': 'S', 'AAH': 'N', 'AAW': 'N', 'AAC': 'N', 'AAG': 'K', 'AAA': 'N', 'AAM': 'N', 'AAY': 'N', 'AAT': 'N', 'ATC': 'I', 'ATR': 'M', 'ATG': 'M', 'ATA': 'M', 'ATY': 'I', 'ATT': 'I', 'YTR': 'L', 'YTG': 'L', 'YTA': 'L', 'TCB': 'S', 'TCD': 'S', 'TCH': 'S', 'TCK': 'S', 'TCN': 'S', 'TCW': 'S', 'TCC': 'S', 'TCR': 'S', 'TCG': 'S', 'TCA': 'S', 'TCM': 'S', 'TCV': 'S', 'TCY': 'S', 'TCS': 'S', 'TCT': 'S', 'TGC': 'C', 'TGR': 'W', 'TGG': 'W', 'TGA': 'W', 'TGY': 'C', 'TGT': 'C', 'TAC': 'Y', 'TAR': '*', 'TAG': '*', 'TAA': '*', 'TAY': 'Y', 'TAT': 'Y', 'TTC': 'F', 'TTR': 'L', 'TTG': 'L', 'TTA': 'L', 'TTY': 'F', 'TTT': 'F'}, 'start_table': {'CCB': 'P', 'CCD': 'P', 'CCH': 'P', 'CCK': 'P', 'CCN': 'P', 'CCW': 'P', 'CCC': 'P', 'CCR': 'P', 'CCG': 'P', 'CCA': 'P', 'CCM': 'P', 'CCV': 'P', 'CCY': 'P', 'CCS': 'P', 'CCT': 'P', 'CGB': 'R', 'CGD': 'R', 'CGH': 'R', 'CGK': 'R', 'CGN': 'R', 'CGW': 'R', 'CGC': 'R', 'CGR': 'R', 'CGG': 'R', 'CGA': 'R', 'CGM': 'R', 'CGV': 'R', 'CGY': 'R', 'CGS': 'R', 'CGT': 'R', 'CAC': 'H', 'CAR': 'Q', 'CAG': 'Q', 'CAA': 'Q', 'CAY': 'H', 'CAT': 'H', 'CTB': 'L', 'CTD': 'L', 'CTH': 'L', 'CTK': 'L', 'CTN': 'L', 'CTW': 'L', 'CTC': 'L', 'CTR': 'L', 'CTG': 'L', 'CTA': 'L', 'CTM': 'L', 'CTV': 'L', 'CTY': 'L', 'CTS': 'L', 'CTT': 'L', 'RTG': 'M', 'GCB': 'A', 'GCD': 'A', 'GCH': 'A', 'GCK': 'A', 'GCN': 'A', 'GCW': 'A', 'GCC': 'A', 'GCR': 'A', 'GCG': 'A', 'GCA': 'A', 'GCM': 'A', 'GCV': 'A', 'GCY': 'A', 'GCS': 'A', 'GCT': 'A', 'GGB': 'G', 'GGD': 'G', 'GGH': 'G', 'GGK': 'G', 'GGN': 'G', 'GGW': 'G', 'GGC': 'G', 'GGR': 'G', 'GGG': 'G', 'GGA': 'G', 'GGM': 'G', 'GGV': 'G', 'GGY': 'G', 'GGS': 'G', 'GGT': 'G', 'GAC': 'D', 'GAR': 'E', 'GAG': 'E', 'GAA': 'E', 'GAY': 'D', 'GAT': 'D', 'GTH': 'V', 'GTW': 'V', 'GTC': 'V', 'GTG': 'M', 'GTA': 'V', 'GTM': 'V', 'GTY': 'V', 'GTT': 'V', 'ACB': 'T', 'ACD': 'T', 'ACH': 'T', 'ACK': 'T', 'ACN': 'T', 'ACW': 'T', 'ACC': 'T', 'ACR': 'T', 'ACG': 'T', 'ACA': 'T', 'ACM': 'T', 'ACV': 'T', 'ACY': 'T', 'ACS': 'T', 'ACT': 'T', 'AGB': 'S', 'AGD': 'S', 'AGH': 'S', 'AGK': 'S', 'AGN': 'S', 'AGW': 'S', 'AGC': 'S', 'AGR': 'S', 'AGG': 'S', 'AGA': 'S', 'AGM': 'S', 'AGV': 'S', 'AGY': 'S', 'AGS': 'S', 'AGT': 'S', 'AAH': 'N', 'AAW': 'N', 'AAC': 'N', 'AAG': 'K', 'AAA': 'N', 'AAM': 'N', 'AAY': 'N', 'AAT': 'N', 'ATC': 'I', 'ATR': 'M', 'ATG': 'M', 'ATA': 'M', 'ATY': 'I', 'ATT': 'I', 'YTR': 'L', 'YTG': 'L', 'YTA': 'L', 'TCB': 'S', 'TCD': 'S', 'TCH': 'S', 'TCK': 'S', 'TCN': 'S', 'TCW': 'S', 'TCC': 'S', 'TCR': 'S', 'TCG': 'S', 'TCA': 'S', 'TCM': 'S', 'TCV': 'S', 'TCY': 'S', 'TCS': 'S', 'TCT': 'S', 'TGC': 'C', 'TGR': 'W', 'TGG': 'W', 'TGA': 'W', 'TGY': 'C', 'TGT': 'C', 'TAC': 'Y', 'TAR': '*', 'TAG': '*', 'TAA': '*', 'TAY': 'Y', 'TAT': 'Y', 'TTC': 'F', 'TTR': 'L', 'TTG': 'L', 'TTA': 'L', 'TTY': 'F', 'TTT': 'F'}}, '22': {'trans_table': {'CCB': 'P', 'CCD': 'P', 'CCH': 'P', 'CCK': 'P', 'CCN': 'P', 'CCW': 'P', 'CCC': 'P', 'CCR': 'P', 'CCG': 'P', 'CCA': 'P', 'CCM': 'P', 'CCV': 'P', 'CCY': 'P', 'CCS': 'P', 'CCT': 'P', 'CGB': 'R', 'CGD': 'R', 'CGH': 'R', 'CGK': 'R', 'CGN': 'R', 'CGW': 'R', 'CGC': 'R', 'CGR': 'R', 'CGG': 'R', 'CGA': 'R', 'CGM': 'R', 'CGV': 'R', 'CGY': 'R', 'CGS': 'R', 'CGT': 'R', 'CAC': 'H', 'CAR': 'Q', 'CAG': 'Q', 'CAA': 'Q', 'CAY': 'H', 'CAT': 'H', 'CTB': 'L', 'CTD': 'L', 'CTH': 'L', 'CTK': 'L', 'CTN': 'L', 'CTW': 'L', 'CTC': 'L', 'CTR': 'L', 'CTG': 'L', 'CTA': 'L', 'CTM': 'L', 'CTV': 'L', 'CTY': 'L', 'CTS': 'L', 'CTT': 'L', 'GCB': 'A', 'GCD': 'A', 'GCH': 'A', 'GCK': 'A', 'GCN': 'A', 'GCW': 'A', 'GCC': 'A', 'GCR': 'A', 'GCG': 'A', 'GCA': 'A', 'GCM': 'A', 'GCV': 'A', 'GCY': 'A', 'GCS': 'A', 'GCT': 'A', 'GGB': 'G', 'GGD': 'G', 'GGH': 'G', 'GGK': 'G', 'GGN': 'G', 'GGW': 'G', 'GGC': 'G', 'GGR': 'G', 'GGG': 'G', 'GGA': 'G', 'GGM': 'G', 'GGV': 'G', 'GGY': 'G', 'GGS': 'G', 'GGT': 'G', 'GAC': 'D', 'GAR': 'E', 'GAG': 'E', 'GAA': 'E', 'GAY': 'D', 'GAT': 'D', 'GTB': 'V', 'GTD': 'V', 'GTH': 'V', 'GTK': 'V', 'GTN': 'V', 'GTW': 'V', 'GTC': 'V', 'GTR': 'V', 'GTG': 'V', 'GTA': 'V', 'GTM': 'V', 'GTV': 'V', 'GTY': 'V', 'GTS': 'V', 'GTT': 'V', 'ACB': 'T', 'ACD': 'T', 'ACH': 'T', 'ACK': 'T', 'ACN': 'T', 'ACW': 'T', 'ACC': 'T', 'ACR': 'T', 'ACG': 'T', 'ACA': 'T', 'ACM': 'T', 'ACV': 'T', 'ACY': 'T', 'ACS': 'T', 'ACT': 'T', 'AGC': 'S', 'AGR': 'R', 'AGG': 'R', 'AGA': 'R', 'AGY': 'S', 'AGT': 'S', 'AAC': 'N', 'AAR': 'K', 'AAG': 'K', 'AAA': 'K', 'AAY': 'N', 'AAT': 'N', 'ATH': 'I', 'ATW': 'I', 'ATC': 'I', 'ATG': 'M', 'ATA': 'I', 'ATM': 'I', 'ATY': 'I', 'ATT': 'I', 'MGR': 'R', 'MGG': 'R', 'MGA': 'R', 'YTR': 'L', 'YTG': 'L', 'YTA': 'L', 'TWG': 'L', 'TCB': 'S', 'TCK': 'S', 'TCC': 'S', 'TCG': 'S', 'TCA': '*', 'TCY': 'S', 'TCS': 'S', 'TCT': 'S', 'TRA': '*', 'TGC': 'C', 'TGG': 'W', 'TGA': '*', 'TGY': 'C', 'TGT': 'C', 'TAC': 'Y', 'TAG': 'L', 'TAA': '*', 'TAY': 'Y', 'TAT': 'Y', 'TMA': '*', 'TVA': '*', 'TSA': '*', 'TTC': 'F', 'TTR': 'L', 'TTG': 'L', 'TTA': 'L', 'TTY': 'F', 'TTT': 'F'}, 'start_table': {'CCB': 'P', 'CCD': 'P', 'CCH': 'P', 'CCK': 'P', 'CCN': 'P', 'CCW': 'P', 'CCC': 'P', 'CCR': 'P', 'CCG': 'P', 'CCA': 'P', 'CCM': 'P', 'CCV': 'P', 'CCY': 'P', 'CCS': 'P', 'CCT': 'P', 'CGB': 'R', 'CGD': 'R', 'CGH': 'R', 'CGK': 'R', 'CGN': 'R', 'CGW': 'R', 'CGC': 'R', 'CGR': 'R', 'CGG': 'R', 'CGA': 'R', 'CGM': 'R', 'CGV': 'R', 'CGY': 'R', 'CGS': 'R', 'CGT': 'R', 'CAC': 'H', 'CAR': 'Q', 'CAG': 'Q', 'CAA': 'Q', 'CAY': 'H', 'CAT': 'H', 'CTB': 'L', 'CTD': 'L', 'CTH': 'L', 'CTK': 'L', 'CTN': 'L', 'CTW': 'L', 'CTC': 'L', 'CTR': 'L', 'CTG': 'L', 'CTA': 'L', 'CTM': 'L', 'CTV': 'L', 'CTY': 'L', 'CTS': 'L', 'CTT': 'L', 'GCB': 'A', 'GCD': 'A', 'GCH': 'A', 'GCK': 'A', 'GCN': 'A', 'GCW': 'A', 'GCC': 'A', 'GCR': 'A', 'GCG': 'A', 'GCA': 'A', 'GCM': 'A', 'GCV': 'A', 'GCY': 'A', 'GCS': 'A', 'GCT': 'A', 'GGB': 'G', 'GGD': 'G', 'GGH': 'G', 'GGK': 'G', 'GGN': 'G', 'GGW': 'G', 'GGC': 'G', 'GGR': 'G', 'GGG': 'G', 'GGA': 'G', 'GGM': 'G', 'GGV': 'G', 'GGY': 'G', 'GGS': 'G', 'GGT': 'G', 'GAC': 'D', 'GAR': 'E', 'GAG': 'E', 'GAA': 'E', 'GAY': 'D', 'GAT': 'D', 'GTB': 'V', 'GTD': 'V', 'GTH': 'V', 'GTK': 'V', 'GTN': 'V', 'GTW': 'V', 'GTC': 'V', 'GTR': 'V', 'GTG': 'V', 'GTA': 'V', 'GTM': 'V', 'GTV': 'V', 'GTY': 'V', 'GTS': 'V', 'GTT': 'V', 'ACB': 'T', 'ACD': 'T', 'ACH': 'T', 'ACK': 'T', 'ACN': 'T', 'ACW': 'T', 'ACC': 'T', 'ACR': 'T', 'ACG': 'T', 'ACA': 'T', 'ACM': 'T', 'ACV': 'T', 'ACY': 'T', 'ACS': 'T', 'ACT': 'T', 'AGC': 'S', 'AGR': 'R', 'AGG': 'R', 'AGA': 'R', 'AGY': 'S', 'AGT': 'S', 'AAC': 'N', 'AAR': 'K', 'AAG': 'K', 'AAA': 'K', 'AAY': 'N', 'AAT': 'N', 'ATH': 'I', 'ATW': 'I', 'ATC': 'I', 'ATG': 'M', 'ATA': 'I', 'ATM': 'I', 'ATY': 'I', 'ATT': 'I', 'MGR': 'R', 'MGG': 'R', 'MGA': 'R', 'YTR': 'L', 'YTG': 'L', 'YTA': 'L', 'TWG': 'L', 'TCB': 'S', 'TCK': 'S', 'TCC': 'S', 'TCG': 'S', 'TCA': '*', 'TCY': 'S', 'TCS': 'S', 'TCT': 'S', 'TRA': '*', 'TGC': 'C', 'TGG': 'W', 'TGA': '*', 'TGY': 'C', 'TGT': 'C', 'TAC': 'Y', 'TAG': 'L', 'TAA': '*', 'TAY': 'Y', 'TAT': 'Y', 'TMA': '*', 'TVA': '*', 'TSA': '*', 'TTC': 'F', 'TTR': 'L', 'TTG': 'L', 'TTA': 'L', 'TTY': 'F', 'TTT': 'F'}}, '23': {'trans_table': {'CCB': 'P', 'CCD': 'P', 'CCH': 'P', 'CCK': 'P', 'CCN': 'P', 'CCW': 'P', 'CCC': 'P', 'CCR': 'P', 'CCG': 'P', 'CCA': 'P', 'CCM': 'P', 'CCV': 'P', 'CCY': 'P', 'CCS': 'P', 'CCT': 'P', 'CGB': 'R', 'CGD': 'R', 'CGH': 'R', 'CGK': 'R', 'CGN': 'R', 'CGW': 'R', 'CGC': 'R', 'CGR': 'R', 'CGG': 'R', 'CGA': 'R', 'CGM': 'R', 'CGV': 'R', 'CGY': 'R', 'CGS': 'R', 'CGT': 'R', 'CAC': 'H', 'CAR': 'Q', 'CAG': 'Q', 'CAA': 'Q', 'CAY': 'H', 'CAT': 'H', 'CTB': 'L', 'CTD': 'L', 'CTH': 'L', 'CTK': 'L', 'CTN': 'L', 'CTW': 'L', 'CTC': 'L', 'CTR': 'L', 'CTG': 'L', 'CTA': 'L', 'CTM': 'L', 'CTV': 'L', 'CTY': 'L', 'CTS': 'L', 'CTT': 'L', 'GCB': 'A', 'GCD': 'A', 'GCH': 'A', 'GCK': 'A', 'GCN': 'A', 'GCW': 'A', 'GCC': 'A', 'GCR': 'A', 'GCG': 'A', 'GCA': 'A', 'GCM': 'A', 'GCV': 'A', 'GCY': 'A', 'GCS': 'A', 'GCT': 'A', 'GGB': 'G', 'GGD': 'G', 'GGH': 'G', 'GGK': 'G', 'GGN': 'G', 'GGW': 'G', 'GGC': 'G', 'GGR': 'G', 'GGG': 'G', 'GGA': 'G', 'GGM': 'G', 'GGV': 'G', 'GGY': 'G', 'GGS': 'G', 'GGT': 'G', 'GAC': 'D', 'GAR': 'E', 'GAG': 'E', 'GAA': 'E', 'GAY': 'D', 'GAT': 'D', 'GTB': 'V', 'GTD': 'V', 'GTH': 'V', 'GTK': 'V', 'GTN': 'V', 'GTW': 'V', 'GTC': 'V', 'GTR': 'V', 'GTG': 'V', 'GTA': 'V', 'GTM': 'V', 'GTV': 'V', 'GTY': 'V', 'GTS': 'V', 'GTT': 'V', 'ACB': 'T', 'ACD': 'T', 'ACH': 'T', 'ACK': 'T', 'ACN': 'T', 'ACW': 'T', 'ACC': 'T', 'ACR': 'T', 'ACG': 'T', 'ACA': 'T', 'ACM': 'T', 'ACV': 'T', 'ACY': 'T', 'ACS': 'T', 'ACT': 'T', 'AGC': 'S', 'AGR': 'R', 'AGG': 'R', 'AGA': 'R', 'AGY': 'S', 'AGT': 'S', 'AAC': 'N', 'AAR': 'K', 'AAG': 'K', 'AAA': 'K', 'AAY': 'N', 'AAT': 'N', 'ATH': 'I', 'ATW': 'I', 'ATC': 'I', 'ATG': 'M', 'ATA': 'I', 'ATM': 'I', 'ATY': 'I', 'ATT': 'I', 'MGR': 'R', 'MGG': 'R', 'MGA': 'R', 'YTG': 'L', 'TDA': '*', 'TKA': '*', 'TWA': '*', 'TCB': 'S', 'TCD': 'S', 'TCH': 'S', 'TCK': 'S', 'TCN': 'S', 'TCW': 'S', 'TCC': 'S', 'TCR': 'S', 'TCG': 'S', 'TCA': 'S', 'TCM': 'S', 'TCV': 'S', 'TCY': 'S', 'TCS': 'S', 'TCT': 'S', 'TRA': '*', 'TGC': 'C', 'TGG': 'W', 'TGA': '*', 'TGY': 'C', 'TGT': 'C', 'TAC': 'Y', 'TAR': '*', 'TAG': '*', 'TAA': '*', 'TAY': 'Y', 'TAT': 'Y', 'TTC': 'F', 'TTG': 'L', 'TTA': '*', 'TTY': 'F', 'TTT': 'F'}, 'start_table': {'CCB': 'P', 'CCD': 'P', 'CCH': 'P', 'CCK': 'P', 'CCN': 'P', 'CCW': 'P', 'CCC': 'P', 'CCR': 'P', 'CCG': 'P', 'CCA': 'P', 'CCM': 'P', 'CCV': 'P', 'CCY': 'P', 'CCS': 'P', 'CCT': 'P', 'CGB': 'R', 'CGD': 'R', 'CGH': 'R', 'CGK': 'R', 'CGN': 'R', 'CGW': 'R', 'CGC': 'R', 'CGR': 'R', 'CGG': 'R', 'CGA': 'R', 'CGM': 'R', 'CGV': 'R', 'CGY': 'R', 'CGS': 'R', 'CGT': 'R', 'CAC': 'H', 'CAR': 'Q', 'CAG': 'Q', 'CAA': 'Q', 'CAY': 'H', 'CAT': 'H', 'CTB': 'L', 'CTD': 'L', 'CTH': 'L', 'CTK': 'L', 'CTN': 'L', 'CTW': 'L', 'CTC': 'L', 'CTR': 'L', 'CTG': 'L', 'CTA': 'L', 'CTM': 'L', 'CTV': 'L', 'CTY': 'L', 'CTS': 'L', 'CTT': 'L', 'RTG': 'M', 'GCB': 'A', 'GCD': 'A', 'GCH': 'A', 'GCK': 'A', 'GCN': 'A', 'GCW': 'A', 'GCC': 'A', 'GCR': 'A', 'GCG': 'A', 'GCA': 'A', 'GCM': 'A', 'GCV': 'A', 'GCY': 'A', 'GCS': 'A', 'GCT': 'A', 'GGB': 'G', 'GGD': 'G', 'GGH': 'G', 'GGK': 'G', 'GGN': 'G', 'GGW': 'G', 'GGC': 'G', 'GGR': 'G', 'GGG': 'G', 'GGA': 'G', 'GGM': 'G', 'GGV': 'G', 'GGY': 'G', 'GGS': 'G', 'GGT': 'G', 'GAC': 'D', 'GAR': 'E', 'GAG': 'E', 'GAA': 'E', 'GAY': 'D', 'GAT': 'D', 'GTH': 'V', 'GTW': 'V', 'GTC': 'V', 'GTG': 'M', 'GTA': 'V', 'GTM': 'V', 'GTY': 'V', 'GTT': 'V', 'ACB': 'T', 'ACD': 'T', 'ACH': 'T', 'ACK': 'T', 'ACN': 'T', 'ACW': 'T', 'ACC': 'T', 'ACR': 'T', 'ACG': 'T', 'ACA': 'T', 'ACM': 'T', 'ACV': 'T', 'ACY': 'T', 'ACS': 'T', 'ACT': 'T', 'AGC': 'S', 'AGR': 'R', 'AGG': 'R', 'AGA': 'R', 'AGY': 'S', 'AGT': 'S', 'AAC': 'N', 'AAR': 'K', 'AAG': 'K', 'AAA': 'K', 'AAY': 'N', 'AAT': 'N', 'ATK': 'M', 'ATC': 'I', 'ATG': 'M', 'ATA': 'I', 'ATM': 'I', 'ATT': 'M', 'MGR': 'R', 'MGG': 'R', 'MGA': 'R', 'YTG': 'L', 'TDA': '*', 'TKA': '*', 'TWA': '*', 'TCB': 'S', 'TCD': 'S', 'TCH': 'S', 'TCK': 'S', 'TCN': 'S', 'TCW': 'S', 'TCC': 'S', 'TCR': 'S', 'TCG': 'S', 'TCA': 'S', 'TCM': 'S', 'TCV': 'S', 'TCY': 'S', 'TCS': 'S', 'TCT': 'S', 'TRA': '*', 'TGC': 'C', 'TGG': 'W', 'TGA': '*', 'TGY': 'C', 'TGT': 'C', 'TAC': 'Y', 'TAR': '*', 'TAG': '*', 'TAA': '*', 'TAY': 'Y', 'TAT': 'Y', 'TTC': 'F', 'TTG': 'L', 'TTA': '*', 'TTY': 'F', 'TTT': 'F'}}, '24': {'trans_table': {'CCB': 'P', 'CCD': 'P', 'CCH': 'P', 'CCK': 'P', 'CCN': 'P', 'CCW': 'P', 'CCC': 'P', 'CCR': 'P', 'CCG': 'P', 'CCA': 'P', 'CCM': 'P', 'CCV': 'P', 'CCY': 'P', 'CCS': 'P', 'CCT': 'P', 'CGB': 'R', 'CGD': 'R', 'CGH': 'R', 'CGK': 'R', 'CGN': 'R', 'CGW': 'R', 'CGC': 'R', 'CGR': 'R', 'CGG': 'R', 'CGA': 'R', 'CGM': 'R', 'CGV': 'R', 'CGY': 'R', 'CGS': 'R', 'CGT': 'R', 'CAC': 'H', 'CAR': 'Q', 'CAG': 'Q', 'CAA': 'Q', 'CAY': 'H', 'CAT': 'H', 'CTB': 'L', 'CTD': 'L', 'CTH': 'L', 'CTK': 'L', 'CTN': 'L', 'CTW': 'L', 'CTC': 'L', 'CTR': 'L', 'CTG': 'L', 'CTA': 'L', 'CTM': 'L', 'CTV': 'L', 'CTY': 'L', 'CTS': 'L', 'CTT': 'L', 'GCB': 'A', 'GCD': 'A', 'GCH': 'A', 'GCK': 'A', 'GCN': 'A', 'GCW': 'A', 'GCC': 'A', 'GCR': 'A', 'GCG': 'A', 'GCA': 'A', 'GCM': 'A', 'GCV': 'A', 'GCY': 'A', 'GCS': 'A', 'GCT': 'A', 'GGB': 'G', 'GGD': 'G', 'GGH': 'G', 'GGK': 'G', 'GGN': 'G', 'GGW': 'G', 'GGC': 'G', 'GGR': 'G', 'GGG': 'G', 'GGA': 'G', 'GGM': 'G', 'GGV': 'G', 'GGY': 'G', 'GGS': 'G', 'GGT': 'G', 'GAC': 'D', 'GAR': 'E', 'GAG': 'E', 'GAA': 'E', 'GAY': 'D', 'GAT': 'D', 'GTB': 'V', 'GTD': 'V', 'GTH': 'V', 'GTK': 'V', 'GTN': 'V', 'GTW': 'V', 'GTC': 'V', 'GTR': 'V', 'GTG': 'V', 'GTA': 'V', 'GTM': 'V', 'GTV': 'V', 'GTY': 'V', 'GTS': 'V', 'GTT': 'V', 'ACB': 'T', 'ACD': 'T', 'ACH': 'T', 'ACK': 'T', 'ACN': 'T', 'ACW': 'T', 'ACC': 'T', 'ACR': 'T', 'ACG': 'T', 'ACA': 'T', 'ACM': 'T', 'ACV': 'T', 'ACY': 'T', 'ACS': 'T', 'ACT': 'T', 'ARG': 'K', 'AGH': 'S', 'AGW': 'S', 'AGC': 'S', 'AGG': 'K', 'AGA': 'S', 'AGM': 'S', 'AGY': 'S', 'AGT': 'S', 'AAC': 'N', 'AAR': 'K', 'AAG': 'K', 'AAA': 'K', 'AAY': 'N', 'AAT': 'N', 'ATH': 'I', 'ATW': 'I', 'ATC': 'I', 'ATG': 'M', 'ATA': 'I', 'ATM': 'I', 'ATY': 'I', 'ATT': 'I', 'YTR': 'L', 'YTG': 'L', 'YTA': 'L', 'TCB': 'S', 'TCD': 'S', 'TCH': 'S', 'TCK': 'S', 'TCN': 'S', 'TCW': 'S', 'TCC': 'S', 'TCR': 'S', 'TCG': 'S', 'TCA': 'S', 'TCM': 'S', 'TCV': 'S', 'TCY': 'S', 'TCS': 'S', 'TCT': 'S', 'TGC': 'C', 'TGR': 'W', 'TGG': 'W', 'TGA': 'W', 'TGY': 'C', 'TGT': 'C', 'TAC': 'Y', 'TAR': '*', 'TAG': '*', 'TAA': '*', 'TAY': 'Y', 'TAT': 'Y', 'TTC': 'F', 'TTR': 'L', 'TTG': 'L', 'TTA': 'L', 'TTY': 'F', 'TTT': 'F'}, 'start_table': {'BTG': 'M', 'DTG': 'M', 'HTG': 'M', 'KTG': 'M', 'NTG': 'M', 'WTG': 'M', 'CCB': 'P', 'CCD': 'P', 'CCH': 'P', 'CCK': 'P', 'CCN': 'P', 'CCW': 'P', 'CCC': 'P', 'CCR': 'P', 'CCG': 'P', 'CCA': 'P', 'CCM': 'P', 'CCV': 'P', 'CCY': 'P', 'CCS': 'P', 'CCT': 'P', 'CGB': 'R', 'CGD': 'R', 'CGH': 'R', 'CGK': 'R', 'CGN': 'R', 'CGW': 'R', 'CGC': 'R', 'CGR': 'R', 'CGG': 'R', 'CGA': 'R', 'CGM': 'R', 'CGV': 'R', 'CGY': 'R', 'CGS': 'R', 'CGT': 'R', 'CAC': 'H', 'CAR': 'Q', 'CAG': 'Q', 'CAA': 'Q', 'CAY': 'H', 'CAT': 'H', 'CTH': 'L', 'CTW': 'L', 'CTC': 'L', 'CTG': 'M', 'CTA': 'L', 'CTM': 'L', 'CTY': 'L', 'CTT': 'L', 'RTG': 'M', 'GCB': 'A', 'GCD': 'A', 'GCH': 'A', 'GCK': 'A', 'GCN': 'A', 'GCW': 'A', 'GCC': 'A', 'GCR': 'A', 'GCG': 'A', 'GCA': 'A', 'GCM': 'A', 'GCV': 'A', 'GCY': 'A', 'GCS': 'A', 'GCT': 'A', 'GGB': 'G', 'GGD': 'G', 'GGH': 'G', 'GGK': 'G', 'GGN': 'G', 'GGW': 'G', 'GGC': 'G', 'GGR': 'G', 'GGG': 'G', 'GGA': 'G', 'GGM': 'G', 'GGV': 'G', 'GGY': 'G', 'GGS': 'G', 'GGT': 'G', 'GAC': 'D', 'GAR': 'E', 'GAG': 'E', 'GAA': 'E', 'GAY': 'D', 'GAT': 'D', 'GTH': 'V', 'GTW': 'V', 'GTC': 'V', 'GTG': 'M', 'GTA': 'V', 'GTM': 'V', 'GTY': 'V', 'GTT': 'V', 'ACB': 'T', 'ACD': 'T', 'ACH': 'T', 'ACK': 'T', 'ACN': 'T', 'ACW': 'T', 'ACC': 'T', 'ACR': 'T', 'ACG': 'T', 'ACA': 'T', 'ACM': 'T', 'ACV': 'T', 'ACY': 'T', 'ACS': 'T', 'ACT': 'T', 'ARG': 'K', 'AGH': 'S', 'AGW': 'S', 'AGC': 'S', 'AGG': 'K', 'AGA': 'S', 'AGM': 'S', 'AGY': 'S', 'AGT': 'S', 'AAC': 'N', 'AAR': 'K', 'AAG': 'K', 'AAA': 'K', 'AAY': 'N', 'AAT': 'N', 'ATH': 'I', 'ATW': 'I', 'ATC': 'I', 'ATG': 'M', 'ATA': 'I', 'ATM': 'I', 'ATY': 'I', 'ATT': 'I', 'MTG': 'M', 'VTG': 'M', 'YTG': 'M', 'YTA': 'L', 'STG': 'M', 'TCB': 'S', 'TCD': 'S', 'TCH': 'S', 'TCK': 'S', 'TCN': 'S', 'TCW': 'S', 'TCC': 'S', 'TCR': 'S', 'TCG': 'S', 'TCA': 'S', 'TCM': 'S', 'TCV': 'S', 'TCY': 'S', 'TCS': 'S', 'TCT': 'S', 'TGC': 'C', 'TGR': 'W', 'TGG': 'W', 'TGA': 'W', 'TGY': 'C', 'TGT': 'C', 'TAC': 'Y', 'TAR': '*', 'TAG': '*', 'TAA': '*', 'TAY': 'Y', 'TAT': 'Y', 'TTC': 'F', 'TTG': 'M', 'TTA': 'L', 'TTY': 'F', 'TTT': 'F'}}, '25': {'trans_table': {'KGA': 'G', 'CCB': 'P', 'CCD': 'P', 'CCH': 'P', 'CCK': 'P', 'CCN': 'P', 'CCW': 'P', 'CCC': 'P', 'CCR': 'P', 'CCG': 'P', 'CCA': 'P', 'CCM': 'P', 'CCV': 'P', 'CCY': 'P', 'CCS': 'P', 'CCT': 'P', 'CGB': 'R', 'CGD': 'R', 'CGH': 'R', 'CGK': 'R', 'CGN': 'R', 'CGW': 'R', 'CGC': 'R', 'CGR': 'R', 'CGG': 'R', 'CGA': 'R', 'CGM': 'R', 'CGV': 'R', 'CGY': 'R', 'CGS': 'R', 'CGT': 'R', 'CAC': 'H', 'CAR': 'Q', 'CAG': 'Q', 'CAA': 'Q', 'CAY': 'H', 'CAT': 'H', 'CTB': 'L', 'CTD': 'L', 'CTH': 'L', 'CTK': 'L', 'CTN': 'L', 'CTW': 'L', 'CTC': 'L', 'CTR': 'L', 'CTG': 'L', 'CTA': 'L', 'CTM': 'L', 'CTV': 'L', 'CTY': 'L', 'CTS': 'L', 'CTT': 'L', 'GCB': 'A', 'GCD': 'A', 'GCH': 'A', 'GCK': 'A', 'GCN': 'A', 'GCW': 'A', 'GCC': 'A', 'GCR': 'A', 'GCG': 'A', 'GCA': 'A', 'GCM': 'A', 'GCV': 'A', 'GCY': 'A', 'GCS': 'A', 'GCT': 'A', 'GGB': 'G', 'GGD': 'G', 'GGH': 'G', 'GGK': 'G', 'GGN': 'G', 'GGW': 'G', 'GGC': 'G', 'GGR': 'G', 'GGG': 'G', 'GGA': 'G', 'GGM': 'G', 'GGV': 'G', 'GGY': 'G', 'GGS': 'G', 'GGT': 'G', 'GAC': 'D', 'GAR': 'E', 'GAG': 'E', 'GAA': 'E', 'GAY': 'D', 'GAT': 'D', 'GTB': 'V', 'GTD': 'V', 'GTH': 'V', 'GTK': 'V', 'GTN': 'V', 'GTW': 'V', 'GTC': 'V', 'GTR': 'V', 'GTG': 'V', 'GTA': 'V', 'GTM': 'V', 'GTV': 'V', 'GTY': 'V', 'GTS': 'V', 'GTT': 'V', 'ACB': 'T', 'ACD': 'T', 'ACH': 'T', 'ACK': 'T', 'ACN': 'T', 'ACW': 'T', 'ACC': 'T', 'ACR': 'T', 'ACG': 'T', 'ACA': 'T', 'ACM': 'T', 'ACV': 'T', 'ACY': 'T', 'ACS': 'T', 'ACT': 'T', 'AGC': 'S', 'AGR': 'R', 'AGG': 'R', 'AGA': 'R', 'AGY': 'S', 'AGT': 'S', 'AAC': 'N', 'AAR': 'K', 'AAG': 'K', 'AAA': 'K', 'AAY': 'N', 'AAT': 'N', 'ATH': 'I', 'ATW': 'I', 'ATC': 'I', 'ATG': 'M', 'ATA': 'I', 'ATM': 'I', 'ATY': 'I', 'ATT': 'I', 'MGR': 'R', 'MGG': 'R', 'MGA': 'R', 'YTR': 'L', 'YTG': 'L', 'YTA': 'L', 'TCB': 'S', 'TCD': 'S', 'TCH': 'S', 'TCK': 'S', 'TCN': 'S', 'TCW': 'S', 'TCC': 'S', 'TCR': 'S', 'TCG': 'S', 'TCA': 'S', 'TCM': 'S', 'TCV': 'S', 'TCY': 'S', 'TCS': 'S', 'TCT': 'S', 'TGC': 'C', 'TGG': 'W', 'TGA': 'G', 'TGY': 'C', 'TGT': 'C', 'TAC': 'Y', 'TAR': '*', 'TAG': '*', 'TAA': '*', 'TAY': 'Y', 'TAT': 'Y', 'TTC': 'F', 'TTR': 'L', 'TTG': 'L', 'TTA': 'L', 'TTY': 'F', 'TTT': 'F'}, 'start_table': {'DTG': 'M', 'KGA': 'G', 'KTG': 'M', 'WTG': 'M', 'CCB': 'P', 'CCD': 'P', 'CCH': 'P', 'CCK': 'P', 'CCN': 'P', 'CCW': 'P', 'CCC': 'P', 'CCR': 'P', 'CCG': 'P', 'CCA': 'P', 'CCM': 'P', 'CCV': 'P', 'CCY': 'P', 'CCS': 'P', 'CCT': 'P', 'CGB': 'R', 'CGD': 'R', 'CGH': 'R', 'CGK': 'R', 'CGN': 'R', 'CGW': 'R', 'CGC': 'R', 'CGR': 'R', 'CGG': 'R', 'CGA': 'R', 'CGM': 'R', 'CGV': 'R', 'CGY': 'R', 'CGS': 'R', 'CGT': 'R', 'CAC': 'H', 'CAR': 'Q', 'CAG': 'Q', 'CAA': 'Q', 'CAY': 'H', 'CAT': 'H', 'CTB': 'L', 'CTD': 'L', 'CTH': 'L', 'CTK': 'L', 'CTN': 'L', 'CTW': 'L', 'CTC': 'L', 'CTR': 'L', 'CTG': 'L', 'CTA': 'L', 'CTM': 'L', 'CTV': 'L', 'CTY': 'L', 'CTS': 'L', 'CTT': 'L', 'RTG': 'M', 'GCB': 'A', 'GCD': 'A', 'GCH': 'A', 'GCK': 'A', 'GCN': 'A', 'GCW': 'A', 'GCC': 'A', 'GCR': 'A', 'GCG': 'A', 'GCA': 'A', 'GCM': 'A', 'GCV': 'A', 'GCY': 'A', 'GCS': 'A', 'GCT': 'A', 'GGB': 'G', 'GGD': 'G', 'GGH': 'G', 'GGK': 'G', 'GGN': 'G', 'GGW': 'G', 'GGC': 'G', 'GGR': 'G', 'GGG': 'G', 'GGA': 'G', 'GGM': 'G', 'GGV': 'G', 'GGY': 'G', 'GGS': 'G', 'GGT': 'G', 'GAC': 'D', 'GAR': 'E', 'GAG': 'E', 'GAA': 'E', 'GAY': 'D', 'GAT': 'D', 'GTH': 'V', 'GTW': 'V', 'GTC': 'V', 'GTG': 'M', 'GTA': 'V', 'GTM': 'V', 'GTY': 'V', 'GTT': 'V', 'ACB': 'T', 'ACD': 'T', 'ACH': 'T', 'ACK': 'T', 'ACN': 'T', 'ACW': 'T', 'ACC': 'T', 'ACR': 'T', 'ACG': 'T', 'ACA': 'T', 'ACM': 'T', 'ACV': 'T', 'ACY': 'T', 'ACS': 'T', 'ACT': 'T', 'AGC': 'S', 'AGR': 'R', 'AGG': 'R', 'AGA': 'R', 'AGY': 'S', 'AGT': 'S', 'AAC': 'N', 'AAR': 'K', 'AAG': 'K', 'AAA': 'K', 'AAY': 'N', 'AAT': 'N', 'ATH': 'I', 'ATW': 'I', 'ATC': 'I', 'ATG': 'M', 'ATA': 'I', 'ATM': 'I', 'ATY': 'I', 'ATT': 'I', 'MGR': 'R', 'MGG': 'R', 'MGA': 'R', 'YTA': 'L', 'TCB': 'S', 'TCD': 'S', 'TCH': 'S', 'TCK': 'S', 'TCN': 'S', 'TCW': 'S', 'TCC': 'S', 'TCR': 'S', 'TCG': 'S', 'TCA': 'S', 'TCM': 'S', 'TCV': 'S', 'TCY': 'S', 'TCS': 'S', 'TCT': 'S', 'TGC': 'C', 'TGG': 'W', 'TGA': 'G', 'TGY': 'C', 'TGT': 'C', 'TAC': 'Y', 'TAR': '*', 'TAG': '*', 'TAA': '*', 'TAY': 'Y', 'TAT': 'Y', 'TTC': 'F', 'TTG': 'M', 'TTA': 'L', 'TTY': 'F', 'TTT': 'F'}}, '26': {'trans_table': {'CCB': 'P', 'CCD': 'P', 'CCH': 'P', 'CCK': 'P', 'CCN': 'P', 'CCW': 'P', 'CCC': 'P', 'CCR': 'P', 'CCG': 'P', 'CCA': 'P', 'CCM': 'P', 'CCV': 'P', 'CCY': 'P', 'CCS': 'P', 'CCT': 'P', 'CGB': 'R', 'CGD': 'R', 'CGH': 'R', 'CGK': 'R', 'CGN': 'R', 'CGW': 'R', 'CGC': 'R', 'CGR': 'R', 'CGG': 'R', 'CGA': 'R', 'CGM': 'R', 'CGV': 'R', 'CGY': 'R', 'CGS': 'R', 'CGT': 'R', 'CAC': 'H', 'CAR': 'Q', 'CAG': 'Q', 'CAA': 'Q', 'CAY': 'H', 'CAT': 'H', 'CTH': 'L', 'CTW': 'L', 'CTC': 'L', 'CTG': 'A', 'CTA': 'L', 'CTM': 'L', 'CTY': 'L', 'CTT': 'L', 'GCB': 'A', 'GCD': 'A', 'GCH': 'A', 'GCK': 'A', 'GCN': 'A', 'GCW': 'A', 'GCC': 'A', 'GCR': 'A', 'GCG': 'A', 'GCA': 'A', 'GCM': 'A', 'GCV': 'A', 'GCY': 'A', 'GCS': 'A', 'GCT': 'A', 'GGB': 'G', 'GGD': 'G', 'GGH': 'G', 'GGK': 'G', 'GGN': 'G', 'GGW': 'G', 'GGC': 'G', 'GGR': 'G', 'GGG': 'G', 'GGA': 'G', 'GGM': 'G', 'GGV': 'G', 'GGY': 'G', 'GGS': 'G', 'GGT': 'G', 'GAC': 'D', 'GAR': 'E', 'GAG': 'E', 'GAA': 'E', 'GAY': 'D', 'GAT': 'D', 'GTB': 'V', 'GTD': 'V', 'GTH': 'V', 'GTK': 'V', 'GTN': 'V', 'GTW': 'V', 'GTC': 'V', 'GTR': 'V', 'GTG': 'V', 'GTA': 'V', 'GTM': 'V', 'GTV': 'V', 'GTY': 'V', 'GTS': 'V', 'GTT': 'V', 'ACB': 'T', 'ACD': 'T', 'ACH': 'T', 'ACK': 'T', 'ACN': 'T', 'ACW': 'T', 'ACC': 'T', 'ACR': 'T', 'ACG': 'T', 'ACA': 'T', 'ACM': 'T', 'ACV': 'T', 'ACY': 'T', 'ACS': 'T', 'ACT': 'T', 'AGC': 'S', 'AGR': 'R', 'AGG': 'R', 'AGA': 'R', 'AGY': 'S', 'AGT': 'S', 'AAC': 'N', 'AAR': 'K', 'AAG': 'K', 'AAA': 'K', 'AAY': 'N', 'AAT': 'N', 'ATH': 'I', 'ATW': 'I', 'ATC': 'I', 'ATG': 'M', 'ATA': 'I', 'ATM': 'I', 'ATY': 'I', 'ATT': 'I', 'MGR': 'R', 'MGG': 'R', 'MGA': 'R', 'YTA': 'L', 'TCB': 'S', 'TCD': 'S', 'TCH': 'S', 'TCK': 'S', 'TCN': 'S', 'TCW': 'S', 'TCC': 'S', 'TCR': 'S', 'TCG': 'S', 'TCA': 'S', 'TCM': 'S', 'TCV': 'S', 'TCY': 'S', 'TCS': 'S', 'TCT': 'S', 'TRA': '*', 'TGC': 'C', 'TGG': 'W', 'TGA': '*', 'TGY': 'C', 'TGT': 'C', 'TAC': 'Y', 'TAR': '*', 'TAG': '*', 'TAA': '*', 'TAY': 'Y', 'TAT': 'Y', 'TTC': 'F', 'TTR': 'L', 'TTG': 'L', 'TTA': 'L', 'TTY': 'F', 'TTT': 'F'}, 'start_table': {'CCB': 'P', 'CCD': 'P', 'CCH': 'P', 'CCK': 'P', 'CCN': 'P', 'CCW': 'P', 'CCC': 'P', 'CCR': 'P', 'CCG': 'P', 'CCA': 'P', 'CCM': 'P', 'CCV': 'P', 'CCY': 'P', 'CCS': 'P', 'CCT': 'P', 'CGB': 'R', 'CGD': 'R', 'CGH': 'R', 'CGK': 'R', 'CGN': 'R', 'CGW': 'R', 'CGC': 'R', 'CGR': 'R', 'CGG': 'R', 'CGA': 'R', 'CGM': 'R', 'CGV': 'R', 'CGY': 'R', 'CGS': 'R', 'CGT': 'R', 'CAC': 'H', 'CAR': 'Q', 'CAG': 'Q', 'CAA': 'Q', 'CAY': 'H', 'CAT': 'H', 'CTH': 'L', 'CTW': 'L', 'CTC': 'L', 'CTG': 'M', 'CTA': 'L', 'CTM': 'L', 'CTY': 'L', 'CTT': 'L', 'GCB': 'A', 'GCD': 'A', 'GCH': 'A', 'GCK': 'A', 'GCN': 'A', 'GCW': 'A', 'GCC': 'A', 'GCR': 'A', 'GCG': 'A', 'GCA': 'A', 'GCM': 'A', 'GCV': 'A', 'GCY': 'A', 'GCS': 'A', 'GCT': 'A', 'GGB': 'G', 'GGD': 'G', 'GGH': 'G', 'GGK': 'G', 'GGN': 'G', 'GGW': 'G', 'GGC': 'G', 'GGR': 'G', 'GGG': 'G', 'GGA': 'G', 'GGM': 'G', 'GGV': 'G', 'GGY': 'G', 'GGS': 'G', 'GGT': 'G', 'GAC': 'D', 'GAR': 'E', 'GAG': 'E', 'GAA': 'E', 'GAY': 'D', 'GAT': 'D', 'GTB': 'V', 'GTD': 'V', 'GTH': 'V', 'GTK': 'V', 'GTN': 'V', 'GTW': 'V', 'GTC': 'V', 'GTR': 'V', 'GTG': 'V', 'GTA': 'V', 'GTM': 'V', 'GTV': 'V', 'GTY': 'V', 'GTS': 'V', 'GTT': 'V', 'ACB': 'T', 'ACD': 'T', 'ACH': 'T', 'ACK': 'T', 'ACN': 'T', 'ACW': 'T', 'ACC': 'T', 'ACR': 'T', 'ACG': 'T', 'ACA': 'T', 'ACM': 'T', 'ACV': 'T', 'ACY': 'T', 'ACS': 'T', 'ACT': 'T', 'AGC': 'S', 'AGR': 'R', 'AGG': 'R', 'AGA': 'R', 'AGY': 'S', 'AGT': 'S', 'AAC': 'N', 'AAR': 'K', 'AAG': 'K', 'AAA': 'K', 'AAY': 'N', 'AAT': 'N', 'ATH': 'I', 'ATW': 'I', 'ATC': 'I', 'ATG': 'M', 'ATA': 'I', 'ATM': 'I', 'ATY': 'I', 'ATT': 'I', 'MGR': 'R', 'MGG': 'R', 'MGA': 'R', 'MTG': 'M', 'YTA': 'L', 'TCB': 'S', 'TCD': 'S', 'TCH': 'S', 'TCK': 'S', 'TCN': 'S', 'TCW': 'S', 'TCC': 'S', 'TCR': 'S', 'TCG': 'S', 'TCA': 'S', 'TCM': 'S', 'TCV': 'S', 'TCY': 'S', 'TCS': 'S', 'TCT': 'S', 'TRA': '*', 'TGC': 'C', 'TGG': 'W', 'TGA': '*', 'TGY': 'C', 'TGT': 'C', 'TAC': 'Y', 'TAR': '*', 'TAG': '*', 'TAA': '*', 'TAY': 'Y', 'TAT': 'Y', 'TTC': 'F', 'TTR': 'L', 'TTG': 'L', 'TTA': 'L', 'TTY': 'F', 'TTT': 'F'}}, '27': {'trans_table': {'CCB': 'P', 'CCD': 'P', 'CCH': 'P', 'CCK': 'P', 'CCN': 'P', 'CCW': 'P', 'CCC': 'P', 'CCR': 'P', 'CCG': 'P', 'CCA': 'P', 'CCM': 'P', 'CCV': 'P', 'CCY': 'P', 'CCS': 'P', 'CCT': 'P', 'CGB': 'R', 'CGD': 'R', 'CGH': 'R', 'CGK': 'R', 'CGN': 'R', 'CGW': 'R', 'CGC': 'R', 'CGR': 'R', 'CGG': 'R', 'CGA': 'R', 'CGM': 'R', 'CGV': 'R', 'CGY': 'R', 'CGS': 'R', 'CGT': 'R', 'CAC': 'H', 'CAR': 'Q', 'CAG': 'Q', 'CAA': 'Q', 'CAY': 'H', 'CAT': 'H', 'CTB': 'L', 'CTD': 'L', 'CTH': 'L', 'CTK': 'L', 'CTN': 'L', 'CTW': 'L', 'CTC': 'L', 'CTR': 'L', 'CTG': 'L', 'CTA': 'L', 'CTM': 'L', 'CTV': 'L', 'CTY': 'L', 'CTS': 'L', 'CTT': 'L', 'GCB': 'A', 'GCD': 'A', 'GCH': 'A', 'GCK': 'A', 'GCN': 'A', 'GCW': 'A', 'GCC': 'A', 'GCR': 'A', 'GCG': 'A', 'GCA': 'A', 'GCM': 'A', 'GCV': 'A', 'GCY': 'A', 'GCS': 'A', 'GCT': 'A', 'GGB': 'G', 'GGD': 'G', 'GGH': 'G', 'GGK': 'G', 'GGN': 'G', 'GGW': 'G', 'GGC': 'G', 'GGR': 'G', 'GGG': 'G', 'GGA': 'G', 'GGM': 'G', 'GGV': 'G', 'GGY': 'G', 'GGS': 'G', 'GGT': 'G', 'GAC': 'D', 'GAR': 'E', 'GAG': 'E', 'GAA': 'E', 'GAY': 'D', 'GAT': 'D', 'GTB': 'V', 'GTD': 'V', 'GTH': 'V', 'GTK': 'V', 'GTN': 'V', 'GTW': 'V', 'GTC': 'V', 'GTR': 'V', 'GTG': 'V', 'GTA': 'V', 'GTM': 'V', 'GTV': 'V', 'GTY': 'V', 'GTS': 'V', 'GTT': 'V', 'ACB': 'T', 'ACD': 'T', 'ACH': 'T', 'ACK': 'T', 'ACN': 'T', 'ACW': 'T', 'ACC': 'T', 'ACR': 'T', 'ACG': 'T', 'ACA': 'T', 'ACM': 'T', 'ACV': 'T', 'ACY': 'T', 'ACS': 'T', 'ACT': 'T', 'AGC': 'S', 'AGR': 'R', 'AGG': 'R', 'AGA': 'R', 'AGY': 'S', 'AGT': 'S', 'AAC': 'N', 'AAR': 'K', 'AAG': 'K', 'AAA': 'K', 'AAY': 'N', 'AAT': 'N', 'ATH': 'I', 'ATW': 'I', 'ATC': 'I', 'ATG': 'M', 'ATA': 'I', 'ATM': 'I', 'ATY': 'I', 'ATT': 'I', 'MGR': 'R', 'MGG': 'R', 'MGA': 'R', 'YAR': 'Q', 'YAG': 'Q', 'YAA': 'Q', 'YTR': 'L', 'YTG': 'L', 'YTA': 'L', 'TCB': 'S', 'TCD': 'S', 'TCH': 'S', 'TCK': 'S', 'TCN': 'S', 'TCW': 'S', 'TCC': 'S', 'TCR': 'S', 'TCG': 'S', 'TCA': 'S', 'TCM': 'S', 'TCV': 'S', 'TCY': 'S', 'TCS': 'S', 'TCT': 'S', 'TGC': 'C', 'TGR': 'W', 'TGG': 'W', 'TGA': 'W', 'TGY': 'C', 'TGT': 'C', 'TAC': 'Y', 'TAR': 'Q', 'TAG': 'Q', 'TAA': 'Q', 'TAY': 'Y', 'TAT': 'Y', 'TTC': 'F', 'TTR': 'L', 'TTG': 'L', 'TTA': 'L', 'TTY': 'F', 'TTT': 'F'}, 'start_table': {'CCB': 'P', 'CCD': 'P', 'CCH': 'P', 'CCK': 'P', 'CCN': 'P', 'CCW': 'P', 'CCC': 'P', 'CCR': 'P', 'CCG': 'P', 'CCA': 'P', 'CCM': 'P', 'CCV': 'P', 'CCY': 'P', 'CCS': 'P', 'CCT': 'P', 'CGB': 'R', 'CGD': 'R', 'CGH': 'R', 'CGK': 'R', 'CGN': 'R', 'CGW': 'R', 'CGC': 'R', 'CGR': 'R', 'CGG': 'R', 'CGA': 'R', 'CGM': 'R', 'CGV': 'R', 'CGY': 'R', 'CGS': 'R', 'CGT': 'R', 'CAC': 'H', 'CAR': 'Q', 'CAG': 'Q', 'CAA': 'Q', 'CAY': 'H', 'CAT': 'H', 'CTB': 'L', 'CTD': 'L', 'CTH': 'L', 'CTK': 'L', 'CTN': 'L', 'CTW': 'L', 'CTC': 'L', 'CTR': 'L', 'CTG': 'L', 'CTA': 'L', 'CTM': 'L', 'CTV': 'L', 'CTY': 'L', 'CTS': 'L', 'CTT': 'L', 'GCB': 'A', 'GCD': 'A', 'GCH': 'A', 'GCK': 'A', 'GCN': 'A', 'GCW': 'A', 'GCC': 'A', 'GCR': 'A', 'GCG': 'A', 'GCA': 'A', 'GCM': 'A', 'GCV': 'A', 'GCY': 'A', 'GCS': 'A', 'GCT': 'A', 'GGB': 'G', 'GGD': 'G', 'GGH': 'G', 'GGK': 'G', 'GGN': 'G', 'GGW': 'G', 'GGC': 'G', 'GGR': 'G', 'GGG': 'G', 'GGA': 'G', 'GGM': 'G', 'GGV': 'G', 'GGY': 'G', 'GGS': 'G', 'GGT': 'G', 'GAC': 'D', 'GAR': 'E', 'GAG': 'E', 'GAA': 'E', 'GAY': 'D', 'GAT': 'D', 'GTB': 'V', 'GTD': 'V', 'GTH': 'V', 'GTK': 'V', 'GTN': 'V', 'GTW': 'V', 'GTC': 'V', 'GTR': 'V', 'GTG': 'V', 'GTA': 'V', 'GTM': 'V', 'GTV': 'V', 'GTY': 'V', 'GTS': 'V', 'GTT': 'V', 'ACB': 'T', 'ACD': 'T', 'ACH': 'T', 'ACK': 'T', 'ACN': 'T', 'ACW': 'T', 'ACC': 'T', 'ACR': 'T', 'ACG': 'T', 'ACA': 'T', 'ACM': 'T', 'ACV': 'T', 'ACY': 'T', 'ACS': 'T', 'ACT': 'T', 'AGC': 'S', 'AGR': 'R', 'AGG': 'R', 'AGA': 'R', 'AGY': 'S', 'AGT': 'S', 'AAC': 'N', 'AAR': 'K', 'AAG': 'K', 'AAA': 'K', 'AAY': 'N', 'AAT': 'N', 'ATH': 'I', 'ATW': 'I', 'ATC': 'I', 'ATG': 'M', 'ATA': 'I', 'ATM': 'I', 'ATY': 'I', 'ATT': 'I', 'MGR': 'R', 'MGG': 'R', 'MGA': 'R', 'YAR': 'Q', 'YAG': 'Q', 'YAA': 'Q', 'YTR': 'L', 'YTG': 'L', 'YTA': 'L', 'TCB': 'S', 'TCD': 'S', 'TCH': 'S', 'TCK': 'S', 'TCN': 'S', 'TCW': 'S', 'TCC': 'S', 'TCR': 'S', 'TCG': 'S', 'TCA': 'S', 'TCM': 'S', 'TCV': 'S', 'TCY': 'S', 'TCS': 'S', 'TCT': 'S', 'TGC': 'C', 'TGG': 'W', 'TGA': '*', 'TGY': 'C', 'TGT': 'C', 'TAC': 'Y', 'TAR': 'Q', 'TAG': 'Q', 'TAA': 'Q', 'TAY': 'Y', 'TAT': 'Y', 'TTC': 'F', 'TTR': 'L', 'TTG': 'L', 'TTA': 'L', 'TTY': 'F', 'TTT': 'F'}}, '28': {'trans_table': {'CCB': 'P', 'CCD': 'P', 'CCH': 'P', 'CCK': 'P', 'CCN': 'P', 'CCW': 'P', 'CCC': 'P', 'CCR': 'P', 'CCG': 'P', 'CCA': 'P', 'CCM': 'P', 'CCV': 'P', 'CCY': 'P', 'CCS': 'P', 'CCT': 'P', 'CGB': 'R', 'CGD': 'R', 'CGH': 'R', 'CGK': 'R', 'CGN': 'R', 'CGW': 'R', 'CGC': 'R', 'CGR': 'R', 'CGG': 'R', 'CGA': 'R', 'CGM': 'R', 'CGV': 'R', 'CGY': 'R', 'CGS': 'R', 'CGT': 'R', 'CAC': 'H', 'CAR': 'Q', 'CAG': 'Q', 'CAA': 'Q', 'CAY': 'H', 'CAT': 'H', 'CTB': 'L', 'CTD': 'L', 'CTH': 'L', 'CTK': 'L', 'CTN': 'L', 'CTW': 'L', 'CTC': 'L', 'CTR': 'L', 'CTG': 'L', 'CTA': 'L', 'CTM': 'L', 'CTV': 'L', 'CTY': 'L', 'CTS': 'L', 'CTT': 'L', 'GCB': 'A', 'GCD': 'A', 'GCH': 'A', 'GCK': 'A', 'GCN': 'A', 'GCW': 'A', 'GCC': 'A', 'GCR': 'A', 'GCG': 'A', 'GCA': 'A', 'GCM': 'A', 'GCV': 'A', 'GCY': 'A', 'GCS': 'A', 'GCT': 'A', 'GGB': 'G', 'GGD': 'G', 'GGH': 'G', 'GGK': 'G', 'GGN': 'G', 'GGW': 'G', 'GGC': 'G', 'GGR': 'G', 'GGG': 'G', 'GGA': 'G', 'GGM': 'G', 'GGV': 'G', 'GGY': 'G', 'GGS': 'G', 'GGT': 'G', 'GAC': 'D', 'GAR': 'E', 'GAG': 'E', 'GAA': 'E', 'GAY': 'D', 'GAT': 'D', 'GTB': 'V', 'GTD': 'V', 'GTH': 'V', 'GTK': 'V', 'GTN': 'V', 'GTW': 'V', 'GTC': 'V', 'GTR': 'V', 'GTG': 'V', 'GTA': 'V', 'GTM': 'V', 'GTV': 'V', 'GTY': 'V', 'GTS': 'V', 'GTT': 'V', 'ACB': 'T', 'ACD': 'T', 'ACH': 'T', 'ACK': 'T', 'ACN': 'T', 'ACW': 'T', 'ACC': 'T', 'ACR': 'T', 'ACG': 'T', 'ACA': 'T', 'ACM': 'T', 'ACV': 'T', 'ACY': 'T', 'ACS': 'T', 'ACT': 'T', 'AGC': 'S', 'AGR': 'R', 'AGG': 'R', 'AGA': 'R', 'AGY': 'S', 'AGT': 'S', 'AAC': 'N', 'AAR': 'K', 'AAG': 'K', 'AAA': 'K', 'AAY': 'N', 'AAT': 'N', 'ATH': 'I', 'ATW': 'I', 'ATC': 'I', 'ATG': 'M', 'ATA': 'I', 'ATM': 'I', 'ATY': 'I', 'ATT': 'I', 'MGR': 'R', 'MGG': 'R', 'MGA': 'R', 'YAR': 'Q', 'YAG': 'Q', 'YAA': 'Q', 'YTR': 'L', 'YTG': 'L', 'YTA': 'L', 'TCB': 'S', 'TCD': 'S', 'TCH': 'S', 'TCK': 'S', 'TCN': 'S', 'TCW': 'S', 'TCC': 'S', 'TCR': 'S', 'TCG': 'S', 'TCA': 'S', 'TCM': 'S', 'TCV': 'S', 'TCY': 'S', 'TCS': 'S', 'TCT': 'S', 'TGC': 'C', 'TGR': 'W', 'TGG': 'W', 'TGA': 'W', 'TGY': 'C', 'TGT': 'C', 'TAC': 'Y', 'TAR': 'Q', 'TAG': 'Q', 'TAA': 'Q', 'TAY': 'Y', 'TAT': 'Y', 'TTC': 'F', 'TTR': 'L', 'TTG': 'L', 'TTA': 'L', 'TTY': 'F', 'TTT': 'F'}, 'start_table': {'CCB': 'P', 'CCD': 'P', 'CCH': 'P', 'CCK': 'P', 'CCN': 'P', 'CCW': 'P', 'CCC': 'P', 'CCR': 'P', 'CCG': 'P', 'CCA': 'P', 'CCM': 'P', 'CCV': 'P', 'CCY': 'P', 'CCS': 'P', 'CCT': 'P', 'CGB': 'R', 'CGD': 'R', 'CGH': 'R', 'CGK': 'R', 'CGN': 'R', 'CGW': 'R', 'CGC': 'R', 'CGR': 'R', 'CGG': 'R', 'CGA': 'R', 'CGM': 'R', 'CGV': 'R', 'CGY': 'R', 'CGS': 'R', 'CGT': 'R', 'CAC': 'H', 'CAR': 'Q', 'CAG': 'Q', 'CAA': 'Q', 'CAY': 'H', 'CAT': 'H', 'CTB': 'L', 'CTD': 'L', 'CTH': 'L', 'CTK': 'L', 'CTN': 'L', 'CTW': 'L', 'CTC': 'L', 'CTR': 'L', 'CTG': 'L', 'CTA': 'L', 'CTM': 'L', 'CTV': 'L', 'CTY': 'L', 'CTS': 'L', 'CTT': 'L', 'GCB': 'A', 'GCD': 'A', 'GCH': 'A', 'GCK': 'A', 'GCN': 'A', 'GCW': 'A', 'GCC': 'A', 'GCR': 'A', 'GCG': 'A', 'GCA': 'A', 'GCM': 'A', 'GCV': 'A', 'GCY': 'A', 'GCS': 'A', 'GCT': 'A', 'GGB': 'G', 'GGD': 'G', 'GGH': 'G', 'GGK': 'G', 'GGN': 'G', 'GGW': 'G', 'GGC': 'G', 'GGR': 'G', 'GGG': 'G', 'GGA': 'G', 'GGM': 'G', 'GGV': 'G', 'GGY': 'G', 'GGS': 'G', 'GGT': 'G', 'GAC': 'D', 'GAR': 'E', 'GAG': 'E', 'GAA': 'E', 'GAY': 'D', 'GAT': 'D', 'GTB': 'V', 'GTD': 'V', 'GTH': 'V', 'GTK': 'V', 'GTN': 'V', 'GTW': 'V', 'GTC': 'V', 'GTR': 'V', 'GTG': 'V', 'GTA': 'V', 'GTM': 'V', 'GTV': 'V', 'GTY': 'V', 'GTS': 'V', 'GTT': 'V', 'ACB': 'T', 'ACD': 'T', 'ACH': 'T', 'ACK': 'T', 'ACN': 'T', 'ACW': 'T', 'ACC': 'T', 'ACR': 'T', 'ACG': 'T', 'ACA': 'T', 'ACM': 'T', 'ACV': 'T', 'ACY': 'T', 'ACS': 'T', 'ACT': 'T', 'AGC': 'S', 'AGR': 'R', 'AGG': 'R', 'AGA': 'R', 'AGY': 'S', 'AGT': 'S', 'AAC': 'N', 'AAR': 'K', 'AAG': 'K', 'AAA': 'K', 'AAY': 'N', 'AAT': 'N', 'ATH': 'I', 'ATW': 'I', 'ATC': 'I', 'ATG': 'M', 'ATA': 'I', 'ATM': 'I', 'ATY': 'I', 'ATT': 'I', 'MGR': 'R', 'MGG': 'R', 'MGA': 'R', 'YTR': 'L', 'YTG': 'L', 'YTA': 'L', 'TCB': 'S', 'TCD': 'S', 'TCH': 'S', 'TCK': 'S', 'TCN': 'S', 'TCW': 'S', 'TCC': 'S', 'TCR': 'S', 'TCG': 'S', 'TCA': 'S', 'TCM': 'S', 'TCV': 'S', 'TCY': 'S', 'TCS': 'S', 'TCT': 'S', 'TRA': '*', 'TGC': 'C', 'TGG': 'W', 'TGA': '*', 'TGY': 'C', 'TGT': 'C', 'TAC': 'Y', 'TAR': '*', 'TAG': '*', 'TAA': '*', 'TAY': 'Y', 'TAT': 'Y', 'TTC': 'F', 'TTR': 'L', 'TTG': 'L', 'TTA': 'L', 'TTY': 'F', 'TTT': 'F'}}, '29': {'trans_table': {'CCB': 'P', 'CCD': 'P', 'CCH': 'P', 'CCK': 'P', 'CCN': 'P', 'CCW': 'P', 'CCC': 'P', 'CCR': 'P', 'CCG': 'P', 'CCA': 'P', 'CCM': 'P', 'CCV': 'P', 'CCY': 'P', 'CCS': 'P', 'CCT': 'P', 'CGB': 'R', 'CGD': 'R', 'CGH': 'R', 'CGK': 'R', 'CGN': 'R', 'CGW': 'R', 'CGC': 'R', 'CGR': 'R', 'CGG': 'R', 'CGA': 'R', 'CGM': 'R', 'CGV': 'R', 'CGY': 'R', 'CGS': 'R', 'CGT': 'R', 'CAC': 'H', 'CAR': 'Q', 'CAG': 'Q', 'CAA': 'Q', 'CAY': 'H', 'CAT': 'H', 'CTB': 'L', 'CTD': 'L', 'CTH': 'L', 'CTK': 'L', 'CTN': 'L', 'CTW': 'L', 'CTC': 'L', 'CTR': 'L', 'CTG': 'L', 'CTA': 'L', 'CTM': 'L', 'CTV': 'L', 'CTY': 'L', 'CTS': 'L', 'CTT': 'L', 'GCB': 'A', 'GCD': 'A', 'GCH': 'A', 'GCK': 'A', 'GCN': 'A', 'GCW': 'A', 'GCC': 'A', 'GCR': 'A', 'GCG': 'A', 'GCA': 'A', 'GCM': 'A', 'GCV': 'A', 'GCY': 'A', 'GCS': 'A', 'GCT': 'A', 'GGB': 'G', 'GGD': 'G', 'GGH': 'G', 'GGK': 'G', 'GGN': 'G', 'GGW': 'G', 'GGC': 'G', 'GGR': 'G', 'GGG': 'G', 'GGA': 'G', 'GGM': 'G', 'GGV': 'G', 'GGY': 'G', 'GGS': 'G', 'GGT': 'G', 'GAC': 'D', 'GAR': 'E', 'GAG': 'E', 'GAA': 'E', 'GAY': 'D', 'GAT': 'D', 'GTB': 'V', 'GTD': 'V', 'GTH': 'V', 'GTK': 'V', 'GTN': 'V', 'GTW': 'V', 'GTC': 'V', 'GTR': 'V', 'GTG': 'V', 'GTA': 'V', 'GTM': 'V', 'GTV': 'V', 'GTY': 'V', 'GTS': 'V', 'GTT': 'V', 'ACB': 'T', 'ACD': 'T', 'ACH': 'T', 'ACK': 'T', 'ACN': 'T', 'ACW': 'T', 'ACC': 'T', 'ACR': 'T', 'ACG': 'T', 'ACA': 'T', 'ACM': 'T', 'ACV': 'T', 'ACY': 'T', 'ACS': 'T', 'ACT': 'T', 'AGC': 'S', 'AGR': 'R', 'AGG': 'R', 'AGA': 'R', 'AGY': 'S', 'AGT': 'S', 'AAC': 'N', 'AAR': 'K', 'AAG': 'K', 'AAA': 'K', 'AAY': 'N', 'AAT': 'N', 'ATH': 'I', 'ATW': 'I', 'ATC': 'I', 'ATG': 'M', 'ATA': 'I', 'ATM': 'I', 'ATY': 'I', 'ATT': 'I', 'MGR': 'R', 'MGG': 'R', 'MGA': 'R', 'YTR': 'L', 'YTG': 'L', 'YTA': 'L', 'TCB': 'S', 'TCD': 'S', 'TCH': 'S', 'TCK': 'S', 'TCN': 'S', 'TCW': 'S', 'TCC': 'S', 'TCR': 'S', 'TCG': 'S', 'TCA': 'S', 'TCM': 'S', 'TCV': 'S', 'TCY': 'S', 'TCS': 'S', 'TCT': 'S', 'TGC': 'C', 'TGG': 'W', 'TGA': '*', 'TGY': 'C', 'TGT': 'C', 'TAB': 'Y', 'TAD': 'Y', 'TAH': 'Y', 'TAK': 'Y', 'TAN': 'Y', 'TAW': 'Y', 'TAC': 'Y', 'TAR': 'Y', 'TAG': 'Y', 'TAA': 'Y', 'TAM': 'Y', 'TAV': 'Y', 'TAY': 'Y', 'TAS': 'Y', 'TAT': 'Y', 'TTC': 'F', 'TTR': 'L', 'TTG': 'L', 'TTA': 'L', 'TTY': 'F', 'TTT': 'F'}, 'start_table': {'CCB': 'P', 'CCD': 'P', 'CCH': 'P', 'CCK': 'P', 'CCN': 'P', 'CCW': 'P', 'CCC': 'P', 'CCR': 'P', 'CCG': 'P', 'CCA': 'P', 'CCM': 'P', 'CCV': 'P', 'CCY': 'P', 'CCS': 'P', 'CCT': 'P', 'CGB': 'R', 'CGD': 'R', 'CGH': 'R', 'CGK': 'R', 'CGN': 'R', 'CGW': 'R', 'CGC': 'R', 'CGR': 'R', 'CGG': 'R', 'CGA': 'R', 'CGM': 'R', 'CGV': 'R', 'CGY': 'R', 'CGS': 'R', 'CGT': 'R', 'CAC': 'H', 'CAR': 'Q', 'CAG': 'Q', 'CAA': 'Q', 'CAY': 'H', 'CAT': 'H', 'CTB': 'L', 'CTD': 'L', 'CTH': 'L', 'CTK': 'L', 'CTN': 'L', 'CTW': 'L', 'CTC': 'L', 'CTR': 'L', 'CTG': 'L', 'CTA': 'L', 'CTM': 'L', 'CTV': 'L', 'CTY': 'L', 'CTS': 'L', 'CTT': 'L', 'GCB': 'A', 'GCD': 'A', 'GCH': 'A', 'GCK': 'A', 'GCN': 'A', 'GCW': 'A', 'GCC': 'A', 'GCR': 'A', 'GCG': 'A', 'GCA': 'A', 'GCM': 'A', 'GCV': 'A', 'GCY': 'A', 'GCS': 'A', 'GCT': 'A', 'GGB': 'G', 'GGD': 'G', 'GGH': 'G', 'GGK': 'G', 'GGN': 'G', 'GGW': 'G', 'GGC': 'G', 'GGR': 'G', 'GGG': 'G', 'GGA': 'G', 'GGM': 'G', 'GGV': 'G', 'GGY': 'G', 'GGS': 'G', 'GGT': 'G', 'GAC': 'D', 'GAR': 'E', 'GAG': 'E', 'GAA': 'E', 'GAY': 'D', 'GAT': 'D', 'GTB': 'V', 'GTD': 'V', 'GTH': 'V', 'GTK': 'V', 'GTN': 'V', 'GTW': 'V', 'GTC': 'V', 'GTR': 'V', 'GTG': 'V', 'GTA': 'V', 'GTM': 'V', 'GTV': 'V', 'GTY': 'V', 'GTS': 'V', 'GTT': 'V', 'ACB': 'T', 'ACD': 'T', 'ACH': 'T', 'ACK': 'T', 'ACN': 'T', 'ACW': 'T', 'ACC': 'T', 'ACR': 'T', 'ACG': 'T', 'ACA': 'T', 'ACM': 'T', 'ACV': 'T', 'ACY': 'T', 'ACS': 'T', 'ACT': 'T', 'AGC': 'S', 'AGR': 'R', 'AGG': 'R', 'AGA': 'R', 'AGY': 'S', 'AGT': 'S', 'AAC': 'N', 'AAR': 'K', 'AAG': 'K', 'AAA': 'K', 'AAY': 'N', 'AAT': 'N', 'ATH': 'I', 'ATW': 'I', 'ATC': 'I', 'ATG': 'M', 'ATA': 'I', 'ATM': 'I', 'ATY': 'I', 'ATT': 'I', 'MGR': 'R', 'MGG': 'R', 'MGA': 'R', 'YTR': 'L', 'YTG': 'L', 'YTA': 'L', 'TCB': 'S', 'TCD': 'S', 'TCH': 'S', 'TCK': 'S', 'TCN': 'S', 'TCW': 'S', 'TCC': 'S', 'TCR': 'S', 'TCG': 'S', 'TCA': 'S', 'TCM': 'S', 'TCV': 'S', 'TCY': 'S', 'TCS': 'S', 'TCT': 'S', 'TGC': 'C', 'TGG': 'W', 'TGA': '*', 'TGY': 'C', 'TGT': 'C', 'TAB': 'Y', 'TAD': 'Y', 'TAH': 'Y', 'TAK': 'Y', 'TAN': 'Y', 'TAW': 'Y', 'TAC': 'Y', 'TAR': 'Y', 'TAG': 'Y', 'TAA': 'Y', 'TAM': 'Y', 'TAV': 'Y', 'TAY': 'Y', 'TAS': 'Y', 'TAT': 'Y', 'TTC': 'F', 'TTR': 'L', 'TTG': 'L', 'TTA': 'L', 'TTY': 'F', 'TTT': 'F'}}, '30': {'trans_table': {'KAR': 'E', 'KAG': 'E', 'KAA': 'E', 'CCB': 'P', 'CCD': 'P', 'CCH': 'P', 'CCK': 'P', 'CCN': 'P', 'CCW': 'P', 'CCC': 'P', 'CCR': 'P', 'CCG': 'P', 'CCA': 'P', 'CCM': 'P', 'CCV': 'P', 'CCY': 'P', 'CCS': 'P', 'CCT': 'P', 'CGB': 'R', 'CGD': 'R', 'CGH': 'R', 'CGK': 'R', 'CGN': 'R', 'CGW': 'R', 'CGC': 'R', 'CGR': 'R', 'CGG': 'R', 'CGA': 'R', 'CGM': 'R', 'CGV': 'R', 'CGY': 'R', 'CGS': 'R', 'CGT': 'R', 'CAC': 'H', 'CAR': 'Q', 'CAG': 'Q', 'CAA': 'Q', 'CAY': 'H', 'CAT': 'H', 'CTB': 'L', 'CTD': 'L', 'CTH': 'L', 'CTK': 'L', 'CTN': 'L', 'CTW': 'L', 'CTC': 'L', 'CTR': 'L', 'CTG': 'L', 'CTA': 'L', 'CTM': 'L', 'CTV': 'L', 'CTY': 'L', 'CTS': 'L', 'CTT': 'L', 'GCB': 'A', 'GCD': 'A', 'GCH': 'A', 'GCK': 'A', 'GCN': 'A', 'GCW': 'A', 'GCC': 'A', 'GCR': 'A', 'GCG': 'A', 'GCA': 'A', 'GCM': 'A', 'GCV': 'A', 'GCY': 'A', 'GCS': 'A', 'GCT': 'A', 'GGB': 'G', 'GGD': 'G', 'GGH': 'G', 'GGK': 'G', 'GGN': 'G', 'GGW': 'G', 'GGC': 'G', 'GGR': 'G', 'GGG': 'G', 'GGA': 'G', 'GGM': 'G', 'GGV': 'G', 'GGY': 'G', 'GGS': 'G', 'GGT': 'G', 'GAC': 'D', 'GAR': 'E', 'GAG': 'E', 'GAA': 'E', 'GAY': 'D', 'GAT': 'D', 'GTB': 'V', 'GTD': 'V', 'GTH': 'V', 'GTK': 'V', 'GTN': 'V', 'GTW': 'V', 'GTC': 'V', 'GTR': 'V', 'GTG': 'V', 'GTA': 'V', 'GTM': 'V', 'GTV': 'V', 'GTY': 'V', 'GTS': 'V', 'GTT': 'V', 'ACB': 'T', 'ACD': 'T', 'ACH': 'T', 'ACK': 'T', 'ACN': 'T', 'ACW': 'T', 'ACC': 'T', 'ACR': 'T', 'ACG': 'T', 'ACA': 'T', 'ACM': 'T', 'ACV': 'T', 'ACY': 'T', 'ACS': 'T', 'ACT': 'T', 'AGC': 'S', 'AGR': 'R', 'AGG': 'R', 'AGA': 'R', 'AGY': 'S', 'AGT': 'S', 'AAC': 'N', 'AAR': 'K', 'AAG': 'K', 'AAA': 'K', 'AAY': 'N', 'AAT': 'N', 'ATH': 'I', 'ATW': 'I', 'ATC': 'I', 'ATG': 'M', 'ATA': 'I', 'ATM': 'I', 'ATY': 'I', 'ATT': 'I', 'MGR': 'R', 'MGG': 'R', 'MGA': 'R', 'YTR': 'L', 'YTG': 'L', 'YTA': 'L', 'TCB': 'S', 'TCD': 'S', 'TCH': 'S', 'TCK': 'S', 'TCN': 'S', 'TCW': 'S', 'TCC': 'S', 'TCR': 'S', 'TCG': 'S', 'TCA': 'S', 'TCM': 'S', 'TCV': 'S', 'TCY': 'S', 'TCS': 'S', 'TCT': 'S', 'TGC': 'C', 'TGG': 'W', 'TGA': '*', 'TGY': 'C', 'TGT': 'C', 'TAC': 'Y', 'TAR': 'E', 'TAG': 'E', 'TAA': 'E', 'TAY': 'Y', 'TAT': 'Y', 'TTC': 'F', 'TTR': 'L', 'TTG': 'L', 'TTA': 'L', 'TTY': 'F', 'TTT': 'F'}, 'start_table': {'KAR': 'E', 'KAG': 'E', 'KAA': 'E', 'CCB': 'P', 'CCD': 'P', 'CCH': 'P', 'CCK': 'P', 'CCN': 'P', 'CCW': 'P', 'CCC': 'P', 'CCR': 'P', 'CCG': 'P', 'CCA': 'P', 'CCM': 'P', 'CCV': 'P', 'CCY': 'P', 'CCS': 'P', 'CCT': 'P', 'CGB': 'R', 'CGD': 'R', 'CGH': 'R', 'CGK': 'R', 'CGN': 'R', 'CGW': 'R', 'CGC': 'R', 'CGR': 'R', 'CGG': 'R', 'CGA': 'R', 'CGM': 'R', 'CGV': 'R', 'CGY': 'R', 'CGS': 'R', 'CGT': 'R', 'CAC': 'H', 'CAR': 'Q', 'CAG': 'Q', 'CAA': 'Q', 'CAY': 'H', 'CAT': 'H', 'CTB': 'L', 'CTD': 'L', 'CTH': 'L', 'CTK': 'L', 'CTN': 'L', 'CTW': 'L', 'CTC': 'L', 'CTR': 'L', 'CTG': 'L', 'CTA': 'L', 'CTM': 'L', 'CTV': 'L', 'CTY': 'L', 'CTS': 'L', 'CTT': 'L', 'GCB': 'A', 'GCD': 'A', 'GCH': 'A', 'GCK': 'A', 'GCN': 'A', 'GCW': 'A', 'GCC': 'A', 'GCR': 'A', 'GCG': 'A', 'GCA': 'A', 'GCM': 'A', 'GCV': 'A', 'GCY': 'A', 'GCS': 'A', 'GCT': 'A', 'GGB': 'G', 'GGD': 'G', 'GGH': 'G', 'GGK': 'G', 'GGN': 'G', 'GGW': 'G', 'GGC': 'G', 'GGR': 'G', 'GGG': 'G', 'GGA': 'G', 'GGM': 'G', 'GGV': 'G', 'GGY': 'G', 'GGS': 'G', 'GGT': 'G', 'GAC': 'D', 'GAR': 'E', 'GAG': 'E', 'GAA': 'E', 'GAY': 'D', 'GAT': 'D', 'GTB': 'V', 'GTD': 'V', 'GTH': 'V', 'GTK': 'V', 'GTN': 'V', 'GTW': 'V', 'GTC': 'V', 'GTR': 'V', 'GTG': 'V', 'GTA': 'V', 'GTM': 'V', 'GTV': 'V', 'GTY': 'V', 'GTS': 'V', 'GTT': 'V', 'ACB': 'T', 'ACD': 'T', 'ACH': 'T', 'ACK': 'T', 'ACN': 'T', 'ACW': 'T', 'ACC': 'T', 'ACR': 'T', 'ACG': 'T', 'ACA': 'T', 'ACM': 'T', 'ACV': 'T', 'ACY': 'T', 'ACS': 'T', 'ACT': 'T', 'AGC': 'S', 'AGR': 'R', 'AGG': 'R', 'AGA': 'R', 'AGY': 'S', 'AGT': 'S', 'AAC': 'N', 'AAR': 'K', 'AAG': 'K', 'AAA': 'K', 'AAY': 'N', 'AAT': 'N', 'ATH': 'I', 'ATW': 'I', 'ATC': 'I', 'ATG': 'M', 'ATA': 'I', 'ATM': 'I', 'ATY': 'I', 'ATT': 'I', 'MGR': 'R', 'MGG': 'R', 'MGA': 'R', 'YTR': 'L', 'YTG': 'L', 'YTA': 'L', 'TCB': 'S', 'TCD': 'S', 'TCH': 'S', 'TCK': 'S', 'TCN': 'S', 'TCW': 'S', 'TCC': 'S', 'TCR': 'S', 'TCG': 'S', 'TCA': 'S', 'TCM': 'S', 'TCV': 'S', 'TCY': 'S', 'TCS': 'S', 'TCT': 'S', 'TGC': 'C', 'TGG': 'W', 'TGA': '*', 'TGY': 'C', 'TGT': 'C', 'TAC': 'Y', 'TAR': 'E', 'TAG': 'E', 'TAA': 'E', 'TAY': 'Y', 'TAT': 'Y', 'TTC': 'F', 'TTR': 'L', 'TTG': 'L', 'TTA': 'L', 'TTY': 'F', 'TTT': 'F'}}, '31': {'trans_table': {'KAR': 'E', 'KAG': 'E', 'KAA': 'E', 'CCB': 'P', 'CCD': 'P', 'CCH': 'P', 'CCK': 'P', 'CCN': 'P', 'CCW': 'P', 'CCC': 'P', 'CCR': 'P', 'CCG': 'P', 'CCA': 'P', 'CCM': 'P', 'CCV': 'P', 'CCY': 'P', 'CCS': 'P', 'CCT': 'P', 'CGB': 'R', 'CGD': 'R', 'CGH': 'R', 'CGK': 'R', 'CGN': 'R', 'CGW': 'R', 'CGC': 'R', 'CGR': 'R', 'CGG': 'R', 'CGA': 'R', 'CGM': 'R', 'CGV': 'R', 'CGY': 'R', 'CGS': 'R', 'CGT': 'R', 'CAC': 'H', 'CAR': 'Q', 'CAG': 'Q', 'CAA': 'Q', 'CAY': 'H', 'CAT': 'H', 'CTB': 'L', 'CTD': 'L', 'CTH': 'L', 'CTK': 'L', 'CTN': 'L', 'CTW': 'L', 'CTC': 'L', 'CTR': 'L', 'CTG': 'L', 'CTA': 'L', 'CTM': 'L', 'CTV': 'L', 'CTY': 'L', 'CTS': 'L', 'CTT': 'L', 'GCB': 'A', 'GCD': 'A', 'GCH': 'A', 'GCK': 'A', 'GCN': 'A', 'GCW': 'A', 'GCC': 'A', 'GCR': 'A', 'GCG': 'A', 'GCA': 'A', 'GCM': 'A', 'GCV': 'A', 'GCY': 'A', 'GCS': 'A', 'GCT': 'A', 'GGB': 'G', 'GGD': 'G', 'GGH': 'G', 'GGK': 'G', 'GGN': 'G', 'GGW': 'G', 'GGC': 'G', 'GGR': 'G', 'GGG': 'G', 'GGA': 'G', 'GGM': 'G', 'GGV': 'G', 'GGY': 'G', 'GGS': 'G', 'GGT': 'G', 'GAC': 'D', 'GAR': 'E', 'GAG': 'E', 'GAA': 'E', 'GAY': 'D', 'GAT': 'D', 'GTB': 'V', 'GTD': 'V', 'GTH': 'V', 'GTK': 'V', 'GTN': 'V', 'GTW': 'V', 'GTC': 'V', 'GTR': 'V', 'GTG': 'V', 'GTA': 'V', 'GTM': 'V', 'GTV': 'V', 'GTY': 'V', 'GTS': 'V', 'GTT': 'V', 'ACB': 'T', 'ACD': 'T', 'ACH': 'T', 'ACK': 'T', 'ACN': 'T', 'ACW': 'T', 'ACC': 'T', 'ACR': 'T', 'ACG': 'T', 'ACA': 'T', 'ACM': 'T', 'ACV': 'T', 'ACY': 'T', 'ACS': 'T', 'ACT': 'T', 'AGC': 'S', 'AGR': 'R', 'AGG': 'R', 'AGA': 'R', 'AGY': 'S', 'AGT': 'S', 'AAC': 'N', 'AAR': 'K', 'AAG': 'K', 'AAA': 'K', 'AAY': 'N', 'AAT': 'N', 'ATH': 'I', 'ATW': 'I', 'ATC': 'I', 'ATG': 'M', 'ATA': 'I', 'ATM': 'I', 'ATY': 'I', 'ATT': 'I', 'MGR': 'R', 'MGG': 'R', 'MGA': 'R', 'YTR': 'L', 'YTG': 'L', 'YTA': 'L', 'TCB': 'S', 'TCD': 'S', 'TCH': 'S', 'TCK': 'S', 'TCN': 'S', 'TCW': 'S', 'TCC': 'S', 'TCR': 'S', 'TCG': 'S', 'TCA': 'S', 'TCM': 'S', 'TCV': 'S', 'TCY': 'S', 'TCS': 'S', 'TCT': 'S', 'TGC': 'C', 'TGR': 'W', 'TGG': 'W', 'TGA': 'W', 'TGY': 'C', 'TGT': 'C', 'TAC': 'Y', 'TAR': 'E', 'TAG': 'E', 'TAA': 'E', 'TAY': 'Y', 'TAT': 'Y', 'TTC': 'F', 'TTR': 'L', 'TTG': 'L', 'TTA': 'L', 'TTY': 'F', 'TTT': 'F'}, 'start_table': {'CCB': 'P', 'CCD': 'P', 'CCH': 'P', 'CCK': 'P', 'CCN': 'P', 'CCW': 'P', 'CCC': 'P', 'CCR': 'P', 'CCG': 'P', 'CCA': 'P', 'CCM': 'P', 'CCV': 'P', 'CCY': 'P', 'CCS': 'P', 'CCT': 'P', 'CGB': 'R', 'CGD': 'R', 'CGH': 'R', 'CGK': 'R', 'CGN': 'R', 'CGW': 'R', 'CGC': 'R', 'CGR': 'R', 'CGG': 'R', 'CGA': 'R', 'CGM': 'R', 'CGV': 'R', 'CGY': 'R', 'CGS': 'R', 'CGT': 'R', 'CAC': 'H', 'CAR': 'Q', 'CAG': 'Q', 'CAA': 'Q', 'CAY': 'H', 'CAT': 'H', 'CTB': 'L', 'CTD': 'L', 'CTH': 'L', 'CTK': 'L', 'CTN': 'L', 'CTW': 'L', 'CTC': 'L', 'CTR': 'L', 'CTG': 'L', 'CTA': 'L', 'CTM': 'L', 'CTV': 'L', 'CTY': 'L', 'CTS': 'L', 'CTT': 'L', 'GCB': 'A', 'GCD': 'A', 'GCH': 'A', 'GCK': 'A', 'GCN': 'A', 'GCW': 'A', 'GCC': 'A', 'GCR': 'A', 'GCG': 'A', 'GCA': 'A', 'GCM': 'A', 'GCV': 'A', 'GCY': 'A', 'GCS': 'A', 'GCT': 'A', 'GGB': 'G', 'GGD': 'G', 'GGH': 'G', 'GGK': 'G', 'GGN': 'G', 'GGW': 'G', 'GGC': 'G', 'GGR': 'G', 'GGG': 'G', 'GGA': 'G', 'GGM': 'G', 'GGV': 'G', 'GGY': 'G', 'GGS': 'G', 'GGT': 'G', 'GAC': 'D', 'GAR': 'E', 'GAG': 'E', 'GAA': 'E', 'GAY': 'D', 'GAT': 'D', 'GTB': 'V', 'GTD': 'V', 'GTH': 'V', 'GTK': 'V', 'GTN': 'V', 'GTW': 'V', 'GTC': 'V', 'GTR': 'V', 'GTG': 'V', 'GTA': 'V', 'GTM': 'V', 'GTV': 'V', 'GTY': 'V', 'GTS': 'V', 'GTT': 'V', 'ACB': 'T', 'ACD': 'T', 'ACH': 'T', 'ACK': 'T', 'ACN': 'T', 'ACW': 'T', 'ACC': 'T', 'ACR': 'T', 'ACG': 'T', 'ACA': 'T', 'ACM': 'T', 'ACV': 'T', 'ACY': 'T', 'ACS': 'T', 'ACT': 'T', 'AGC': 'S', 'AGR': 'R', 'AGG': 'R', 'AGA': 'R', 'AGY': 'S', 'AGT': 'S', 'AAC': 'N', 'AAR': 'K', 'AAG': 'K', 'AAA': 'K', 'AAY': 'N', 'AAT': 'N', 'ATH': 'I', 'ATW': 'I', 'ATC': 'I', 'ATG': 'M', 'ATA': 'I', 'ATM': 'I', 'ATY': 'I', 'ATT': 'I', 'MGR': 'R', 'MGG': 'R', 'MGA': 'R', 'YTR': 'L', 'YTG': 'L', 'YTA': 'L', 'TCB': 'S', 'TCD': 'S', 'TCH': 'S', 'TCK': 'S', 'TCN': 'S', 'TCW': 'S', 'TCC': 'S', 'TCR': 'S', 'TCG': 'S', 'TCA': 'S', 'TCM': 'S', 'TCV': 'S', 'TCY': 'S', 'TCS': 'S', 'TCT': 'S', 'TGC': 'C', 'TGR': 'W', 'TGG': 'W', 'TGA': 'W', 'TGY': 'C', 'TGT': 'C', 'TAC': 'Y', 'TAR': '*', 'TAG': '*', 'TAA': '*', 'TAY': 'Y', 'TAT': 'Y', 'TTC': 'F', 'TTR': 'L', 'TTG': 'L', 'TTA': 'L', 'TTY': 'F', 'TTT': 'F'}}}[code] - +def genetic_codes(code): + return { + "1": { + "trans_table": { + "CCB": "P", + "CCD": "P", + "CCH": "P", + "CCK": "P", + "CCN": "P", + "CCW": "P", + "CCC": "P", + "CCR": "P", + "CCG": "P", + "CCA": "P", + "CCM": "P", + "CCV": "P", + "CCY": "P", + "CCS": "P", + "CCT": "P", + "CGB": "R", + "CGD": "R", + "CGH": "R", + "CGK": "R", + "CGN": "R", + "CGW": "R", + "CGC": "R", + "CGR": "R", + "CGG": "R", + "CGA": "R", + "CGM": "R", + "CGV": "R", + "CGY": "R", + "CGS": "R", + "CGT": "R", + "CAC": "H", + "CAR": "Q", + "CAG": "Q", + "CAA": "Q", + "CAY": "H", + "CAT": "H", + "CTB": "L", + "CTD": "L", + "CTH": "L", + "CTK": "L", + "CTN": "L", + "CTW": "L", + "CTC": "L", + "CTR": "L", + "CTG": "L", + "CTA": "L", + "CTM": "L", + "CTV": "L", + "CTY": "L", + "CTS": "L", + "CTT": "L", + "GCB": "A", + "GCD": "A", + "GCH": "A", + "GCK": "A", + "GCN": "A", + "GCW": "A", + "GCC": "A", + "GCR": "A", + "GCG": "A", + "GCA": "A", + "GCM": "A", + "GCV": "A", + "GCY": "A", + "GCS": "A", + "GCT": "A", + "GGB": "G", + "GGD": "G", + "GGH": "G", + "GGK": "G", + "GGN": "G", + "GGW": "G", + "GGC": "G", + "GGR": "G", + "GGG": "G", + "GGA": "G", + "GGM": "G", + "GGV": "G", + "GGY": "G", + "GGS": "G", + "GGT": "G", + "GAC": "D", + "GAR": "E", + "GAG": "E", + "GAA": "E", + "GAY": "D", + "GAT": "D", + "GTB": "V", + "GTD": "V", + "GTH": "V", + "GTK": "V", + "GTN": "V", + "GTW": "V", + "GTC": "V", + "GTR": "V", + "GTG": "V", + "GTA": "V", + "GTM": "V", + "GTV": "V", + "GTY": "V", + "GTS": "V", + "GTT": "V", + "ACB": "T", + "ACD": "T", + "ACH": "T", + "ACK": "T", + "ACN": "T", + "ACW": "T", + "ACC": "T", + "ACR": "T", + "ACG": "T", + "ACA": "T", + "ACM": "T", + "ACV": "T", + "ACY": "T", + "ACS": "T", + "ACT": "T", + "AGC": "S", + "AGR": "R", + "AGG": "R", + "AGA": "R", + "AGY": "S", + "AGT": "S", + "AAC": "N", + "AAR": "K", + "AAG": "K", + "AAA": "K", + "AAY": "N", + "AAT": "N", + "ATH": "I", + "ATW": "I", + "ATC": "I", + "ATG": "M", + "ATA": "I", + "ATM": "I", + "ATY": "I", + "ATT": "I", + "MGR": "R", + "MGG": "R", + "MGA": "R", + "YTR": "L", + "YTG": "L", + "YTA": "L", + "TCB": "S", + "TCD": "S", + "TCH": "S", + "TCK": "S", + "TCN": "S", + "TCW": "S", + "TCC": "S", + "TCR": "S", + "TCG": "S", + "TCA": "S", + "TCM": "S", + "TCV": "S", + "TCY": "S", + "TCS": "S", + "TCT": "S", + "TRA": "*", + "TGC": "C", + "TGG": "W", + "TGA": "*", + "TGY": "C", + "TGT": "C", + "TAC": "Y", + "TAR": "*", + "TAG": "*", + "TAA": "*", + "TAY": "Y", + "TAT": "Y", + "TTC": "F", + "TTR": "L", + "TTG": "L", + "TTA": "L", + "TTY": "F", + "TTT": "F", + }, + "start_table": { + "HTG": "M", + "WTG": "M", + "CCB": "P", + "CCD": "P", + "CCH": "P", + "CCK": "P", + "CCN": "P", + "CCW": "P", + "CCC": "P", + "CCR": "P", + "CCG": "P", + "CCA": "P", + "CCM": "P", + "CCV": "P", + "CCY": "P", + "CCS": "P", + "CCT": "P", + "CGB": "R", + "CGD": "R", + "CGH": "R", + "CGK": "R", + "CGN": "R", + "CGW": "R", + "CGC": "R", + "CGR": "R", + "CGG": "R", + "CGA": "R", + "CGM": "R", + "CGV": "R", + "CGY": "R", + "CGS": "R", + "CGT": "R", + "CAC": "H", + "CAR": "Q", + "CAG": "Q", + "CAA": "Q", + "CAY": "H", + "CAT": "H", + "CTH": "L", + "CTW": "L", + "CTC": "L", + "CTG": "M", + "CTA": "L", + "CTM": "L", + "CTY": "L", + "CTT": "L", + "GCB": "A", + "GCD": "A", + "GCH": "A", + "GCK": "A", + "GCN": "A", + "GCW": "A", + "GCC": "A", + "GCR": "A", + "GCG": "A", + "GCA": "A", + "GCM": "A", + "GCV": "A", + "GCY": "A", + "GCS": "A", + "GCT": "A", + "GGB": "G", + "GGD": "G", + "GGH": "G", + "GGK": "G", + "GGN": "G", + "GGW": "G", + "GGC": "G", + "GGR": "G", + "GGG": "G", + "GGA": "G", + "GGM": "G", + "GGV": "G", + "GGY": "G", + "GGS": "G", + "GGT": "G", + "GAC": "D", + "GAR": "E", + "GAG": "E", + "GAA": "E", + "GAY": "D", + "GAT": "D", + "GTB": "V", + "GTD": "V", + "GTH": "V", + "GTK": "V", + "GTN": "V", + "GTW": "V", + "GTC": "V", + "GTR": "V", + "GTG": "V", + "GTA": "V", + "GTM": "V", + "GTV": "V", + "GTY": "V", + "GTS": "V", + "GTT": "V", + "ACB": "T", + "ACD": "T", + "ACH": "T", + "ACK": "T", + "ACN": "T", + "ACW": "T", + "ACC": "T", + "ACR": "T", + "ACG": "T", + "ACA": "T", + "ACM": "T", + "ACV": "T", + "ACY": "T", + "ACS": "T", + "ACT": "T", + "AGC": "S", + "AGR": "R", + "AGG": "R", + "AGA": "R", + "AGY": "S", + "AGT": "S", + "AAC": "N", + "AAR": "K", + "AAG": "K", + "AAA": "K", + "AAY": "N", + "AAT": "N", + "ATH": "I", + "ATW": "I", + "ATC": "I", + "ATG": "M", + "ATA": "I", + "ATM": "I", + "ATY": "I", + "ATT": "I", + "MGR": "R", + "MGG": "R", + "MGA": "R", + "MTG": "M", + "YTG": "M", + "YTA": "L", + "TCB": "S", + "TCD": "S", + "TCH": "S", + "TCK": "S", + "TCN": "S", + "TCW": "S", + "TCC": "S", + "TCR": "S", + "TCG": "S", + "TCA": "S", + "TCM": "S", + "TCV": "S", + "TCY": "S", + "TCS": "S", + "TCT": "S", + "TRA": "*", + "TGC": "C", + "TGG": "W", + "TGA": "*", + "TGY": "C", + "TGT": "C", + "TAC": "Y", + "TAR": "*", + "TAG": "*", + "TAA": "*", + "TAY": "Y", + "TAT": "Y", + "TTC": "F", + "TTG": "M", + "TTA": "L", + "TTY": "F", + "TTT": "F", + }, + }, + "2": { + "trans_table": { + "CCB": "P", + "CCD": "P", + "CCH": "P", + "CCK": "P", + "CCN": "P", + "CCW": "P", + "CCC": "P", + "CCR": "P", + "CCG": "P", + "CCA": "P", + "CCM": "P", + "CCV": "P", + "CCY": "P", + "CCS": "P", + "CCT": "P", + "CGB": "R", + "CGD": "R", + "CGH": "R", + "CGK": "R", + "CGN": "R", + "CGW": "R", + "CGC": "R", + "CGR": "R", + "CGG": "R", + "CGA": "R", + "CGM": "R", + "CGV": "R", + "CGY": "R", + "CGS": "R", + "CGT": "R", + "CAC": "H", + "CAR": "Q", + "CAG": "Q", + "CAA": "Q", + "CAY": "H", + "CAT": "H", + "CTB": "L", + "CTD": "L", + "CTH": "L", + "CTK": "L", + "CTN": "L", + "CTW": "L", + "CTC": "L", + "CTR": "L", + "CTG": "L", + "CTA": "L", + "CTM": "L", + "CTV": "L", + "CTY": "L", + "CTS": "L", + "CTT": "L", + "GCB": "A", + "GCD": "A", + "GCH": "A", + "GCK": "A", + "GCN": "A", + "GCW": "A", + "GCC": "A", + "GCR": "A", + "GCG": "A", + "GCA": "A", + "GCM": "A", + "GCV": "A", + "GCY": "A", + "GCS": "A", + "GCT": "A", + "GGB": "G", + "GGD": "G", + "GGH": "G", + "GGK": "G", + "GGN": "G", + "GGW": "G", + "GGC": "G", + "GGR": "G", + "GGG": "G", + "GGA": "G", + "GGM": "G", + "GGV": "G", + "GGY": "G", + "GGS": "G", + "GGT": "G", + "GAC": "D", + "GAR": "E", + "GAG": "E", + "GAA": "E", + "GAY": "D", + "GAT": "D", + "GTB": "V", + "GTD": "V", + "GTH": "V", + "GTK": "V", + "GTN": "V", + "GTW": "V", + "GTC": "V", + "GTR": "V", + "GTG": "V", + "GTA": "V", + "GTM": "V", + "GTV": "V", + "GTY": "V", + "GTS": "V", + "GTT": "V", + "ACB": "T", + "ACD": "T", + "ACH": "T", + "ACK": "T", + "ACN": "T", + "ACW": "T", + "ACC": "T", + "ACR": "T", + "ACG": "T", + "ACA": "T", + "ACM": "T", + "ACV": "T", + "ACY": "T", + "ACS": "T", + "ACT": "T", + "AGC": "S", + "AGR": "*", + "AGG": "*", + "AGA": "*", + "AGY": "S", + "AGT": "S", + "AAC": "N", + "AAR": "K", + "AAG": "K", + "AAA": "K", + "AAY": "N", + "AAT": "N", + "ATC": "I", + "ATR": "M", + "ATG": "M", + "ATA": "M", + "ATY": "I", + "ATT": "I", + "YTR": "L", + "YTG": "L", + "YTA": "L", + "TCB": "S", + "TCD": "S", + "TCH": "S", + "TCK": "S", + "TCN": "S", + "TCW": "S", + "TCC": "S", + "TCR": "S", + "TCG": "S", + "TCA": "S", + "TCM": "S", + "TCV": "S", + "TCY": "S", + "TCS": "S", + "TCT": "S", + "TGC": "C", + "TGR": "W", + "TGG": "W", + "TGA": "W", + "TGY": "C", + "TGT": "C", + "TAC": "Y", + "TAR": "*", + "TAG": "*", + "TAA": "*", + "TAY": "Y", + "TAT": "Y", + "TTC": "F", + "TTR": "L", + "TTG": "L", + "TTA": "L", + "TTY": "F", + "TTT": "F", + }, + "start_table": { + "CCB": "P", + "CCD": "P", + "CCH": "P", + "CCK": "P", + "CCN": "P", + "CCW": "P", + "CCC": "P", + "CCR": "P", + "CCG": "P", + "CCA": "P", + "CCM": "P", + "CCV": "P", + "CCY": "P", + "CCS": "P", + "CCT": "P", + "CGB": "R", + "CGD": "R", + "CGH": "R", + "CGK": "R", + "CGN": "R", + "CGW": "R", + "CGC": "R", + "CGR": "R", + "CGG": "R", + "CGA": "R", + "CGM": "R", + "CGV": "R", + "CGY": "R", + "CGS": "R", + "CGT": "R", + "CAC": "H", + "CAR": "Q", + "CAG": "Q", + "CAA": "Q", + "CAY": "H", + "CAT": "H", + "CTB": "L", + "CTD": "L", + "CTH": "L", + "CTK": "L", + "CTN": "L", + "CTW": "L", + "CTC": "L", + "CTR": "L", + "CTG": "L", + "CTA": "L", + "CTM": "L", + "CTV": "L", + "CTY": "L", + "CTS": "L", + "CTT": "L", + "RTG": "M", + "GCB": "A", + "GCD": "A", + "GCH": "A", + "GCK": "A", + "GCN": "A", + "GCW": "A", + "GCC": "A", + "GCR": "A", + "GCG": "A", + "GCA": "A", + "GCM": "A", + "GCV": "A", + "GCY": "A", + "GCS": "A", + "GCT": "A", + "GGB": "G", + "GGD": "G", + "GGH": "G", + "GGK": "G", + "GGN": "G", + "GGW": "G", + "GGC": "G", + "GGR": "G", + "GGG": "G", + "GGA": "G", + "GGM": "G", + "GGV": "G", + "GGY": "G", + "GGS": "G", + "GGT": "G", + "GAC": "D", + "GAR": "E", + "GAG": "E", + "GAA": "E", + "GAY": "D", + "GAT": "D", + "GTH": "V", + "GTW": "V", + "GTC": "V", + "GTG": "M", + "GTA": "V", + "GTM": "V", + "GTY": "V", + "GTT": "V", + "ACB": "T", + "ACD": "T", + "ACH": "T", + "ACK": "T", + "ACN": "T", + "ACW": "T", + "ACC": "T", + "ACR": "T", + "ACG": "T", + "ACA": "T", + "ACM": "T", + "ACV": "T", + "ACY": "T", + "ACS": "T", + "ACT": "T", + "AGC": "S", + "AGR": "*", + "AGG": "*", + "AGA": "*", + "AGY": "S", + "AGT": "S", + "AAC": "N", + "AAR": "K", + "AAG": "K", + "AAA": "K", + "AAY": "N", + "AAT": "N", + "ATB": "M", + "ATD": "M", + "ATH": "M", + "ATK": "M", + "ATN": "M", + "ATW": "M", + "ATC": "M", + "ATR": "M", + "ATG": "M", + "ATA": "M", + "ATM": "M", + "ATV": "M", + "ATY": "M", + "ATS": "M", + "ATT": "M", + "YTR": "L", + "YTG": "L", + "YTA": "L", + "TCB": "S", + "TCD": "S", + "TCH": "S", + "TCK": "S", + "TCN": "S", + "TCW": "S", + "TCC": "S", + "TCR": "S", + "TCG": "S", + "TCA": "S", + "TCM": "S", + "TCV": "S", + "TCY": "S", + "TCS": "S", + "TCT": "S", + "TGC": "C", + "TGR": "W", + "TGG": "W", + "TGA": "W", + "TGY": "C", + "TGT": "C", + "TAC": "Y", + "TAR": "*", + "TAG": "*", + "TAA": "*", + "TAY": "Y", + "TAT": "Y", + "TTC": "F", + "TTR": "L", + "TTG": "L", + "TTA": "L", + "TTY": "F", + "TTT": "F", + }, + }, + "3": { + "trans_table": { + "CCB": "P", + "CCD": "P", + "CCH": "P", + "CCK": "P", + "CCN": "P", + "CCW": "P", + "CCC": "P", + "CCR": "P", + "CCG": "P", + "CCA": "P", + "CCM": "P", + "CCV": "P", + "CCY": "P", + "CCS": "P", + "CCT": "P", + "CGB": "R", + "CGD": "R", + "CGH": "R", + "CGK": "R", + "CGN": "R", + "CGW": "R", + "CGC": "R", + "CGR": "R", + "CGG": "R", + "CGA": "R", + "CGM": "R", + "CGV": "R", + "CGY": "R", + "CGS": "R", + "CGT": "R", + "CAC": "H", + "CAR": "Q", + "CAG": "Q", + "CAA": "Q", + "CAY": "H", + "CAT": "H", + "CTB": "T", + "CTD": "T", + "CTH": "T", + "CTK": "T", + "CTN": "T", + "CTW": "T", + "CTC": "T", + "CTR": "T", + "CTG": "T", + "CTA": "T", + "CTM": "T", + "CTV": "T", + "CTY": "T", + "CTS": "T", + "CTT": "T", + "GCB": "A", + "GCD": "A", + "GCH": "A", + "GCK": "A", + "GCN": "A", + "GCW": "A", + "GCC": "A", + "GCR": "A", + "GCG": "A", + "GCA": "A", + "GCM": "A", + "GCV": "A", + "GCY": "A", + "GCS": "A", + "GCT": "A", + "GGB": "G", + "GGD": "G", + "GGH": "G", + "GGK": "G", + "GGN": "G", + "GGW": "G", + "GGC": "G", + "GGR": "G", + "GGG": "G", + "GGA": "G", + "GGM": "G", + "GGV": "G", + "GGY": "G", + "GGS": "G", + "GGT": "G", + "GAC": "D", + "GAR": "E", + "GAG": "E", + "GAA": "E", + "GAY": "D", + "GAT": "D", + "GTB": "V", + "GTD": "V", + "GTH": "V", + "GTK": "V", + "GTN": "V", + "GTW": "V", + "GTC": "V", + "GTR": "V", + "GTG": "V", + "GTA": "V", + "GTM": "V", + "GTV": "V", + "GTY": "V", + "GTS": "V", + "GTT": "V", + "ACB": "T", + "ACD": "T", + "ACH": "T", + "ACK": "T", + "ACN": "T", + "ACW": "T", + "ACC": "T", + "ACR": "T", + "ACG": "T", + "ACA": "T", + "ACM": "T", + "ACV": "T", + "ACY": "T", + "ACS": "T", + "ACT": "T", + "AGC": "S", + "AGR": "R", + "AGG": "R", + "AGA": "R", + "AGY": "S", + "AGT": "S", + "AAC": "N", + "AAR": "K", + "AAG": "K", + "AAA": "K", + "AAY": "N", + "AAT": "N", + "ATC": "I", + "ATR": "M", + "ATG": "M", + "ATA": "M", + "ATY": "I", + "ATT": "I", + "MGR": "R", + "MGG": "R", + "MGA": "R", + "TCB": "S", + "TCD": "S", + "TCH": "S", + "TCK": "S", + "TCN": "S", + "TCW": "S", + "TCC": "S", + "TCR": "S", + "TCG": "S", + "TCA": "S", + "TCM": "S", + "TCV": "S", + "TCY": "S", + "TCS": "S", + "TCT": "S", + "TGC": "C", + "TGR": "W", + "TGG": "W", + "TGA": "W", + "TGY": "C", + "TGT": "C", + "TAC": "Y", + "TAR": "*", + "TAG": "*", + "TAA": "*", + "TAY": "Y", + "TAT": "Y", + "TTC": "F", + "TTR": "L", + "TTG": "L", + "TTA": "L", + "TTY": "F", + "TTT": "F", + }, + "start_table": { + "CCB": "P", + "CCD": "P", + "CCH": "P", + "CCK": "P", + "CCN": "P", + "CCW": "P", + "CCC": "P", + "CCR": "P", + "CCG": "P", + "CCA": "P", + "CCM": "P", + "CCV": "P", + "CCY": "P", + "CCS": "P", + "CCT": "P", + "CGB": "R", + "CGD": "R", + "CGH": "R", + "CGK": "R", + "CGN": "R", + "CGW": "R", + "CGC": "R", + "CGR": "R", + "CGG": "R", + "CGA": "R", + "CGM": "R", + "CGV": "R", + "CGY": "R", + "CGS": "R", + "CGT": "R", + "CAC": "H", + "CAR": "Q", + "CAG": "Q", + "CAA": "Q", + "CAY": "H", + "CAT": "H", + "CTB": "T", + "CTD": "T", + "CTH": "T", + "CTK": "T", + "CTN": "T", + "CTW": "T", + "CTC": "T", + "CTR": "T", + "CTG": "T", + "CTA": "T", + "CTM": "T", + "CTV": "T", + "CTY": "T", + "CTS": "T", + "CTT": "T", + "RTG": "M", + "GCB": "A", + "GCD": "A", + "GCH": "A", + "GCK": "A", + "GCN": "A", + "GCW": "A", + "GCC": "A", + "GCR": "A", + "GCG": "A", + "GCA": "A", + "GCM": "A", + "GCV": "A", + "GCY": "A", + "GCS": "A", + "GCT": "A", + "GGB": "G", + "GGD": "G", + "GGH": "G", + "GGK": "G", + "GGN": "G", + "GGW": "G", + "GGC": "G", + "GGR": "G", + "GGG": "G", + "GGA": "G", + "GGM": "G", + "GGV": "G", + "GGY": "G", + "GGS": "G", + "GGT": "G", + "GAC": "D", + "GAR": "E", + "GAG": "E", + "GAA": "E", + "GAY": "D", + "GAT": "D", + "GTH": "V", + "GTW": "V", + "GTC": "V", + "GTG": "M", + "GTA": "V", + "GTM": "V", + "GTY": "V", + "GTT": "V", + "ACB": "T", + "ACD": "T", + "ACH": "T", + "ACK": "T", + "ACN": "T", + "ACW": "T", + "ACC": "T", + "ACR": "T", + "ACG": "T", + "ACA": "T", + "ACM": "T", + "ACV": "T", + "ACY": "T", + "ACS": "T", + "ACT": "T", + "AGC": "S", + "AGR": "R", + "AGG": "R", + "AGA": "R", + "AGY": "S", + "AGT": "S", + "AAC": "N", + "AAR": "K", + "AAG": "K", + "AAA": "K", + "AAY": "N", + "AAT": "N", + "ATC": "I", + "ATR": "M", + "ATG": "M", + "ATA": "M", + "ATY": "I", + "ATT": "I", + "MGR": "R", + "MGG": "R", + "MGA": "R", + "TCB": "S", + "TCD": "S", + "TCH": "S", + "TCK": "S", + "TCN": "S", + "TCW": "S", + "TCC": "S", + "TCR": "S", + "TCG": "S", + "TCA": "S", + "TCM": "S", + "TCV": "S", + "TCY": "S", + "TCS": "S", + "TCT": "S", + "TGC": "C", + "TGR": "W", + "TGG": "W", + "TGA": "W", + "TGY": "C", + "TGT": "C", + "TAC": "Y", + "TAR": "*", + "TAG": "*", + "TAA": "*", + "TAY": "Y", + "TAT": "Y", + "TTC": "F", + "TTR": "L", + "TTG": "L", + "TTA": "L", + "TTY": "F", + "TTT": "F", + }, + }, + "4": { + "trans_table": { + "CCB": "P", + "CCD": "P", + "CCH": "P", + "CCK": "P", + "CCN": "P", + "CCW": "P", + "CCC": "P", + "CCR": "P", + "CCG": "P", + "CCA": "P", + "CCM": "P", + "CCV": "P", + "CCY": "P", + "CCS": "P", + "CCT": "P", + "CGB": "R", + "CGD": "R", + "CGH": "R", + "CGK": "R", + "CGN": "R", + "CGW": "R", + "CGC": "R", + "CGR": "R", + "CGG": "R", + "CGA": "R", + "CGM": "R", + "CGV": "R", + "CGY": "R", + "CGS": "R", + "CGT": "R", + "CAC": "H", + "CAR": "Q", + "CAG": "Q", + "CAA": "Q", + "CAY": "H", + "CAT": "H", + "CTB": "L", + "CTD": "L", + "CTH": "L", + "CTK": "L", + "CTN": "L", + "CTW": "L", + "CTC": "L", + "CTR": "L", + "CTG": "L", + "CTA": "L", + "CTM": "L", + "CTV": "L", + "CTY": "L", + "CTS": "L", + "CTT": "L", + "GCB": "A", + "GCD": "A", + "GCH": "A", + "GCK": "A", + "GCN": "A", + "GCW": "A", + "GCC": "A", + "GCR": "A", + "GCG": "A", + "GCA": "A", + "GCM": "A", + "GCV": "A", + "GCY": "A", + "GCS": "A", + "GCT": "A", + "GGB": "G", + "GGD": "G", + "GGH": "G", + "GGK": "G", + "GGN": "G", + "GGW": "G", + "GGC": "G", + "GGR": "G", + "GGG": "G", + "GGA": "G", + "GGM": "G", + "GGV": "G", + "GGY": "G", + "GGS": "G", + "GGT": "G", + "GAC": "D", + "GAR": "E", + "GAG": "E", + "GAA": "E", + "GAY": "D", + "GAT": "D", + "GTB": "V", + "GTD": "V", + "GTH": "V", + "GTK": "V", + "GTN": "V", + "GTW": "V", + "GTC": "V", + "GTR": "V", + "GTG": "V", + "GTA": "V", + "GTM": "V", + "GTV": "V", + "GTY": "V", + "GTS": "V", + "GTT": "V", + "ACB": "T", + "ACD": "T", + "ACH": "T", + "ACK": "T", + "ACN": "T", + "ACW": "T", + "ACC": "T", + "ACR": "T", + "ACG": "T", + "ACA": "T", + "ACM": "T", + "ACV": "T", + "ACY": "T", + "ACS": "T", + "ACT": "T", + "AGC": "S", + "AGR": "R", + "AGG": "R", + "AGA": "R", + "AGY": "S", + "AGT": "S", + "AAC": "N", + "AAR": "K", + "AAG": "K", + "AAA": "K", + "AAY": "N", + "AAT": "N", + "ATH": "I", + "ATW": "I", + "ATC": "I", + "ATG": "M", + "ATA": "I", + "ATM": "I", + "ATY": "I", + "ATT": "I", + "MGR": "R", + "MGG": "R", + "MGA": "R", + "YTR": "L", + "YTG": "L", + "YTA": "L", + "TCB": "S", + "TCD": "S", + "TCH": "S", + "TCK": "S", + "TCN": "S", + "TCW": "S", + "TCC": "S", + "TCR": "S", + "TCG": "S", + "TCA": "S", + "TCM": "S", + "TCV": "S", + "TCY": "S", + "TCS": "S", + "TCT": "S", + "TGC": "C", + "TGR": "W", + "TGG": "W", + "TGA": "W", + "TGY": "C", + "TGT": "C", + "TAC": "Y", + "TAR": "*", + "TAG": "*", + "TAA": "*", + "TAY": "Y", + "TAT": "Y", + "TTC": "F", + "TTR": "L", + "TTG": "L", + "TTA": "L", + "TTY": "F", + "TTT": "F", + }, + "start_table": { + "BTG": "M", + "DTG": "M", + "HTG": "M", + "KTG": "M", + "NTG": "M", + "WTR": "M", + "WTG": "M", + "WTA": "M", + "CCB": "P", + "CCD": "P", + "CCH": "P", + "CCK": "P", + "CCN": "P", + "CCW": "P", + "CCC": "P", + "CCR": "P", + "CCG": "P", + "CCA": "P", + "CCM": "P", + "CCV": "P", + "CCY": "P", + "CCS": "P", + "CCT": "P", + "CGB": "R", + "CGD": "R", + "CGH": "R", + "CGK": "R", + "CGN": "R", + "CGW": "R", + "CGC": "R", + "CGR": "R", + "CGG": "R", + "CGA": "R", + "CGM": "R", + "CGV": "R", + "CGY": "R", + "CGS": "R", + "CGT": "R", + "CAC": "H", + "CAR": "Q", + "CAG": "Q", + "CAA": "Q", + "CAY": "H", + "CAT": "H", + "CTH": "L", + "CTW": "L", + "CTC": "L", + "CTG": "M", + "CTA": "L", + "CTM": "L", + "CTY": "L", + "CTT": "L", + "RTG": "M", + "GCB": "A", + "GCD": "A", + "GCH": "A", + "GCK": "A", + "GCN": "A", + "GCW": "A", + "GCC": "A", + "GCR": "A", + "GCG": "A", + "GCA": "A", + "GCM": "A", + "GCV": "A", + "GCY": "A", + "GCS": "A", + "GCT": "A", + "GGB": "G", + "GGD": "G", + "GGH": "G", + "GGK": "G", + "GGN": "G", + "GGW": "G", + "GGC": "G", + "GGR": "G", + "GGG": "G", + "GGA": "G", + "GGM": "G", + "GGV": "G", + "GGY": "G", + "GGS": "G", + "GGT": "G", + "GAC": "D", + "GAR": "E", + "GAG": "E", + "GAA": "E", + "GAY": "D", + "GAT": "D", + "GTH": "V", + "GTW": "V", + "GTC": "V", + "GTG": "M", + "GTA": "V", + "GTM": "V", + "GTY": "V", + "GTT": "V", + "ACB": "T", + "ACD": "T", + "ACH": "T", + "ACK": "T", + "ACN": "T", + "ACW": "T", + "ACC": "T", + "ACR": "T", + "ACG": "T", + "ACA": "T", + "ACM": "T", + "ACV": "T", + "ACY": "T", + "ACS": "T", + "ACT": "T", + "AGC": "S", + "AGR": "R", + "AGG": "R", + "AGA": "R", + "AGY": "S", + "AGT": "S", + "AAC": "N", + "AAR": "K", + "AAG": "K", + "AAA": "K", + "AAY": "N", + "AAT": "N", + "ATB": "M", + "ATD": "M", + "ATH": "M", + "ATK": "M", + "ATN": "M", + "ATW": "M", + "ATC": "M", + "ATR": "M", + "ATG": "M", + "ATA": "M", + "ATM": "M", + "ATV": "M", + "ATY": "M", + "ATS": "M", + "ATT": "M", + "MGR": "R", + "MGG": "R", + "MGA": "R", + "MTG": "M", + "VTG": "M", + "YTG": "M", + "STG": "M", + "TCB": "S", + "TCD": "S", + "TCH": "S", + "TCK": "S", + "TCN": "S", + "TCW": "S", + "TCC": "S", + "TCR": "S", + "TCG": "S", + "TCA": "S", + "TCM": "S", + "TCV": "S", + "TCY": "S", + "TCS": "S", + "TCT": "S", + "TGC": "C", + "TGR": "W", + "TGG": "W", + "TGA": "W", + "TGY": "C", + "TGT": "C", + "TAC": "Y", + "TAR": "*", + "TAG": "*", + "TAA": "*", + "TAY": "Y", + "TAT": "Y", + "TTC": "F", + "TTR": "M", + "TTG": "M", + "TTA": "M", + "TTY": "F", + "TTT": "F", + }, + }, + "5": { + "trans_table": { + "CCB": "P", + "CCD": "P", + "CCH": "P", + "CCK": "P", + "CCN": "P", + "CCW": "P", + "CCC": "P", + "CCR": "P", + "CCG": "P", + "CCA": "P", + "CCM": "P", + "CCV": "P", + "CCY": "P", + "CCS": "P", + "CCT": "P", + "CGB": "R", + "CGD": "R", + "CGH": "R", + "CGK": "R", + "CGN": "R", + "CGW": "R", + "CGC": "R", + "CGR": "R", + "CGG": "R", + "CGA": "R", + "CGM": "R", + "CGV": "R", + "CGY": "R", + "CGS": "R", + "CGT": "R", + "CAC": "H", + "CAR": "Q", + "CAG": "Q", + "CAA": "Q", + "CAY": "H", + "CAT": "H", + "CTB": "L", + "CTD": "L", + "CTH": "L", + "CTK": "L", + "CTN": "L", + "CTW": "L", + "CTC": "L", + "CTR": "L", + "CTG": "L", + "CTA": "L", + "CTM": "L", + "CTV": "L", + "CTY": "L", + "CTS": "L", + "CTT": "L", + "GCB": "A", + "GCD": "A", + "GCH": "A", + "GCK": "A", + "GCN": "A", + "GCW": "A", + "GCC": "A", + "GCR": "A", + "GCG": "A", + "GCA": "A", + "GCM": "A", + "GCV": "A", + "GCY": "A", + "GCS": "A", + "GCT": "A", + "GGB": "G", + "GGD": "G", + "GGH": "G", + "GGK": "G", + "GGN": "G", + "GGW": "G", + "GGC": "G", + "GGR": "G", + "GGG": "G", + "GGA": "G", + "GGM": "G", + "GGV": "G", + "GGY": "G", + "GGS": "G", + "GGT": "G", + "GAC": "D", + "GAR": "E", + "GAG": "E", + "GAA": "E", + "GAY": "D", + "GAT": "D", + "GTB": "V", + "GTD": "V", + "GTH": "V", + "GTK": "V", + "GTN": "V", + "GTW": "V", + "GTC": "V", + "GTR": "V", + "GTG": "V", + "GTA": "V", + "GTM": "V", + "GTV": "V", + "GTY": "V", + "GTS": "V", + "GTT": "V", + "ACB": "T", + "ACD": "T", + "ACH": "T", + "ACK": "T", + "ACN": "T", + "ACW": "T", + "ACC": "T", + "ACR": "T", + "ACG": "T", + "ACA": "T", + "ACM": "T", + "ACV": "T", + "ACY": "T", + "ACS": "T", + "ACT": "T", + "AGB": "S", + "AGD": "S", + "AGH": "S", + "AGK": "S", + "AGN": "S", + "AGW": "S", + "AGC": "S", + "AGR": "S", + "AGG": "S", + "AGA": "S", + "AGM": "S", + "AGV": "S", + "AGY": "S", + "AGS": "S", + "AGT": "S", + "AAC": "N", + "AAR": "K", + "AAG": "K", + "AAA": "K", + "AAY": "N", + "AAT": "N", + "ATC": "I", + "ATR": "M", + "ATG": "M", + "ATA": "M", + "ATY": "I", + "ATT": "I", + "YTR": "L", + "YTG": "L", + "YTA": "L", + "TCB": "S", + "TCD": "S", + "TCH": "S", + "TCK": "S", + "TCN": "S", + "TCW": "S", + "TCC": "S", + "TCR": "S", + "TCG": "S", + "TCA": "S", + "TCM": "S", + "TCV": "S", + "TCY": "S", + "TCS": "S", + "TCT": "S", + "TGC": "C", + "TGR": "W", + "TGG": "W", + "TGA": "W", + "TGY": "C", + "TGT": "C", + "TAC": "Y", + "TAR": "*", + "TAG": "*", + "TAA": "*", + "TAY": "Y", + "TAT": "Y", + "TTC": "F", + "TTR": "L", + "TTG": "L", + "TTA": "L", + "TTY": "F", + "TTT": "F", + }, + "start_table": { + "DTG": "M", + "KTG": "M", + "WTG": "M", + "CCB": "P", + "CCD": "P", + "CCH": "P", + "CCK": "P", + "CCN": "P", + "CCW": "P", + "CCC": "P", + "CCR": "P", + "CCG": "P", + "CCA": "P", + "CCM": "P", + "CCV": "P", + "CCY": "P", + "CCS": "P", + "CCT": "P", + "CGB": "R", + "CGD": "R", + "CGH": "R", + "CGK": "R", + "CGN": "R", + "CGW": "R", + "CGC": "R", + "CGR": "R", + "CGG": "R", + "CGA": "R", + "CGM": "R", + "CGV": "R", + "CGY": "R", + "CGS": "R", + "CGT": "R", + "CAC": "H", + "CAR": "Q", + "CAG": "Q", + "CAA": "Q", + "CAY": "H", + "CAT": "H", + "CTB": "L", + "CTD": "L", + "CTH": "L", + "CTK": "L", + "CTN": "L", + "CTW": "L", + "CTC": "L", + "CTR": "L", + "CTG": "L", + "CTA": "L", + "CTM": "L", + "CTV": "L", + "CTY": "L", + "CTS": "L", + "CTT": "L", + "RTG": "M", + "GCB": "A", + "GCD": "A", + "GCH": "A", + "GCK": "A", + "GCN": "A", + "GCW": "A", + "GCC": "A", + "GCR": "A", + "GCG": "A", + "GCA": "A", + "GCM": "A", + "GCV": "A", + "GCY": "A", + "GCS": "A", + "GCT": "A", + "GGB": "G", + "GGD": "G", + "GGH": "G", + "GGK": "G", + "GGN": "G", + "GGW": "G", + "GGC": "G", + "GGR": "G", + "GGG": "G", + "GGA": "G", + "GGM": "G", + "GGV": "G", + "GGY": "G", + "GGS": "G", + "GGT": "G", + "GAC": "D", + "GAR": "E", + "GAG": "E", + "GAA": "E", + "GAY": "D", + "GAT": "D", + "GTH": "V", + "GTW": "V", + "GTC": "V", + "GTG": "M", + "GTA": "V", + "GTM": "V", + "GTY": "V", + "GTT": "V", + "ACB": "T", + "ACD": "T", + "ACH": "T", + "ACK": "T", + "ACN": "T", + "ACW": "T", + "ACC": "T", + "ACR": "T", + "ACG": "T", + "ACA": "T", + "ACM": "T", + "ACV": "T", + "ACY": "T", + "ACS": "T", + "ACT": "T", + "AGB": "S", + "AGD": "S", + "AGH": "S", + "AGK": "S", + "AGN": "S", + "AGW": "S", + "AGC": "S", + "AGR": "S", + "AGG": "S", + "AGA": "S", + "AGM": "S", + "AGV": "S", + "AGY": "S", + "AGS": "S", + "AGT": "S", + "AAC": "N", + "AAR": "K", + "AAG": "K", + "AAA": "K", + "AAY": "N", + "AAT": "N", + "ATB": "M", + "ATD": "M", + "ATH": "M", + "ATK": "M", + "ATN": "M", + "ATW": "M", + "ATC": "M", + "ATR": "M", + "ATG": "M", + "ATA": "M", + "ATM": "M", + "ATV": "M", + "ATY": "M", + "ATS": "M", + "ATT": "M", + "YTA": "L", + "TCB": "S", + "TCD": "S", + "TCH": "S", + "TCK": "S", + "TCN": "S", + "TCW": "S", + "TCC": "S", + "TCR": "S", + "TCG": "S", + "TCA": "S", + "TCM": "S", + "TCV": "S", + "TCY": "S", + "TCS": "S", + "TCT": "S", + "TGC": "C", + "TGR": "W", + "TGG": "W", + "TGA": "W", + "TGY": "C", + "TGT": "C", + "TAC": "Y", + "TAR": "*", + "TAG": "*", + "TAA": "*", + "TAY": "Y", + "TAT": "Y", + "TTC": "F", + "TTG": "M", + "TTA": "L", + "TTY": "F", + "TTT": "F", + }, + }, + "6": { + "trans_table": { + "CCB": "P", + "CCD": "P", + "CCH": "P", + "CCK": "P", + "CCN": "P", + "CCW": "P", + "CCC": "P", + "CCR": "P", + "CCG": "P", + "CCA": "P", + "CCM": "P", + "CCV": "P", + "CCY": "P", + "CCS": "P", + "CCT": "P", + "CGB": "R", + "CGD": "R", + "CGH": "R", + "CGK": "R", + "CGN": "R", + "CGW": "R", + "CGC": "R", + "CGR": "R", + "CGG": "R", + "CGA": "R", + "CGM": "R", + "CGV": "R", + "CGY": "R", + "CGS": "R", + "CGT": "R", + "CAC": "H", + "CAR": "Q", + "CAG": "Q", + "CAA": "Q", + "CAY": "H", + "CAT": "H", + "CTB": "L", + "CTD": "L", + "CTH": "L", + "CTK": "L", + "CTN": "L", + "CTW": "L", + "CTC": "L", + "CTR": "L", + "CTG": "L", + "CTA": "L", + "CTM": "L", + "CTV": "L", + "CTY": "L", + "CTS": "L", + "CTT": "L", + "GCB": "A", + "GCD": "A", + "GCH": "A", + "GCK": "A", + "GCN": "A", + "GCW": "A", + "GCC": "A", + "GCR": "A", + "GCG": "A", + "GCA": "A", + "GCM": "A", + "GCV": "A", + "GCY": "A", + "GCS": "A", + "GCT": "A", + "GGB": "G", + "GGD": "G", + "GGH": "G", + "GGK": "G", + "GGN": "G", + "GGW": "G", + "GGC": "G", + "GGR": "G", + "GGG": "G", + "GGA": "G", + "GGM": "G", + "GGV": "G", + "GGY": "G", + "GGS": "G", + "GGT": "G", + "GAC": "D", + "GAR": "E", + "GAG": "E", + "GAA": "E", + "GAY": "D", + "GAT": "D", + "GTB": "V", + "GTD": "V", + "GTH": "V", + "GTK": "V", + "GTN": "V", + "GTW": "V", + "GTC": "V", + "GTR": "V", + "GTG": "V", + "GTA": "V", + "GTM": "V", + "GTV": "V", + "GTY": "V", + "GTS": "V", + "GTT": "V", + "ACB": "T", + "ACD": "T", + "ACH": "T", + "ACK": "T", + "ACN": "T", + "ACW": "T", + "ACC": "T", + "ACR": "T", + "ACG": "T", + "ACA": "T", + "ACM": "T", + "ACV": "T", + "ACY": "T", + "ACS": "T", + "ACT": "T", + "AGC": "S", + "AGR": "R", + "AGG": "R", + "AGA": "R", + "AGY": "S", + "AGT": "S", + "AAC": "N", + "AAR": "K", + "AAG": "K", + "AAA": "K", + "AAY": "N", + "AAT": "N", + "ATH": "I", + "ATW": "I", + "ATC": "I", + "ATG": "M", + "ATA": "I", + "ATM": "I", + "ATY": "I", + "ATT": "I", + "MGR": "R", + "MGG": "R", + "MGA": "R", + "YAR": "Q", + "YAG": "Q", + "YAA": "Q", + "YTR": "L", + "YTG": "L", + "YTA": "L", + "TCB": "S", + "TCD": "S", + "TCH": "S", + "TCK": "S", + "TCN": "S", + "TCW": "S", + "TCC": "S", + "TCR": "S", + "TCG": "S", + "TCA": "S", + "TCM": "S", + "TCV": "S", + "TCY": "S", + "TCS": "S", + "TCT": "S", + "TGC": "C", + "TGG": "W", + "TGA": "*", + "TGY": "C", + "TGT": "C", + "TAC": "Y", + "TAR": "Q", + "TAG": "Q", + "TAA": "Q", + "TAY": "Y", + "TAT": "Y", + "TTC": "F", + "TTR": "L", + "TTG": "L", + "TTA": "L", + "TTY": "F", + "TTT": "F", + }, + "start_table": { + "CCB": "P", + "CCD": "P", + "CCH": "P", + "CCK": "P", + "CCN": "P", + "CCW": "P", + "CCC": "P", + "CCR": "P", + "CCG": "P", + "CCA": "P", + "CCM": "P", + "CCV": "P", + "CCY": "P", + "CCS": "P", + "CCT": "P", + "CGB": "R", + "CGD": "R", + "CGH": "R", + "CGK": "R", + "CGN": "R", + "CGW": "R", + "CGC": "R", + "CGR": "R", + "CGG": "R", + "CGA": "R", + "CGM": "R", + "CGV": "R", + "CGY": "R", + "CGS": "R", + "CGT": "R", + "CAC": "H", + "CAR": "Q", + "CAG": "Q", + "CAA": "Q", + "CAY": "H", + "CAT": "H", + "CTB": "L", + "CTD": "L", + "CTH": "L", + "CTK": "L", + "CTN": "L", + "CTW": "L", + "CTC": "L", + "CTR": "L", + "CTG": "L", + "CTA": "L", + "CTM": "L", + "CTV": "L", + "CTY": "L", + "CTS": "L", + "CTT": "L", + "GCB": "A", + "GCD": "A", + "GCH": "A", + "GCK": "A", + "GCN": "A", + "GCW": "A", + "GCC": "A", + "GCR": "A", + "GCG": "A", + "GCA": "A", + "GCM": "A", + "GCV": "A", + "GCY": "A", + "GCS": "A", + "GCT": "A", + "GGB": "G", + "GGD": "G", + "GGH": "G", + "GGK": "G", + "GGN": "G", + "GGW": "G", + "GGC": "G", + "GGR": "G", + "GGG": "G", + "GGA": "G", + "GGM": "G", + "GGV": "G", + "GGY": "G", + "GGS": "G", + "GGT": "G", + "GAC": "D", + "GAR": "E", + "GAG": "E", + "GAA": "E", + "GAY": "D", + "GAT": "D", + "GTB": "V", + "GTD": "V", + "GTH": "V", + "GTK": "V", + "GTN": "V", + "GTW": "V", + "GTC": "V", + "GTR": "V", + "GTG": "V", + "GTA": "V", + "GTM": "V", + "GTV": "V", + "GTY": "V", + "GTS": "V", + "GTT": "V", + "ACB": "T", + "ACD": "T", + "ACH": "T", + "ACK": "T", + "ACN": "T", + "ACW": "T", + "ACC": "T", + "ACR": "T", + "ACG": "T", + "ACA": "T", + "ACM": "T", + "ACV": "T", + "ACY": "T", + "ACS": "T", + "ACT": "T", + "AGC": "S", + "AGR": "R", + "AGG": "R", + "AGA": "R", + "AGY": "S", + "AGT": "S", + "AAC": "N", + "AAR": "K", + "AAG": "K", + "AAA": "K", + "AAY": "N", + "AAT": "N", + "ATH": "I", + "ATW": "I", + "ATC": "I", + "ATG": "M", + "ATA": "I", + "ATM": "I", + "ATY": "I", + "ATT": "I", + "MGR": "R", + "MGG": "R", + "MGA": "R", + "YAR": "Q", + "YAG": "Q", + "YAA": "Q", + "YTR": "L", + "YTG": "L", + "YTA": "L", + "TCB": "S", + "TCD": "S", + "TCH": "S", + "TCK": "S", + "TCN": "S", + "TCW": "S", + "TCC": "S", + "TCR": "S", + "TCG": "S", + "TCA": "S", + "TCM": "S", + "TCV": "S", + "TCY": "S", + "TCS": "S", + "TCT": "S", + "TGC": "C", + "TGG": "W", + "TGA": "*", + "TGY": "C", + "TGT": "C", + "TAC": "Y", + "TAR": "Q", + "TAG": "Q", + "TAA": "Q", + "TAY": "Y", + "TAT": "Y", + "TTC": "F", + "TTR": "L", + "TTG": "L", + "TTA": "L", + "TTY": "F", + "TTT": "F", + }, + }, + "9": { + "trans_table": { + "CCB": "P", + "CCD": "P", + "CCH": "P", + "CCK": "P", + "CCN": "P", + "CCW": "P", + "CCC": "P", + "CCR": "P", + "CCG": "P", + "CCA": "P", + "CCM": "P", + "CCV": "P", + "CCY": "P", + "CCS": "P", + "CCT": "P", + "CGB": "R", + "CGD": "R", + "CGH": "R", + "CGK": "R", + "CGN": "R", + "CGW": "R", + "CGC": "R", + "CGR": "R", + "CGG": "R", + "CGA": "R", + "CGM": "R", + "CGV": "R", + "CGY": "R", + "CGS": "R", + "CGT": "R", + "CAC": "H", + "CAR": "Q", + "CAG": "Q", + "CAA": "Q", + "CAY": "H", + "CAT": "H", + "CTB": "L", + "CTD": "L", + "CTH": "L", + "CTK": "L", + "CTN": "L", + "CTW": "L", + "CTC": "L", + "CTR": "L", + "CTG": "L", + "CTA": "L", + "CTM": "L", + "CTV": "L", + "CTY": "L", + "CTS": "L", + "CTT": "L", + "GCB": "A", + "GCD": "A", + "GCH": "A", + "GCK": "A", + "GCN": "A", + "GCW": "A", + "GCC": "A", + "GCR": "A", + "GCG": "A", + "GCA": "A", + "GCM": "A", + "GCV": "A", + "GCY": "A", + "GCS": "A", + "GCT": "A", + "GGB": "G", + "GGD": "G", + "GGH": "G", + "GGK": "G", + "GGN": "G", + "GGW": "G", + "GGC": "G", + "GGR": "G", + "GGG": "G", + "GGA": "G", + "GGM": "G", + "GGV": "G", + "GGY": "G", + "GGS": "G", + "GGT": "G", + "GAC": "D", + "GAR": "E", + "GAG": "E", + "GAA": "E", + "GAY": "D", + "GAT": "D", + "GTB": "V", + "GTD": "V", + "GTH": "V", + "GTK": "V", + "GTN": "V", + "GTW": "V", + "GTC": "V", + "GTR": "V", + "GTG": "V", + "GTA": "V", + "GTM": "V", + "GTV": "V", + "GTY": "V", + "GTS": "V", + "GTT": "V", + "ACB": "T", + "ACD": "T", + "ACH": "T", + "ACK": "T", + "ACN": "T", + "ACW": "T", + "ACC": "T", + "ACR": "T", + "ACG": "T", + "ACA": "T", + "ACM": "T", + "ACV": "T", + "ACY": "T", + "ACS": "T", + "ACT": "T", + "AGB": "S", + "AGD": "S", + "AGH": "S", + "AGK": "S", + "AGN": "S", + "AGW": "S", + "AGC": "S", + "AGR": "S", + "AGG": "S", + "AGA": "S", + "AGM": "S", + "AGV": "S", + "AGY": "S", + "AGS": "S", + "AGT": "S", + "AAH": "N", + "AAW": "N", + "AAC": "N", + "AAG": "K", + "AAA": "N", + "AAM": "N", + "AAY": "N", + "AAT": "N", + "ATH": "I", + "ATW": "I", + "ATC": "I", + "ATG": "M", + "ATA": "I", + "ATM": "I", + "ATY": "I", + "ATT": "I", + "YTR": "L", + "YTG": "L", + "YTA": "L", + "TCB": "S", + "TCD": "S", + "TCH": "S", + "TCK": "S", + "TCN": "S", + "TCW": "S", + "TCC": "S", + "TCR": "S", + "TCG": "S", + "TCA": "S", + "TCM": "S", + "TCV": "S", + "TCY": "S", + "TCS": "S", + "TCT": "S", + "TGC": "C", + "TGR": "W", + "TGG": "W", + "TGA": "W", + "TGY": "C", + "TGT": "C", + "TAC": "Y", + "TAR": "*", + "TAG": "*", + "TAA": "*", + "TAY": "Y", + "TAT": "Y", + "TTC": "F", + "TTR": "L", + "TTG": "L", + "TTA": "L", + "TTY": "F", + "TTT": "F", + }, + "start_table": { + "CCB": "P", + "CCD": "P", + "CCH": "P", + "CCK": "P", + "CCN": "P", + "CCW": "P", + "CCC": "P", + "CCR": "P", + "CCG": "P", + "CCA": "P", + "CCM": "P", + "CCV": "P", + "CCY": "P", + "CCS": "P", + "CCT": "P", + "CGB": "R", + "CGD": "R", + "CGH": "R", + "CGK": "R", + "CGN": "R", + "CGW": "R", + "CGC": "R", + "CGR": "R", + "CGG": "R", + "CGA": "R", + "CGM": "R", + "CGV": "R", + "CGY": "R", + "CGS": "R", + "CGT": "R", + "CAC": "H", + "CAR": "Q", + "CAG": "Q", + "CAA": "Q", + "CAY": "H", + "CAT": "H", + "CTB": "L", + "CTD": "L", + "CTH": "L", + "CTK": "L", + "CTN": "L", + "CTW": "L", + "CTC": "L", + "CTR": "L", + "CTG": "L", + "CTA": "L", + "CTM": "L", + "CTV": "L", + "CTY": "L", + "CTS": "L", + "CTT": "L", + "RTG": "M", + "GCB": "A", + "GCD": "A", + "GCH": "A", + "GCK": "A", + "GCN": "A", + "GCW": "A", + "GCC": "A", + "GCR": "A", + "GCG": "A", + "GCA": "A", + "GCM": "A", + "GCV": "A", + "GCY": "A", + "GCS": "A", + "GCT": "A", + "GGB": "G", + "GGD": "G", + "GGH": "G", + "GGK": "G", + "GGN": "G", + "GGW": "G", + "GGC": "G", + "GGR": "G", + "GGG": "G", + "GGA": "G", + "GGM": "G", + "GGV": "G", + "GGY": "G", + "GGS": "G", + "GGT": "G", + "GAC": "D", + "GAR": "E", + "GAG": "E", + "GAA": "E", + "GAY": "D", + "GAT": "D", + "GTH": "V", + "GTW": "V", + "GTC": "V", + "GTG": "M", + "GTA": "V", + "GTM": "V", + "GTY": "V", + "GTT": "V", + "ACB": "T", + "ACD": "T", + "ACH": "T", + "ACK": "T", + "ACN": "T", + "ACW": "T", + "ACC": "T", + "ACR": "T", + "ACG": "T", + "ACA": "T", + "ACM": "T", + "ACV": "T", + "ACY": "T", + "ACS": "T", + "ACT": "T", + "AGB": "S", + "AGD": "S", + "AGH": "S", + "AGK": "S", + "AGN": "S", + "AGW": "S", + "AGC": "S", + "AGR": "S", + "AGG": "S", + "AGA": "S", + "AGM": "S", + "AGV": "S", + "AGY": "S", + "AGS": "S", + "AGT": "S", + "AAH": "N", + "AAW": "N", + "AAC": "N", + "AAG": "K", + "AAA": "N", + "AAM": "N", + "AAY": "N", + "AAT": "N", + "ATH": "I", + "ATW": "I", + "ATC": "I", + "ATG": "M", + "ATA": "I", + "ATM": "I", + "ATY": "I", + "ATT": "I", + "YTR": "L", + "YTG": "L", + "YTA": "L", + "TCB": "S", + "TCD": "S", + "TCH": "S", + "TCK": "S", + "TCN": "S", + "TCW": "S", + "TCC": "S", + "TCR": "S", + "TCG": "S", + "TCA": "S", + "TCM": "S", + "TCV": "S", + "TCY": "S", + "TCS": "S", + "TCT": "S", + "TGC": "C", + "TGR": "W", + "TGG": "W", + "TGA": "W", + "TGY": "C", + "TGT": "C", + "TAC": "Y", + "TAR": "*", + "TAG": "*", + "TAA": "*", + "TAY": "Y", + "TAT": "Y", + "TTC": "F", + "TTR": "L", + "TTG": "L", + "TTA": "L", + "TTY": "F", + "TTT": "F", + }, + }, + "10": { + "trans_table": { + "CCB": "P", + "CCD": "P", + "CCH": "P", + "CCK": "P", + "CCN": "P", + "CCW": "P", + "CCC": "P", + "CCR": "P", + "CCG": "P", + "CCA": "P", + "CCM": "P", + "CCV": "P", + "CCY": "P", + "CCS": "P", + "CCT": "P", + "CGB": "R", + "CGD": "R", + "CGH": "R", + "CGK": "R", + "CGN": "R", + "CGW": "R", + "CGC": "R", + "CGR": "R", + "CGG": "R", + "CGA": "R", + "CGM": "R", + "CGV": "R", + "CGY": "R", + "CGS": "R", + "CGT": "R", + "CAC": "H", + "CAR": "Q", + "CAG": "Q", + "CAA": "Q", + "CAY": "H", + "CAT": "H", + "CTB": "L", + "CTD": "L", + "CTH": "L", + "CTK": "L", + "CTN": "L", + "CTW": "L", + "CTC": "L", + "CTR": "L", + "CTG": "L", + "CTA": "L", + "CTM": "L", + "CTV": "L", + "CTY": "L", + "CTS": "L", + "CTT": "L", + "GCB": "A", + "GCD": "A", + "GCH": "A", + "GCK": "A", + "GCN": "A", + "GCW": "A", + "GCC": "A", + "GCR": "A", + "GCG": "A", + "GCA": "A", + "GCM": "A", + "GCV": "A", + "GCY": "A", + "GCS": "A", + "GCT": "A", + "GGB": "G", + "GGD": "G", + "GGH": "G", + "GGK": "G", + "GGN": "G", + "GGW": "G", + "GGC": "G", + "GGR": "G", + "GGG": "G", + "GGA": "G", + "GGM": "G", + "GGV": "G", + "GGY": "G", + "GGS": "G", + "GGT": "G", + "GAC": "D", + "GAR": "E", + "GAG": "E", + "GAA": "E", + "GAY": "D", + "GAT": "D", + "GTB": "V", + "GTD": "V", + "GTH": "V", + "GTK": "V", + "GTN": "V", + "GTW": "V", + "GTC": "V", + "GTR": "V", + "GTG": "V", + "GTA": "V", + "GTM": "V", + "GTV": "V", + "GTY": "V", + "GTS": "V", + "GTT": "V", + "ACB": "T", + "ACD": "T", + "ACH": "T", + "ACK": "T", + "ACN": "T", + "ACW": "T", + "ACC": "T", + "ACR": "T", + "ACG": "T", + "ACA": "T", + "ACM": "T", + "ACV": "T", + "ACY": "T", + "ACS": "T", + "ACT": "T", + "AGC": "S", + "AGR": "R", + "AGG": "R", + "AGA": "R", + "AGY": "S", + "AGT": "S", + "AAC": "N", + "AAR": "K", + "AAG": "K", + "AAA": "K", + "AAY": "N", + "AAT": "N", + "ATH": "I", + "ATW": "I", + "ATC": "I", + "ATG": "M", + "ATA": "I", + "ATM": "I", + "ATY": "I", + "ATT": "I", + "MGR": "R", + "MGG": "R", + "MGA": "R", + "YTR": "L", + "YTG": "L", + "YTA": "L", + "TCB": "S", + "TCD": "S", + "TCH": "S", + "TCK": "S", + "TCN": "S", + "TCW": "S", + "TCC": "S", + "TCR": "S", + "TCG": "S", + "TCA": "S", + "TCM": "S", + "TCV": "S", + "TCY": "S", + "TCS": "S", + "TCT": "S", + "TGH": "C", + "TGW": "C", + "TGC": "C", + "TGG": "W", + "TGA": "C", + "TGM": "C", + "TGY": "C", + "TGT": "C", + "TAC": "Y", + "TAR": "*", + "TAG": "*", + "TAA": "*", + "TAY": "Y", + "TAT": "Y", + "TTC": "F", + "TTR": "L", + "TTG": "L", + "TTA": "L", + "TTY": "F", + "TTT": "F", + }, + "start_table": { + "CCB": "P", + "CCD": "P", + "CCH": "P", + "CCK": "P", + "CCN": "P", + "CCW": "P", + "CCC": "P", + "CCR": "P", + "CCG": "P", + "CCA": "P", + "CCM": "P", + "CCV": "P", + "CCY": "P", + "CCS": "P", + "CCT": "P", + "CGB": "R", + "CGD": "R", + "CGH": "R", + "CGK": "R", + "CGN": "R", + "CGW": "R", + "CGC": "R", + "CGR": "R", + "CGG": "R", + "CGA": "R", + "CGM": "R", + "CGV": "R", + "CGY": "R", + "CGS": "R", + "CGT": "R", + "CAC": "H", + "CAR": "Q", + "CAG": "Q", + "CAA": "Q", + "CAY": "H", + "CAT": "H", + "CTB": "L", + "CTD": "L", + "CTH": "L", + "CTK": "L", + "CTN": "L", + "CTW": "L", + "CTC": "L", + "CTR": "L", + "CTG": "L", + "CTA": "L", + "CTM": "L", + "CTV": "L", + "CTY": "L", + "CTS": "L", + "CTT": "L", + "GCB": "A", + "GCD": "A", + "GCH": "A", + "GCK": "A", + "GCN": "A", + "GCW": "A", + "GCC": "A", + "GCR": "A", + "GCG": "A", + "GCA": "A", + "GCM": "A", + "GCV": "A", + "GCY": "A", + "GCS": "A", + "GCT": "A", + "GGB": "G", + "GGD": "G", + "GGH": "G", + "GGK": "G", + "GGN": "G", + "GGW": "G", + "GGC": "G", + "GGR": "G", + "GGG": "G", + "GGA": "G", + "GGM": "G", + "GGV": "G", + "GGY": "G", + "GGS": "G", + "GGT": "G", + "GAC": "D", + "GAR": "E", + "GAG": "E", + "GAA": "E", + "GAY": "D", + "GAT": "D", + "GTB": "V", + "GTD": "V", + "GTH": "V", + "GTK": "V", + "GTN": "V", + "GTW": "V", + "GTC": "V", + "GTR": "V", + "GTG": "V", + "GTA": "V", + "GTM": "V", + "GTV": "V", + "GTY": "V", + "GTS": "V", + "GTT": "V", + "ACB": "T", + "ACD": "T", + "ACH": "T", + "ACK": "T", + "ACN": "T", + "ACW": "T", + "ACC": "T", + "ACR": "T", + "ACG": "T", + "ACA": "T", + "ACM": "T", + "ACV": "T", + "ACY": "T", + "ACS": "T", + "ACT": "T", + "AGC": "S", + "AGR": "R", + "AGG": "R", + "AGA": "R", + "AGY": "S", + "AGT": "S", + "AAC": "N", + "AAR": "K", + "AAG": "K", + "AAA": "K", + "AAY": "N", + "AAT": "N", + "ATH": "I", + "ATW": "I", + "ATC": "I", + "ATG": "M", + "ATA": "I", + "ATM": "I", + "ATY": "I", + "ATT": "I", + "MGR": "R", + "MGG": "R", + "MGA": "R", + "YTR": "L", + "YTG": "L", + "YTA": "L", + "TCB": "S", + "TCD": "S", + "TCH": "S", + "TCK": "S", + "TCN": "S", + "TCW": "S", + "TCC": "S", + "TCR": "S", + "TCG": "S", + "TCA": "S", + "TCM": "S", + "TCV": "S", + "TCY": "S", + "TCS": "S", + "TCT": "S", + "TGH": "C", + "TGW": "C", + "TGC": "C", + "TGG": "W", + "TGA": "C", + "TGM": "C", + "TGY": "C", + "TGT": "C", + "TAC": "Y", + "TAR": "*", + "TAG": "*", + "TAA": "*", + "TAY": "Y", + "TAT": "Y", + "TTC": "F", + "TTR": "L", + "TTG": "L", + "TTA": "L", + "TTY": "F", + "TTT": "F", + }, + }, + "11": { + "trans_table": { + "CCB": "P", + "CCD": "P", + "CCH": "P", + "CCK": "P", + "CCN": "P", + "CCW": "P", + "CCC": "P", + "CCR": "P", + "CCG": "P", + "CCA": "P", + "CCM": "P", + "CCV": "P", + "CCY": "P", + "CCS": "P", + "CCT": "P", + "CGB": "R", + "CGD": "R", + "CGH": "R", + "CGK": "R", + "CGN": "R", + "CGW": "R", + "CGC": "R", + "CGR": "R", + "CGG": "R", + "CGA": "R", + "CGM": "R", + "CGV": "R", + "CGY": "R", + "CGS": "R", + "CGT": "R", + "CAC": "H", + "CAR": "Q", + "CAG": "Q", + "CAA": "Q", + "CAY": "H", + "CAT": "H", + "CTB": "L", + "CTD": "L", + "CTH": "L", + "CTK": "L", + "CTN": "L", + "CTW": "L", + "CTC": "L", + "CTR": "L", + "CTG": "L", + "CTA": "L", + "CTM": "L", + "CTV": "L", + "CTY": "L", + "CTS": "L", + "CTT": "L", + "GCB": "A", + "GCD": "A", + "GCH": "A", + "GCK": "A", + "GCN": "A", + "GCW": "A", + "GCC": "A", + "GCR": "A", + "GCG": "A", + "GCA": "A", + "GCM": "A", + "GCV": "A", + "GCY": "A", + "GCS": "A", + "GCT": "A", + "GGB": "G", + "GGD": "G", + "GGH": "G", + "GGK": "G", + "GGN": "G", + "GGW": "G", + "GGC": "G", + "GGR": "G", + "GGG": "G", + "GGA": "G", + "GGM": "G", + "GGV": "G", + "GGY": "G", + "GGS": "G", + "GGT": "G", + "GAC": "D", + "GAR": "E", + "GAG": "E", + "GAA": "E", + "GAY": "D", + "GAT": "D", + "GTB": "V", + "GTD": "V", + "GTH": "V", + "GTK": "V", + "GTN": "V", + "GTW": "V", + "GTC": "V", + "GTR": "V", + "GTG": "V", + "GTA": "V", + "GTM": "V", + "GTV": "V", + "GTY": "V", + "GTS": "V", + "GTT": "V", + "ACB": "T", + "ACD": "T", + "ACH": "T", + "ACK": "T", + "ACN": "T", + "ACW": "T", + "ACC": "T", + "ACR": "T", + "ACG": "T", + "ACA": "T", + "ACM": "T", + "ACV": "T", + "ACY": "T", + "ACS": "T", + "ACT": "T", + "AGC": "S", + "AGR": "R", + "AGG": "R", + "AGA": "R", + "AGY": "S", + "AGT": "S", + "AAC": "N", + "AAR": "K", + "AAG": "K", + "AAA": "K", + "AAY": "N", + "AAT": "N", + "ATH": "I", + "ATW": "I", + "ATC": "I", + "ATG": "M", + "ATA": "I", + "ATM": "I", + "ATY": "I", + "ATT": "I", + "MGR": "R", + "MGG": "R", + "MGA": "R", + "YTR": "L", + "YTG": "L", + "YTA": "L", + "TCB": "S", + "TCD": "S", + "TCH": "S", + "TCK": "S", + "TCN": "S", + "TCW": "S", + "TCC": "S", + "TCR": "S", + "TCG": "S", + "TCA": "S", + "TCM": "S", + "TCV": "S", + "TCY": "S", + "TCS": "S", + "TCT": "S", + "TRA": "*", + "TGC": "C", + "TGG": "W", + "TGA": "*", + "TGY": "C", + "TGT": "C", + "TAC": "Y", + "TAR": "*", + "TAG": "*", + "TAA": "*", + "TAY": "Y", + "TAT": "Y", + "TTC": "F", + "TTR": "L", + "TTG": "L", + "TTA": "L", + "TTY": "F", + "TTT": "F", + }, + "start_table": { + "BTG": "M", + "DTG": "M", + "HTG": "M", + "KTG": "M", + "NTG": "M", + "WTG": "M", + "CCB": "P", + "CCD": "P", + "CCH": "P", + "CCK": "P", + "CCN": "P", + "CCW": "P", + "CCC": "P", + "CCR": "P", + "CCG": "P", + "CCA": "P", + "CCM": "P", + "CCV": "P", + "CCY": "P", + "CCS": "P", + "CCT": "P", + "CGB": "R", + "CGD": "R", + "CGH": "R", + "CGK": "R", + "CGN": "R", + "CGW": "R", + "CGC": "R", + "CGR": "R", + "CGG": "R", + "CGA": "R", + "CGM": "R", + "CGV": "R", + "CGY": "R", + "CGS": "R", + "CGT": "R", + "CAC": "H", + "CAR": "Q", + "CAG": "Q", + "CAA": "Q", + "CAY": "H", + "CAT": "H", + "CTH": "L", + "CTW": "L", + "CTC": "L", + "CTG": "M", + "CTA": "L", + "CTM": "L", + "CTY": "L", + "CTT": "L", + "RTG": "M", + "GCB": "A", + "GCD": "A", + "GCH": "A", + "GCK": "A", + "GCN": "A", + "GCW": "A", + "GCC": "A", + "GCR": "A", + "GCG": "A", + "GCA": "A", + "GCM": "A", + "GCV": "A", + "GCY": "A", + "GCS": "A", + "GCT": "A", + "GGB": "G", + "GGD": "G", + "GGH": "G", + "GGK": "G", + "GGN": "G", + "GGW": "G", + "GGC": "G", + "GGR": "G", + "GGG": "G", + "GGA": "G", + "GGM": "G", + "GGV": "G", + "GGY": "G", + "GGS": "G", + "GGT": "G", + "GAC": "D", + "GAR": "E", + "GAG": "E", + "GAA": "E", + "GAY": "D", + "GAT": "D", + "GTH": "V", + "GTW": "V", + "GTC": "V", + "GTG": "M", + "GTA": "V", + "GTM": "V", + "GTY": "V", + "GTT": "V", + "ACB": "T", + "ACD": "T", + "ACH": "T", + "ACK": "T", + "ACN": "T", + "ACW": "T", + "ACC": "T", + "ACR": "T", + "ACG": "T", + "ACA": "T", + "ACM": "T", + "ACV": "T", + "ACY": "T", + "ACS": "T", + "ACT": "T", + "AGC": "S", + "AGR": "R", + "AGG": "R", + "AGA": "R", + "AGY": "S", + "AGT": "S", + "AAC": "N", + "AAR": "K", + "AAG": "K", + "AAA": "K", + "AAY": "N", + "AAT": "N", + "ATB": "M", + "ATD": "M", + "ATH": "M", + "ATK": "M", + "ATN": "M", + "ATW": "M", + "ATC": "M", + "ATR": "M", + "ATG": "M", + "ATA": "M", + "ATM": "M", + "ATV": "M", + "ATY": "M", + "ATS": "M", + "ATT": "M", + "MGR": "R", + "MGG": "R", + "MGA": "R", + "MTG": "M", + "VTG": "M", + "YTG": "M", + "YTA": "L", + "STG": "M", + "TCB": "S", + "TCD": "S", + "TCH": "S", + "TCK": "S", + "TCN": "S", + "TCW": "S", + "TCC": "S", + "TCR": "S", + "TCG": "S", + "TCA": "S", + "TCM": "S", + "TCV": "S", + "TCY": "S", + "TCS": "S", + "TCT": "S", + "TRA": "*", + "TGC": "C", + "TGG": "W", + "TGA": "*", + "TGY": "C", + "TGT": "C", + "TAC": "Y", + "TAR": "*", + "TAG": "*", + "TAA": "*", + "TAY": "Y", + "TAT": "Y", + "TTC": "F", + "TTG": "M", + "TTA": "L", + "TTY": "F", + "TTT": "F", + }, + }, + "12": { + "trans_table": { + "CCB": "P", + "CCD": "P", + "CCH": "P", + "CCK": "P", + "CCN": "P", + "CCW": "P", + "CCC": "P", + "CCR": "P", + "CCG": "P", + "CCA": "P", + "CCM": "P", + "CCV": "P", + "CCY": "P", + "CCS": "P", + "CCT": "P", + "CGB": "R", + "CGD": "R", + "CGH": "R", + "CGK": "R", + "CGN": "R", + "CGW": "R", + "CGC": "R", + "CGR": "R", + "CGG": "R", + "CGA": "R", + "CGM": "R", + "CGV": "R", + "CGY": "R", + "CGS": "R", + "CGT": "R", + "CAC": "H", + "CAR": "Q", + "CAG": "Q", + "CAA": "Q", + "CAY": "H", + "CAT": "H", + "CTH": "L", + "CTW": "L", + "CTC": "L", + "CTG": "S", + "CTA": "L", + "CTM": "L", + "CTY": "L", + "CTT": "L", + "GCB": "A", + "GCD": "A", + "GCH": "A", + "GCK": "A", + "GCN": "A", + "GCW": "A", + "GCC": "A", + "GCR": "A", + "GCG": "A", + "GCA": "A", + "GCM": "A", + "GCV": "A", + "GCY": "A", + "GCS": "A", + "GCT": "A", + "GGB": "G", + "GGD": "G", + "GGH": "G", + "GGK": "G", + "GGN": "G", + "GGW": "G", + "GGC": "G", + "GGR": "G", + "GGG": "G", + "GGA": "G", + "GGM": "G", + "GGV": "G", + "GGY": "G", + "GGS": "G", + "GGT": "G", + "GAC": "D", + "GAR": "E", + "GAG": "E", + "GAA": "E", + "GAY": "D", + "GAT": "D", + "GTB": "V", + "GTD": "V", + "GTH": "V", + "GTK": "V", + "GTN": "V", + "GTW": "V", + "GTC": "V", + "GTR": "V", + "GTG": "V", + "GTA": "V", + "GTM": "V", + "GTV": "V", + "GTY": "V", + "GTS": "V", + "GTT": "V", + "ACB": "T", + "ACD": "T", + "ACH": "T", + "ACK": "T", + "ACN": "T", + "ACW": "T", + "ACC": "T", + "ACR": "T", + "ACG": "T", + "ACA": "T", + "ACM": "T", + "ACV": "T", + "ACY": "T", + "ACS": "T", + "ACT": "T", + "AGC": "S", + "AGR": "R", + "AGG": "R", + "AGA": "R", + "AGY": "S", + "AGT": "S", + "AAC": "N", + "AAR": "K", + "AAG": "K", + "AAA": "K", + "AAY": "N", + "AAT": "N", + "ATH": "I", + "ATW": "I", + "ATC": "I", + "ATG": "M", + "ATA": "I", + "ATM": "I", + "ATY": "I", + "ATT": "I", + "MGR": "R", + "MGG": "R", + "MGA": "R", + "YTA": "L", + "TCB": "S", + "TCD": "S", + "TCH": "S", + "TCK": "S", + "TCN": "S", + "TCW": "S", + "TCC": "S", + "TCR": "S", + "TCG": "S", + "TCA": "S", + "TCM": "S", + "TCV": "S", + "TCY": "S", + "TCS": "S", + "TCT": "S", + "TRA": "*", + "TGC": "C", + "TGG": "W", + "TGA": "*", + "TGY": "C", + "TGT": "C", + "TAC": "Y", + "TAR": "*", + "TAG": "*", + "TAA": "*", + "TAY": "Y", + "TAT": "Y", + "TTC": "F", + "TTR": "L", + "TTG": "L", + "TTA": "L", + "TTY": "F", + "TTT": "F", + }, + "start_table": { + "CCB": "P", + "CCD": "P", + "CCH": "P", + "CCK": "P", + "CCN": "P", + "CCW": "P", + "CCC": "P", + "CCR": "P", + "CCG": "P", + "CCA": "P", + "CCM": "P", + "CCV": "P", + "CCY": "P", + "CCS": "P", + "CCT": "P", + "CGB": "R", + "CGD": "R", + "CGH": "R", + "CGK": "R", + "CGN": "R", + "CGW": "R", + "CGC": "R", + "CGR": "R", + "CGG": "R", + "CGA": "R", + "CGM": "R", + "CGV": "R", + "CGY": "R", + "CGS": "R", + "CGT": "R", + "CAC": "H", + "CAR": "Q", + "CAG": "Q", + "CAA": "Q", + "CAY": "H", + "CAT": "H", + "CTH": "L", + "CTW": "L", + "CTC": "L", + "CTG": "M", + "CTA": "L", + "CTM": "L", + "CTY": "L", + "CTT": "L", + "GCB": "A", + "GCD": "A", + "GCH": "A", + "GCK": "A", + "GCN": "A", + "GCW": "A", + "GCC": "A", + "GCR": "A", + "GCG": "A", + "GCA": "A", + "GCM": "A", + "GCV": "A", + "GCY": "A", + "GCS": "A", + "GCT": "A", + "GGB": "G", + "GGD": "G", + "GGH": "G", + "GGK": "G", + "GGN": "G", + "GGW": "G", + "GGC": "G", + "GGR": "G", + "GGG": "G", + "GGA": "G", + "GGM": "G", + "GGV": "G", + "GGY": "G", + "GGS": "G", + "GGT": "G", + "GAC": "D", + "GAR": "E", + "GAG": "E", + "GAA": "E", + "GAY": "D", + "GAT": "D", + "GTB": "V", + "GTD": "V", + "GTH": "V", + "GTK": "V", + "GTN": "V", + "GTW": "V", + "GTC": "V", + "GTR": "V", + "GTG": "V", + "GTA": "V", + "GTM": "V", + "GTV": "V", + "GTY": "V", + "GTS": "V", + "GTT": "V", + "ACB": "T", + "ACD": "T", + "ACH": "T", + "ACK": "T", + "ACN": "T", + "ACW": "T", + "ACC": "T", + "ACR": "T", + "ACG": "T", + "ACA": "T", + "ACM": "T", + "ACV": "T", + "ACY": "T", + "ACS": "T", + "ACT": "T", + "AGC": "S", + "AGR": "R", + "AGG": "R", + "AGA": "R", + "AGY": "S", + "AGT": "S", + "AAC": "N", + "AAR": "K", + "AAG": "K", + "AAA": "K", + "AAY": "N", + "AAT": "N", + "ATH": "I", + "ATW": "I", + "ATC": "I", + "ATG": "M", + "ATA": "I", + "ATM": "I", + "ATY": "I", + "ATT": "I", + "MGR": "R", + "MGG": "R", + "MGA": "R", + "MTG": "M", + "YTA": "L", + "TCB": "S", + "TCD": "S", + "TCH": "S", + "TCK": "S", + "TCN": "S", + "TCW": "S", + "TCC": "S", + "TCR": "S", + "TCG": "S", + "TCA": "S", + "TCM": "S", + "TCV": "S", + "TCY": "S", + "TCS": "S", + "TCT": "S", + "TRA": "*", + "TGC": "C", + "TGG": "W", + "TGA": "*", + "TGY": "C", + "TGT": "C", + "TAC": "Y", + "TAR": "*", + "TAG": "*", + "TAA": "*", + "TAY": "Y", + "TAT": "Y", + "TTC": "F", + "TTR": "L", + "TTG": "L", + "TTA": "L", + "TTY": "F", + "TTT": "F", + }, + }, + "13": { + "trans_table": { + "CCB": "P", + "CCD": "P", + "CCH": "P", + "CCK": "P", + "CCN": "P", + "CCW": "P", + "CCC": "P", + "CCR": "P", + "CCG": "P", + "CCA": "P", + "CCM": "P", + "CCV": "P", + "CCY": "P", + "CCS": "P", + "CCT": "P", + "CGB": "R", + "CGD": "R", + "CGH": "R", + "CGK": "R", + "CGN": "R", + "CGW": "R", + "CGC": "R", + "CGR": "R", + "CGG": "R", + "CGA": "R", + "CGM": "R", + "CGV": "R", + "CGY": "R", + "CGS": "R", + "CGT": "R", + "CAC": "H", + "CAR": "Q", + "CAG": "Q", + "CAA": "Q", + "CAY": "H", + "CAT": "H", + "CTB": "L", + "CTD": "L", + "CTH": "L", + "CTK": "L", + "CTN": "L", + "CTW": "L", + "CTC": "L", + "CTR": "L", + "CTG": "L", + "CTA": "L", + "CTM": "L", + "CTV": "L", + "CTY": "L", + "CTS": "L", + "CTT": "L", + "RGR": "G", + "RGG": "G", + "RGA": "G", + "GCB": "A", + "GCD": "A", + "GCH": "A", + "GCK": "A", + "GCN": "A", + "GCW": "A", + "GCC": "A", + "GCR": "A", + "GCG": "A", + "GCA": "A", + "GCM": "A", + "GCV": "A", + "GCY": "A", + "GCS": "A", + "GCT": "A", + "GGB": "G", + "GGD": "G", + "GGH": "G", + "GGK": "G", + "GGN": "G", + "GGW": "G", + "GGC": "G", + "GGR": "G", + "GGG": "G", + "GGA": "G", + "GGM": "G", + "GGV": "G", + "GGY": "G", + "GGS": "G", + "GGT": "G", + "GAC": "D", + "GAR": "E", + "GAG": "E", + "GAA": "E", + "GAY": "D", + "GAT": "D", + "GTB": "V", + "GTD": "V", + "GTH": "V", + "GTK": "V", + "GTN": "V", + "GTW": "V", + "GTC": "V", + "GTR": "V", + "GTG": "V", + "GTA": "V", + "GTM": "V", + "GTV": "V", + "GTY": "V", + "GTS": "V", + "GTT": "V", + "ACB": "T", + "ACD": "T", + "ACH": "T", + "ACK": "T", + "ACN": "T", + "ACW": "T", + "ACC": "T", + "ACR": "T", + "ACG": "T", + "ACA": "T", + "ACM": "T", + "ACV": "T", + "ACY": "T", + "ACS": "T", + "ACT": "T", + "AGC": "S", + "AGR": "G", + "AGG": "G", + "AGA": "G", + "AGY": "S", + "AGT": "S", + "AAC": "N", + "AAR": "K", + "AAG": "K", + "AAA": "K", + "AAY": "N", + "AAT": "N", + "ATC": "I", + "ATR": "M", + "ATG": "M", + "ATA": "M", + "ATY": "I", + "ATT": "I", + "YTR": "L", + "YTG": "L", + "YTA": "L", + "TCB": "S", + "TCD": "S", + "TCH": "S", + "TCK": "S", + "TCN": "S", + "TCW": "S", + "TCC": "S", + "TCR": "S", + "TCG": "S", + "TCA": "S", + "TCM": "S", + "TCV": "S", + "TCY": "S", + "TCS": "S", + "TCT": "S", + "TGC": "C", + "TGR": "W", + "TGG": "W", + "TGA": "W", + "TGY": "C", + "TGT": "C", + "TAC": "Y", + "TAR": "*", + "TAG": "*", + "TAA": "*", + "TAY": "Y", + "TAT": "Y", + "TTC": "F", + "TTR": "L", + "TTG": "L", + "TTA": "L", + "TTY": "F", + "TTT": "F", + }, + "start_table": { + "DTG": "M", + "KTG": "M", + "WTG": "M", + "CCB": "P", + "CCD": "P", + "CCH": "P", + "CCK": "P", + "CCN": "P", + "CCW": "P", + "CCC": "P", + "CCR": "P", + "CCG": "P", + "CCA": "P", + "CCM": "P", + "CCV": "P", + "CCY": "P", + "CCS": "P", + "CCT": "P", + "CGB": "R", + "CGD": "R", + "CGH": "R", + "CGK": "R", + "CGN": "R", + "CGW": "R", + "CGC": "R", + "CGR": "R", + "CGG": "R", + "CGA": "R", + "CGM": "R", + "CGV": "R", + "CGY": "R", + "CGS": "R", + "CGT": "R", + "CAC": "H", + "CAR": "Q", + "CAG": "Q", + "CAA": "Q", + "CAY": "H", + "CAT": "H", + "CTB": "L", + "CTD": "L", + "CTH": "L", + "CTK": "L", + "CTN": "L", + "CTW": "L", + "CTC": "L", + "CTR": "L", + "CTG": "L", + "CTA": "L", + "CTM": "L", + "CTV": "L", + "CTY": "L", + "CTS": "L", + "CTT": "L", + "RGR": "G", + "RGG": "G", + "RGA": "G", + "RTG": "M", + "GCB": "A", + "GCD": "A", + "GCH": "A", + "GCK": "A", + "GCN": "A", + "GCW": "A", + "GCC": "A", + "GCR": "A", + "GCG": "A", + "GCA": "A", + "GCM": "A", + "GCV": "A", + "GCY": "A", + "GCS": "A", + "GCT": "A", + "GGB": "G", + "GGD": "G", + "GGH": "G", + "GGK": "G", + "GGN": "G", + "GGW": "G", + "GGC": "G", + "GGR": "G", + "GGG": "G", + "GGA": "G", + "GGM": "G", + "GGV": "G", + "GGY": "G", + "GGS": "G", + "GGT": "G", + "GAC": "D", + "GAR": "E", + "GAG": "E", + "GAA": "E", + "GAY": "D", + "GAT": "D", + "GTH": "V", + "GTW": "V", + "GTC": "V", + "GTG": "M", + "GTA": "V", + "GTM": "V", + "GTY": "V", + "GTT": "V", + "ACB": "T", + "ACD": "T", + "ACH": "T", + "ACK": "T", + "ACN": "T", + "ACW": "T", + "ACC": "T", + "ACR": "T", + "ACG": "T", + "ACA": "T", + "ACM": "T", + "ACV": "T", + "ACY": "T", + "ACS": "T", + "ACT": "T", + "AGC": "S", + "AGR": "G", + "AGG": "G", + "AGA": "G", + "AGY": "S", + "AGT": "S", + "AAC": "N", + "AAR": "K", + "AAG": "K", + "AAA": "K", + "AAY": "N", + "AAT": "N", + "ATC": "I", + "ATR": "M", + "ATG": "M", + "ATA": "M", + "ATY": "I", + "ATT": "I", + "YTA": "L", + "TCB": "S", + "TCD": "S", + "TCH": "S", + "TCK": "S", + "TCN": "S", + "TCW": "S", + "TCC": "S", + "TCR": "S", + "TCG": "S", + "TCA": "S", + "TCM": "S", + "TCV": "S", + "TCY": "S", + "TCS": "S", + "TCT": "S", + "TGC": "C", + "TGR": "W", + "TGG": "W", + "TGA": "W", + "TGY": "C", + "TGT": "C", + "TAC": "Y", + "TAR": "*", + "TAG": "*", + "TAA": "*", + "TAY": "Y", + "TAT": "Y", + "TTC": "F", + "TTG": "M", + "TTA": "L", + "TTY": "F", + "TTT": "F", + }, + }, + "14": { + "trans_table": { + "CCB": "P", + "CCD": "P", + "CCH": "P", + "CCK": "P", + "CCN": "P", + "CCW": "P", + "CCC": "P", + "CCR": "P", + "CCG": "P", + "CCA": "P", + "CCM": "P", + "CCV": "P", + "CCY": "P", + "CCS": "P", + "CCT": "P", + "CGB": "R", + "CGD": "R", + "CGH": "R", + "CGK": "R", + "CGN": "R", + "CGW": "R", + "CGC": "R", + "CGR": "R", + "CGG": "R", + "CGA": "R", + "CGM": "R", + "CGV": "R", + "CGY": "R", + "CGS": "R", + "CGT": "R", + "CAC": "H", + "CAR": "Q", + "CAG": "Q", + "CAA": "Q", + "CAY": "H", + "CAT": "H", + "CTB": "L", + "CTD": "L", + "CTH": "L", + "CTK": "L", + "CTN": "L", + "CTW": "L", + "CTC": "L", + "CTR": "L", + "CTG": "L", + "CTA": "L", + "CTM": "L", + "CTV": "L", + "CTY": "L", + "CTS": "L", + "CTT": "L", + "GCB": "A", + "GCD": "A", + "GCH": "A", + "GCK": "A", + "GCN": "A", + "GCW": "A", + "GCC": "A", + "GCR": "A", + "GCG": "A", + "GCA": "A", + "GCM": "A", + "GCV": "A", + "GCY": "A", + "GCS": "A", + "GCT": "A", + "GGB": "G", + "GGD": "G", + "GGH": "G", + "GGK": "G", + "GGN": "G", + "GGW": "G", + "GGC": "G", + "GGR": "G", + "GGG": "G", + "GGA": "G", + "GGM": "G", + "GGV": "G", + "GGY": "G", + "GGS": "G", + "GGT": "G", + "GAC": "D", + "GAR": "E", + "GAG": "E", + "GAA": "E", + "GAY": "D", + "GAT": "D", + "GTB": "V", + "GTD": "V", + "GTH": "V", + "GTK": "V", + "GTN": "V", + "GTW": "V", + "GTC": "V", + "GTR": "V", + "GTG": "V", + "GTA": "V", + "GTM": "V", + "GTV": "V", + "GTY": "V", + "GTS": "V", + "GTT": "V", + "ACB": "T", + "ACD": "T", + "ACH": "T", + "ACK": "T", + "ACN": "T", + "ACW": "T", + "ACC": "T", + "ACR": "T", + "ACG": "T", + "ACA": "T", + "ACM": "T", + "ACV": "T", + "ACY": "T", + "ACS": "T", + "ACT": "T", + "AGB": "S", + "AGD": "S", + "AGH": "S", + "AGK": "S", + "AGN": "S", + "AGW": "S", + "AGC": "S", + "AGR": "S", + "AGG": "S", + "AGA": "S", + "AGM": "S", + "AGV": "S", + "AGY": "S", + "AGS": "S", + "AGT": "S", + "AAH": "N", + "AAW": "N", + "AAC": "N", + "AAG": "K", + "AAA": "N", + "AAM": "N", + "AAY": "N", + "AAT": "N", + "ATH": "I", + "ATW": "I", + "ATC": "I", + "ATG": "M", + "ATA": "I", + "ATM": "I", + "ATY": "I", + "ATT": "I", + "YTR": "L", + "YTG": "L", + "YTA": "L", + "TCB": "S", + "TCD": "S", + "TCH": "S", + "TCK": "S", + "TCN": "S", + "TCW": "S", + "TCC": "S", + "TCR": "S", + "TCG": "S", + "TCA": "S", + "TCM": "S", + "TCV": "S", + "TCY": "S", + "TCS": "S", + "TCT": "S", + "TGC": "C", + "TGR": "W", + "TGG": "W", + "TGA": "W", + "TGY": "C", + "TGT": "C", + "TAH": "Y", + "TAW": "Y", + "TAC": "Y", + "TAG": "*", + "TAA": "Y", + "TAM": "Y", + "TAY": "Y", + "TAT": "Y", + "TTC": "F", + "TTR": "L", + "TTG": "L", + "TTA": "L", + "TTY": "F", + "TTT": "F", + }, + "start_table": { + "CCB": "P", + "CCD": "P", + "CCH": "P", + "CCK": "P", + "CCN": "P", + "CCW": "P", + "CCC": "P", + "CCR": "P", + "CCG": "P", + "CCA": "P", + "CCM": "P", + "CCV": "P", + "CCY": "P", + "CCS": "P", + "CCT": "P", + "CGB": "R", + "CGD": "R", + "CGH": "R", + "CGK": "R", + "CGN": "R", + "CGW": "R", + "CGC": "R", + "CGR": "R", + "CGG": "R", + "CGA": "R", + "CGM": "R", + "CGV": "R", + "CGY": "R", + "CGS": "R", + "CGT": "R", + "CAC": "H", + "CAR": "Q", + "CAG": "Q", + "CAA": "Q", + "CAY": "H", + "CAT": "H", + "CTB": "L", + "CTD": "L", + "CTH": "L", + "CTK": "L", + "CTN": "L", + "CTW": "L", + "CTC": "L", + "CTR": "L", + "CTG": "L", + "CTA": "L", + "CTM": "L", + "CTV": "L", + "CTY": "L", + "CTS": "L", + "CTT": "L", + "GCB": "A", + "GCD": "A", + "GCH": "A", + "GCK": "A", + "GCN": "A", + "GCW": "A", + "GCC": "A", + "GCR": "A", + "GCG": "A", + "GCA": "A", + "GCM": "A", + "GCV": "A", + "GCY": "A", + "GCS": "A", + "GCT": "A", + "GGB": "G", + "GGD": "G", + "GGH": "G", + "GGK": "G", + "GGN": "G", + "GGW": "G", + "GGC": "G", + "GGR": "G", + "GGG": "G", + "GGA": "G", + "GGM": "G", + "GGV": "G", + "GGY": "G", + "GGS": "G", + "GGT": "G", + "GAC": "D", + "GAR": "E", + "GAG": "E", + "GAA": "E", + "GAY": "D", + "GAT": "D", + "GTB": "V", + "GTD": "V", + "GTH": "V", + "GTK": "V", + "GTN": "V", + "GTW": "V", + "GTC": "V", + "GTR": "V", + "GTG": "V", + "GTA": "V", + "GTM": "V", + "GTV": "V", + "GTY": "V", + "GTS": "V", + "GTT": "V", + "ACB": "T", + "ACD": "T", + "ACH": "T", + "ACK": "T", + "ACN": "T", + "ACW": "T", + "ACC": "T", + "ACR": "T", + "ACG": "T", + "ACA": "T", + "ACM": "T", + "ACV": "T", + "ACY": "T", + "ACS": "T", + "ACT": "T", + "AGB": "S", + "AGD": "S", + "AGH": "S", + "AGK": "S", + "AGN": "S", + "AGW": "S", + "AGC": "S", + "AGR": "S", + "AGG": "S", + "AGA": "S", + "AGM": "S", + "AGV": "S", + "AGY": "S", + "AGS": "S", + "AGT": "S", + "AAH": "N", + "AAW": "N", + "AAC": "N", + "AAG": "K", + "AAA": "N", + "AAM": "N", + "AAY": "N", + "AAT": "N", + "ATH": "I", + "ATW": "I", + "ATC": "I", + "ATG": "M", + "ATA": "I", + "ATM": "I", + "ATY": "I", + "ATT": "I", + "YTR": "L", + "YTG": "L", + "YTA": "L", + "TCB": "S", + "TCD": "S", + "TCH": "S", + "TCK": "S", + "TCN": "S", + "TCW": "S", + "TCC": "S", + "TCR": "S", + "TCG": "S", + "TCA": "S", + "TCM": "S", + "TCV": "S", + "TCY": "S", + "TCS": "S", + "TCT": "S", + "TGC": "C", + "TGR": "W", + "TGG": "W", + "TGA": "W", + "TGY": "C", + "TGT": "C", + "TAH": "Y", + "TAW": "Y", + "TAC": "Y", + "TAG": "*", + "TAA": "Y", + "TAM": "Y", + "TAY": "Y", + "TAT": "Y", + "TTC": "F", + "TTR": "L", + "TTG": "L", + "TTA": "L", + "TTY": "F", + "TTT": "F", + }, + }, + "15": { + "trans_table": { + "CCB": "P", + "CCD": "P", + "CCH": "P", + "CCK": "P", + "CCN": "P", + "CCW": "P", + "CCC": "P", + "CCR": "P", + "CCG": "P", + "CCA": "P", + "CCM": "P", + "CCV": "P", + "CCY": "P", + "CCS": "P", + "CCT": "P", + "CGB": "R", + "CGD": "R", + "CGH": "R", + "CGK": "R", + "CGN": "R", + "CGW": "R", + "CGC": "R", + "CGR": "R", + "CGG": "R", + "CGA": "R", + "CGM": "R", + "CGV": "R", + "CGY": "R", + "CGS": "R", + "CGT": "R", + "CAC": "H", + "CAR": "Q", + "CAG": "Q", + "CAA": "Q", + "CAY": "H", + "CAT": "H", + "CTB": "L", + "CTD": "L", + "CTH": "L", + "CTK": "L", + "CTN": "L", + "CTW": "L", + "CTC": "L", + "CTR": "L", + "CTG": "L", + "CTA": "L", + "CTM": "L", + "CTV": "L", + "CTY": "L", + "CTS": "L", + "CTT": "L", + "GCB": "A", + "GCD": "A", + "GCH": "A", + "GCK": "A", + "GCN": "A", + "GCW": "A", + "GCC": "A", + "GCR": "A", + "GCG": "A", + "GCA": "A", + "GCM": "A", + "GCV": "A", + "GCY": "A", + "GCS": "A", + "GCT": "A", + "GGB": "G", + "GGD": "G", + "GGH": "G", + "GGK": "G", + "GGN": "G", + "GGW": "G", + "GGC": "G", + "GGR": "G", + "GGG": "G", + "GGA": "G", + "GGM": "G", + "GGV": "G", + "GGY": "G", + "GGS": "G", + "GGT": "G", + "GAC": "D", + "GAR": "E", + "GAG": "E", + "GAA": "E", + "GAY": "D", + "GAT": "D", + "GTB": "V", + "GTD": "V", + "GTH": "V", + "GTK": "V", + "GTN": "V", + "GTW": "V", + "GTC": "V", + "GTR": "V", + "GTG": "V", + "GTA": "V", + "GTM": "V", + "GTV": "V", + "GTY": "V", + "GTS": "V", + "GTT": "V", + "ACB": "T", + "ACD": "T", + "ACH": "T", + "ACK": "T", + "ACN": "T", + "ACW": "T", + "ACC": "T", + "ACR": "T", + "ACG": "T", + "ACA": "T", + "ACM": "T", + "ACV": "T", + "ACY": "T", + "ACS": "T", + "ACT": "T", + "AGC": "S", + "AGR": "R", + "AGG": "R", + "AGA": "R", + "AGY": "S", + "AGT": "S", + "AAC": "N", + "AAR": "K", + "AAG": "K", + "AAA": "K", + "AAY": "N", + "AAT": "N", + "ATH": "I", + "ATW": "I", + "ATC": "I", + "ATG": "M", + "ATA": "I", + "ATM": "I", + "ATY": "I", + "ATT": "I", + "MGR": "R", + "MGG": "R", + "MGA": "R", + "YAG": "Q", + "YTR": "L", + "YTG": "L", + "YTA": "L", + "TCB": "S", + "TCD": "S", + "TCH": "S", + "TCK": "S", + "TCN": "S", + "TCW": "S", + "TCC": "S", + "TCR": "S", + "TCG": "S", + "TCA": "S", + "TCM": "S", + "TCV": "S", + "TCY": "S", + "TCS": "S", + "TCT": "S", + "TRA": "*", + "TGC": "C", + "TGG": "W", + "TGA": "*", + "TGY": "C", + "TGT": "C", + "TAC": "Y", + "TAG": "Q", + "TAA": "*", + "TAY": "Y", + "TAT": "Y", + "TTC": "F", + "TTR": "L", + "TTG": "L", + "TTA": "L", + "TTY": "F", + "TTT": "F", + }, + "start_table": { + "CCB": "P", + "CCD": "P", + "CCH": "P", + "CCK": "P", + "CCN": "P", + "CCW": "P", + "CCC": "P", + "CCR": "P", + "CCG": "P", + "CCA": "P", + "CCM": "P", + "CCV": "P", + "CCY": "P", + "CCS": "P", + "CCT": "P", + "CGB": "R", + "CGD": "R", + "CGH": "R", + "CGK": "R", + "CGN": "R", + "CGW": "R", + "CGC": "R", + "CGR": "R", + "CGG": "R", + "CGA": "R", + "CGM": "R", + "CGV": "R", + "CGY": "R", + "CGS": "R", + "CGT": "R", + "CAC": "H", + "CAR": "Q", + "CAG": "Q", + "CAA": "Q", + "CAY": "H", + "CAT": "H", + "CTB": "L", + "CTD": "L", + "CTH": "L", + "CTK": "L", + "CTN": "L", + "CTW": "L", + "CTC": "L", + "CTR": "L", + "CTG": "L", + "CTA": "L", + "CTM": "L", + "CTV": "L", + "CTY": "L", + "CTS": "L", + "CTT": "L", + "GCB": "A", + "GCD": "A", + "GCH": "A", + "GCK": "A", + "GCN": "A", + "GCW": "A", + "GCC": "A", + "GCR": "A", + "GCG": "A", + "GCA": "A", + "GCM": "A", + "GCV": "A", + "GCY": "A", + "GCS": "A", + "GCT": "A", + "GGB": "G", + "GGD": "G", + "GGH": "G", + "GGK": "G", + "GGN": "G", + "GGW": "G", + "GGC": "G", + "GGR": "G", + "GGG": "G", + "GGA": "G", + "GGM": "G", + "GGV": "G", + "GGY": "G", + "GGS": "G", + "GGT": "G", + "GAC": "D", + "GAR": "E", + "GAG": "E", + "GAA": "E", + "GAY": "D", + "GAT": "D", + "GTB": "V", + "GTD": "V", + "GTH": "V", + "GTK": "V", + "GTN": "V", + "GTW": "V", + "GTC": "V", + "GTR": "V", + "GTG": "V", + "GTA": "V", + "GTM": "V", + "GTV": "V", + "GTY": "V", + "GTS": "V", + "GTT": "V", + "ACB": "T", + "ACD": "T", + "ACH": "T", + "ACK": "T", + "ACN": "T", + "ACW": "T", + "ACC": "T", + "ACR": "T", + "ACG": "T", + "ACA": "T", + "ACM": "T", + "ACV": "T", + "ACY": "T", + "ACS": "T", + "ACT": "T", + "AGC": "S", + "AGR": "R", + "AGG": "R", + "AGA": "R", + "AGY": "S", + "AGT": "S", + "AAC": "N", + "AAR": "K", + "AAG": "K", + "AAA": "K", + "AAY": "N", + "AAT": "N", + "ATH": "I", + "ATW": "I", + "ATC": "I", + "ATG": "M", + "ATA": "I", + "ATM": "I", + "ATY": "I", + "ATT": "I", + "MGR": "R", + "MGG": "R", + "MGA": "R", + "YAG": "Q", + "YTR": "L", + "YTG": "L", + "YTA": "L", + "TCB": "S", + "TCD": "S", + "TCH": "S", + "TCK": "S", + "TCN": "S", + "TCW": "S", + "TCC": "S", + "TCR": "S", + "TCG": "S", + "TCA": "S", + "TCM": "S", + "TCV": "S", + "TCY": "S", + "TCS": "S", + "TCT": "S", + "TRA": "*", + "TGC": "C", + "TGG": "W", + "TGA": "*", + "TGY": "C", + "TGT": "C", + "TAC": "Y", + "TAG": "Q", + "TAA": "*", + "TAY": "Y", + "TAT": "Y", + "TTC": "F", + "TTR": "L", + "TTG": "L", + "TTA": "L", + "TTY": "F", + "TTT": "F", + }, + }, + "16": { + "trans_table": { + "CCB": "P", + "CCD": "P", + "CCH": "P", + "CCK": "P", + "CCN": "P", + "CCW": "P", + "CCC": "P", + "CCR": "P", + "CCG": "P", + "CCA": "P", + "CCM": "P", + "CCV": "P", + "CCY": "P", + "CCS": "P", + "CCT": "P", + "CGB": "R", + "CGD": "R", + "CGH": "R", + "CGK": "R", + "CGN": "R", + "CGW": "R", + "CGC": "R", + "CGR": "R", + "CGG": "R", + "CGA": "R", + "CGM": "R", + "CGV": "R", + "CGY": "R", + "CGS": "R", + "CGT": "R", + "CAC": "H", + "CAR": "Q", + "CAG": "Q", + "CAA": "Q", + "CAY": "H", + "CAT": "H", + "CTB": "L", + "CTD": "L", + "CTH": "L", + "CTK": "L", + "CTN": "L", + "CTW": "L", + "CTC": "L", + "CTR": "L", + "CTG": "L", + "CTA": "L", + "CTM": "L", + "CTV": "L", + "CTY": "L", + "CTS": "L", + "CTT": "L", + "GCB": "A", + "GCD": "A", + "GCH": "A", + "GCK": "A", + "GCN": "A", + "GCW": "A", + "GCC": "A", + "GCR": "A", + "GCG": "A", + "GCA": "A", + "GCM": "A", + "GCV": "A", + "GCY": "A", + "GCS": "A", + "GCT": "A", + "GGB": "G", + "GGD": "G", + "GGH": "G", + "GGK": "G", + "GGN": "G", + "GGW": "G", + "GGC": "G", + "GGR": "G", + "GGG": "G", + "GGA": "G", + "GGM": "G", + "GGV": "G", + "GGY": "G", + "GGS": "G", + "GGT": "G", + "GAC": "D", + "GAR": "E", + "GAG": "E", + "GAA": "E", + "GAY": "D", + "GAT": "D", + "GTB": "V", + "GTD": "V", + "GTH": "V", + "GTK": "V", + "GTN": "V", + "GTW": "V", + "GTC": "V", + "GTR": "V", + "GTG": "V", + "GTA": "V", + "GTM": "V", + "GTV": "V", + "GTY": "V", + "GTS": "V", + "GTT": "V", + "ACB": "T", + "ACD": "T", + "ACH": "T", + "ACK": "T", + "ACN": "T", + "ACW": "T", + "ACC": "T", + "ACR": "T", + "ACG": "T", + "ACA": "T", + "ACM": "T", + "ACV": "T", + "ACY": "T", + "ACS": "T", + "ACT": "T", + "AGC": "S", + "AGR": "R", + "AGG": "R", + "AGA": "R", + "AGY": "S", + "AGT": "S", + "AAC": "N", + "AAR": "K", + "AAG": "K", + "AAA": "K", + "AAY": "N", + "AAT": "N", + "ATH": "I", + "ATW": "I", + "ATC": "I", + "ATG": "M", + "ATA": "I", + "ATM": "I", + "ATY": "I", + "ATT": "I", + "MGR": "R", + "MGG": "R", + "MGA": "R", + "YTR": "L", + "YTG": "L", + "YTA": "L", + "TWG": "L", + "TCB": "S", + "TCD": "S", + "TCH": "S", + "TCK": "S", + "TCN": "S", + "TCW": "S", + "TCC": "S", + "TCR": "S", + "TCG": "S", + "TCA": "S", + "TCM": "S", + "TCV": "S", + "TCY": "S", + "TCS": "S", + "TCT": "S", + "TRA": "*", + "TGC": "C", + "TGG": "W", + "TGA": "*", + "TGY": "C", + "TGT": "C", + "TAC": "Y", + "TAG": "L", + "TAA": "*", + "TAY": "Y", + "TAT": "Y", + "TTC": "F", + "TTR": "L", + "TTG": "L", + "TTA": "L", + "TTY": "F", + "TTT": "F", + }, + "start_table": { + "CCB": "P", + "CCD": "P", + "CCH": "P", + "CCK": "P", + "CCN": "P", + "CCW": "P", + "CCC": "P", + "CCR": "P", + "CCG": "P", + "CCA": "P", + "CCM": "P", + "CCV": "P", + "CCY": "P", + "CCS": "P", + "CCT": "P", + "CGB": "R", + "CGD": "R", + "CGH": "R", + "CGK": "R", + "CGN": "R", + "CGW": "R", + "CGC": "R", + "CGR": "R", + "CGG": "R", + "CGA": "R", + "CGM": "R", + "CGV": "R", + "CGY": "R", + "CGS": "R", + "CGT": "R", + "CAC": "H", + "CAR": "Q", + "CAG": "Q", + "CAA": "Q", + "CAY": "H", + "CAT": "H", + "CTB": "L", + "CTD": "L", + "CTH": "L", + "CTK": "L", + "CTN": "L", + "CTW": "L", + "CTC": "L", + "CTR": "L", + "CTG": "L", + "CTA": "L", + "CTM": "L", + "CTV": "L", + "CTY": "L", + "CTS": "L", + "CTT": "L", + "GCB": "A", + "GCD": "A", + "GCH": "A", + "GCK": "A", + "GCN": "A", + "GCW": "A", + "GCC": "A", + "GCR": "A", + "GCG": "A", + "GCA": "A", + "GCM": "A", + "GCV": "A", + "GCY": "A", + "GCS": "A", + "GCT": "A", + "GGB": "G", + "GGD": "G", + "GGH": "G", + "GGK": "G", + "GGN": "G", + "GGW": "G", + "GGC": "G", + "GGR": "G", + "GGG": "G", + "GGA": "G", + "GGM": "G", + "GGV": "G", + "GGY": "G", + "GGS": "G", + "GGT": "G", + "GAC": "D", + "GAR": "E", + "GAG": "E", + "GAA": "E", + "GAY": "D", + "GAT": "D", + "GTB": "V", + "GTD": "V", + "GTH": "V", + "GTK": "V", + "GTN": "V", + "GTW": "V", + "GTC": "V", + "GTR": "V", + "GTG": "V", + "GTA": "V", + "GTM": "V", + "GTV": "V", + "GTY": "V", + "GTS": "V", + "GTT": "V", + "ACB": "T", + "ACD": "T", + "ACH": "T", + "ACK": "T", + "ACN": "T", + "ACW": "T", + "ACC": "T", + "ACR": "T", + "ACG": "T", + "ACA": "T", + "ACM": "T", + "ACV": "T", + "ACY": "T", + "ACS": "T", + "ACT": "T", + "AGC": "S", + "AGR": "R", + "AGG": "R", + "AGA": "R", + "AGY": "S", + "AGT": "S", + "AAC": "N", + "AAR": "K", + "AAG": "K", + "AAA": "K", + "AAY": "N", + "AAT": "N", + "ATH": "I", + "ATW": "I", + "ATC": "I", + "ATG": "M", + "ATA": "I", + "ATM": "I", + "ATY": "I", + "ATT": "I", + "MGR": "R", + "MGG": "R", + "MGA": "R", + "YTR": "L", + "YTG": "L", + "YTA": "L", + "TWG": "L", + "TCB": "S", + "TCD": "S", + "TCH": "S", + "TCK": "S", + "TCN": "S", + "TCW": "S", + "TCC": "S", + "TCR": "S", + "TCG": "S", + "TCA": "S", + "TCM": "S", + "TCV": "S", + "TCY": "S", + "TCS": "S", + "TCT": "S", + "TRA": "*", + "TGC": "C", + "TGG": "W", + "TGA": "*", + "TGY": "C", + "TGT": "C", + "TAC": "Y", + "TAG": "L", + "TAA": "*", + "TAY": "Y", + "TAT": "Y", + "TTC": "F", + "TTR": "L", + "TTG": "L", + "TTA": "L", + "TTY": "F", + "TTT": "F", + }, + }, + "21": { + "trans_table": { + "CCB": "P", + "CCD": "P", + "CCH": "P", + "CCK": "P", + "CCN": "P", + "CCW": "P", + "CCC": "P", + "CCR": "P", + "CCG": "P", + "CCA": "P", + "CCM": "P", + "CCV": "P", + "CCY": "P", + "CCS": "P", + "CCT": "P", + "CGB": "R", + "CGD": "R", + "CGH": "R", + "CGK": "R", + "CGN": "R", + "CGW": "R", + "CGC": "R", + "CGR": "R", + "CGG": "R", + "CGA": "R", + "CGM": "R", + "CGV": "R", + "CGY": "R", + "CGS": "R", + "CGT": "R", + "CAC": "H", + "CAR": "Q", + "CAG": "Q", + "CAA": "Q", + "CAY": "H", + "CAT": "H", + "CTB": "L", + "CTD": "L", + "CTH": "L", + "CTK": "L", + "CTN": "L", + "CTW": "L", + "CTC": "L", + "CTR": "L", + "CTG": "L", + "CTA": "L", + "CTM": "L", + "CTV": "L", + "CTY": "L", + "CTS": "L", + "CTT": "L", + "GCB": "A", + "GCD": "A", + "GCH": "A", + "GCK": "A", + "GCN": "A", + "GCW": "A", + "GCC": "A", + "GCR": "A", + "GCG": "A", + "GCA": "A", + "GCM": "A", + "GCV": "A", + "GCY": "A", + "GCS": "A", + "GCT": "A", + "GGB": "G", + "GGD": "G", + "GGH": "G", + "GGK": "G", + "GGN": "G", + "GGW": "G", + "GGC": "G", + "GGR": "G", + "GGG": "G", + "GGA": "G", + "GGM": "G", + "GGV": "G", + "GGY": "G", + "GGS": "G", + "GGT": "G", + "GAC": "D", + "GAR": "E", + "GAG": "E", + "GAA": "E", + "GAY": "D", + "GAT": "D", + "GTB": "V", + "GTD": "V", + "GTH": "V", + "GTK": "V", + "GTN": "V", + "GTW": "V", + "GTC": "V", + "GTR": "V", + "GTG": "V", + "GTA": "V", + "GTM": "V", + "GTV": "V", + "GTY": "V", + "GTS": "V", + "GTT": "V", + "ACB": "T", + "ACD": "T", + "ACH": "T", + "ACK": "T", + "ACN": "T", + "ACW": "T", + "ACC": "T", + "ACR": "T", + "ACG": "T", + "ACA": "T", + "ACM": "T", + "ACV": "T", + "ACY": "T", + "ACS": "T", + "ACT": "T", + "AGB": "S", + "AGD": "S", + "AGH": "S", + "AGK": "S", + "AGN": "S", + "AGW": "S", + "AGC": "S", + "AGR": "S", + "AGG": "S", + "AGA": "S", + "AGM": "S", + "AGV": "S", + "AGY": "S", + "AGS": "S", + "AGT": "S", + "AAH": "N", + "AAW": "N", + "AAC": "N", + "AAG": "K", + "AAA": "N", + "AAM": "N", + "AAY": "N", + "AAT": "N", + "ATC": "I", + "ATR": "M", + "ATG": "M", + "ATA": "M", + "ATY": "I", + "ATT": "I", + "YTR": "L", + "YTG": "L", + "YTA": "L", + "TCB": "S", + "TCD": "S", + "TCH": "S", + "TCK": "S", + "TCN": "S", + "TCW": "S", + "TCC": "S", + "TCR": "S", + "TCG": "S", + "TCA": "S", + "TCM": "S", + "TCV": "S", + "TCY": "S", + "TCS": "S", + "TCT": "S", + "TGC": "C", + "TGR": "W", + "TGG": "W", + "TGA": "W", + "TGY": "C", + "TGT": "C", + "TAC": "Y", + "TAR": "*", + "TAG": "*", + "TAA": "*", + "TAY": "Y", + "TAT": "Y", + "TTC": "F", + "TTR": "L", + "TTG": "L", + "TTA": "L", + "TTY": "F", + "TTT": "F", + }, + "start_table": { + "CCB": "P", + "CCD": "P", + "CCH": "P", + "CCK": "P", + "CCN": "P", + "CCW": "P", + "CCC": "P", + "CCR": "P", + "CCG": "P", + "CCA": "P", + "CCM": "P", + "CCV": "P", + "CCY": "P", + "CCS": "P", + "CCT": "P", + "CGB": "R", + "CGD": "R", + "CGH": "R", + "CGK": "R", + "CGN": "R", + "CGW": "R", + "CGC": "R", + "CGR": "R", + "CGG": "R", + "CGA": "R", + "CGM": "R", + "CGV": "R", + "CGY": "R", + "CGS": "R", + "CGT": "R", + "CAC": "H", + "CAR": "Q", + "CAG": "Q", + "CAA": "Q", + "CAY": "H", + "CAT": "H", + "CTB": "L", + "CTD": "L", + "CTH": "L", + "CTK": "L", + "CTN": "L", + "CTW": "L", + "CTC": "L", + "CTR": "L", + "CTG": "L", + "CTA": "L", + "CTM": "L", + "CTV": "L", + "CTY": "L", + "CTS": "L", + "CTT": "L", + "RTG": "M", + "GCB": "A", + "GCD": "A", + "GCH": "A", + "GCK": "A", + "GCN": "A", + "GCW": "A", + "GCC": "A", + "GCR": "A", + "GCG": "A", + "GCA": "A", + "GCM": "A", + "GCV": "A", + "GCY": "A", + "GCS": "A", + "GCT": "A", + "GGB": "G", + "GGD": "G", + "GGH": "G", + "GGK": "G", + "GGN": "G", + "GGW": "G", + "GGC": "G", + "GGR": "G", + "GGG": "G", + "GGA": "G", + "GGM": "G", + "GGV": "G", + "GGY": "G", + "GGS": "G", + "GGT": "G", + "GAC": "D", + "GAR": "E", + "GAG": "E", + "GAA": "E", + "GAY": "D", + "GAT": "D", + "GTH": "V", + "GTW": "V", + "GTC": "V", + "GTG": "M", + "GTA": "V", + "GTM": "V", + "GTY": "V", + "GTT": "V", + "ACB": "T", + "ACD": "T", + "ACH": "T", + "ACK": "T", + "ACN": "T", + "ACW": "T", + "ACC": "T", + "ACR": "T", + "ACG": "T", + "ACA": "T", + "ACM": "T", + "ACV": "T", + "ACY": "T", + "ACS": "T", + "ACT": "T", + "AGB": "S", + "AGD": "S", + "AGH": "S", + "AGK": "S", + "AGN": "S", + "AGW": "S", + "AGC": "S", + "AGR": "S", + "AGG": "S", + "AGA": "S", + "AGM": "S", + "AGV": "S", + "AGY": "S", + "AGS": "S", + "AGT": "S", + "AAH": "N", + "AAW": "N", + "AAC": "N", + "AAG": "K", + "AAA": "N", + "AAM": "N", + "AAY": "N", + "AAT": "N", + "ATC": "I", + "ATR": "M", + "ATG": "M", + "ATA": "M", + "ATY": "I", + "ATT": "I", + "YTR": "L", + "YTG": "L", + "YTA": "L", + "TCB": "S", + "TCD": "S", + "TCH": "S", + "TCK": "S", + "TCN": "S", + "TCW": "S", + "TCC": "S", + "TCR": "S", + "TCG": "S", + "TCA": "S", + "TCM": "S", + "TCV": "S", + "TCY": "S", + "TCS": "S", + "TCT": "S", + "TGC": "C", + "TGR": "W", + "TGG": "W", + "TGA": "W", + "TGY": "C", + "TGT": "C", + "TAC": "Y", + "TAR": "*", + "TAG": "*", + "TAA": "*", + "TAY": "Y", + "TAT": "Y", + "TTC": "F", + "TTR": "L", + "TTG": "L", + "TTA": "L", + "TTY": "F", + "TTT": "F", + }, + }, + "22": { + "trans_table": { + "CCB": "P", + "CCD": "P", + "CCH": "P", + "CCK": "P", + "CCN": "P", + "CCW": "P", + "CCC": "P", + "CCR": "P", + "CCG": "P", + "CCA": "P", + "CCM": "P", + "CCV": "P", + "CCY": "P", + "CCS": "P", + "CCT": "P", + "CGB": "R", + "CGD": "R", + "CGH": "R", + "CGK": "R", + "CGN": "R", + "CGW": "R", + "CGC": "R", + "CGR": "R", + "CGG": "R", + "CGA": "R", + "CGM": "R", + "CGV": "R", + "CGY": "R", + "CGS": "R", + "CGT": "R", + "CAC": "H", + "CAR": "Q", + "CAG": "Q", + "CAA": "Q", + "CAY": "H", + "CAT": "H", + "CTB": "L", + "CTD": "L", + "CTH": "L", + "CTK": "L", + "CTN": "L", + "CTW": "L", + "CTC": "L", + "CTR": "L", + "CTG": "L", + "CTA": "L", + "CTM": "L", + "CTV": "L", + "CTY": "L", + "CTS": "L", + "CTT": "L", + "GCB": "A", + "GCD": "A", + "GCH": "A", + "GCK": "A", + "GCN": "A", + "GCW": "A", + "GCC": "A", + "GCR": "A", + "GCG": "A", + "GCA": "A", + "GCM": "A", + "GCV": "A", + "GCY": "A", + "GCS": "A", + "GCT": "A", + "GGB": "G", + "GGD": "G", + "GGH": "G", + "GGK": "G", + "GGN": "G", + "GGW": "G", + "GGC": "G", + "GGR": "G", + "GGG": "G", + "GGA": "G", + "GGM": "G", + "GGV": "G", + "GGY": "G", + "GGS": "G", + "GGT": "G", + "GAC": "D", + "GAR": "E", + "GAG": "E", + "GAA": "E", + "GAY": "D", + "GAT": "D", + "GTB": "V", + "GTD": "V", + "GTH": "V", + "GTK": "V", + "GTN": "V", + "GTW": "V", + "GTC": "V", + "GTR": "V", + "GTG": "V", + "GTA": "V", + "GTM": "V", + "GTV": "V", + "GTY": "V", + "GTS": "V", + "GTT": "V", + "ACB": "T", + "ACD": "T", + "ACH": "T", + "ACK": "T", + "ACN": "T", + "ACW": "T", + "ACC": "T", + "ACR": "T", + "ACG": "T", + "ACA": "T", + "ACM": "T", + "ACV": "T", + "ACY": "T", + "ACS": "T", + "ACT": "T", + "AGC": "S", + "AGR": "R", + "AGG": "R", + "AGA": "R", + "AGY": "S", + "AGT": "S", + "AAC": "N", + "AAR": "K", + "AAG": "K", + "AAA": "K", + "AAY": "N", + "AAT": "N", + "ATH": "I", + "ATW": "I", + "ATC": "I", + "ATG": "M", + "ATA": "I", + "ATM": "I", + "ATY": "I", + "ATT": "I", + "MGR": "R", + "MGG": "R", + "MGA": "R", + "YTR": "L", + "YTG": "L", + "YTA": "L", + "TWG": "L", + "TCB": "S", + "TCK": "S", + "TCC": "S", + "TCG": "S", + "TCA": "*", + "TCY": "S", + "TCS": "S", + "TCT": "S", + "TRA": "*", + "TGC": "C", + "TGG": "W", + "TGA": "*", + "TGY": "C", + "TGT": "C", + "TAC": "Y", + "TAG": "L", + "TAA": "*", + "TAY": "Y", + "TAT": "Y", + "TMA": "*", + "TVA": "*", + "TSA": "*", + "TTC": "F", + "TTR": "L", + "TTG": "L", + "TTA": "L", + "TTY": "F", + "TTT": "F", + }, + "start_table": { + "CCB": "P", + "CCD": "P", + "CCH": "P", + "CCK": "P", + "CCN": "P", + "CCW": "P", + "CCC": "P", + "CCR": "P", + "CCG": "P", + "CCA": "P", + "CCM": "P", + "CCV": "P", + "CCY": "P", + "CCS": "P", + "CCT": "P", + "CGB": "R", + "CGD": "R", + "CGH": "R", + "CGK": "R", + "CGN": "R", + "CGW": "R", + "CGC": "R", + "CGR": "R", + "CGG": "R", + "CGA": "R", + "CGM": "R", + "CGV": "R", + "CGY": "R", + "CGS": "R", + "CGT": "R", + "CAC": "H", + "CAR": "Q", + "CAG": "Q", + "CAA": "Q", + "CAY": "H", + "CAT": "H", + "CTB": "L", + "CTD": "L", + "CTH": "L", + "CTK": "L", + "CTN": "L", + "CTW": "L", + "CTC": "L", + "CTR": "L", + "CTG": "L", + "CTA": "L", + "CTM": "L", + "CTV": "L", + "CTY": "L", + "CTS": "L", + "CTT": "L", + "GCB": "A", + "GCD": "A", + "GCH": "A", + "GCK": "A", + "GCN": "A", + "GCW": "A", + "GCC": "A", + "GCR": "A", + "GCG": "A", + "GCA": "A", + "GCM": "A", + "GCV": "A", + "GCY": "A", + "GCS": "A", + "GCT": "A", + "GGB": "G", + "GGD": "G", + "GGH": "G", + "GGK": "G", + "GGN": "G", + "GGW": "G", + "GGC": "G", + "GGR": "G", + "GGG": "G", + "GGA": "G", + "GGM": "G", + "GGV": "G", + "GGY": "G", + "GGS": "G", + "GGT": "G", + "GAC": "D", + "GAR": "E", + "GAG": "E", + "GAA": "E", + "GAY": "D", + "GAT": "D", + "GTB": "V", + "GTD": "V", + "GTH": "V", + "GTK": "V", + "GTN": "V", + "GTW": "V", + "GTC": "V", + "GTR": "V", + "GTG": "V", + "GTA": "V", + "GTM": "V", + "GTV": "V", + "GTY": "V", + "GTS": "V", + "GTT": "V", + "ACB": "T", + "ACD": "T", + "ACH": "T", + "ACK": "T", + "ACN": "T", + "ACW": "T", + "ACC": "T", + "ACR": "T", + "ACG": "T", + "ACA": "T", + "ACM": "T", + "ACV": "T", + "ACY": "T", + "ACS": "T", + "ACT": "T", + "AGC": "S", + "AGR": "R", + "AGG": "R", + "AGA": "R", + "AGY": "S", + "AGT": "S", + "AAC": "N", + "AAR": "K", + "AAG": "K", + "AAA": "K", + "AAY": "N", + "AAT": "N", + "ATH": "I", + "ATW": "I", + "ATC": "I", + "ATG": "M", + "ATA": "I", + "ATM": "I", + "ATY": "I", + "ATT": "I", + "MGR": "R", + "MGG": "R", + "MGA": "R", + "YTR": "L", + "YTG": "L", + "YTA": "L", + "TWG": "L", + "TCB": "S", + "TCK": "S", + "TCC": "S", + "TCG": "S", + "TCA": "*", + "TCY": "S", + "TCS": "S", + "TCT": "S", + "TRA": "*", + "TGC": "C", + "TGG": "W", + "TGA": "*", + "TGY": "C", + "TGT": "C", + "TAC": "Y", + "TAG": "L", + "TAA": "*", + "TAY": "Y", + "TAT": "Y", + "TMA": "*", + "TVA": "*", + "TSA": "*", + "TTC": "F", + "TTR": "L", + "TTG": "L", + "TTA": "L", + "TTY": "F", + "TTT": "F", + }, + }, + "23": { + "trans_table": { + "CCB": "P", + "CCD": "P", + "CCH": "P", + "CCK": "P", + "CCN": "P", + "CCW": "P", + "CCC": "P", + "CCR": "P", + "CCG": "P", + "CCA": "P", + "CCM": "P", + "CCV": "P", + "CCY": "P", + "CCS": "P", + "CCT": "P", + "CGB": "R", + "CGD": "R", + "CGH": "R", + "CGK": "R", + "CGN": "R", + "CGW": "R", + "CGC": "R", + "CGR": "R", + "CGG": "R", + "CGA": "R", + "CGM": "R", + "CGV": "R", + "CGY": "R", + "CGS": "R", + "CGT": "R", + "CAC": "H", + "CAR": "Q", + "CAG": "Q", + "CAA": "Q", + "CAY": "H", + "CAT": "H", + "CTB": "L", + "CTD": "L", + "CTH": "L", + "CTK": "L", + "CTN": "L", + "CTW": "L", + "CTC": "L", + "CTR": "L", + "CTG": "L", + "CTA": "L", + "CTM": "L", + "CTV": "L", + "CTY": "L", + "CTS": "L", + "CTT": "L", + "GCB": "A", + "GCD": "A", + "GCH": "A", + "GCK": "A", + "GCN": "A", + "GCW": "A", + "GCC": "A", + "GCR": "A", + "GCG": "A", + "GCA": "A", + "GCM": "A", + "GCV": "A", + "GCY": "A", + "GCS": "A", + "GCT": "A", + "GGB": "G", + "GGD": "G", + "GGH": "G", + "GGK": "G", + "GGN": "G", + "GGW": "G", + "GGC": "G", + "GGR": "G", + "GGG": "G", + "GGA": "G", + "GGM": "G", + "GGV": "G", + "GGY": "G", + "GGS": "G", + "GGT": "G", + "GAC": "D", + "GAR": "E", + "GAG": "E", + "GAA": "E", + "GAY": "D", + "GAT": "D", + "GTB": "V", + "GTD": "V", + "GTH": "V", + "GTK": "V", + "GTN": "V", + "GTW": "V", + "GTC": "V", + "GTR": "V", + "GTG": "V", + "GTA": "V", + "GTM": "V", + "GTV": "V", + "GTY": "V", + "GTS": "V", + "GTT": "V", + "ACB": "T", + "ACD": "T", + "ACH": "T", + "ACK": "T", + "ACN": "T", + "ACW": "T", + "ACC": "T", + "ACR": "T", + "ACG": "T", + "ACA": "T", + "ACM": "T", + "ACV": "T", + "ACY": "T", + "ACS": "T", + "ACT": "T", + "AGC": "S", + "AGR": "R", + "AGG": "R", + "AGA": "R", + "AGY": "S", + "AGT": "S", + "AAC": "N", + "AAR": "K", + "AAG": "K", + "AAA": "K", + "AAY": "N", + "AAT": "N", + "ATH": "I", + "ATW": "I", + "ATC": "I", + "ATG": "M", + "ATA": "I", + "ATM": "I", + "ATY": "I", + "ATT": "I", + "MGR": "R", + "MGG": "R", + "MGA": "R", + "YTG": "L", + "TDA": "*", + "TKA": "*", + "TWA": "*", + "TCB": "S", + "TCD": "S", + "TCH": "S", + "TCK": "S", + "TCN": "S", + "TCW": "S", + "TCC": "S", + "TCR": "S", + "TCG": "S", + "TCA": "S", + "TCM": "S", + "TCV": "S", + "TCY": "S", + "TCS": "S", + "TCT": "S", + "TRA": "*", + "TGC": "C", + "TGG": "W", + "TGA": "*", + "TGY": "C", + "TGT": "C", + "TAC": "Y", + "TAR": "*", + "TAG": "*", + "TAA": "*", + "TAY": "Y", + "TAT": "Y", + "TTC": "F", + "TTG": "L", + "TTA": "*", + "TTY": "F", + "TTT": "F", + }, + "start_table": { + "CCB": "P", + "CCD": "P", + "CCH": "P", + "CCK": "P", + "CCN": "P", + "CCW": "P", + "CCC": "P", + "CCR": "P", + "CCG": "P", + "CCA": "P", + "CCM": "P", + "CCV": "P", + "CCY": "P", + "CCS": "P", + "CCT": "P", + "CGB": "R", + "CGD": "R", + "CGH": "R", + "CGK": "R", + "CGN": "R", + "CGW": "R", + "CGC": "R", + "CGR": "R", + "CGG": "R", + "CGA": "R", + "CGM": "R", + "CGV": "R", + "CGY": "R", + "CGS": "R", + "CGT": "R", + "CAC": "H", + "CAR": "Q", + "CAG": "Q", + "CAA": "Q", + "CAY": "H", + "CAT": "H", + "CTB": "L", + "CTD": "L", + "CTH": "L", + "CTK": "L", + "CTN": "L", + "CTW": "L", + "CTC": "L", + "CTR": "L", + "CTG": "L", + "CTA": "L", + "CTM": "L", + "CTV": "L", + "CTY": "L", + "CTS": "L", + "CTT": "L", + "RTG": "M", + "GCB": "A", + "GCD": "A", + "GCH": "A", + "GCK": "A", + "GCN": "A", + "GCW": "A", + "GCC": "A", + "GCR": "A", + "GCG": "A", + "GCA": "A", + "GCM": "A", + "GCV": "A", + "GCY": "A", + "GCS": "A", + "GCT": "A", + "GGB": "G", + "GGD": "G", + "GGH": "G", + "GGK": "G", + "GGN": "G", + "GGW": "G", + "GGC": "G", + "GGR": "G", + "GGG": "G", + "GGA": "G", + "GGM": "G", + "GGV": "G", + "GGY": "G", + "GGS": "G", + "GGT": "G", + "GAC": "D", + "GAR": "E", + "GAG": "E", + "GAA": "E", + "GAY": "D", + "GAT": "D", + "GTH": "V", + "GTW": "V", + "GTC": "V", + "GTG": "M", + "GTA": "V", + "GTM": "V", + "GTY": "V", + "GTT": "V", + "ACB": "T", + "ACD": "T", + "ACH": "T", + "ACK": "T", + "ACN": "T", + "ACW": "T", + "ACC": "T", + "ACR": "T", + "ACG": "T", + "ACA": "T", + "ACM": "T", + "ACV": "T", + "ACY": "T", + "ACS": "T", + "ACT": "T", + "AGC": "S", + "AGR": "R", + "AGG": "R", + "AGA": "R", + "AGY": "S", + "AGT": "S", + "AAC": "N", + "AAR": "K", + "AAG": "K", + "AAA": "K", + "AAY": "N", + "AAT": "N", + "ATK": "M", + "ATC": "I", + "ATG": "M", + "ATA": "I", + "ATM": "I", + "ATT": "M", + "MGR": "R", + "MGG": "R", + "MGA": "R", + "YTG": "L", + "TDA": "*", + "TKA": "*", + "TWA": "*", + "TCB": "S", + "TCD": "S", + "TCH": "S", + "TCK": "S", + "TCN": "S", + "TCW": "S", + "TCC": "S", + "TCR": "S", + "TCG": "S", + "TCA": "S", + "TCM": "S", + "TCV": "S", + "TCY": "S", + "TCS": "S", + "TCT": "S", + "TRA": "*", + "TGC": "C", + "TGG": "W", + "TGA": "*", + "TGY": "C", + "TGT": "C", + "TAC": "Y", + "TAR": "*", + "TAG": "*", + "TAA": "*", + "TAY": "Y", + "TAT": "Y", + "TTC": "F", + "TTG": "L", + "TTA": "*", + "TTY": "F", + "TTT": "F", + }, + }, + "24": { + "trans_table": { + "CCB": "P", + "CCD": "P", + "CCH": "P", + "CCK": "P", + "CCN": "P", + "CCW": "P", + "CCC": "P", + "CCR": "P", + "CCG": "P", + "CCA": "P", + "CCM": "P", + "CCV": "P", + "CCY": "P", + "CCS": "P", + "CCT": "P", + "CGB": "R", + "CGD": "R", + "CGH": "R", + "CGK": "R", + "CGN": "R", + "CGW": "R", + "CGC": "R", + "CGR": "R", + "CGG": "R", + "CGA": "R", + "CGM": "R", + "CGV": "R", + "CGY": "R", + "CGS": "R", + "CGT": "R", + "CAC": "H", + "CAR": "Q", + "CAG": "Q", + "CAA": "Q", + "CAY": "H", + "CAT": "H", + "CTB": "L", + "CTD": "L", + "CTH": "L", + "CTK": "L", + "CTN": "L", + "CTW": "L", + "CTC": "L", + "CTR": "L", + "CTG": "L", + "CTA": "L", + "CTM": "L", + "CTV": "L", + "CTY": "L", + "CTS": "L", + "CTT": "L", + "GCB": "A", + "GCD": "A", + "GCH": "A", + "GCK": "A", + "GCN": "A", + "GCW": "A", + "GCC": "A", + "GCR": "A", + "GCG": "A", + "GCA": "A", + "GCM": "A", + "GCV": "A", + "GCY": "A", + "GCS": "A", + "GCT": "A", + "GGB": "G", + "GGD": "G", + "GGH": "G", + "GGK": "G", + "GGN": "G", + "GGW": "G", + "GGC": "G", + "GGR": "G", + "GGG": "G", + "GGA": "G", + "GGM": "G", + "GGV": "G", + "GGY": "G", + "GGS": "G", + "GGT": "G", + "GAC": "D", + "GAR": "E", + "GAG": "E", + "GAA": "E", + "GAY": "D", + "GAT": "D", + "GTB": "V", + "GTD": "V", + "GTH": "V", + "GTK": "V", + "GTN": "V", + "GTW": "V", + "GTC": "V", + "GTR": "V", + "GTG": "V", + "GTA": "V", + "GTM": "V", + "GTV": "V", + "GTY": "V", + "GTS": "V", + "GTT": "V", + "ACB": "T", + "ACD": "T", + "ACH": "T", + "ACK": "T", + "ACN": "T", + "ACW": "T", + "ACC": "T", + "ACR": "T", + "ACG": "T", + "ACA": "T", + "ACM": "T", + "ACV": "T", + "ACY": "T", + "ACS": "T", + "ACT": "T", + "ARG": "K", + "AGH": "S", + "AGW": "S", + "AGC": "S", + "AGG": "K", + "AGA": "S", + "AGM": "S", + "AGY": "S", + "AGT": "S", + "AAC": "N", + "AAR": "K", + "AAG": "K", + "AAA": "K", + "AAY": "N", + "AAT": "N", + "ATH": "I", + "ATW": "I", + "ATC": "I", + "ATG": "M", + "ATA": "I", + "ATM": "I", + "ATY": "I", + "ATT": "I", + "YTR": "L", + "YTG": "L", + "YTA": "L", + "TCB": "S", + "TCD": "S", + "TCH": "S", + "TCK": "S", + "TCN": "S", + "TCW": "S", + "TCC": "S", + "TCR": "S", + "TCG": "S", + "TCA": "S", + "TCM": "S", + "TCV": "S", + "TCY": "S", + "TCS": "S", + "TCT": "S", + "TGC": "C", + "TGR": "W", + "TGG": "W", + "TGA": "W", + "TGY": "C", + "TGT": "C", + "TAC": "Y", + "TAR": "*", + "TAG": "*", + "TAA": "*", + "TAY": "Y", + "TAT": "Y", + "TTC": "F", + "TTR": "L", + "TTG": "L", + "TTA": "L", + "TTY": "F", + "TTT": "F", + }, + "start_table": { + "BTG": "M", + "DTG": "M", + "HTG": "M", + "KTG": "M", + "NTG": "M", + "WTG": "M", + "CCB": "P", + "CCD": "P", + "CCH": "P", + "CCK": "P", + "CCN": "P", + "CCW": "P", + "CCC": "P", + "CCR": "P", + "CCG": "P", + "CCA": "P", + "CCM": "P", + "CCV": "P", + "CCY": "P", + "CCS": "P", + "CCT": "P", + "CGB": "R", + "CGD": "R", + "CGH": "R", + "CGK": "R", + "CGN": "R", + "CGW": "R", + "CGC": "R", + "CGR": "R", + "CGG": "R", + "CGA": "R", + "CGM": "R", + "CGV": "R", + "CGY": "R", + "CGS": "R", + "CGT": "R", + "CAC": "H", + "CAR": "Q", + "CAG": "Q", + "CAA": "Q", + "CAY": "H", + "CAT": "H", + "CTH": "L", + "CTW": "L", + "CTC": "L", + "CTG": "M", + "CTA": "L", + "CTM": "L", + "CTY": "L", + "CTT": "L", + "RTG": "M", + "GCB": "A", + "GCD": "A", + "GCH": "A", + "GCK": "A", + "GCN": "A", + "GCW": "A", + "GCC": "A", + "GCR": "A", + "GCG": "A", + "GCA": "A", + "GCM": "A", + "GCV": "A", + "GCY": "A", + "GCS": "A", + "GCT": "A", + "GGB": "G", + "GGD": "G", + "GGH": "G", + "GGK": "G", + "GGN": "G", + "GGW": "G", + "GGC": "G", + "GGR": "G", + "GGG": "G", + "GGA": "G", + "GGM": "G", + "GGV": "G", + "GGY": "G", + "GGS": "G", + "GGT": "G", + "GAC": "D", + "GAR": "E", + "GAG": "E", + "GAA": "E", + "GAY": "D", + "GAT": "D", + "GTH": "V", + "GTW": "V", + "GTC": "V", + "GTG": "M", + "GTA": "V", + "GTM": "V", + "GTY": "V", + "GTT": "V", + "ACB": "T", + "ACD": "T", + "ACH": "T", + "ACK": "T", + "ACN": "T", + "ACW": "T", + "ACC": "T", + "ACR": "T", + "ACG": "T", + "ACA": "T", + "ACM": "T", + "ACV": "T", + "ACY": "T", + "ACS": "T", + "ACT": "T", + "ARG": "K", + "AGH": "S", + "AGW": "S", + "AGC": "S", + "AGG": "K", + "AGA": "S", + "AGM": "S", + "AGY": "S", + "AGT": "S", + "AAC": "N", + "AAR": "K", + "AAG": "K", + "AAA": "K", + "AAY": "N", + "AAT": "N", + "ATH": "I", + "ATW": "I", + "ATC": "I", + "ATG": "M", + "ATA": "I", + "ATM": "I", + "ATY": "I", + "ATT": "I", + "MTG": "M", + "VTG": "M", + "YTG": "M", + "YTA": "L", + "STG": "M", + "TCB": "S", + "TCD": "S", + "TCH": "S", + "TCK": "S", + "TCN": "S", + "TCW": "S", + "TCC": "S", + "TCR": "S", + "TCG": "S", + "TCA": "S", + "TCM": "S", + "TCV": "S", + "TCY": "S", + "TCS": "S", + "TCT": "S", + "TGC": "C", + "TGR": "W", + "TGG": "W", + "TGA": "W", + "TGY": "C", + "TGT": "C", + "TAC": "Y", + "TAR": "*", + "TAG": "*", + "TAA": "*", + "TAY": "Y", + "TAT": "Y", + "TTC": "F", + "TTG": "M", + "TTA": "L", + "TTY": "F", + "TTT": "F", + }, + }, + "25": { + "trans_table": { + "KGA": "G", + "CCB": "P", + "CCD": "P", + "CCH": "P", + "CCK": "P", + "CCN": "P", + "CCW": "P", + "CCC": "P", + "CCR": "P", + "CCG": "P", + "CCA": "P", + "CCM": "P", + "CCV": "P", + "CCY": "P", + "CCS": "P", + "CCT": "P", + "CGB": "R", + "CGD": "R", + "CGH": "R", + "CGK": "R", + "CGN": "R", + "CGW": "R", + "CGC": "R", + "CGR": "R", + "CGG": "R", + "CGA": "R", + "CGM": "R", + "CGV": "R", + "CGY": "R", + "CGS": "R", + "CGT": "R", + "CAC": "H", + "CAR": "Q", + "CAG": "Q", + "CAA": "Q", + "CAY": "H", + "CAT": "H", + "CTB": "L", + "CTD": "L", + "CTH": "L", + "CTK": "L", + "CTN": "L", + "CTW": "L", + "CTC": "L", + "CTR": "L", + "CTG": "L", + "CTA": "L", + "CTM": "L", + "CTV": "L", + "CTY": "L", + "CTS": "L", + "CTT": "L", + "GCB": "A", + "GCD": "A", + "GCH": "A", + "GCK": "A", + "GCN": "A", + "GCW": "A", + "GCC": "A", + "GCR": "A", + "GCG": "A", + "GCA": "A", + "GCM": "A", + "GCV": "A", + "GCY": "A", + "GCS": "A", + "GCT": "A", + "GGB": "G", + "GGD": "G", + "GGH": "G", + "GGK": "G", + "GGN": "G", + "GGW": "G", + "GGC": "G", + "GGR": "G", + "GGG": "G", + "GGA": "G", + "GGM": "G", + "GGV": "G", + "GGY": "G", + "GGS": "G", + "GGT": "G", + "GAC": "D", + "GAR": "E", + "GAG": "E", + "GAA": "E", + "GAY": "D", + "GAT": "D", + "GTB": "V", + "GTD": "V", + "GTH": "V", + "GTK": "V", + "GTN": "V", + "GTW": "V", + "GTC": "V", + "GTR": "V", + "GTG": "V", + "GTA": "V", + "GTM": "V", + "GTV": "V", + "GTY": "V", + "GTS": "V", + "GTT": "V", + "ACB": "T", + "ACD": "T", + "ACH": "T", + "ACK": "T", + "ACN": "T", + "ACW": "T", + "ACC": "T", + "ACR": "T", + "ACG": "T", + "ACA": "T", + "ACM": "T", + "ACV": "T", + "ACY": "T", + "ACS": "T", + "ACT": "T", + "AGC": "S", + "AGR": "R", + "AGG": "R", + "AGA": "R", + "AGY": "S", + "AGT": "S", + "AAC": "N", + "AAR": "K", + "AAG": "K", + "AAA": "K", + "AAY": "N", + "AAT": "N", + "ATH": "I", + "ATW": "I", + "ATC": "I", + "ATG": "M", + "ATA": "I", + "ATM": "I", + "ATY": "I", + "ATT": "I", + "MGR": "R", + "MGG": "R", + "MGA": "R", + "YTR": "L", + "YTG": "L", + "YTA": "L", + "TCB": "S", + "TCD": "S", + "TCH": "S", + "TCK": "S", + "TCN": "S", + "TCW": "S", + "TCC": "S", + "TCR": "S", + "TCG": "S", + "TCA": "S", + "TCM": "S", + "TCV": "S", + "TCY": "S", + "TCS": "S", + "TCT": "S", + "TGC": "C", + "TGG": "W", + "TGA": "G", + "TGY": "C", + "TGT": "C", + "TAC": "Y", + "TAR": "*", + "TAG": "*", + "TAA": "*", + "TAY": "Y", + "TAT": "Y", + "TTC": "F", + "TTR": "L", + "TTG": "L", + "TTA": "L", + "TTY": "F", + "TTT": "F", + }, + "start_table": { + "DTG": "M", + "KGA": "G", + "KTG": "M", + "WTG": "M", + "CCB": "P", + "CCD": "P", + "CCH": "P", + "CCK": "P", + "CCN": "P", + "CCW": "P", + "CCC": "P", + "CCR": "P", + "CCG": "P", + "CCA": "P", + "CCM": "P", + "CCV": "P", + "CCY": "P", + "CCS": "P", + "CCT": "P", + "CGB": "R", + "CGD": "R", + "CGH": "R", + "CGK": "R", + "CGN": "R", + "CGW": "R", + "CGC": "R", + "CGR": "R", + "CGG": "R", + "CGA": "R", + "CGM": "R", + "CGV": "R", + "CGY": "R", + "CGS": "R", + "CGT": "R", + "CAC": "H", + "CAR": "Q", + "CAG": "Q", + "CAA": "Q", + "CAY": "H", + "CAT": "H", + "CTB": "L", + "CTD": "L", + "CTH": "L", + "CTK": "L", + "CTN": "L", + "CTW": "L", + "CTC": "L", + "CTR": "L", + "CTG": "L", + "CTA": "L", + "CTM": "L", + "CTV": "L", + "CTY": "L", + "CTS": "L", + "CTT": "L", + "RTG": "M", + "GCB": "A", + "GCD": "A", + "GCH": "A", + "GCK": "A", + "GCN": "A", + "GCW": "A", + "GCC": "A", + "GCR": "A", + "GCG": "A", + "GCA": "A", + "GCM": "A", + "GCV": "A", + "GCY": "A", + "GCS": "A", + "GCT": "A", + "GGB": "G", + "GGD": "G", + "GGH": "G", + "GGK": "G", + "GGN": "G", + "GGW": "G", + "GGC": "G", + "GGR": "G", + "GGG": "G", + "GGA": "G", + "GGM": "G", + "GGV": "G", + "GGY": "G", + "GGS": "G", + "GGT": "G", + "GAC": "D", + "GAR": "E", + "GAG": "E", + "GAA": "E", + "GAY": "D", + "GAT": "D", + "GTH": "V", + "GTW": "V", + "GTC": "V", + "GTG": "M", + "GTA": "V", + "GTM": "V", + "GTY": "V", + "GTT": "V", + "ACB": "T", + "ACD": "T", + "ACH": "T", + "ACK": "T", + "ACN": "T", + "ACW": "T", + "ACC": "T", + "ACR": "T", + "ACG": "T", + "ACA": "T", + "ACM": "T", + "ACV": "T", + "ACY": "T", + "ACS": "T", + "ACT": "T", + "AGC": "S", + "AGR": "R", + "AGG": "R", + "AGA": "R", + "AGY": "S", + "AGT": "S", + "AAC": "N", + "AAR": "K", + "AAG": "K", + "AAA": "K", + "AAY": "N", + "AAT": "N", + "ATH": "I", + "ATW": "I", + "ATC": "I", + "ATG": "M", + "ATA": "I", + "ATM": "I", + "ATY": "I", + "ATT": "I", + "MGR": "R", + "MGG": "R", + "MGA": "R", + "YTA": "L", + "TCB": "S", + "TCD": "S", + "TCH": "S", + "TCK": "S", + "TCN": "S", + "TCW": "S", + "TCC": "S", + "TCR": "S", + "TCG": "S", + "TCA": "S", + "TCM": "S", + "TCV": "S", + "TCY": "S", + "TCS": "S", + "TCT": "S", + "TGC": "C", + "TGG": "W", + "TGA": "G", + "TGY": "C", + "TGT": "C", + "TAC": "Y", + "TAR": "*", + "TAG": "*", + "TAA": "*", + "TAY": "Y", + "TAT": "Y", + "TTC": "F", + "TTG": "M", + "TTA": "L", + "TTY": "F", + "TTT": "F", + }, + }, + "26": { + "trans_table": { + "CCB": "P", + "CCD": "P", + "CCH": "P", + "CCK": "P", + "CCN": "P", + "CCW": "P", + "CCC": "P", + "CCR": "P", + "CCG": "P", + "CCA": "P", + "CCM": "P", + "CCV": "P", + "CCY": "P", + "CCS": "P", + "CCT": "P", + "CGB": "R", + "CGD": "R", + "CGH": "R", + "CGK": "R", + "CGN": "R", + "CGW": "R", + "CGC": "R", + "CGR": "R", + "CGG": "R", + "CGA": "R", + "CGM": "R", + "CGV": "R", + "CGY": "R", + "CGS": "R", + "CGT": "R", + "CAC": "H", + "CAR": "Q", + "CAG": "Q", + "CAA": "Q", + "CAY": "H", + "CAT": "H", + "CTH": "L", + "CTW": "L", + "CTC": "L", + "CTG": "A", + "CTA": "L", + "CTM": "L", + "CTY": "L", + "CTT": "L", + "GCB": "A", + "GCD": "A", + "GCH": "A", + "GCK": "A", + "GCN": "A", + "GCW": "A", + "GCC": "A", + "GCR": "A", + "GCG": "A", + "GCA": "A", + "GCM": "A", + "GCV": "A", + "GCY": "A", + "GCS": "A", + "GCT": "A", + "GGB": "G", + "GGD": "G", + "GGH": "G", + "GGK": "G", + "GGN": "G", + "GGW": "G", + "GGC": "G", + "GGR": "G", + "GGG": "G", + "GGA": "G", + "GGM": "G", + "GGV": "G", + "GGY": "G", + "GGS": "G", + "GGT": "G", + "GAC": "D", + "GAR": "E", + "GAG": "E", + "GAA": "E", + "GAY": "D", + "GAT": "D", + "GTB": "V", + "GTD": "V", + "GTH": "V", + "GTK": "V", + "GTN": "V", + "GTW": "V", + "GTC": "V", + "GTR": "V", + "GTG": "V", + "GTA": "V", + "GTM": "V", + "GTV": "V", + "GTY": "V", + "GTS": "V", + "GTT": "V", + "ACB": "T", + "ACD": "T", + "ACH": "T", + "ACK": "T", + "ACN": "T", + "ACW": "T", + "ACC": "T", + "ACR": "T", + "ACG": "T", + "ACA": "T", + "ACM": "T", + "ACV": "T", + "ACY": "T", + "ACS": "T", + "ACT": "T", + "AGC": "S", + "AGR": "R", + "AGG": "R", + "AGA": "R", + "AGY": "S", + "AGT": "S", + "AAC": "N", + "AAR": "K", + "AAG": "K", + "AAA": "K", + "AAY": "N", + "AAT": "N", + "ATH": "I", + "ATW": "I", + "ATC": "I", + "ATG": "M", + "ATA": "I", + "ATM": "I", + "ATY": "I", + "ATT": "I", + "MGR": "R", + "MGG": "R", + "MGA": "R", + "YTA": "L", + "TCB": "S", + "TCD": "S", + "TCH": "S", + "TCK": "S", + "TCN": "S", + "TCW": "S", + "TCC": "S", + "TCR": "S", + "TCG": "S", + "TCA": "S", + "TCM": "S", + "TCV": "S", + "TCY": "S", + "TCS": "S", + "TCT": "S", + "TRA": "*", + "TGC": "C", + "TGG": "W", + "TGA": "*", + "TGY": "C", + "TGT": "C", + "TAC": "Y", + "TAR": "*", + "TAG": "*", + "TAA": "*", + "TAY": "Y", + "TAT": "Y", + "TTC": "F", + "TTR": "L", + "TTG": "L", + "TTA": "L", + "TTY": "F", + "TTT": "F", + }, + "start_table": { + "CCB": "P", + "CCD": "P", + "CCH": "P", + "CCK": "P", + "CCN": "P", + "CCW": "P", + "CCC": "P", + "CCR": "P", + "CCG": "P", + "CCA": "P", + "CCM": "P", + "CCV": "P", + "CCY": "P", + "CCS": "P", + "CCT": "P", + "CGB": "R", + "CGD": "R", + "CGH": "R", + "CGK": "R", + "CGN": "R", + "CGW": "R", + "CGC": "R", + "CGR": "R", + "CGG": "R", + "CGA": "R", + "CGM": "R", + "CGV": "R", + "CGY": "R", + "CGS": "R", + "CGT": "R", + "CAC": "H", + "CAR": "Q", + "CAG": "Q", + "CAA": "Q", + "CAY": "H", + "CAT": "H", + "CTH": "L", + "CTW": "L", + "CTC": "L", + "CTG": "M", + "CTA": "L", + "CTM": "L", + "CTY": "L", + "CTT": "L", + "GCB": "A", + "GCD": "A", + "GCH": "A", + "GCK": "A", + "GCN": "A", + "GCW": "A", + "GCC": "A", + "GCR": "A", + "GCG": "A", + "GCA": "A", + "GCM": "A", + "GCV": "A", + "GCY": "A", + "GCS": "A", + "GCT": "A", + "GGB": "G", + "GGD": "G", + "GGH": "G", + "GGK": "G", + "GGN": "G", + "GGW": "G", + "GGC": "G", + "GGR": "G", + "GGG": "G", + "GGA": "G", + "GGM": "G", + "GGV": "G", + "GGY": "G", + "GGS": "G", + "GGT": "G", + "GAC": "D", + "GAR": "E", + "GAG": "E", + "GAA": "E", + "GAY": "D", + "GAT": "D", + "GTB": "V", + "GTD": "V", + "GTH": "V", + "GTK": "V", + "GTN": "V", + "GTW": "V", + "GTC": "V", + "GTR": "V", + "GTG": "V", + "GTA": "V", + "GTM": "V", + "GTV": "V", + "GTY": "V", + "GTS": "V", + "GTT": "V", + "ACB": "T", + "ACD": "T", + "ACH": "T", + "ACK": "T", + "ACN": "T", + "ACW": "T", + "ACC": "T", + "ACR": "T", + "ACG": "T", + "ACA": "T", + "ACM": "T", + "ACV": "T", + "ACY": "T", + "ACS": "T", + "ACT": "T", + "AGC": "S", + "AGR": "R", + "AGG": "R", + "AGA": "R", + "AGY": "S", + "AGT": "S", + "AAC": "N", + "AAR": "K", + "AAG": "K", + "AAA": "K", + "AAY": "N", + "AAT": "N", + "ATH": "I", + "ATW": "I", + "ATC": "I", + "ATG": "M", + "ATA": "I", + "ATM": "I", + "ATY": "I", + "ATT": "I", + "MGR": "R", + "MGG": "R", + "MGA": "R", + "MTG": "M", + "YTA": "L", + "TCB": "S", + "TCD": "S", + "TCH": "S", + "TCK": "S", + "TCN": "S", + "TCW": "S", + "TCC": "S", + "TCR": "S", + "TCG": "S", + "TCA": "S", + "TCM": "S", + "TCV": "S", + "TCY": "S", + "TCS": "S", + "TCT": "S", + "TRA": "*", + "TGC": "C", + "TGG": "W", + "TGA": "*", + "TGY": "C", + "TGT": "C", + "TAC": "Y", + "TAR": "*", + "TAG": "*", + "TAA": "*", + "TAY": "Y", + "TAT": "Y", + "TTC": "F", + "TTR": "L", + "TTG": "L", + "TTA": "L", + "TTY": "F", + "TTT": "F", + }, + }, + "27": { + "trans_table": { + "CCB": "P", + "CCD": "P", + "CCH": "P", + "CCK": "P", + "CCN": "P", + "CCW": "P", + "CCC": "P", + "CCR": "P", + "CCG": "P", + "CCA": "P", + "CCM": "P", + "CCV": "P", + "CCY": "P", + "CCS": "P", + "CCT": "P", + "CGB": "R", + "CGD": "R", + "CGH": "R", + "CGK": "R", + "CGN": "R", + "CGW": "R", + "CGC": "R", + "CGR": "R", + "CGG": "R", + "CGA": "R", + "CGM": "R", + "CGV": "R", + "CGY": "R", + "CGS": "R", + "CGT": "R", + "CAC": "H", + "CAR": "Q", + "CAG": "Q", + "CAA": "Q", + "CAY": "H", + "CAT": "H", + "CTB": "L", + "CTD": "L", + "CTH": "L", + "CTK": "L", + "CTN": "L", + "CTW": "L", + "CTC": "L", + "CTR": "L", + "CTG": "L", + "CTA": "L", + "CTM": "L", + "CTV": "L", + "CTY": "L", + "CTS": "L", + "CTT": "L", + "GCB": "A", + "GCD": "A", + "GCH": "A", + "GCK": "A", + "GCN": "A", + "GCW": "A", + "GCC": "A", + "GCR": "A", + "GCG": "A", + "GCA": "A", + "GCM": "A", + "GCV": "A", + "GCY": "A", + "GCS": "A", + "GCT": "A", + "GGB": "G", + "GGD": "G", + "GGH": "G", + "GGK": "G", + "GGN": "G", + "GGW": "G", + "GGC": "G", + "GGR": "G", + "GGG": "G", + "GGA": "G", + "GGM": "G", + "GGV": "G", + "GGY": "G", + "GGS": "G", + "GGT": "G", + "GAC": "D", + "GAR": "E", + "GAG": "E", + "GAA": "E", + "GAY": "D", + "GAT": "D", + "GTB": "V", + "GTD": "V", + "GTH": "V", + "GTK": "V", + "GTN": "V", + "GTW": "V", + "GTC": "V", + "GTR": "V", + "GTG": "V", + "GTA": "V", + "GTM": "V", + "GTV": "V", + "GTY": "V", + "GTS": "V", + "GTT": "V", + "ACB": "T", + "ACD": "T", + "ACH": "T", + "ACK": "T", + "ACN": "T", + "ACW": "T", + "ACC": "T", + "ACR": "T", + "ACG": "T", + "ACA": "T", + "ACM": "T", + "ACV": "T", + "ACY": "T", + "ACS": "T", + "ACT": "T", + "AGC": "S", + "AGR": "R", + "AGG": "R", + "AGA": "R", + "AGY": "S", + "AGT": "S", + "AAC": "N", + "AAR": "K", + "AAG": "K", + "AAA": "K", + "AAY": "N", + "AAT": "N", + "ATH": "I", + "ATW": "I", + "ATC": "I", + "ATG": "M", + "ATA": "I", + "ATM": "I", + "ATY": "I", + "ATT": "I", + "MGR": "R", + "MGG": "R", + "MGA": "R", + "YAR": "Q", + "YAG": "Q", + "YAA": "Q", + "YTR": "L", + "YTG": "L", + "YTA": "L", + "TCB": "S", + "TCD": "S", + "TCH": "S", + "TCK": "S", + "TCN": "S", + "TCW": "S", + "TCC": "S", + "TCR": "S", + "TCG": "S", + "TCA": "S", + "TCM": "S", + "TCV": "S", + "TCY": "S", + "TCS": "S", + "TCT": "S", + "TGC": "C", + "TGR": "W", + "TGG": "W", + "TGA": "W", + "TGY": "C", + "TGT": "C", + "TAC": "Y", + "TAR": "Q", + "TAG": "Q", + "TAA": "Q", + "TAY": "Y", + "TAT": "Y", + "TTC": "F", + "TTR": "L", + "TTG": "L", + "TTA": "L", + "TTY": "F", + "TTT": "F", + }, + "start_table": { + "CCB": "P", + "CCD": "P", + "CCH": "P", + "CCK": "P", + "CCN": "P", + "CCW": "P", + "CCC": "P", + "CCR": "P", + "CCG": "P", + "CCA": "P", + "CCM": "P", + "CCV": "P", + "CCY": "P", + "CCS": "P", + "CCT": "P", + "CGB": "R", + "CGD": "R", + "CGH": "R", + "CGK": "R", + "CGN": "R", + "CGW": "R", + "CGC": "R", + "CGR": "R", + "CGG": "R", + "CGA": "R", + "CGM": "R", + "CGV": "R", + "CGY": "R", + "CGS": "R", + "CGT": "R", + "CAC": "H", + "CAR": "Q", + "CAG": "Q", + "CAA": "Q", + "CAY": "H", + "CAT": "H", + "CTB": "L", + "CTD": "L", + "CTH": "L", + "CTK": "L", + "CTN": "L", + "CTW": "L", + "CTC": "L", + "CTR": "L", + "CTG": "L", + "CTA": "L", + "CTM": "L", + "CTV": "L", + "CTY": "L", + "CTS": "L", + "CTT": "L", + "GCB": "A", + "GCD": "A", + "GCH": "A", + "GCK": "A", + "GCN": "A", + "GCW": "A", + "GCC": "A", + "GCR": "A", + "GCG": "A", + "GCA": "A", + "GCM": "A", + "GCV": "A", + "GCY": "A", + "GCS": "A", + "GCT": "A", + "GGB": "G", + "GGD": "G", + "GGH": "G", + "GGK": "G", + "GGN": "G", + "GGW": "G", + "GGC": "G", + "GGR": "G", + "GGG": "G", + "GGA": "G", + "GGM": "G", + "GGV": "G", + "GGY": "G", + "GGS": "G", + "GGT": "G", + "GAC": "D", + "GAR": "E", + "GAG": "E", + "GAA": "E", + "GAY": "D", + "GAT": "D", + "GTB": "V", + "GTD": "V", + "GTH": "V", + "GTK": "V", + "GTN": "V", + "GTW": "V", + "GTC": "V", + "GTR": "V", + "GTG": "V", + "GTA": "V", + "GTM": "V", + "GTV": "V", + "GTY": "V", + "GTS": "V", + "GTT": "V", + "ACB": "T", + "ACD": "T", + "ACH": "T", + "ACK": "T", + "ACN": "T", + "ACW": "T", + "ACC": "T", + "ACR": "T", + "ACG": "T", + "ACA": "T", + "ACM": "T", + "ACV": "T", + "ACY": "T", + "ACS": "T", + "ACT": "T", + "AGC": "S", + "AGR": "R", + "AGG": "R", + "AGA": "R", + "AGY": "S", + "AGT": "S", + "AAC": "N", + "AAR": "K", + "AAG": "K", + "AAA": "K", + "AAY": "N", + "AAT": "N", + "ATH": "I", + "ATW": "I", + "ATC": "I", + "ATG": "M", + "ATA": "I", + "ATM": "I", + "ATY": "I", + "ATT": "I", + "MGR": "R", + "MGG": "R", + "MGA": "R", + "YAR": "Q", + "YAG": "Q", + "YAA": "Q", + "YTR": "L", + "YTG": "L", + "YTA": "L", + "TCB": "S", + "TCD": "S", + "TCH": "S", + "TCK": "S", + "TCN": "S", + "TCW": "S", + "TCC": "S", + "TCR": "S", + "TCG": "S", + "TCA": "S", + "TCM": "S", + "TCV": "S", + "TCY": "S", + "TCS": "S", + "TCT": "S", + "TGC": "C", + "TGG": "W", + "TGA": "*", + "TGY": "C", + "TGT": "C", + "TAC": "Y", + "TAR": "Q", + "TAG": "Q", + "TAA": "Q", + "TAY": "Y", + "TAT": "Y", + "TTC": "F", + "TTR": "L", + "TTG": "L", + "TTA": "L", + "TTY": "F", + "TTT": "F", + }, + }, + "28": { + "trans_table": { + "CCB": "P", + "CCD": "P", + "CCH": "P", + "CCK": "P", + "CCN": "P", + "CCW": "P", + "CCC": "P", + "CCR": "P", + "CCG": "P", + "CCA": "P", + "CCM": "P", + "CCV": "P", + "CCY": "P", + "CCS": "P", + "CCT": "P", + "CGB": "R", + "CGD": "R", + "CGH": "R", + "CGK": "R", + "CGN": "R", + "CGW": "R", + "CGC": "R", + "CGR": "R", + "CGG": "R", + "CGA": "R", + "CGM": "R", + "CGV": "R", + "CGY": "R", + "CGS": "R", + "CGT": "R", + "CAC": "H", + "CAR": "Q", + "CAG": "Q", + "CAA": "Q", + "CAY": "H", + "CAT": "H", + "CTB": "L", + "CTD": "L", + "CTH": "L", + "CTK": "L", + "CTN": "L", + "CTW": "L", + "CTC": "L", + "CTR": "L", + "CTG": "L", + "CTA": "L", + "CTM": "L", + "CTV": "L", + "CTY": "L", + "CTS": "L", + "CTT": "L", + "GCB": "A", + "GCD": "A", + "GCH": "A", + "GCK": "A", + "GCN": "A", + "GCW": "A", + "GCC": "A", + "GCR": "A", + "GCG": "A", + "GCA": "A", + "GCM": "A", + "GCV": "A", + "GCY": "A", + "GCS": "A", + "GCT": "A", + "GGB": "G", + "GGD": "G", + "GGH": "G", + "GGK": "G", + "GGN": "G", + "GGW": "G", + "GGC": "G", + "GGR": "G", + "GGG": "G", + "GGA": "G", + "GGM": "G", + "GGV": "G", + "GGY": "G", + "GGS": "G", + "GGT": "G", + "GAC": "D", + "GAR": "E", + "GAG": "E", + "GAA": "E", + "GAY": "D", + "GAT": "D", + "GTB": "V", + "GTD": "V", + "GTH": "V", + "GTK": "V", + "GTN": "V", + "GTW": "V", + "GTC": "V", + "GTR": "V", + "GTG": "V", + "GTA": "V", + "GTM": "V", + "GTV": "V", + "GTY": "V", + "GTS": "V", + "GTT": "V", + "ACB": "T", + "ACD": "T", + "ACH": "T", + "ACK": "T", + "ACN": "T", + "ACW": "T", + "ACC": "T", + "ACR": "T", + "ACG": "T", + "ACA": "T", + "ACM": "T", + "ACV": "T", + "ACY": "T", + "ACS": "T", + "ACT": "T", + "AGC": "S", + "AGR": "R", + "AGG": "R", + "AGA": "R", + "AGY": "S", + "AGT": "S", + "AAC": "N", + "AAR": "K", + "AAG": "K", + "AAA": "K", + "AAY": "N", + "AAT": "N", + "ATH": "I", + "ATW": "I", + "ATC": "I", + "ATG": "M", + "ATA": "I", + "ATM": "I", + "ATY": "I", + "ATT": "I", + "MGR": "R", + "MGG": "R", + "MGA": "R", + "YAR": "Q", + "YAG": "Q", + "YAA": "Q", + "YTR": "L", + "YTG": "L", + "YTA": "L", + "TCB": "S", + "TCD": "S", + "TCH": "S", + "TCK": "S", + "TCN": "S", + "TCW": "S", + "TCC": "S", + "TCR": "S", + "TCG": "S", + "TCA": "S", + "TCM": "S", + "TCV": "S", + "TCY": "S", + "TCS": "S", + "TCT": "S", + "TGC": "C", + "TGR": "W", + "TGG": "W", + "TGA": "W", + "TGY": "C", + "TGT": "C", + "TAC": "Y", + "TAR": "Q", + "TAG": "Q", + "TAA": "Q", + "TAY": "Y", + "TAT": "Y", + "TTC": "F", + "TTR": "L", + "TTG": "L", + "TTA": "L", + "TTY": "F", + "TTT": "F", + }, + "start_table": { + "CCB": "P", + "CCD": "P", + "CCH": "P", + "CCK": "P", + "CCN": "P", + "CCW": "P", + "CCC": "P", + "CCR": "P", + "CCG": "P", + "CCA": "P", + "CCM": "P", + "CCV": "P", + "CCY": "P", + "CCS": "P", + "CCT": "P", + "CGB": "R", + "CGD": "R", + "CGH": "R", + "CGK": "R", + "CGN": "R", + "CGW": "R", + "CGC": "R", + "CGR": "R", + "CGG": "R", + "CGA": "R", + "CGM": "R", + "CGV": "R", + "CGY": "R", + "CGS": "R", + "CGT": "R", + "CAC": "H", + "CAR": "Q", + "CAG": "Q", + "CAA": "Q", + "CAY": "H", + "CAT": "H", + "CTB": "L", + "CTD": "L", + "CTH": "L", + "CTK": "L", + "CTN": "L", + "CTW": "L", + "CTC": "L", + "CTR": "L", + "CTG": "L", + "CTA": "L", + "CTM": "L", + "CTV": "L", + "CTY": "L", + "CTS": "L", + "CTT": "L", + "GCB": "A", + "GCD": "A", + "GCH": "A", + "GCK": "A", + "GCN": "A", + "GCW": "A", + "GCC": "A", + "GCR": "A", + "GCG": "A", + "GCA": "A", + "GCM": "A", + "GCV": "A", + "GCY": "A", + "GCS": "A", + "GCT": "A", + "GGB": "G", + "GGD": "G", + "GGH": "G", + "GGK": "G", + "GGN": "G", + "GGW": "G", + "GGC": "G", + "GGR": "G", + "GGG": "G", + "GGA": "G", + "GGM": "G", + "GGV": "G", + "GGY": "G", + "GGS": "G", + "GGT": "G", + "GAC": "D", + "GAR": "E", + "GAG": "E", + "GAA": "E", + "GAY": "D", + "GAT": "D", + "GTB": "V", + "GTD": "V", + "GTH": "V", + "GTK": "V", + "GTN": "V", + "GTW": "V", + "GTC": "V", + "GTR": "V", + "GTG": "V", + "GTA": "V", + "GTM": "V", + "GTV": "V", + "GTY": "V", + "GTS": "V", + "GTT": "V", + "ACB": "T", + "ACD": "T", + "ACH": "T", + "ACK": "T", + "ACN": "T", + "ACW": "T", + "ACC": "T", + "ACR": "T", + "ACG": "T", + "ACA": "T", + "ACM": "T", + "ACV": "T", + "ACY": "T", + "ACS": "T", + "ACT": "T", + "AGC": "S", + "AGR": "R", + "AGG": "R", + "AGA": "R", + "AGY": "S", + "AGT": "S", + "AAC": "N", + "AAR": "K", + "AAG": "K", + "AAA": "K", + "AAY": "N", + "AAT": "N", + "ATH": "I", + "ATW": "I", + "ATC": "I", + "ATG": "M", + "ATA": "I", + "ATM": "I", + "ATY": "I", + "ATT": "I", + "MGR": "R", + "MGG": "R", + "MGA": "R", + "YTR": "L", + "YTG": "L", + "YTA": "L", + "TCB": "S", + "TCD": "S", + "TCH": "S", + "TCK": "S", + "TCN": "S", + "TCW": "S", + "TCC": "S", + "TCR": "S", + "TCG": "S", + "TCA": "S", + "TCM": "S", + "TCV": "S", + "TCY": "S", + "TCS": "S", + "TCT": "S", + "TRA": "*", + "TGC": "C", + "TGG": "W", + "TGA": "*", + "TGY": "C", + "TGT": "C", + "TAC": "Y", + "TAR": "*", + "TAG": "*", + "TAA": "*", + "TAY": "Y", + "TAT": "Y", + "TTC": "F", + "TTR": "L", + "TTG": "L", + "TTA": "L", + "TTY": "F", + "TTT": "F", + }, + }, + "29": { + "trans_table": { + "CCB": "P", + "CCD": "P", + "CCH": "P", + "CCK": "P", + "CCN": "P", + "CCW": "P", + "CCC": "P", + "CCR": "P", + "CCG": "P", + "CCA": "P", + "CCM": "P", + "CCV": "P", + "CCY": "P", + "CCS": "P", + "CCT": "P", + "CGB": "R", + "CGD": "R", + "CGH": "R", + "CGK": "R", + "CGN": "R", + "CGW": "R", + "CGC": "R", + "CGR": "R", + "CGG": "R", + "CGA": "R", + "CGM": "R", + "CGV": "R", + "CGY": "R", + "CGS": "R", + "CGT": "R", + "CAC": "H", + "CAR": "Q", + "CAG": "Q", + "CAA": "Q", + "CAY": "H", + "CAT": "H", + "CTB": "L", + "CTD": "L", + "CTH": "L", + "CTK": "L", + "CTN": "L", + "CTW": "L", + "CTC": "L", + "CTR": "L", + "CTG": "L", + "CTA": "L", + "CTM": "L", + "CTV": "L", + "CTY": "L", + "CTS": "L", + "CTT": "L", + "GCB": "A", + "GCD": "A", + "GCH": "A", + "GCK": "A", + "GCN": "A", + "GCW": "A", + "GCC": "A", + "GCR": "A", + "GCG": "A", + "GCA": "A", + "GCM": "A", + "GCV": "A", + "GCY": "A", + "GCS": "A", + "GCT": "A", + "GGB": "G", + "GGD": "G", + "GGH": "G", + "GGK": "G", + "GGN": "G", + "GGW": "G", + "GGC": "G", + "GGR": "G", + "GGG": "G", + "GGA": "G", + "GGM": "G", + "GGV": "G", + "GGY": "G", + "GGS": "G", + "GGT": "G", + "GAC": "D", + "GAR": "E", + "GAG": "E", + "GAA": "E", + "GAY": "D", + "GAT": "D", + "GTB": "V", + "GTD": "V", + "GTH": "V", + "GTK": "V", + "GTN": "V", + "GTW": "V", + "GTC": "V", + "GTR": "V", + "GTG": "V", + "GTA": "V", + "GTM": "V", + "GTV": "V", + "GTY": "V", + "GTS": "V", + "GTT": "V", + "ACB": "T", + "ACD": "T", + "ACH": "T", + "ACK": "T", + "ACN": "T", + "ACW": "T", + "ACC": "T", + "ACR": "T", + "ACG": "T", + "ACA": "T", + "ACM": "T", + "ACV": "T", + "ACY": "T", + "ACS": "T", + "ACT": "T", + "AGC": "S", + "AGR": "R", + "AGG": "R", + "AGA": "R", + "AGY": "S", + "AGT": "S", + "AAC": "N", + "AAR": "K", + "AAG": "K", + "AAA": "K", + "AAY": "N", + "AAT": "N", + "ATH": "I", + "ATW": "I", + "ATC": "I", + "ATG": "M", + "ATA": "I", + "ATM": "I", + "ATY": "I", + "ATT": "I", + "MGR": "R", + "MGG": "R", + "MGA": "R", + "YTR": "L", + "YTG": "L", + "YTA": "L", + "TCB": "S", + "TCD": "S", + "TCH": "S", + "TCK": "S", + "TCN": "S", + "TCW": "S", + "TCC": "S", + "TCR": "S", + "TCG": "S", + "TCA": "S", + "TCM": "S", + "TCV": "S", + "TCY": "S", + "TCS": "S", + "TCT": "S", + "TGC": "C", + "TGG": "W", + "TGA": "*", + "TGY": "C", + "TGT": "C", + "TAB": "Y", + "TAD": "Y", + "TAH": "Y", + "TAK": "Y", + "TAN": "Y", + "TAW": "Y", + "TAC": "Y", + "TAR": "Y", + "TAG": "Y", + "TAA": "Y", + "TAM": "Y", + "TAV": "Y", + "TAY": "Y", + "TAS": "Y", + "TAT": "Y", + "TTC": "F", + "TTR": "L", + "TTG": "L", + "TTA": "L", + "TTY": "F", + "TTT": "F", + }, + "start_table": { + "CCB": "P", + "CCD": "P", + "CCH": "P", + "CCK": "P", + "CCN": "P", + "CCW": "P", + "CCC": "P", + "CCR": "P", + "CCG": "P", + "CCA": "P", + "CCM": "P", + "CCV": "P", + "CCY": "P", + "CCS": "P", + "CCT": "P", + "CGB": "R", + "CGD": "R", + "CGH": "R", + "CGK": "R", + "CGN": "R", + "CGW": "R", + "CGC": "R", + "CGR": "R", + "CGG": "R", + "CGA": "R", + "CGM": "R", + "CGV": "R", + "CGY": "R", + "CGS": "R", + "CGT": "R", + "CAC": "H", + "CAR": "Q", + "CAG": "Q", + "CAA": "Q", + "CAY": "H", + "CAT": "H", + "CTB": "L", + "CTD": "L", + "CTH": "L", + "CTK": "L", + "CTN": "L", + "CTW": "L", + "CTC": "L", + "CTR": "L", + "CTG": "L", + "CTA": "L", + "CTM": "L", + "CTV": "L", + "CTY": "L", + "CTS": "L", + "CTT": "L", + "GCB": "A", + "GCD": "A", + "GCH": "A", + "GCK": "A", + "GCN": "A", + "GCW": "A", + "GCC": "A", + "GCR": "A", + "GCG": "A", + "GCA": "A", + "GCM": "A", + "GCV": "A", + "GCY": "A", + "GCS": "A", + "GCT": "A", + "GGB": "G", + "GGD": "G", + "GGH": "G", + "GGK": "G", + "GGN": "G", + "GGW": "G", + "GGC": "G", + "GGR": "G", + "GGG": "G", + "GGA": "G", + "GGM": "G", + "GGV": "G", + "GGY": "G", + "GGS": "G", + "GGT": "G", + "GAC": "D", + "GAR": "E", + "GAG": "E", + "GAA": "E", + "GAY": "D", + "GAT": "D", + "GTB": "V", + "GTD": "V", + "GTH": "V", + "GTK": "V", + "GTN": "V", + "GTW": "V", + "GTC": "V", + "GTR": "V", + "GTG": "V", + "GTA": "V", + "GTM": "V", + "GTV": "V", + "GTY": "V", + "GTS": "V", + "GTT": "V", + "ACB": "T", + "ACD": "T", + "ACH": "T", + "ACK": "T", + "ACN": "T", + "ACW": "T", + "ACC": "T", + "ACR": "T", + "ACG": "T", + "ACA": "T", + "ACM": "T", + "ACV": "T", + "ACY": "T", + "ACS": "T", + "ACT": "T", + "AGC": "S", + "AGR": "R", + "AGG": "R", + "AGA": "R", + "AGY": "S", + "AGT": "S", + "AAC": "N", + "AAR": "K", + "AAG": "K", + "AAA": "K", + "AAY": "N", + "AAT": "N", + "ATH": "I", + "ATW": "I", + "ATC": "I", + "ATG": "M", + "ATA": "I", + "ATM": "I", + "ATY": "I", + "ATT": "I", + "MGR": "R", + "MGG": "R", + "MGA": "R", + "YTR": "L", + "YTG": "L", + "YTA": "L", + "TCB": "S", + "TCD": "S", + "TCH": "S", + "TCK": "S", + "TCN": "S", + "TCW": "S", + "TCC": "S", + "TCR": "S", + "TCG": "S", + "TCA": "S", + "TCM": "S", + "TCV": "S", + "TCY": "S", + "TCS": "S", + "TCT": "S", + "TGC": "C", + "TGG": "W", + "TGA": "*", + "TGY": "C", + "TGT": "C", + "TAB": "Y", + "TAD": "Y", + "TAH": "Y", + "TAK": "Y", + "TAN": "Y", + "TAW": "Y", + "TAC": "Y", + "TAR": "Y", + "TAG": "Y", + "TAA": "Y", + "TAM": "Y", + "TAV": "Y", + "TAY": "Y", + "TAS": "Y", + "TAT": "Y", + "TTC": "F", + "TTR": "L", + "TTG": "L", + "TTA": "L", + "TTY": "F", + "TTT": "F", + }, + }, + "30": { + "trans_table": { + "KAR": "E", + "KAG": "E", + "KAA": "E", + "CCB": "P", + "CCD": "P", + "CCH": "P", + "CCK": "P", + "CCN": "P", + "CCW": "P", + "CCC": "P", + "CCR": "P", + "CCG": "P", + "CCA": "P", + "CCM": "P", + "CCV": "P", + "CCY": "P", + "CCS": "P", + "CCT": "P", + "CGB": "R", + "CGD": "R", + "CGH": "R", + "CGK": "R", + "CGN": "R", + "CGW": "R", + "CGC": "R", + "CGR": "R", + "CGG": "R", + "CGA": "R", + "CGM": "R", + "CGV": "R", + "CGY": "R", + "CGS": "R", + "CGT": "R", + "CAC": "H", + "CAR": "Q", + "CAG": "Q", + "CAA": "Q", + "CAY": "H", + "CAT": "H", + "CTB": "L", + "CTD": "L", + "CTH": "L", + "CTK": "L", + "CTN": "L", + "CTW": "L", + "CTC": "L", + "CTR": "L", + "CTG": "L", + "CTA": "L", + "CTM": "L", + "CTV": "L", + "CTY": "L", + "CTS": "L", + "CTT": "L", + "GCB": "A", + "GCD": "A", + "GCH": "A", + "GCK": "A", + "GCN": "A", + "GCW": "A", + "GCC": "A", + "GCR": "A", + "GCG": "A", + "GCA": "A", + "GCM": "A", + "GCV": "A", + "GCY": "A", + "GCS": "A", + "GCT": "A", + "GGB": "G", + "GGD": "G", + "GGH": "G", + "GGK": "G", + "GGN": "G", + "GGW": "G", + "GGC": "G", + "GGR": "G", + "GGG": "G", + "GGA": "G", + "GGM": "G", + "GGV": "G", + "GGY": "G", + "GGS": "G", + "GGT": "G", + "GAC": "D", + "GAR": "E", + "GAG": "E", + "GAA": "E", + "GAY": "D", + "GAT": "D", + "GTB": "V", + "GTD": "V", + "GTH": "V", + "GTK": "V", + "GTN": "V", + "GTW": "V", + "GTC": "V", + "GTR": "V", + "GTG": "V", + "GTA": "V", + "GTM": "V", + "GTV": "V", + "GTY": "V", + "GTS": "V", + "GTT": "V", + "ACB": "T", + "ACD": "T", + "ACH": "T", + "ACK": "T", + "ACN": "T", + "ACW": "T", + "ACC": "T", + "ACR": "T", + "ACG": "T", + "ACA": "T", + "ACM": "T", + "ACV": "T", + "ACY": "T", + "ACS": "T", + "ACT": "T", + "AGC": "S", + "AGR": "R", + "AGG": "R", + "AGA": "R", + "AGY": "S", + "AGT": "S", + "AAC": "N", + "AAR": "K", + "AAG": "K", + "AAA": "K", + "AAY": "N", + "AAT": "N", + "ATH": "I", + "ATW": "I", + "ATC": "I", + "ATG": "M", + "ATA": "I", + "ATM": "I", + "ATY": "I", + "ATT": "I", + "MGR": "R", + "MGG": "R", + "MGA": "R", + "YTR": "L", + "YTG": "L", + "YTA": "L", + "TCB": "S", + "TCD": "S", + "TCH": "S", + "TCK": "S", + "TCN": "S", + "TCW": "S", + "TCC": "S", + "TCR": "S", + "TCG": "S", + "TCA": "S", + "TCM": "S", + "TCV": "S", + "TCY": "S", + "TCS": "S", + "TCT": "S", + "TGC": "C", + "TGG": "W", + "TGA": "*", + "TGY": "C", + "TGT": "C", + "TAC": "Y", + "TAR": "E", + "TAG": "E", + "TAA": "E", + "TAY": "Y", + "TAT": "Y", + "TTC": "F", + "TTR": "L", + "TTG": "L", + "TTA": "L", + "TTY": "F", + "TTT": "F", + }, + "start_table": { + "KAR": "E", + "KAG": "E", + "KAA": "E", + "CCB": "P", + "CCD": "P", + "CCH": "P", + "CCK": "P", + "CCN": "P", + "CCW": "P", + "CCC": "P", + "CCR": "P", + "CCG": "P", + "CCA": "P", + "CCM": "P", + "CCV": "P", + "CCY": "P", + "CCS": "P", + "CCT": "P", + "CGB": "R", + "CGD": "R", + "CGH": "R", + "CGK": "R", + "CGN": "R", + "CGW": "R", + "CGC": "R", + "CGR": "R", + "CGG": "R", + "CGA": "R", + "CGM": "R", + "CGV": "R", + "CGY": "R", + "CGS": "R", + "CGT": "R", + "CAC": "H", + "CAR": "Q", + "CAG": "Q", + "CAA": "Q", + "CAY": "H", + "CAT": "H", + "CTB": "L", + "CTD": "L", + "CTH": "L", + "CTK": "L", + "CTN": "L", + "CTW": "L", + "CTC": "L", + "CTR": "L", + "CTG": "L", + "CTA": "L", + "CTM": "L", + "CTV": "L", + "CTY": "L", + "CTS": "L", + "CTT": "L", + "GCB": "A", + "GCD": "A", + "GCH": "A", + "GCK": "A", + "GCN": "A", + "GCW": "A", + "GCC": "A", + "GCR": "A", + "GCG": "A", + "GCA": "A", + "GCM": "A", + "GCV": "A", + "GCY": "A", + "GCS": "A", + "GCT": "A", + "GGB": "G", + "GGD": "G", + "GGH": "G", + "GGK": "G", + "GGN": "G", + "GGW": "G", + "GGC": "G", + "GGR": "G", + "GGG": "G", + "GGA": "G", + "GGM": "G", + "GGV": "G", + "GGY": "G", + "GGS": "G", + "GGT": "G", + "GAC": "D", + "GAR": "E", + "GAG": "E", + "GAA": "E", + "GAY": "D", + "GAT": "D", + "GTB": "V", + "GTD": "V", + "GTH": "V", + "GTK": "V", + "GTN": "V", + "GTW": "V", + "GTC": "V", + "GTR": "V", + "GTG": "V", + "GTA": "V", + "GTM": "V", + "GTV": "V", + "GTY": "V", + "GTS": "V", + "GTT": "V", + "ACB": "T", + "ACD": "T", + "ACH": "T", + "ACK": "T", + "ACN": "T", + "ACW": "T", + "ACC": "T", + "ACR": "T", + "ACG": "T", + "ACA": "T", + "ACM": "T", + "ACV": "T", + "ACY": "T", + "ACS": "T", + "ACT": "T", + "AGC": "S", + "AGR": "R", + "AGG": "R", + "AGA": "R", + "AGY": "S", + "AGT": "S", + "AAC": "N", + "AAR": "K", + "AAG": "K", + "AAA": "K", + "AAY": "N", + "AAT": "N", + "ATH": "I", + "ATW": "I", + "ATC": "I", + "ATG": "M", + "ATA": "I", + "ATM": "I", + "ATY": "I", + "ATT": "I", + "MGR": "R", + "MGG": "R", + "MGA": "R", + "YTR": "L", + "YTG": "L", + "YTA": "L", + "TCB": "S", + "TCD": "S", + "TCH": "S", + "TCK": "S", + "TCN": "S", + "TCW": "S", + "TCC": "S", + "TCR": "S", + "TCG": "S", + "TCA": "S", + "TCM": "S", + "TCV": "S", + "TCY": "S", + "TCS": "S", + "TCT": "S", + "TGC": "C", + "TGG": "W", + "TGA": "*", + "TGY": "C", + "TGT": "C", + "TAC": "Y", + "TAR": "E", + "TAG": "E", + "TAA": "E", + "TAY": "Y", + "TAT": "Y", + "TTC": "F", + "TTR": "L", + "TTG": "L", + "TTA": "L", + "TTY": "F", + "TTT": "F", + }, + }, + "31": { + "trans_table": { + "KAR": "E", + "KAG": "E", + "KAA": "E", + "CCB": "P", + "CCD": "P", + "CCH": "P", + "CCK": "P", + "CCN": "P", + "CCW": "P", + "CCC": "P", + "CCR": "P", + "CCG": "P", + "CCA": "P", + "CCM": "P", + "CCV": "P", + "CCY": "P", + "CCS": "P", + "CCT": "P", + "CGB": "R", + "CGD": "R", + "CGH": "R", + "CGK": "R", + "CGN": "R", + "CGW": "R", + "CGC": "R", + "CGR": "R", + "CGG": "R", + "CGA": "R", + "CGM": "R", + "CGV": "R", + "CGY": "R", + "CGS": "R", + "CGT": "R", + "CAC": "H", + "CAR": "Q", + "CAG": "Q", + "CAA": "Q", + "CAY": "H", + "CAT": "H", + "CTB": "L", + "CTD": "L", + "CTH": "L", + "CTK": "L", + "CTN": "L", + "CTW": "L", + "CTC": "L", + "CTR": "L", + "CTG": "L", + "CTA": "L", + "CTM": "L", + "CTV": "L", + "CTY": "L", + "CTS": "L", + "CTT": "L", + "GCB": "A", + "GCD": "A", + "GCH": "A", + "GCK": "A", + "GCN": "A", + "GCW": "A", + "GCC": "A", + "GCR": "A", + "GCG": "A", + "GCA": "A", + "GCM": "A", + "GCV": "A", + "GCY": "A", + "GCS": "A", + "GCT": "A", + "GGB": "G", + "GGD": "G", + "GGH": "G", + "GGK": "G", + "GGN": "G", + "GGW": "G", + "GGC": "G", + "GGR": "G", + "GGG": "G", + "GGA": "G", + "GGM": "G", + "GGV": "G", + "GGY": "G", + "GGS": "G", + "GGT": "G", + "GAC": "D", + "GAR": "E", + "GAG": "E", + "GAA": "E", + "GAY": "D", + "GAT": "D", + "GTB": "V", + "GTD": "V", + "GTH": "V", + "GTK": "V", + "GTN": "V", + "GTW": "V", + "GTC": "V", + "GTR": "V", + "GTG": "V", + "GTA": "V", + "GTM": "V", + "GTV": "V", + "GTY": "V", + "GTS": "V", + "GTT": "V", + "ACB": "T", + "ACD": "T", + "ACH": "T", + "ACK": "T", + "ACN": "T", + "ACW": "T", + "ACC": "T", + "ACR": "T", + "ACG": "T", + "ACA": "T", + "ACM": "T", + "ACV": "T", + "ACY": "T", + "ACS": "T", + "ACT": "T", + "AGC": "S", + "AGR": "R", + "AGG": "R", + "AGA": "R", + "AGY": "S", + "AGT": "S", + "AAC": "N", + "AAR": "K", + "AAG": "K", + "AAA": "K", + "AAY": "N", + "AAT": "N", + "ATH": "I", + "ATW": "I", + "ATC": "I", + "ATG": "M", + "ATA": "I", + "ATM": "I", + "ATY": "I", + "ATT": "I", + "MGR": "R", + "MGG": "R", + "MGA": "R", + "YTR": "L", + "YTG": "L", + "YTA": "L", + "TCB": "S", + "TCD": "S", + "TCH": "S", + "TCK": "S", + "TCN": "S", + "TCW": "S", + "TCC": "S", + "TCR": "S", + "TCG": "S", + "TCA": "S", + "TCM": "S", + "TCV": "S", + "TCY": "S", + "TCS": "S", + "TCT": "S", + "TGC": "C", + "TGR": "W", + "TGG": "W", + "TGA": "W", + "TGY": "C", + "TGT": "C", + "TAC": "Y", + "TAR": "E", + "TAG": "E", + "TAA": "E", + "TAY": "Y", + "TAT": "Y", + "TTC": "F", + "TTR": "L", + "TTG": "L", + "TTA": "L", + "TTY": "F", + "TTT": "F", + }, + "start_table": { + "CCB": "P", + "CCD": "P", + "CCH": "P", + "CCK": "P", + "CCN": "P", + "CCW": "P", + "CCC": "P", + "CCR": "P", + "CCG": "P", + "CCA": "P", + "CCM": "P", + "CCV": "P", + "CCY": "P", + "CCS": "P", + "CCT": "P", + "CGB": "R", + "CGD": "R", + "CGH": "R", + "CGK": "R", + "CGN": "R", + "CGW": "R", + "CGC": "R", + "CGR": "R", + "CGG": "R", + "CGA": "R", + "CGM": "R", + "CGV": "R", + "CGY": "R", + "CGS": "R", + "CGT": "R", + "CAC": "H", + "CAR": "Q", + "CAG": "Q", + "CAA": "Q", + "CAY": "H", + "CAT": "H", + "CTB": "L", + "CTD": "L", + "CTH": "L", + "CTK": "L", + "CTN": "L", + "CTW": "L", + "CTC": "L", + "CTR": "L", + "CTG": "L", + "CTA": "L", + "CTM": "L", + "CTV": "L", + "CTY": "L", + "CTS": "L", + "CTT": "L", + "GCB": "A", + "GCD": "A", + "GCH": "A", + "GCK": "A", + "GCN": "A", + "GCW": "A", + "GCC": "A", + "GCR": "A", + "GCG": "A", + "GCA": "A", + "GCM": "A", + "GCV": "A", + "GCY": "A", + "GCS": "A", + "GCT": "A", + "GGB": "G", + "GGD": "G", + "GGH": "G", + "GGK": "G", + "GGN": "G", + "GGW": "G", + "GGC": "G", + "GGR": "G", + "GGG": "G", + "GGA": "G", + "GGM": "G", + "GGV": "G", + "GGY": "G", + "GGS": "G", + "GGT": "G", + "GAC": "D", + "GAR": "E", + "GAG": "E", + "GAA": "E", + "GAY": "D", + "GAT": "D", + "GTB": "V", + "GTD": "V", + "GTH": "V", + "GTK": "V", + "GTN": "V", + "GTW": "V", + "GTC": "V", + "GTR": "V", + "GTG": "V", + "GTA": "V", + "GTM": "V", + "GTV": "V", + "GTY": "V", + "GTS": "V", + "GTT": "V", + "ACB": "T", + "ACD": "T", + "ACH": "T", + "ACK": "T", + "ACN": "T", + "ACW": "T", + "ACC": "T", + "ACR": "T", + "ACG": "T", + "ACA": "T", + "ACM": "T", + "ACV": "T", + "ACY": "T", + "ACS": "T", + "ACT": "T", + "AGC": "S", + "AGR": "R", + "AGG": "R", + "AGA": "R", + "AGY": "S", + "AGT": "S", + "AAC": "N", + "AAR": "K", + "AAG": "K", + "AAA": "K", + "AAY": "N", + "AAT": "N", + "ATH": "I", + "ATW": "I", + "ATC": "I", + "ATG": "M", + "ATA": "I", + "ATM": "I", + "ATY": "I", + "ATT": "I", + "MGR": "R", + "MGG": "R", + "MGA": "R", + "YTR": "L", + "YTG": "L", + "YTA": "L", + "TCB": "S", + "TCD": "S", + "TCH": "S", + "TCK": "S", + "TCN": "S", + "TCW": "S", + "TCC": "S", + "TCR": "S", + "TCG": "S", + "TCA": "S", + "TCM": "S", + "TCV": "S", + "TCY": "S", + "TCS": "S", + "TCT": "S", + "TGC": "C", + "TGR": "W", + "TGG": "W", + "TGA": "W", + "TGY": "C", + "TGT": "C", + "TAC": "Y", + "TAR": "*", + "TAG": "*", + "TAA": "*", + "TAY": "Y", + "TAT": "Y", + "TTC": "F", + "TTR": "L", + "TTG": "L", + "TTA": "L", + "TTY": "F", + "TTT": "F", + }, + }, + }[code] diff --git a/ppanggolin/genome.py b/ppanggolin/genome.py index 83bf971c..46cbdcdd 100644 --- a/ppanggolin/genome.py +++ b/ppanggolin/genome.py @@ -42,7 +42,7 @@ def __init__(self, identifier: str): :param identifier: Identifier of the feature """ assert isinstance(identifier, str), "Expected identifier should be a string" - if identifier == '': + if identifier == "": raise ValueError("Identifier should not be empty") super().__init__() self.ID = identifier @@ -78,7 +78,8 @@ def __len__(self) -> int: return sum([(stop - start + 1) for start, stop in self.coordinates]) except TypeError: raise ValueError( - f"Coordinates of gene {self} have not been defined. Getting its length is then impossible.") + f"Coordinates of gene {self} have not been defined. Getting its length is then impossible." + ) @property def has_joined_coordinates(self) -> bool: @@ -121,7 +122,7 @@ def organism(self, organism: Organism): :param organism: Organism belonging to the feature """ if not isinstance(organism, Organism): - raise TypeError(f'Expected type Organism, got {type(organism)}') + raise TypeError(f"Expected type Organism, got {type(organism)}") self._organism = organism @property @@ -139,11 +140,20 @@ def contig(self, contig: Contig): :param contig: Contig linked to the feature """ if not isinstance(contig, Contig): - raise TypeError(f'Expected type Contig, got {type(contig)}') + raise TypeError(f"Expected type Contig, got {type(contig)}") self._contig = contig - def fill_annotations(self, start: int, stop: int, strand: str, gene_type: str = "", name: str = "", - product: str = "", local_identifier: str = "", coordinates: List[Tuple[int, int]] = None): + def fill_annotations( + self, + start: int, + stop: int, + strand: str, + gene_type: str = "", + name: str = "", + product: str = "", + local_identifier: str = "", + coordinates: List[Tuple[int, int]] = None, + ): """ Fill general annotation for child classes @@ -163,37 +173,59 @@ def fill_annotations(self, start: int, stop: int, strand: str, gene_type: str = coordinates = [(start, stop)] if not isinstance(start, int): - raise TypeError(f"Start should be int. Got {type(start)} instead in {self} from {self.organism}.") + raise TypeError( + f"Start should be int. Got {type(start)} instead in {self} from {self.organism}." + ) if not isinstance(stop, int): - raise TypeError(f"Stop should be int. Got {type(stop)} instead in {self} from {self.organism}.") + raise TypeError( + f"Stop should be int. Got {type(stop)} instead in {self} from {self.organism}." + ) if not isinstance(strand, str): - raise TypeError(f"Strand should be str. Got {type(strand)} instead in {self} from {self.organism}.") + raise TypeError( + f"Strand should be str. Got {type(strand)} instead in {self} from {self.organism}." + ) if not isinstance(gene_type, str): - raise TypeError(f"Gene type should be str. Got {type(gene_type)} instead in {self} from {self.organism}.") + raise TypeError( + f"Gene type should be str. Got {type(gene_type)} instead in {self} from {self.organism}." + ) if not isinstance(name, str): - raise TypeError(f"Name should be str. Got {type(name)} instead in {self} from {self.organism}.") + raise TypeError( + f"Name should be str. Got {type(name)} instead in {self} from {self.organism}." + ) if not isinstance(product, str): - raise TypeError(f"Product should be str. Got {type(product)} instead in {self} from {self.organism}.") + raise TypeError( + f"Product should be str. Got {type(product)} instead in {self} from {self.organism}." + ) if not isinstance(local_identifier, str): raise TypeError( - f"Local identifier should be str. Got {type(local_identifier)} instead in {self} from {self.organism}.") + f"Local identifier should be str. Got {type(local_identifier)} instead in {self} from {self.organism}." + ) if strand not in ["+", "-"]: - raise ValueError(f"Strand should be '+' or '-'. Got {strand} instead in {self} from {self.organism}.") + raise ValueError( + f"Strand should be '+' or '-'. Got {strand} instead in {self} from {self.organism}." + ) if not isinstance(coordinates, list): raise TypeError( - f"Coordinates should be of type list. Got {type(coordinates)} instead in {self} from {self.organism}.") + f"Coordinates should be of type list. Got {type(coordinates)} instead in {self} from {self.organism}." + ) for start_i, stop_i in coordinates: if not isinstance(start_i, int): - raise TypeError(f"Start should be int. Got {type(start_i)} instead in {self} from {self.organism}.") + raise TypeError( + f"Start should be int. Got {type(start_i)} instead in {self} from {self.organism}." + ) if not isinstance(stop_i, int): - raise TypeError(f"Stop should be int. Got {type(stop_i)} instead in {self} from {self.organism}.") + raise TypeError( + f"Stop should be int. Got {type(stop_i)} instead in {self} from {self.organism}." + ) if stop_i < start_i: raise ValueError( - f"Wrong coordinates: {coordinates}. Start ({start_i}) should not be greater than stop ({stop_i}) in {self} from {self.organism}.") + f"Wrong coordinates: {coordinates}. Start ({start_i}) should not be greater than stop ({stop_i}) in {self} from {self.organism}." + ) if start_i < 1 or stop_i < 1: raise ValueError( - f"Wrong coordinates: {coordinates}. Start ({start_i}) and stop ({stop_i}) should be greater than 0 in {self} from {self.organism}.") + f"Wrong coordinates: {coordinates}. Start ({start_i}) and stop ({stop_i}) should be greater than 0 in {self} from {self.organism}." + ) self.start = start self.stop = stop @@ -205,7 +237,7 @@ def fill_annotations(self, start: int, stop: int, strand: str, gene_type: str = self.coordinates = coordinates def fill_parents(self, organism: Organism = None, contig: Contig = None): - """ Associate object to an organism and a contig + """Associate object to an organism and a contig :param organism: Parent organism :param contig: Parent contig @@ -228,8 +260,9 @@ def add_sequence(self, sequence): :raise AssertionError: Sequence must be a string """ - assert isinstance(sequence, - str), f"'str' type was expected for dna sequence but you provided a '{type(sequence)}' type object" + assert isinstance( + sequence, str + ), f"'str' type was expected for dna sequence but you provided a '{type(sequence)}' type object" self.dna = sequence @@ -237,19 +270,17 @@ def string_coordinates(self) -> str: """ Return a string representation of the coordinates """ - return ','.join(f'{start}..{stop}' for start, stop in self.coordinates) + return ",".join(f"{start}..{stop}" for start, stop in self.coordinates) def start_relative_to(self, gene): - """ - """ + """ """ if gene.start <= self.start: return self.start if gene.start > self.start: return self.start + self.contig.length def stop_relative_to(self, gene): - """ - """ + """ """ if gene.start <= self.stop: return self.stop @@ -278,7 +309,7 @@ class Gene(Feature): Fields: - position: the position of the gene in the genome. - family: the family that the gene belongs to. - - RGP: A putative Region of Plasticity that contains the gene. + - RGP: A putative Region of Plasticity that contains the gene. - genetic_code: the genetic code associated with the gene. - Protein: the protein sequence corresponding to the translated gene. """ @@ -313,8 +344,9 @@ def family(self, family): :param family: Gene family linked to the gene """ from ppanggolin.geneFamily import GeneFamily + if not isinstance(family, GeneFamily): - raise TypeError(f'Expected type GeneFamily, got {type(family)}') + raise TypeError(f"Expected type GeneFamily, got {type(family)}") self._family = family @property @@ -333,8 +365,9 @@ def RGP(self, region): :param region: Region linked to the gene """ from ppanggolin.region import Region + if not isinstance(region, Region): - raise TypeError(f'Expected type Organism, got {type(region)}') + raise TypeError(f"Expected type Organism, got {type(region)}") self._RGP = region @property @@ -359,14 +392,20 @@ def module(self): """ return self.family.module - def fill_annotations(self, position: int = None, genetic_code: int = 11, is_partial: bool = False, frame: int = 0, - **kwargs): + def fill_annotations( + self, + position: int = None, + genetic_code: int = 11, + is_partial: bool = False, + frame: int = 0, + **kwargs, + ): """Fill Gene annotation provide by PPanGGOLiN dependencies :param position: Gene localization in genome :param genetic_code: Genetic code associated to gene :param is_partial: is the gene a partial gene - :param frame: One of '0', '1' or '2'. '0' indicates that the first base of the feature is the first base of a codon, + :param frame: One of '0', '1' or '2'. '0' indicates that the first base of the feature is the first base of a codon, '1' that the second base is the first base of a codon, and so on.. :param kwargs: look at Feature.fill_annotations methods @@ -394,7 +433,9 @@ def add_protein(self, protein: str): :raise TypeError: Protein sequence must be a string """ if not isinstance(protein, str): - raise TypeError(f"'str' type was expected but you provided a '{type(protein)}' type object") + raise TypeError( + f"'str' type was expected but you provided a '{type(protein)}' type object" + ) self.protein = protein @property @@ -403,7 +444,9 @@ def frame(self) -> int: Get the frame of the gene """ - assert self._frame is not None, "frame is already set and should not be set another time." + assert ( + self._frame is not None + ), "frame is already set and should not be set another time." return self._frame @@ -413,7 +456,9 @@ def frame(self, frame: int): :param contig_len: length of the contig """ - assert self._frame is None, "frame is already set and should not be set another time." + assert ( + self._frame is None + ), "frame is already set and should not be set another time." if frame not in [0, 1, 2]: raise ValueError("Frame should be equal to 0, 1 or 2.") @@ -434,8 +479,8 @@ class Contig(MetaFeatures): - is_circular: Boolean value indicating whether the contig is circular or not. - RNAs: Set of RNA annotations present in the contig. - TODO: Getter gene should be based on gene ID, and 2 other attributes should exist to get them by start or position. - Also, when set a new gene in contig, start, stop and strand should be check to check difference, maybe define __eq__ method in gene class. + TODO: Getter gene should be based on gene ID, and 2 other attributes should exist to get them by start or position. + Also, when set a new gene in contig, start, stop and strand should be check to check difference, maybe define __eq__ method in gene class. """ def __init__(self, identifier: int, name: str, is_circular: bool = False): @@ -448,7 +493,9 @@ def __init__(self, identifier: int, name: str, is_circular: bool = False): self.ID = identifier self.name = name self.is_circular = is_circular - self._rna_getter = set() # Saving the rna annotations. We're not using them in the vast majority of cases. + self._rna_getter = ( + set() + ) # Saving the rna annotations. We're not using them in the vast majority of cases. self._genes_getter = {} self._genes_position = [] self._organism = None @@ -462,10 +509,10 @@ def __str__(self) -> str: return self.name def __setitem__(self, coordinate: Tuple[int, int, str], gene: Gene): - """ + """ Set gene to Contig - Check if a gene with the same coordinate exists already in the contig. + Check if a gene with the same coordinate exists already in the contig. :param coordinate: Tuple containing start, stop and strand of the gene :param gene: Gene object to add @@ -476,21 +523,28 @@ def __setitem__(self, coordinate: Tuple[int, int, str], gene: Gene): """ if not isinstance(gene, Gene): - raise TypeError(f"'Gene' type was expected but you provided a '{type(gene)}' type object") + raise TypeError( + f"'Gene' type was expected but you provided a '{type(gene)}' type object" + ) if coordinate in self._genes_getter: raise ValueError( f"Gene '{self._genes_getter[coordinate].ID}' with coordinate {coordinate} already exists in the " f"contig '{self.name}' {f'from genome {self.organism}' if self.organism else ''}, " - f"cannot add gene '{gene.ID}' {f'from genome {gene.organism}' if gene.organism else ''}") + f"cannot add gene '{gene.ID}' {f'from genome {gene.organism}' if gene.organism else ''}" + ) if gene.position is None: - raise AttributeError("The gene object needs to have its position in the contig filled before adding it") + raise AttributeError( + "The gene object needs to have its position in the contig filled before adding it" + ) # Adding empty values. # They should be filled by the end of the parsing. # Doing this because genes are not always met in order. - self._genes_position.extend([None] * (gene.position - len(self._genes_position) + 1)) + self._genes_position.extend( + [None] * (gene.position - len(self._genes_position) + 1) + ) self._genes_position[gene.position] = gene self._genes_getter[coordinate] = gene @@ -498,9 +552,7 @@ def __setitem__(self, coordinate: Tuple[int, int, str], gene: Gene): @property def length(self) -> Union[int, None]: - """Get the length of the contig - - """ + """Get the length of the contig""" if self._length is None: logging.getLogger("PPanGGOLiN").warning("Contig length is unknown") return self._length @@ -519,8 +571,12 @@ def length(self, contig_len: int): if self._length is None: self._length = contig_len elif self.length != contig_len: - logging.getLogger("PPanGGOLiN").debug(f"Known contig length = {self.length}, new length = {contig_len}") - raise ValueError('Attempting to define a contig length different from the previously defined value.') + logging.getLogger("PPanGGOLiN").debug( + f"Known contig length = {self.length}, new length = {contig_len}" + ) + raise ValueError( + "Attempting to define a contig length different from the previously defined value." + ) def __len__(self) -> int: """Get the length of the contig @@ -572,15 +628,18 @@ def add(self, gene: Gene): :raises TypeError: Region is not an instance Region """ if not isinstance(gene, Gene): - raise TypeError(f"Unexpected class / type for {type(gene)} when adding it to a contig") + raise TypeError( + f"Unexpected class / type for {type(gene)} when adding it to a contig" + ) - for attr in ['start', 'stop', 'position', 'strand']: + for attr in ["start", "stop", "position", "strand"]: if getattr(gene, attr) is None: - raise AttributeError(f'Gene {gene.name} is not fill with {attr}') + raise AttributeError(f"Gene {gene.name} is not fill with {attr}") - if gene.strand not in ['+', '-']: + if gene.strand not in ["+", "-"]: raise AttributeError( - f"Strand of Gene {gene.name} does not have the expected format. Expect '-' or '+' got {gene.strand}") + f"Strand of Gene {gene.name} does not have the expected format. Expect '-' or '+' got {gene.strand}" + ) self[(gene.start, gene.stop, gene.strand)] = gene @@ -595,11 +654,15 @@ def get_by_coordinate(self, coordinate: Tuple[int, int, str]) -> Gene: :raises TypeError: Position is not an integer """ if not isinstance(coordinate, Tuple): - raise TypeError(f"Coordinate to get gene must be a tuple. The provided type was {type(coordinate)}") + raise TypeError( + f"Coordinate to get gene must be a tuple. The provided type was {type(coordinate)}" + ) gene = self[coordinate] if gene is None: - logging.getLogger("PPanGGOLiN").debug("Given position result with a None Gene") + logging.getLogger("PPanGGOLiN").debug( + "Given position result with a None Gene" + ) return gene def remove(self, position): @@ -610,10 +673,14 @@ def remove(self, position): :raises TypeError: Position is not an integer """ if not isinstance(position, int): - raise TypeError(f"Position to get gene must be an integer. The provided type was {type(position)}") + raise TypeError( + f"Position to get gene must be an integer. The provided type was {type(position)}" + ) del self[position] - def get_genes(self, begin: int = 0, end: int = None, outrange_ok: bool = False) -> List[Gene]: + def get_genes( + self, begin: int = 0, end: int = None, outrange_ok: bool = False + ) -> List[Gene]: """ Gets a list of genes within a range of gene position. If no arguments are given it return all genes. @@ -632,11 +699,15 @@ def get_genes(self, begin: int = 0, end: int = None, outrange_ok: bool = False) end = self._genes_position[-1].position if not isinstance(begin, int) or not isinstance(end, int): - raise TypeError(f"Expected type int for 'begin' and 'end', " - f"but received types '{type(begin)}' and '{type(end)}'.") + raise TypeError( + f"Expected type int for 'begin' and 'end', " + f"but received types '{type(begin)}' and '{type(end)}'." + ) if begin > end: - raise ValueError("The 'begin' position must be less than the 'end' position.") + raise ValueError( + "The 'begin' position must be less than the 'end' position." + ) if end > self._genes_position[-1].position: if outrange_ok: @@ -650,7 +721,7 @@ def get_genes(self, begin: int = 0, end: int = None, outrange_ok: bool = False) if begin == end: return self._genes_position[begin] else: - return self._genes_position[begin: end] + return self._genes_position[begin:end] @property def number_of_genes(self) -> int: @@ -662,7 +733,7 @@ def number_of_genes(self) -> int: @property def genes(self) -> Generator[Gene, None, None]: - """ Give the gene content of the contig + """Give the gene content of the contig :return: Generator of genes in contig """ @@ -687,11 +758,11 @@ def organism(self, organism: Organism): :raises TypeError: Given organism is not an instance Organism """ if not isinstance(organism, Organism): - raise TypeError(f'Expected type Organism, got {type(organism)}') + raise TypeError(f"Expected type Organism, got {type(organism)}") self._organism = organism def add_rna(self, rna: RNA): - """ Add RNA to contig + """Add RNA to contig :param rna: RNA object to add @@ -699,9 +770,13 @@ def add_rna(self, rna: RNA): :raises KeyError: Another RNA with the same ID already exists in the contig """ if not isinstance(rna, RNA): - raise TypeError(f"'RNA' type was expected but you provided a '{type(rna)}' type object") + raise TypeError( + f"'RNA' type was expected but you provided a '{type(rna)}' type object" + ) if rna in self._rna_getter: - raise KeyError(f"RNA with the id: {rna.ID} already exist in contig {self.name}") + raise KeyError( + f"RNA with the id: {rna.ID} already exist in contig {self.name}" + ) self._rna_getter.add(rna) @property @@ -714,8 +789,7 @@ def RNAs(self) -> Generator[RNA, None, None]: @property def number_of_rnas(self) -> int: - """Get the number of RNA in the contig - """ + """Get the number of RNA in the contig""" return len(self._rna_getter) def add_contig_length(self, contig_length: int): @@ -729,7 +803,9 @@ def add_contig_length(self, contig_length: int): self.length = contig_length elif self.length != contig_length: - raise ValueError('Attempting to define a contig length different from the previously defined value.') + raise ValueError( + "Attempting to define a contig length different from the previously defined value." + ) @property def regions(self): @@ -767,9 +843,11 @@ def families(self): families = set() for gene in self.genes: if gene.family is None: - raise ValueError("Gene has no family, that should not happen. " - "Check if you're families has been computed or loaded." - "If it's the case, you can report an issue on our GitHub.") + raise ValueError( + "Gene has no family, that should not happen. " + "Check if you're families has been computed or loaded." + "If it's the case, you can report an issue on our GitHub." + ) families.add(gene.family) yield from families @@ -789,18 +867,21 @@ def modules(self): def get_ordered_consecutive_genes(self, genes: Iterable[Gene]) -> List[List[Gene]]: """ Order the given genes considering the circularity of the contig. - + :param genes: An iterable containing genes supposed to be consecutive along the contig. :return: A list of lists containing ordered consecutive genes considering circularity. """ gene_positions = [gene.position for gene in genes] # Determine consecutive region positions - consecutive_region_positions = get_consecutive_region_positions(region_positions=gene_positions, - contig_gene_count=self.number_of_genes) + consecutive_region_positions = get_consecutive_region_positions( + region_positions=gene_positions, contig_gene_count=self.number_of_genes + ) - consecutive_genes_lists = [[self[position] for position in consecutive_positions] for consecutive_positions in - consecutive_region_positions] + consecutive_genes_lists = [ + [self[position] for position in consecutive_positions] + for consecutive_positions in consecutive_region_positions + ] return consecutive_genes_lists @@ -846,12 +927,11 @@ def __str__(self) -> str: return self.name def _set_families(self): - """Set the set of gene families belonging to organism - """ + """Set the set of gene families belonging to organism""" self._families = {gene.family for gene in self.genes} def __setitem__(self, name: str, contig: Contig): - """ Set contig to the organism + """Set contig to the organism :param name: Name of the contig :param contig: Contig object to add in the organism @@ -862,9 +942,13 @@ def __setitem__(self, name: str, contig: Contig): """ if not isinstance(name, str): - raise TypeError(f"Contig name should be a string. You provided a '{type(name)}' type object") + raise TypeError( + f"Contig name should be a string. You provided a '{type(name)}' type object" + ) if not isinstance(contig, Contig): - raise TypeError(f"'Contig' type was expected but you provided a '{type(contig)}' type object") + raise TypeError( + f"'Contig' type was expected but you provided a '{type(contig)}' type object" + ) if name in self._contigs_getter: # Add test if contig are equivalent when __eq__ method will be defined in Contig raise KeyError(f"Contig {contig.name} already in genome {self.name}") @@ -906,7 +990,7 @@ def __delitem__(self, name): raise KeyError("Position of the gene in the contig does not exist") def __len__(self): - """ Get number of contigs in organism + """Get number of contigs in organism :return: Number of contigs in organism """ @@ -951,14 +1035,14 @@ def rna_genes(self) -> Generator[RNA, None, None]: yield from contig.RNAs def number_of_genes(self) -> int: - """ Get number of genes in the organism + """Get number of genes in the organism :return: Number of genes """ return sum(contig.number_of_genes for contig in self.contigs) def number_of_rnas(self) -> int: - """ Get number of genes in the organism + """Get number of genes in the organism :return: Number of genes """ @@ -966,7 +1050,7 @@ def number_of_rnas(self) -> int: @property def contigs(self) -> Generator[Contig, None, None]: - """ Generator of contigs in the organism + """Generator of contigs in the organism :return: Values in contig dictionary from organism """ @@ -974,7 +1058,7 @@ def contigs(self) -> Generator[Contig, None, None]: @property def number_of_contigs(self) -> int: - """ Get number of contigs in organism + """Get number of contigs in organism :return: Number of contigs in organism """ @@ -987,7 +1071,9 @@ def add(self, contig: Contig): :raises KeyError: Contig with the given name already exist in the organism """ - assert isinstance(contig, Contig), f"Contig object is expected, given type was {type(contig)}" + assert isinstance( + contig, Contig + ), f"Contig object is expected, given type was {type(contig)}" try: _ = self.get(contig.name) except KeyError: @@ -1077,7 +1163,7 @@ def number_of_spots(self) -> int: """ return len(list(self.spots)) - def mk_bitarray(self, index: Dict[Organism, int], partition: str = 'all'): + def mk_bitarray(self, index: Dict[Organism, int], partition: str = "all"): """Produces a bitarray representing the presence / absence of families in the organism using the provided index The bitarray is stored in the :attr:`bitarray` attribute and is a :class:`gmpy2.xmpz` type. @@ -1087,26 +1173,28 @@ def mk_bitarray(self, index: Dict[Organism, int], partition: str = 'all'): :raises Exception: Partition is not recognized """ self.bitarray = gmpy2.xmpz() # pylint: disable=no-member - if partition == 'all': + if partition == "all": logging.getLogger("PPanGGOLiN").debug("all") for fam in self.families: self.bitarray[index[fam]] = 1 - elif partition in ['shell', 'cloud']: + elif partition in ["shell", "cloud"]: logging.getLogger("PPanGGOLiN").debug("shell, cloud") for fam in self.families: if fam.named_partition == partition: self.bitarray[index[fam]] = 1 - elif partition == 'accessory': + elif partition == "accessory": logging.getLogger("PPanGGOLiN").debug("accessory") for fam in self.families: - if fam.named_partition in ['shell', 'cloud']: + if fam.named_partition in ["shell", "cloud"]: self.bitarray[index[fam]] = 1 else: - raise ValueError("There is not any partition corresponding please report a github issue") + raise ValueError( + "There is not any partition corresponding please report a github issue" + ) def group_genes_by_partition(self) -> Dict[str, Set]: """ - Groups genes based on their family's named partition and returns a dictionary + Groups genes based on their family's named partition and returns a dictionary mapping partition names to sets of genes belonging to each partition. :return: A dictionary containing sets of genes grouped by their family's named partition. diff --git a/ppanggolin/graph/makeGraph.py b/ppanggolin/graph/makeGraph.py index 11d25ec6..ae877013 100644 --- a/ppanggolin/graph/makeGraph.py +++ b/ppanggolin/graph/makeGraph.py @@ -21,9 +21,11 @@ def check_pangenome_former_graph(pangenome: Pangenome, force: bool = False): :param force: Allow to force write on Pangenome file """ if pangenome.status["neighborsGraph"] == "inFile" and not force: - raise AttributeError("You are trying to make a neighbors graph that is already built. " - "If you REALLY want to do that, use --force " - "(it will erase everything except annotation data !)") + raise AttributeError( + "You are trying to make a neighbors graph that is already built. " + "If you REALLY want to do that, use --force " + "(it will erase everything except annotation data !)" + ) elif pangenome.status["neighborsGraph"] == "inFile" and force: erase_pangenome(pangenome, graph=True) @@ -38,21 +40,35 @@ def check_pangenome_for_neighbors_graph(pangenome, force, disable_bar=False): """ check_pangenome_former_graph(pangenome, force) # TODO Check if possible to change for check_pangenome_info - if pangenome.status["genomesAnnotated"] in ["Computed", "Loaded"] and \ - pangenome.status["genesClustered"] in ["Computed", "Loaded"]: + if pangenome.status["genomesAnnotated"] in [ + "Computed", + "Loaded", + ] and pangenome.status["genesClustered"] in ["Computed", "Loaded"]: pass # nothing to do, can just continue. - elif pangenome.status["genomesAnnotated"] == "inFile" and pangenome.status["genesClustered"] == "inFile": - read_pangenome(pangenome, annotation=True, gene_families=True, disable_bar=disable_bar) - elif pangenome.status["genesClustered"] == "No" and \ - pangenome.status["genomesAnnotated"] in ['inFile', 'Computed', 'Loaded']: - raise Exception("You did not cluster the genes. See the 'ppanggolin cluster' if you want to do that.") + elif ( + pangenome.status["genomesAnnotated"] == "inFile" + and pangenome.status["genesClustered"] == "inFile" + ): + read_pangenome( + pangenome, annotation=True, gene_families=True, disable_bar=disable_bar + ) + elif pangenome.status["genesClustered"] == "No" and pangenome.status[ + "genomesAnnotated" + ] in ["inFile", "Computed", "Loaded"]: + raise Exception( + "You did not cluster the genes. See the 'ppanggolin cluster' if you want to do that." + ) else: # You probably can use readPangenome anyway. - msg = "Dev : You are probably writing a new workflow with a combination that I did not test." \ - " You can probably use readPangenome instead of raising this Error. " \ - "However please test it carefully.\n" - msg += " User : I have no idea how you got there. You probably did something unexpected. " \ - "Post an issue with what you did at https://github.com/labgem/PPanGGOLiN\n" + msg = ( + "Dev : You are probably writing a new workflow with a combination that I did not test." + " You can probably use readPangenome instead of raising this Error. " + "However please test it carefully.\n" + ) + msg += ( + " User : I have no idea how you got there. You probably did something unexpected. " + "Post an issue with what you did at https://github.com/labgem/PPanGGOLiN\n" + ) raise NotImplementedError(msg) @@ -68,8 +84,12 @@ def remove_high_copy_number(pangenome, number): fam.removed = True -def compute_neighbors_graph(pangenome: Pangenome, remove_copy_number: int = 0, - force: bool = False, disable_bar: bool = False): +def compute_neighbors_graph( + pangenome: Pangenome, + remove_copy_number: int = 0, + force: bool = False, + disable_bar: bool = False, +): """ Creates the Pangenome Graph. Will either load the information from the pangenome file if they are not loaded, or use the information loaded if they are. @@ -85,7 +105,12 @@ def compute_neighbors_graph(pangenome: Pangenome, remove_copy_number: int = 0, remove_high_copy_number(pangenome, remove_copy_number) logging.getLogger("PPanGGOLiN").info("Computing the neighbors graph...") - bar = tqdm(pangenome.organisms, total=pangenome.number_of_organisms, unit="genome", disable=disable_bar) + bar = tqdm( + pangenome.organisms, + total=pangenome.number_of_organisms, + unit="genome", + disable=disable_bar, + ) for org in bar: bar.set_description(f"Processing {org.name}") bar.refresh() @@ -94,12 +119,16 @@ def compute_neighbors_graph(pangenome: Pangenome, remove_copy_number: int = 0, for gene in contig.genes: try: if not gene.family.removed: - if prev is not None and not (prev.family == gene.family and (prev.is_fragment or - gene.is_fragment)): + if prev is not None and not ( + prev.family == gene.family + and (prev.is_fragment or gene.is_fragment) + ): pangenome.add_edge(gene, prev) prev = gene except AttributeError: - raise AttributeError("a Gene does not have a GeneFamily object associated") + raise AttributeError( + "a Gene does not have a GeneFamily object associated" + ) except Exception: raise Exception("Unexpected error. Please report on our github.") if prev is not None and contig.is_circular and contig.number_of_genes > 0: @@ -121,8 +150,15 @@ def launch(args: argparse.Namespace): """ pangenome = Pangenome() pangenome.add_file(args.pangenome) - compute_neighbors_graph(pangenome, args.remove_high_copy_number, args.force, disable_bar=args.disable_prog_bar) - write_pangenome(pangenome, pangenome.file, args.force, disable_bar=args.disable_prog_bar) + compute_neighbors_graph( + pangenome, + args.remove_high_copy_number, + args.force, + disable_bar=args.disable_prog_bar, + ) + write_pangenome( + pangenome, pangenome.file, args.force, disable_bar=args.disable_prog_bar + ) def subparser(sub_parser: argparse._SubParsersAction) -> argparse.ArgumentParser: @@ -133,7 +169,9 @@ def subparser(sub_parser: argparse._SubParsersAction) -> argparse.ArgumentParser :return : parser arguments for graph command """ - parser = sub_parser.add_parser("graph", formatter_class=argparse.RawTextHelpFormatter) + parser = sub_parser.add_parser( + "graph", formatter_class=argparse.RawTextHelpFormatter + ) parser_graph(parser) return parser @@ -144,23 +182,32 @@ def parser_graph(parser: argparse.ArgumentParser): :param parser: parser for graph argument """ - required = parser.add_argument_group(title="Required arguments", - description="Following arguments is required:") - required.add_argument('-p', '--pangenome', required=False, type=Path, help="The pangenome .h5 file") + required = parser.add_argument_group( + title="Required arguments", description="Following arguments is required:" + ) + required.add_argument( + "-p", "--pangenome", required=False, type=Path, help="The pangenome .h5 file" + ) optional = parser.add_argument_group(title="Optional arguments") - optional.add_argument('-r', '--remove_high_copy_number', type=int, default=0, - help="Positive Number: Remove families having a number of copy of gene in a single genome " - "above or equal to this threshold in at least one genome " - "(0 or negative values are ignored).") - - -if __name__ == '__main__': + optional.add_argument( + "-r", + "--remove_high_copy_number", + type=int, + default=0, + help="Positive Number: Remove families having a number of copy of gene in a single genome " + "above or equal to this threshold in at least one genome " + "(0 or negative values are ignored).", + ) + + +if __name__ == "__main__": """To test local change and allow using debugger""" from ppanggolin.utils import set_verbosity_level, add_common_arguments main_parser = argparse.ArgumentParser( description="Depicting microbial species diversity via a Partitioned PanGenome Graph Of Linked Neighbors", - formatter_class=argparse.RawTextHelpFormatter) + formatter_class=argparse.RawTextHelpFormatter, + ) parser_graph(main_parser) add_common_arguments(main_parser) diff --git a/ppanggolin/info/info.py b/ppanggolin/info/info.py index 969ceb99..26e34e71 100644 --- a/ppanggolin/info/info.py +++ b/ppanggolin/info/info.py @@ -13,7 +13,9 @@ def print_yaml(yaml_dict: dict) -> None: - yaml_output = yaml.dump(yaml_dict, default_flow_style=False, sort_keys=False, indent=4) + yaml_output = yaml.dump( + yaml_dict, default_flow_style=False, sort_keys=False, indent=4 + ) print(yaml_output) @@ -35,7 +37,7 @@ def read_status(h5f: tables.File): "RGP_Predicted": status_group._v_attrs.predictedRGP, "Spots_Predicted": status_group._v_attrs.predictedRGP, # Please confirm if this should be different from "RGP Predicted" - "Modules_Predicted": status_group._v_attrs.modules + "Modules_Predicted": status_group._v_attrs.modules, } status_to_print = {key: bool(val) for key, val in status_to_print.items()} @@ -56,13 +58,21 @@ def read_metadata_status(h5f: tables.File): if hasattr(status_group._v_attrs, "metadata") and status_group._v_attrs.metadata: metastatus = status_group.metastatus metasources = status_group.metasources - metadata_info = {attr: ', '.join(metasources._v_attrs[attr]) for attr in metastatus._v_attrs._f_list()} + metadata_info = { + attr: ", ".join(metasources._v_attrs[attr]) + for attr in metastatus._v_attrs._f_list() + } return {"Metadata": metadata_info} -def print_info(pangenome: str, status: bool = False, content: bool = False, parameters: bool = False, - metadata: bool = False): +def print_info( + pangenome: str, + status: bool = False, + content: bool = False, + parameters: bool = False, + metadata: bool = False, +): """ Main function to return information about pangenome @@ -92,7 +102,9 @@ def launch(args: argparse.Namespace): :param args: All arguments provide by user """ - print_info(args.pangenome, args.status, args.content, args.parameters, args.metadata) + print_info( + args.pangenome, args.status, args.content, args.parameters, args.metadata + ) def subparser(sub_parser: argparse._SubParsersAction) -> argparse.ArgumentParser: @@ -103,7 +115,9 @@ def subparser(sub_parser: argparse._SubParsersAction) -> argparse.ArgumentParser :return : parser arguments for info command """ - parser = sub_parser.add_parser("info", formatter_class=argparse.RawTextHelpFormatter) + parser = sub_parser.add_parser( + "info", formatter_class=argparse.RawTextHelpFormatter + ) parser_info(parser) return parser @@ -114,28 +128,58 @@ def parser_info(parser: argparse.ArgumentParser): :param parser: Parser for the 'info' argument. """ - required = parser.add_argument_group(title="Required arguments", - description="Specify the following required argument:") - required.add_argument('-p', '--pangenome', required=True, type=Path, - help="Path to the pangenome .h5 file") - - options = parser.add_argument_group(title="Information Display Options (default: all)") - options.add_argument("-a", "--parameters", required=False, action="store_true", - help="Display the parameters used or computed for each step of pangenome generation") - options.add_argument("-c", "--content", required=False, action="store_true", - help="Display detailed information about the pangenome's content") - options.add_argument("-s", "--status", required=False, action="store_true", - help="Display information about the statuses of different elements in the pangenome, " - "indicating what has been computed or not") - options.add_argument("-m", "--metadata", required=False, action="store_true", - help="Display a summary of the metadata saved in the pangenome") - - -if __name__ == '__main__': + required = parser.add_argument_group( + title="Required arguments", + description="Specify the following required argument:", + ) + required.add_argument( + "-p", + "--pangenome", + required=True, + type=Path, + help="Path to the pangenome .h5 file", + ) + + options = parser.add_argument_group( + title="Information Display Options (default: all)" + ) + options.add_argument( + "-a", + "--parameters", + required=False, + action="store_true", + help="Display the parameters used or computed for each step of pangenome generation", + ) + options.add_argument( + "-c", + "--content", + required=False, + action="store_true", + help="Display detailed information about the pangenome's content", + ) + options.add_argument( + "-s", + "--status", + required=False, + action="store_true", + help="Display information about the statuses of different elements in the pangenome, " + "indicating what has been computed or not", + ) + options.add_argument( + "-m", + "--metadata", + required=False, + action="store_true", + help="Display a summary of the metadata saved in the pangenome", + ) + + +if __name__ == "__main__": """To test local change and allow using debugger""" main_parser = argparse.ArgumentParser( description="Depicting microbial species diversity via a Partitioned PanGenome Graph Of Linked Neighbors", - formatter_class=argparse.RawTextHelpFormatter) + formatter_class=argparse.RawTextHelpFormatter, + ) parser_info(main_parser) launch(main_parser.parse_args()) diff --git a/ppanggolin/main.py b/ppanggolin/main.py index c5283977..1ded5ec9 100644 --- a/ppanggolin/main.py +++ b/ppanggolin/main.py @@ -4,13 +4,20 @@ import sys if sys.version_info < (3, 8): # minimum is python3.8 - raise AssertionError("Minimum python version to run PPanGGOLiN is 3.8. Your current python version is " + - ".".join(map(str, sys.version_info))) + raise AssertionError( + "Minimum python version to run PPanGGOLiN is 3.8. Your current python version is " + + ".".join(map(str, sys.version_info)) + ) import argparse # local modules import ppanggolin.pangenome -from ppanggolin.utils import check_input_files, set_verbosity_level, add_common_arguments, manage_cli_and_config_args +from ppanggolin.utils import ( + check_input_files, + set_verbosity_level, + add_common_arguments, + manage_cli_and_config_args, +) import ppanggolin.nem.partition import ppanggolin.nem.rarefaction import ppanggolin.graph @@ -28,24 +35,36 @@ import ppanggolin.meta import ppanggolin.utility -from ppanggolin import SUBCOMMAND_TO_SUBPARSER, epilog, pan_epilog, rgp_epilog, mod_epilog, version +from ppanggolin import ( + SUBCOMMAND_TO_SUBPARSER, + epilog, + pan_epilog, + rgp_epilog, + mod_epilog, + version, +) + def cmd_line() -> argparse.Namespace: - """ Manage the command line argument given by user + """Manage the command line argument given by user :return: arguments given and readable by PPanGGOLiN """ # need to manually write the description so that it's displayed into groups of subcommands .... desc = "\n" - desc += "All of the following subcommands have their own set of options. To see them for a given subcommand," \ - " use it with -h or --help, as such:\n" + desc += ( + "All of the following subcommands have their own set of options. To see them for a given subcommand," + " use it with -h or --help, as such:\n" + ) desc += " ppanggolin -h\n" desc += "\n" desc += " Basic:\n" desc += " all Easy workflow to run all possible analysis\n" desc += " workflow Easy workflow to run a pangenome analysis in one go\n" - desc += " panrgp Easy workflow to run a pangenome analysis with genomic islands and spots of" \ - " insertion detection\n" + desc += ( + " panrgp Easy workflow to run a pangenome analysis with genomic islands and spots of" + " insertion detection\n" + ) desc += " panmodule Easy workflow to run a pangenome analysis with module prediction\n" desc += " \n" desc += " Expert:\n" @@ -62,7 +81,9 @@ def cmd_line() -> argparse.Namespace: desc += " write_genomes Writes 'flat' files that represent the genomes along with their associated pangenome elements.\n" desc += " write_metadata Writes 'TSV' files that represent the metadata associated with elements of the pangenome.\n" desc += " fasta Writes fasta files for different elements of the pangenome.\n" - desc += " info Prints information about a given pangenome graph file.\n" + desc += ( + " info Prints information about a given pangenome graph file.\n" + ) desc += " metrics Compute several metrics on a given pangenome.\n" desc += " \n" desc += " Regions of Genomic Plasticity:\n" @@ -73,8 +94,10 @@ def cmd_line() -> argparse.Namespace: desc += " \n" desc += " Analysis using reference pangenomes:\n" desc += " msa Compute Multiple Sequence Alignments for pangenome gene families.\n" - desc += " align Aligns a genome or a set of proteins to the pangenome gene families and " \ + desc += ( + " align Aligns a genome or a set of proteins to the pangenome gene families and " "predicts information from it.\n" + ) desc += " context Local genomic context analysis.\n" desc += " projection Annotates external genomes with an existing pangenome.\n" desc += " \n" @@ -84,12 +107,16 @@ def cmd_line() -> argparse.Namespace: parser = argparse.ArgumentParser( description="Depicting microbial species diversity via a Partitioned PanGenome Graph Of Linked Neighbors", formatter_class=argparse.RawTextHelpFormatter, - epilog=epilog + pan_epilog + rgp_epilog + mod_epilog) + epilog=epilog + pan_epilog + rgp_epilog + mod_epilog, + ) - parser.add_argument('-v', '--version', action='version', - version='%(prog)s ' + version) + parser.add_argument( + "-v", "--version", action="version", version="%(prog)s " + version + ) - subparsers = parser.add_subparsers(metavar="", dest="subcommand", title="subcommands", description=desc) + subparsers = parser.add_subparsers( + metavar="", dest="subcommand", title="subcommands", description=desc + ) subparsers.required = True # because python3 sent subcommands to hell apparently # print help if no subcommand is specified @@ -106,7 +133,14 @@ def cmd_line() -> argparse.Namespace: sub.epilog = epilog if sub_cmd not in ["rgp", "spot", "module", "rgp_cluster"]: sub.epilog += pan_epilog - if sub_cmd not in ["annotate", "cluster", "graph", "partition", "rarefaction", "workflow"]: + if sub_cmd not in [ + "annotate", + "cluster", + "graph", + "partition", + "rarefaction", + "workflow", + ]: if sub_cmd not in ["module", "panmodule"]: sub.epilog += rgp_epilog if sub_cmd not in ["rgp", "spot", "rgp_cluster", "panrgp"]: @@ -126,32 +160,60 @@ def cmd_line() -> argparse.Namespace: # First parse args to check that nothing is missing or not expected in cli and throw help when requested args = parser.parse_args() - if hasattr(args, "config"): + if hasattr(args, "config"): # the two subcommand with no common args does not have config parameter. so we can skip this part for them. - args = manage_cli_and_config_args(args.subcommand, args.config, SUBCOMMAND_TO_SUBPARSER) + args = manage_cli_and_config_args( + args.subcommand, args.config, SUBCOMMAND_TO_SUBPARSER + ) else: set_verbosity_level(args) if args.subcommand == "annotate" and args.fasta is None and args.anno is None: - parser.error("Please provide either a sequence file using the --fasta option or " - "an annotation file using the --anno option to enable annotation. " - "Use the command line or the config file.") + parser.error( + "Please provide either a sequence file using the --fasta option or " + "an annotation file using the --anno option to enable annotation. " + "Use the command line or the config file." + ) - cmds_pangenome_required = ["cluster", "info", "module", "graph", "align", - "context", "write_pangenome", "write_genomes", "write_metadata", "msa", "draw", "partition", - "rarefaction", "spot", "fasta", "metrics", "rgp", "projection", "metadata"] + cmds_pangenome_required = [ + "cluster", + "info", + "module", + "graph", + "align", + "context", + "write_pangenome", + "write_genomes", + "write_metadata", + "msa", + "draw", + "partition", + "rarefaction", + "spot", + "fasta", + "metrics", + "rgp", + "projection", + "metadata", + ] if args.subcommand in cmds_pangenome_required and args.pangenome is None: - parser.error("Please specify a pangenome file using the --pangenome argument, " - "either through the command line or the config file.") + parser.error( + "Please specify a pangenome file using the --pangenome argument, " + "either through the command line or the config file." + ) if args.subcommand == "align" and args.sequences is None: - parser.error("Please provide sequences (nucleotides or amino acids) for alignment " - "with the pangenome gene families using the --sequences argument, " - "either through the command line or the config file.") + parser.error( + "Please provide sequences (nucleotides or amino acids) for alignment " + "with the pangenome gene families using the --sequences argument, " + "either through the command line or the config file." + ) if args.subcommand == "projection": # check argument correctness and determine input mode (single or multiple files) and add it to args. - input_mode = ppanggolin.projection.projection.check_projection_arguments(args, parser) + input_mode = ppanggolin.projection.projection.check_projection_arguments( + args, parser + ) setattr(args, "input_mode", input_mode) if args.subcommand == "metadata": diff --git a/ppanggolin/meta/meta.py b/ppanggolin/meta/meta.py index 4f9aaf85..9d9e6a6b 100644 --- a/ppanggolin/meta/meta.py +++ b/ppanggolin/meta/meta.py @@ -17,9 +17,14 @@ from ppanggolin.formats import check_pangenome_info, write_pangenome, erase_pangenome -def check_pangenome_metadata(pangenome: Pangenome, source: str, metatype: str, force: bool = False, - disable_bar: bool = False): - """ Check and load pangenome information before adding metadata +def check_pangenome_metadata( + pangenome: Pangenome, + source: str, + metatype: str, + force: bool = False, + disable_bar: bool = False, +): + """Check and load pangenome information before adding metadata :param pangenome: Pangenome object :param source: source of the metadata @@ -27,31 +32,37 @@ def check_pangenome_metadata(pangenome: Pangenome, source: str, metatype: str, f :param force: erase if a metadata for the provide source and metatype already exist :param disable_bar: Disable bar """ - need_dic = {'need_annotations': True, - 'need_families': False, - 'need_rgp': False, - 'need_spots': False, - 'need_modules': False} + need_dic = { + "need_annotations": True, + "need_families": False, + "need_rgp": False, + "need_spots": False, + "need_modules": False, + } if metatype in ["families", "RGPs", "spots", "modules"]: - need_dic['need_families'] = True + need_dic["need_families"] = True if metatype in ["RGPs", "spots"]: - need_dic['need_rgp'] = True + need_dic["need_rgp"] = True if metatype == "spots": - need_dic['need_spots'] = True + need_dic["need_spots"] = True if metatype == "modules": - need_dic['need_modules'] = True + need_dic["need_modules"] = True - if pangenome.status["metadata"][metatype] == "inFile" and source in pangenome.status["metasources"][metatype]: + if ( + pangenome.status["metadata"][metatype] == "inFile" + and source in pangenome.status["metasources"][metatype] + ): if force: erase_pangenome(pangenome, metadata=True, source=source, metatype=metatype) else: raise Exception( f"An metadata corresponding to the source : '{source}' already exist in genomes of the pangenome." - "Add the option --force to erase") + "Add the option --force to erase" + ) check_pangenome_info(pangenome, disable_bar=disable_bar, **need_dic) @@ -63,38 +74,65 @@ def check_metadata_format(metadata: Path, metatype: str) -> pd.DataFrame: :return: Dataframe with metadata loaded """ - assert metatype in ["families", "genomes", "contigs", "genes", "RGPs", "spots", "modules"] - colname_check = re.compile('^[a-zA-Z_]\w*$') # \w = [A-Za-z0-9_] - metadata_df = pd.read_csv(metadata, sep="\t", header=0, quoting=csv.QUOTE_NONE, - dtype={metatype: str}) - metadata_df.replace(to_replace='-', value=pd.NA, inplace=True) + assert metatype in [ + "families", + "genomes", + "contigs", + "genes", + "RGPs", + "spots", + "modules", + ] + colname_check = re.compile("^[a-zA-Z_]\w*$") # \w = [A-Za-z0-9_] + metadata_df = pd.read_csv( + metadata, sep="\t", header=0, quoting=csv.QUOTE_NONE, dtype={metatype: str} + ) + metadata_df.replace(to_replace="-", value=pd.NA, inplace=True) if metatype not in metadata_df.columns or metadata_df.shape[1] < 2: - raise KeyError(f"You should at least provide in columns names : {metatype} and one another value. " - "Look at documentation for more information") + raise KeyError( + f"You should at least provide in columns names : {metatype} and one another value. " + "Look at documentation for more information" + ) for column in metadata_df.columns: if not colname_check.match(column): - raise ValueError(f"column name is not a valid identifier: {column}; " - f"it does not match the pattern {colname_check.pattern}") + raise ValueError( + f"column name is not a valid identifier: {column}; " + f"it does not match the pattern {colname_check.pattern}" + ) return metadata_df -def assign_metadata(metadata_df: pd.DataFrame, pangenome: Pangenome, source: str, metatype: str, - omit: bool = False, disable_bar: bool = False): +def assign_metadata( + metadata_df: pd.DataFrame, + pangenome: Pangenome, + source: str, + metatype: str, + omit: bool = False, + disable_bar: bool = False, +): """function assigns metadata to elements in a pangenome based on a metadata dataframe. :param metadata_df: A pandas dataframe containing metadata to be assigned to elements in the pangenome. :param pangenome: A Pangenome object representing the pangenome to which metadata will be assigned. :param source: A string representing the source of the metadata. :param metatype: A string representing the type of element to which metadata will be assigned. - :param omit: A boolean indicating whether to raise an error if metadata cannot be assigned to an element. - If True, metadata will not be assigned to elements that do not exist in the pangenome. + :param omit: A boolean indicating whether to raise an error if metadata cannot be assigned to an element. + If True, metadata will not be assigned to elements that do not exist in the pangenome. If False, an error will be raised. Default is False. :param disable_bar: A boolean indicating whether to disable the progress bar. Default is False. :raise KeyError: element name is not find in pangenome :raise AssertionError: Metatype is not recognized """ - assert metatype in ["families", "genomes", "contigs", "genes", "RGPs", "spots", "modules"] + assert metatype in [ + "families", + "genomes", + "contigs", + "genes", + "RGPs", + "spots", + "modules", + ] def check_duplicate_contig_name(): contig_names = set() @@ -102,15 +140,21 @@ def check_duplicate_contig_name(): old_len = len(contig_names) contig_names.add(contig.name) if len(contig_names) == old_len: - raise Exception("There are 2 contigs with the same name in the pangenome and " - "you did not provide the genome linked to contig. " - "Add a column 'genomes' to indicate to which genome the contig belongs to.") + raise Exception( + "There are 2 contigs with the same name in the pangenome and " + "you did not provide the genome linked to contig. " + "Add a column 'genomes' to indicate to which genome the contig belongs to." + ) if metatype == "contigs" and "genomes" not in metadata_df.columns: check_duplicate_contig_name() - for row in tqdm(metadata_df.iterrows(), unit='row', - total=metadata_df.shape[0], disable=disable_bar): + for row in tqdm( + metadata_df.iterrows(), + unit="row", + total=metadata_df.shape[0], + disable=disable_bar, + ): row = row[1] try: if metatype == "families": @@ -130,11 +174,18 @@ def check_duplicate_contig_name(): element = pangenome.get_module(row[metatype]) except KeyError: if not omit: - raise KeyError(f"{metatype} {row[metatype]} does not exist in pangenome. Check name in your file") + raise KeyError( + f"{metatype} {row[metatype]} does not exist in pangenome. Check name in your file" + ) else: logging.getLogger().debug(f"{metatype}: {row[metatype]} doesn't exist") else: - element.add_metadata(Metadata(source=source, **{k: v for k, v in row.to_dict().items() if k != metatype})) + element.add_metadata( + Metadata( + source=source, + **{k: v for k, v in row.to_dict().items() if k != metatype}, + ) + ) pangenome.status["metadata"][metatype] = "Computed" pangenome.status["metasources"][metatype].append(source) @@ -149,15 +200,30 @@ def launch(args: argparse.Namespace): metadata_df = check_metadata_format(args.metadata, args.assign) pangenome = Pangenome() pangenome.add_file(args.pangenome) - check_pangenome_metadata(pangenome, source=args.source, metatype=args.assign, - force=args.force, disable_bar=args.disable_prog_bar) - assign_metadata(metadata_df, pangenome=pangenome, source=args.source, metatype=args.assign, - omit=args.omit, disable_bar=args.disable_prog_bar) + check_pangenome_metadata( + pangenome, + source=args.source, + metatype=args.assign, + force=args.force, + disable_bar=args.disable_prog_bar, + ) + assign_metadata( + metadata_df, + pangenome=pangenome, + source=args.source, + metatype=args.assign, + omit=args.omit, + disable_bar=args.disable_prog_bar, + ) logging.getLogger().info("Metadata assignment Done") - write_pangenome(pangenome, pangenome.file, force=args.force, disable_bar=args.disable_prog_bar) + write_pangenome( + pangenome, pangenome.file, force=args.force, disable_bar=args.disable_prog_bar + ) -def check_metadata_arguments(args: argparse.Namespace, parser: argparse.ArgumentParser ) -> str: +def check_metadata_arguments( + args: argparse.Namespace, parser: argparse.ArgumentParser +) -> str: """ Check the arguments provided for and raise errors if they are incompatible or missing. @@ -170,8 +236,9 @@ def check_metadata_arguments(args: argparse.Namespace, parser: argparse.Argument for required_arg in ["metadata", "source", "assign"]: if getattr(args, required_arg) is None: - parser.error(f"Please specify the --{required_arg} argument, either through the command line or the config file.") - + parser.error( + f"Please specify the --{required_arg} argument, either through the command line or the config file." + ) def subparser(sub_parser: argparse._SubParsersAction) -> argparse.ArgumentParser: @@ -182,7 +249,9 @@ def subparser(sub_parser: argparse._SubParsersAction) -> argparse.ArgumentParser :return : parser arguments for align command """ - parser = sub_parser.add_parser("metadata", formatter_class=argparse.RawTextHelpFormatter) + parser = sub_parser.add_parser( + "metadata", formatter_class=argparse.RawTextHelpFormatter + ) parser_meta(parser) return parser @@ -193,38 +262,93 @@ def parser_meta(parser: argparse.ArgumentParser): :param parser: parser for align argument """ - required = parser.add_argument_group(title="Required arguments", - description="All of the following arguments are required :") - required.add_argument('-p', '--pangenome', required=False, type=Path, help="The pangenome .h5 file") - required.add_argument('-m', '--metadata', required=False, type=Path, nargs='?', - help='Metadata in TSV file. See our github for more detail about format') - required.add_argument("-s", "--source", required=False, type=str, nargs="?", - help='Name of the metadata source') - required.add_argument("-a", "--assign", required=False, type=str, nargs="?", - choices=["families", "genomes", "contigs", "genes", "RGPs", "spots", "modules"], - help="Select to which pangenome element metadata will be assigned") + required = parser.add_argument_group( + title="Required arguments", + description="All of the following arguments are required :", + ) + required.add_argument( + "-p", "--pangenome", required=False, type=Path, help="The pangenome .h5 file" + ) + required.add_argument( + "-m", + "--metadata", + required=False, + type=Path, + nargs="?", + help="Metadata in TSV file. See our github for more detail about format", + ) + required.add_argument( + "-s", + "--source", + required=False, + type=str, + nargs="?", + help="Name of the metadata source", + ) + required.add_argument( + "-a", + "--assign", + required=False, + type=str, + nargs="?", + choices=["families", "genomes", "contigs", "genes", "RGPs", "spots", "modules"], + help="Select to which pangenome element metadata will be assigned", + ) optional = parser.add_argument_group(title="Optional arguments") - optional.add_argument("--omit", required=False, action="store_true", - help="Allow to pass if a key in metadata is not find in pangenome") + optional.add_argument( + "--omit", + required=False, + action="store_true", + help="Allow to pass if a key in metadata is not find in pangenome", + ) -if __name__ == '__main__': +if __name__ == "__main__": """To test local change and allow using debugger""" from ppanggolin.utils import check_log, set_verbosity_level main_parser = argparse.ArgumentParser( description="Depicting microbial species diversity via a Partitioned PanGenome Graph Of Linked Neighbors", - formatter_class=argparse.RawTextHelpFormatter) + formatter_class=argparse.RawTextHelpFormatter, + ) parser_meta(main_parser) common = main_parser.add_argument_group(title="Common argument") - common.add_argument("--verbose", required=False, type=int, default=1, choices=[0, 1, 2], - help="Indicate verbose level (0 for warning and errors only, 1 for info, 2 for debug)") - common.add_argument("--log", required=False, type=check_log, default="stdout", help="log output file") - common.add_argument("-d", "--disable_prog_bar", required=False, action="store_true", - help="disables the progress bars") - common.add_argument("-c", "--cpu", required=False, default=1, type=int, help="Number of available cpus") - common.add_argument('-f', '--force', action="store_true", - help="Force writing in output directory and in pangenome output file.") + common.add_argument( + "--verbose", + required=False, + type=int, + default=1, + choices=[0, 1, 2], + help="Indicate verbose level (0 for warning and errors only, 1 for info, 2 for debug)", + ) + common.add_argument( + "--log", + required=False, + type=check_log, + default="stdout", + help="log output file", + ) + common.add_argument( + "-d", + "--disable_prog_bar", + required=False, + action="store_true", + help="disables the progress bars", + ) + common.add_argument( + "-c", + "--cpu", + required=False, + default=1, + type=int, + help="Number of available cpus", + ) + common.add_argument( + "-f", + "--force", + action="store_true", + help="Force writing in output directory and in pangenome output file.", + ) set_verbosity_level(main_parser.parse_args()) launch(main_parser.parse_args()) diff --git a/ppanggolin/metadata.py b/ppanggolin/metadata.py index 361e4b5a..11ef61d3 100644 --- a/ppanggolin/metadata.py +++ b/ppanggolin/metadata.py @@ -33,7 +33,9 @@ def __init__(self, source: str, **kwargs): :raises Exception: Metadata is empty """ if not isinstance(source, str): - raise TypeError(f"Metadata source name must be a string. Given type {type(source)}") + raise TypeError( + f"Metadata source name must be a string. Given type {type(source)}" + ) if source == "": raise ValueError("Metadata source name should not be empty.") self.source = source @@ -85,7 +87,7 @@ def to_dict(self) -> Dict[str, Any]: @staticmethod def _join_list(attr_list: Union[str, List[str]]): - return ','.join(attr_list) + return ",".join(attr_list) class MetaFeatures: @@ -100,14 +102,12 @@ class MetaFeatures: """ def __init__(self): - """Constructor method - """ + """Constructor method""" self._metadata_getter = defaultdict(dict) @property def number_of_metadata(self) -> int: - """Get the number of metadata associated to feature - """ + """Get the number of metadata associated to feature""" return sum(len(meta_dict) for meta_dict in self._metadata_getter.values()) @property @@ -122,7 +122,7 @@ def metadata(self) -> Generator[Metadata, None, None]: @property def sources(self) -> Generator[str, None, None]: - """ Get all metadata source in gene family + """Get all metadata source in gene family :return: Metadata source """ @@ -133,7 +133,7 @@ def formatted_metadata_dict(self, separator: str = "|") -> Dict[str, str]: Format metadata by combining source and field values. Given an object with metadata, this function creates a new dictionary where the keys - are formatted as 'source_field'. In some cases, it is possible to have multiple values for the same field, + are formatted as 'source_field'. In some cases, it is possible to have multiple values for the same field, in this situation, values are concatenated with the specified separator. :param separator: The separator used to join multiple values for the same field (default is '|'). @@ -144,12 +144,17 @@ def formatted_metadata_dict(self, separator: str = "|") -> Dict[str, str]: for field in metadata.fields: value = str(getattr(metadata, field)) if separator in value: - raise ValueError(f"Metadata {field}={value} associated to {self} from source {metadata.source} " - f"contains in its value the separator character '{separator}'. " - "Please change separator in order to be able to write the metadata.") + raise ValueError( + f"Metadata {field}={value} associated to {self} from source {metadata.source} " + f"contains in its value the separator character '{separator}'. " + "Please change separator in order to be able to write the metadata." + ) source_field_2_values[f"{metadata.source}_{field}"].append(str(value)) - return {source_field: separator.join(values) for source_field, values in source_field_2_values.items()} + return { + source_field: separator.join(values) + for source_field, values in source_field_2_values.items() + } def add_metadata(self, metadata: Metadata, metadata_id: int = None) -> None: """Add metadata to metadata getter @@ -159,7 +164,9 @@ def add_metadata(self, metadata: Metadata, metadata_id: int = None) -> None: :raises AssertionError: Source or metadata is not with the correct type """ - assert isinstance(metadata, Metadata), f"Metadata is not with type Metadata but with {type(metadata)}" + assert isinstance( + metadata, Metadata + ), f"Metadata is not with type Metadata but with {type(metadata)}" # Metadata_id should not already exist because the metadata are added from scratch to a new source, # or they are ridden @@ -175,8 +182,10 @@ def add_metadata(self, metadata: Metadata, metadata_id: int = None) -> None: except KeyError: self._metadata_getter[metadata.source][metadata_id] = metadata else: - raise KeyError(f"A metadata with ID {metadata_id} already exist " - f"for source {metadata.source} in {str(self)}") + raise KeyError( + f"A metadata with ID {metadata_id} already exist " + f"for source {metadata.source} in {str(self)}" + ) def get_metadata(self, source: str, metadata_id: int = None) -> Metadata: """Get metadata from metadata getter by its source and identifier @@ -189,8 +198,10 @@ def get_metadata(self, source: str, metadata_id: int = None) -> Metadata: try: metadata = self._metadata_getter[source][metadata_id] except KeyError: - raise KeyError(f"No metadata exist with ID {metadata_id}" - f"for source {source} in {str(self)}") + raise KeyError( + f"No metadata exist with ID {metadata_id}" + f"for source {source} in {str(self)}" + ) else: return metadata @@ -203,8 +214,12 @@ def get_metadata_by_source(self, source: str) -> Union[Dict[int, Metadata], None :raises AssertionError: Source is not with the correct type """ - assert isinstance(source, str), f"Source is not a string but with {type(source)}" - return self._metadata_getter.get(source) # if source in _metadata_getter return value else None + assert isinstance( + source, str + ), f"Source is not a string but with {type(source)}" + return self._metadata_getter.get( + source + ) # if source in _metadata_getter return value else None def get_metadata_by_attribute(self, **kwargs) -> Generator[Metadata, None, None]: """Get metadata by one or more attribute @@ -216,7 +231,10 @@ def get_metadata_by_attribute(self, **kwargs) -> Generator[Metadata, None, None] if hasattr(metadata, attr): # BUG If value is a list, the join block detection. # It would be better to keep a list and change in writing and reading metadata to join the list - if getattr(metadata, attr, None) in value or getattr(metadata, attr, None) == value: + if ( + getattr(metadata, attr, None) in value + or getattr(metadata, attr, None) == value + ): yield metadata def del_metadata_by_source(self, source: str): @@ -227,20 +245,26 @@ def del_metadata_by_source(self, source: str): :raises AssertionError: Source is not with the correct type :raises KeyError: Source does not belong in the MetaFeature """ - assert isinstance(source, str), f"Source is not a string but with {type(source)}" + assert isinstance( + source, str + ), f"Source is not a string but with {type(source)}" if self._metadata_getter.pop(source, None) is None: - logging.getLogger("PPanGGOLiN").warning("The source to remove does not exist") + logging.getLogger("PPanGGOLiN").warning( + "The source to remove does not exist" + ) def del_metadata_by_attribute(self, **kwargs): - """Remove a source from the feature - """ + """Remove a source from the feature""" for source, metadata_dict in self._metadata_getter.items(): for attr, value in kwargs.items(): for meta_id, metadata in metadata_dict.items(): if hasattr(metadata, attr): # BUG If value is a list, the join block detection. # It would be better to keep a list and change in writing and reading metadata to join the list - if getattr(metadata, attr, None) in value or getattr(metadata, attr, None) == value: + if ( + getattr(metadata, attr, None) in value + or getattr(metadata, attr, None) == value + ): del self._metadata_getter[source][meta_id] def max_metadata_by_source(self) -> Tuple[str, int]: @@ -248,7 +272,9 @@ def max_metadata_by_source(self) -> Tuple[str, int]: :return: Name of the source with the maximum annotation and the number of metadata corresponding """ - max_source, max_meta = max(self._metadata_getter.items(), key=lambda x: len(x[1])) + max_source, max_meta = max( + self._metadata_getter.items(), key=lambda x: len(x[1]) + ) return max_source, len(max_meta) def has_metadata(self) -> bool: diff --git a/ppanggolin/metrics/fluidity.py b/ppanggolin/metrics/fluidity.py index b2b5b0c6..ad7ca25a 100644 --- a/ppanggolin/metrics/fluidity.py +++ b/ppanggolin/metrics/fluidity.py @@ -14,7 +14,7 @@ def compute_genomes_fluidity(pangenome: Pangenome, disable_bar: bool = False) -> dict: - """ Compute the genomes' fluidity from the pangenome + """Compute the genomes' fluidity from the pangenome :param pangenome: pangenome which will be used to compute the genomes' fluidity :param disable_bar: Disable the progress bar @@ -24,22 +24,36 @@ def compute_genomes_fluidity(pangenome: Pangenome, disable_bar: bool = False) -> # check statuses and load info logging.getLogger("PPanGGOLiN").info("Check information in pangenome") - check_pangenome_info(pangenome, need_annotations=True, need_families=True, disable_bar=disable_bar) - fluidity_dict = {'all': None, 'shell': None, 'cloud': None, 'accessory': None} + check_pangenome_info( + pangenome, need_annotations=True, need_families=True, disable_bar=disable_bar + ) + fluidity_dict = {"all": None, "shell": None, "cloud": None, "accessory": None} for subset in fluidity_dict.keys(): - logging.getLogger("PPanGGOLiN").debug(f"Compute binaries for {subset} partition") + logging.getLogger("PPanGGOLiN").debug( + f"Compute binaries for {subset} partition" + ) pangenome.compute_org_bitarrays(part=subset) # Compute binaries corresponding to presence / absence of families in organisms g_sum = 0 logging.getLogger("PPanGGOLiN").debug("Get number of families in each genomes") org2_nb_fam = nb_fam_per_org(pangenome, disable_bar) - logging.getLogger("PPanGGOLiN").info(f"Compute rate of unique family for each genome combination in {subset}") - for c_organisms in tqdm(list(combinations(pangenome.organisms, 2)), unit="combination", disable=disable_bar): - tot_fam = org2_nb_fam.get(c_organisms[0].name) + org2_nb_fam.get(c_organisms[1].name) + logging.getLogger("PPanGGOLiN").info( + f"Compute rate of unique family for each genome combination in {subset}" + ) + for c_organisms in tqdm( + list(combinations(pangenome.organisms, 2)), + unit="combination", + disable=disable_bar, + ): + tot_fam = org2_nb_fam.get(c_organisms[0].name) + org2_nb_fam.get( + c_organisms[1].name + ) common_fam = popcount(c_organisms[0].bitarray & c_organisms[1].bitarray) - 1 if tot_fam > 0 and common_fam > 0: g_sum += (tot_fam - 2 * common_fam) / tot_fam - fluidity_dict[subset] = (2 / (pangenome.number_of_organisms * (pangenome.number_of_organisms - 1))) * g_sum + fluidity_dict[subset] = ( + 2 / (pangenome.number_of_organisms * (pangenome.number_of_organisms - 1)) + ) * g_sum return fluidity_dict @@ -53,7 +67,7 @@ def nb_fam_per_org(pangenome: Pangenome, disable_bar: bool = False) -> dict: :return: Dictionary with organisms as key and number of families as value """ org2_nb_fam = dict() - for org in tqdm(pangenome.organisms, unit='genome', disable=disable_bar): + for org in tqdm(pangenome.organisms, unit="genome", disable=disable_bar): org2_nb_fam[org.name] = popcount(org.bitarray) return org2_nb_fam @@ -64,8 +78,9 @@ def nb_fam_per_org(pangenome: Pangenome, disable_bar: bool = False) -> dict: # TODO Function to compute mash distance between genome for normalization + def fam_fluidity(pangenome: Pangenome, disable_bar: bool = False) -> dict: - """ Compute the family fluidity from the pangenome + """Compute the family fluidity from the pangenome :param pangenome: pangenome which will be used to compute the genomes' fluidity :param disable_bar: Disable the progress bar @@ -74,23 +89,38 @@ def fam_fluidity(pangenome: Pangenome, disable_bar: bool = False) -> dict: """ # check statuses and load info logging.getLogger("PPanGGOLiN").info("Check information in pangenome") - check_pangenome_info(pangenome, need_annotations=True, need_families=True, disable_bar=disable_bar) - fluidity_dict = {'all': None, 'shell': None, 'cloud': None, 'accessory': None} + check_pangenome_info( + pangenome, need_annotations=True, need_families=True, disable_bar=disable_bar + ) + fluidity_dict = {"all": None, "shell": None, "cloud": None, "accessory": None} for subset in fluidity_dict.keys(): - logging.getLogger("PPanGGOLiN").debug(f"Compute binaries for {subset} partition") + logging.getLogger("PPanGGOLiN").debug( + f"Compute binaries for {subset} partition" + ) pangenome.compute_family_bitarrays(part=subset) # Compute binaries corresponding to presence / absence of families in organisms f_sum = 0 logging.getLogger("PPanGGOLiN").debug("Get number of families in each genome") fam_2_nb_org = nb_org_per_fam(pangenome, disable_bar) - logging.getLogger("PPanGGOLiN").info("Compute rate of unique organism for each family combination") - for c_fam in tqdm(list(combinations(pangenome.gene_families, 2)), unit="combination", disable=disable_bar): + logging.getLogger("PPanGGOLiN").info( + "Compute rate of unique organism for each family combination" + ) + for c_fam in tqdm( + list(combinations(pangenome.gene_families, 2)), + unit="combination", + disable=disable_bar, + ): tot_org = fam_2_nb_org.get(c_fam[0].name) + fam_2_nb_org.get(c_fam[1].name) common_fam = popcount(c_fam[0].bitarray & c_fam[1].bitarray) - 1 if tot_org > 0 and common_fam > 0: f_sum += (tot_org - 2 * common_fam) / tot_org - fluidity_dict[subset] = (2 / (pangenome.number_of_gene_families * - (pangenome.number_of_gene_families - 1))) * f_sum + fluidity_dict[subset] = ( + 2 + / ( + pangenome.number_of_gene_families + * (pangenome.number_of_gene_families - 1) + ) + ) * f_sum return fluidity_dict @@ -104,6 +134,6 @@ def nb_org_per_fam(pangenome: Pangenome, disable_bar: bool = False) -> dict: :return: Dictionary with organisms as key and number of families as value """ fam_2_nb_org = dict() - for fam in tqdm(pangenome.gene_families, unit='gene families', disable=disable_bar): + for fam in tqdm(pangenome.gene_families, unit="gene families", disable=disable_bar): fam_2_nb_org[fam.name] = popcount(fam.bitarray) return fam_2_nb_org diff --git a/ppanggolin/metrics/metrics.py b/ppanggolin/metrics/metrics.py index 71d60b16..6dce8c5f 100644 --- a/ppanggolin/metrics/metrics.py +++ b/ppanggolin/metrics/metrics.py @@ -10,11 +10,16 @@ # local libraries from ppanggolin.pangenome import Pangenome -from ppanggolin.formats.readBinaries import read_info +from ppanggolin.formats.readBinaries import read_info from ppanggolin.metrics.fluidity import compute_genomes_fluidity, fam_fluidity -def check_already_computed_metric(pangenome: Pangenome, genomes_fluidity: bool = False, print_metric:bool = True, recompute:bool = False) : +def check_already_computed_metric( + pangenome: Pangenome, + genomes_fluidity: bool = False, + print_metric: bool = True, + recompute: bool = False, +): """ Check if one of the asked metrics is not already computed @@ -25,16 +30,23 @@ def check_already_computed_metric(pangenome: Pangenome, genomes_fluidity: bool = """ with tables.open_file(pangenome.file, "a") as h5f: info_group = h5f.root.info - if genomes_fluidity and 'genomes_fluidity' in info_group._v_attrs._f_list(): - logging.getLogger("PPanGGOLiN").warning("Genome fluidity has been already computed. " - "Use --force if you want to compute it again") + if genomes_fluidity and "genomes_fluidity" in info_group._v_attrs._f_list(): + logging.getLogger("PPanGGOLiN").warning( + "Genome fluidity has been already computed. " + "Use --force if you want to compute it again" + ) if print_metric and not recompute: - print_computed_metric(info_group._v_attrs['genomes_fluidity']) + print_computed_metric(info_group._v_attrs["genomes_fluidity"]) return True return False -def compute_metrics(pangenome: Pangenome, genomes_fluidity: bool = False, families_fluidity: bool = False, disable_bar: bool = False) -> dict: +def compute_metrics( + pangenome: Pangenome, + genomes_fluidity: bool = False, + families_fluidity: bool = False, + disable_bar: bool = False, +) -> dict: """Compute the metrics :param pangenome: pangenome which will be used to compute the genomes' fluidity @@ -47,14 +59,18 @@ def compute_metrics(pangenome: Pangenome, genomes_fluidity: bool = False, famili metrics_dict = {} if genomes_fluidity: - metrics_dict['genomes_fluidity'] = compute_genomes_fluidity(pangenome, disable_bar) + metrics_dict["genomes_fluidity"] = compute_genomes_fluidity( + pangenome, disable_bar + ) if families_fluidity: - metrics_dict['families_fluidity'] = fam_fluidity(pangenome, disable_bar) + metrics_dict["families_fluidity"] = fam_fluidity(pangenome, disable_bar) return metrics_dict -def write_metrics(pangenome: Pangenome, metrics_dict: dict, print_metrics: bool = False): +def write_metrics( + pangenome: Pangenome, metrics_dict: dict, print_metrics: bool = False +): """ Write the metrics computed in the pangenome @@ -65,13 +81,16 @@ def write_metrics(pangenome: Pangenome, metrics_dict: dict, print_metrics: bool with tables.open_file(pangenome.file, "a") as h5f: info_group = h5f.root.info logging.getLogger("PPanGGOLiN").debug("H5f open") - if 'genomes_fluidity' in metrics_dict.keys(): - logging.getLogger("PPanGGOLiN").info("Writing genome fluidity of the pangenome.") - info_group._v_attrs.genomes_fluidity = metrics_dict['genomes_fluidity'] + if "genomes_fluidity" in metrics_dict.keys(): + logging.getLogger("PPanGGOLiN").info( + "Writing genome fluidity of the pangenome." + ) + info_group._v_attrs.genomes_fluidity = metrics_dict["genomes_fluidity"] # After all metrics have been written if print_metrics: - print_computed_metric(metrics_dict['genomes_fluidity']) + print_computed_metric(metrics_dict["genomes_fluidity"]) + def print_computed_metric(metrics_dict: dict): """ @@ -79,10 +98,15 @@ def print_computed_metric(metrics_dict: dict): :params metrics_dict: Dict of computed metrics """ - metric_dict = {"Genomes_fluidity": {key:round(val,3) for key, val in metrics_dict.items()}} - metric_yaml = yaml.dump(metric_dict, default_flow_style=False, sort_keys=False, indent=4) + metric_dict = { + "Genomes_fluidity": {key: round(val, 3) for key, val in metrics_dict.items()} + } + metric_yaml = yaml.dump( + metric_dict, default_flow_style=False, sort_keys=False, indent=4 + ) print(metric_yaml) + def launch(args: argparse.Namespace): """ Command launcher @@ -97,12 +121,23 @@ def launch(args: argparse.Namespace): print_metrics = not args.no_print_info - logging.getLogger("PPanGGOLiN").debug("Check if one of the metrics was already computed") - is_metric_already_computed = check_already_computed_metric(pangenome, genomes_fluidity=args.genome_fluidity, print_metric=print_metrics, recompute=args.recompute_metrics) + logging.getLogger("PPanGGOLiN").debug( + "Check if one of the metrics was already computed" + ) + is_metric_already_computed = check_already_computed_metric( + pangenome, + genomes_fluidity=args.genome_fluidity, + print_metric=print_metrics, + recompute=args.recompute_metrics, + ) if not is_metric_already_computed or args.recompute_metrics: logging.getLogger("PPanGGOLiN").info("Metrics computation begin") - metrics_dictionary = compute_metrics(pangenome, disable_bar=args.disable_prog_bar, genomes_fluidity=args.genome_fluidity) + metrics_dictionary = compute_metrics( + pangenome, + disable_bar=args.disable_prog_bar, + genomes_fluidity=args.genome_fluidity, + ) logging.getLogger("PPanGGOLiN").info("Metrics computation done") write_metrics(pangenome, metrics_dictionary, print_metrics=print_metrics) @@ -116,7 +151,9 @@ def subparser(sub_parser: argparse._SubParsersAction) -> argparse.ArgumentParser :return : parser arguments for align command """ - parser = sub_parser.add_parser("metrics", formatter_class=argparse.RawTextHelpFormatter) + parser = sub_parser.add_parser( + "metrics", formatter_class=argparse.RawTextHelpFormatter + ) parser_metrics(parser) return parser @@ -127,32 +164,55 @@ def parser_metrics(parser: argparse.ArgumentParser): :param parser: Argument parser for the 'metrics' command. """ - required = parser.add_argument_group(title="Required arguments", - description="Specify the required argument:") - required.add_argument('-p', '--pangenome', required=False, type=Path, - help="Path to the pangenome .h5 file") - - onereq = parser.add_argument_group(title="Input file", - description="Choose one of the following arguments:") - onereq.add_argument('--genome_fluidity', required=False, action="store_true", default=False, - help="Compute the pangenome genomic fluidity.") - - optional = parser.add_argument_group(title="Optional arguments", - description="Specify optional arguments with default values:") - optional.add_argument('--no_print_info', required=False, action="store_true", default=False, - help="Suppress printing the metrics result. " - "Metrics are saved in the pangenome and viewable using 'ppanggolin info'.") - optional.add_argument('--recompute_metrics', action="store_true", - help="Force re-computation of metrics if already computed.") - - -if __name__ == '__main__': + required = parser.add_argument_group( + title="Required arguments", description="Specify the required argument:" + ) + required.add_argument( + "-p", + "--pangenome", + required=False, + type=Path, + help="Path to the pangenome .h5 file", + ) + + onereq = parser.add_argument_group( + title="Input file", description="Choose one of the following arguments:" + ) + onereq.add_argument( + "--genome_fluidity", + required=False, + action="store_true", + default=False, + help="Compute the pangenome genomic fluidity.", + ) + + optional = parser.add_argument_group( + title="Optional arguments", + description="Specify optional arguments with default values:", + ) + optional.add_argument( + "--no_print_info", + required=False, + action="store_true", + default=False, + help="Suppress printing the metrics result. " + "Metrics are saved in the pangenome and viewable using 'ppanggolin info'.", + ) + optional.add_argument( + "--recompute_metrics", + action="store_true", + help="Force re-computation of metrics if already computed.", + ) + + +if __name__ == "__main__": """To test local change and allow using debugger""" from ppanggolin.utils import set_verbosity_level, add_common_arguments main_parser = argparse.ArgumentParser( description="Depicting microbial species diversity via a Partitioned PanGenome Graph Of Linked Neighbors", - formatter_class=argparse.RawTextHelpFormatter) + formatter_class=argparse.RawTextHelpFormatter, + ) parser_metrics(main_parser) add_common_arguments(main_parser) diff --git a/ppanggolin/mod/module.py b/ppanggolin/mod/module.py index fe2df7a0..81dd900e 100644 --- a/ppanggolin/mod/module.py +++ b/ppanggolin/mod/module.py @@ -25,8 +25,10 @@ def check_pangenome_former_modules(pangenome: Pangenome, force: bool = False): :param force: Allow to force write on pangenome by erasing already present modules """ if pangenome.status["modules"] == "inFile" and not force: - raise Exception("You are trying to detect modules on a pangenome which already has predicted modules. " - "If you REALLY want to do that, use --force (it will erase modules previously predicted).") + raise Exception( + "You are trying to detect modules on a pangenome which already has predicted modules. " + "If you REALLY want to do that, use --force (it will erase modules previously predicted)." + ) elif pangenome.status["modules"] == "inFile" and force: erase_pangenome(pangenome, modules=True) @@ -34,32 +36,44 @@ def check_pangenome_former_modules(pangenome: Pangenome, force: bool = False): def compute_mod_graph(pangenome: Pangenome, t: int = 1, disable_bar: bool = False): """ Computes a graph using all provided genomes with a transitive closure of size t - + :param pangenome: pangenome with organisms to compute the graph :param t: the size of the transitive closure :param disable_bar: whether to show a progress bar or not """ g = nx.Graph() - for org in tqdm(pangenome.organisms, total=pangenome.number_of_organisms, unit="genome", disable=disable_bar): + for org in tqdm( + pangenome.organisms, + total=pangenome.number_of_organisms, + unit="genome", + disable=disable_bar, + ): for contig in org.contigs: if contig.number_of_genes > 0: start_gene = contig[0] g.add_node(start_gene.family) add_gene(g.nodes[start_gene.family], start_gene, fam_split=False) for i, gene in enumerate(contig.genes): - for j, a_gene in enumerate(contig.get_genes(i + 1, i + t + 2, outrange_ok=True), start=i + 1): + for j, a_gene in enumerate( + contig.get_genes(i + 1, i + t + 2, outrange_ok=True), + start=i + 1, + ): g.add_edge(gene.family, a_gene.family) edge = g[gene.family][a_gene.family] add_gene(edge, gene) add_gene(edge, a_gene) - if j == i + t + 1 or i == 0: # if it's the last gene of the series, or the first series + if ( + j == i + t + 1 or i == 0 + ): # if it's the last gene of the series, or the first series add_gene(g.nodes[a_gene.family], a_gene, fam_split=False) return g -def compute_modules(g: nx.Graph, multi: set, weight: float = 0.85, min_fam: int = 2, size: int = 3): +def compute_modules( + g: nx.Graph, multi: set, weight: float = 0.85, min_fam: int = 2, size: int = 3 +): """ Computes modules using a graph built by :func:`ppanggolin.mod.module.compute_mod_graph` and different parameters defining how restrictive the modules will be. @@ -77,8 +91,9 @@ def compute_modules(g: nx.Graph, multi: set, weight: float = 0.85, min_fam: int modules = set() c = 0 for comp in connected_components(g, removed, weight): - if len(comp) >= size and not any(fam.named_partition == "persistent" and - fam not in multi for fam in comp): + if len(comp) >= size and not any( + fam.named_partition == "persistent" and fam not in multi for fam in comp + ): # keep only the modules with at least 'size' non-multigenic genes and # remove 'persistent' and non-multigenic modules modules.add(Module(module_id=c, families=comp)) @@ -86,8 +101,16 @@ def compute_modules(g: nx.Graph, multi: set, weight: float = 0.85, min_fam: int return modules -def predict_modules(pangenome: Pangenome, dup_margin: float = 0.05, size: int = 3, min_presence: int = 2, - transitive: int = 4, jaccard: float = 0.85, force: bool = False, disable_bar: bool = False): +def predict_modules( + pangenome: Pangenome, + dup_margin: float = 0.05, + size: int = 3, + min_presence: int = 2, + transitive: int = 4, + jaccard: float = 0.85, + force: bool = False, + disable_bar: bool = False, +): """ Main function to predict module @@ -102,16 +125,24 @@ def predict_modules(pangenome: Pangenome, dup_margin: float = 0.05, size: int = """ # check statuses and load info check_pangenome_former_modules(pangenome, force) - check_pangenome_info(pangenome, need_annotations=True, need_families=True, need_partitions=True, - disable_bar=disable_bar) + check_pangenome_info( + pangenome, + need_annotations=True, + need_families=True, + need_partitions=True, + disable_bar=disable_bar, + ) # compute the graph with transitive closure size provided as parameter start_time = time.time() logging.getLogger("PPanGGOLiN").info("Building the graph...") g = compute_mod_graph(pangenome, t=transitive, disable_bar=disable_bar) logging.getLogger("PPanGGOLiN").info( - f"Took {round(time.time() - start_time, 2)} seconds to build the graph to find modules in") - logging.getLogger("PPanGGOLiN").info(f"There are {nx.number_of_nodes(g)} nodes and {nx.number_of_edges(g)} edges") + f"Took {round(time.time() - start_time, 2)} seconds to build the graph to find modules in" + ) + logging.getLogger("PPanGGOLiN").info( + f"There are {nx.number_of_nodes(g)} nodes and {nx.number_of_edges(g)} edges" + ) start_time = time.time() # get all multigenic gene families @@ -125,8 +156,12 @@ def predict_modules(pangenome: Pangenome, dup_margin: float = 0.05, size: int = fams |= set(mod.families) pangenome.add_module(mod) - logging.getLogger("PPanGGOLiN").info(f"There are {len(fams)} families among {len(modules)} modules") - logging.getLogger("PPanGGOLiN").info(f"Computing modules took {round(time.time() - start_time, 2)} seconds") + logging.getLogger("PPanGGOLiN").info( + f"There are {len(fams)} families among {len(modules)} modules" + ) + logging.getLogger("PPanGGOLiN").info( + f"Computing modules took {round(time.time() - start_time, 2)} seconds" + ) pangenome.status["modules"] = "Computed" pangenome.parameters["module"] = {} @@ -145,10 +180,19 @@ def launch(args: argparse.Namespace): """ pangenome = Pangenome() pangenome.add_file(args.pangenome) - predict_modules(pangenome=pangenome, dup_margin=args.dup_margin, size=args.size, - min_presence=args.min_presence, transitive=args.transitive, jaccard=args.jaccard, force=args.force, - disable_bar=args.disable_prog_bar) - write_pangenome(pangenome, pangenome.file, args.force, disable_bar=args.disable_prog_bar) + predict_modules( + pangenome=pangenome, + dup_margin=args.dup_margin, + size=args.size, + min_presence=args.min_presence, + transitive=args.transitive, + jaccard=args.jaccard, + force=args.force, + disable_bar=args.disable_prog_bar, + ) + write_pangenome( + pangenome, pangenome.file, args.force, disable_bar=args.disable_prog_bar + ) def subparser(sub_parser: argparse._SubParsersAction) -> argparse.ArgumentParser: @@ -159,7 +203,9 @@ def subparser(sub_parser: argparse._SubParsersAction) -> argparse.ArgumentParser :return : parser arguments for align command """ - parser = sub_parser.add_parser("module", formatter_class=argparse.RawTextHelpFormatter) + parser = sub_parser.add_parser( + "module", formatter_class=argparse.RawTextHelpFormatter + ) parser_module(parser) return parser @@ -170,36 +216,76 @@ def parser_module(parser: argparse.ArgumentParser): :param parser: parser for align argument """ - required = parser.add_argument_group(title="Required arguments", - description="One of the following arguments is required :") - required.add_argument('-p', '--pangenome', required=False, type=Path, help="The pangenome .h5 file") + required = parser.add_argument_group( + title="Required arguments", + description="One of the following arguments is required :", + ) + required.add_argument( + "-p", "--pangenome", required=False, type=Path, help="The pangenome .h5 file" + ) optional = parser.add_argument_group(title="Optional arguments") - optional.add_argument("--size", required=False, type=int, default=3, - help="Minimal number of gene family in a module") - optional.add_argument("--dup_margin", required=False, type=restricted_float, default=0.05, - help="minimum ratio of genomes in which the family must have multiple genes" - " for it to be considered 'duplicated'") - optional.add_argument("-m", "--min_presence", required=False, type=int, default=2, - help="Minimum number of times the module needs to be present in the pangenome to be reported." - " Increasing it will improve precision but lower sensitivity.") - optional.add_argument("-t", "--transitive", required=False, type=int, default=4, - help="Size of the transitive closure used to build the graph. " - "This indicates the number of non related genes allowed in-between two related genes. " - "Increasing it will improve precision but lower sensitivity a little.") - optional.add_argument("-s", "--jaccard", required=False, type=restricted_float, default=0.85, - help="minimum jaccard similarity used to filter edges between gene families. " - "Increasing it will improve precision but lower sensitivity a lot.") - - optional.add_argument("-c", "--cpu", required=False, default=1, type=int, help="Number of available cpus") - - -if __name__ == '__main__': + optional.add_argument( + "--size", + required=False, + type=int, + default=3, + help="Minimal number of gene family in a module", + ) + optional.add_argument( + "--dup_margin", + required=False, + type=restricted_float, + default=0.05, + help="minimum ratio of genomes in which the family must have multiple genes" + " for it to be considered 'duplicated'", + ) + optional.add_argument( + "-m", + "--min_presence", + required=False, + type=int, + default=2, + help="Minimum number of times the module needs to be present in the pangenome to be reported." + " Increasing it will improve precision but lower sensitivity.", + ) + optional.add_argument( + "-t", + "--transitive", + required=False, + type=int, + default=4, + help="Size of the transitive closure used to build the graph. " + "This indicates the number of non related genes allowed in-between two related genes. " + "Increasing it will improve precision but lower sensitivity a little.", + ) + optional.add_argument( + "-s", + "--jaccard", + required=False, + type=restricted_float, + default=0.85, + help="minimum jaccard similarity used to filter edges between gene families. " + "Increasing it will improve precision but lower sensitivity a lot.", + ) + + optional.add_argument( + "-c", + "--cpu", + required=False, + default=1, + type=int, + help="Number of available cpus", + ) + + +if __name__ == "__main__": """To test local change and allow using debugger""" from ppanggolin.utils import set_verbosity_level, add_common_arguments main_parser = argparse.ArgumentParser( description="Depicting microbial species diversity via a Partitioned PanGenome Graph Of Linked Neighbors", - formatter_class=argparse.RawTextHelpFormatter) + formatter_class=argparse.RawTextHelpFormatter, + ) parser_module(main_parser) add_common_arguments(main_parser) diff --git a/ppanggolin/nem/partition.py b/ppanggolin/nem/partition.py index 28c48074..f556fb49 100644 --- a/ppanggolin/nem/partition.py +++ b/ppanggolin/nem/partition.py @@ -32,10 +32,18 @@ samples = [] -def run_partitioning(nem_dir_path: Path, nb_org: int, beta: float = 2.5, free_dispersion: bool = False, kval: int = 3, - seed: int = 42, init: str = "param_file", keep_files: bool = False, itermax: int = 100, - just_log_likelihood: bool = False) \ - -> Union[Tuple[dict, None, None], Tuple[int, float, float], Tuple[dict, dict, float]]: +def run_partitioning( + nem_dir_path: Path, + nb_org: int, + beta: float = 2.5, + free_dispersion: bool = False, + kval: int = 3, + seed: int = 42, + init: str = "param_file", + keep_files: bool = False, + itermax: int = 100, + just_log_likelihood: bool = False, +) -> Union[Tuple[dict, None, None], Tuple[int, float, float], Tuple[dict, dict, float]]: """ Main function to make partitioning @@ -88,20 +96,55 @@ def run_partitioning(nem_dir_path: Path, nb_org: int, beta: float = 2.5, free_di init_random, init_param_file = range(1, 3) logging.getLogger("PPanGGOLiN").debug("Running NEM...") logging.getLogger("PPanGGOLiN").debug( - [nem_dir_path.as_posix().encode('ascii') + b"/nem_file", kval, algo, beta, convergence, - convergence_th, b"fuzzy", itermax, True, model, proportion, variance_model, - init_param_file if init in ["param_file", "init_from_old"] else init_random, - nem_dir_path.as_posix().encode('ascii') + b"/nem_file_init_" + str(kval).encode('ascii') + b".m", - nem_dir_path.as_posix().encode('ascii') + b"/nem_file_" + str(kval).encode('ascii'), - seed]) - nem_stats.nem(Fname=nem_dir_path.as_posix().encode('ascii') + b"/nem_file", nk=kval, algo=algo, beta=beta, - convergence=convergence, convergence_th=convergence_th, format=b"fuzzy", it_max=itermax, - dolog=True, model_family=model, proportion=proportion, dispersion=variance_model, - init_mode=init_param_file if init in ["param_file", "init_from_old"] else init_random, - init_file=nem_dir_path.as_posix().encode('ascii') + b"/nem_file_init_" + str(kval).encode( - 'ascii') + b".m", - out_file_prefix=nem_dir_path.as_posix().encode('ascii') + b"/nem_file_" + str(kval).encode('ascii'), - seed=seed) + [ + nem_dir_path.as_posix().encode("ascii") + b"/nem_file", + kval, + algo, + beta, + convergence, + convergence_th, + b"fuzzy", + itermax, + True, + model, + proportion, + variance_model, + init_param_file if init in ["param_file", "init_from_old"] else init_random, + nem_dir_path.as_posix().encode("ascii") + + b"/nem_file_init_" + + str(kval).encode("ascii") + + b".m", + nem_dir_path.as_posix().encode("ascii") + + b"/nem_file_" + + str(kval).encode("ascii"), + seed, + ] + ) + nem_stats.nem( + Fname=nem_dir_path.as_posix().encode("ascii") + b"/nem_file", + nk=kval, + algo=algo, + beta=beta, + convergence=convergence, + convergence_th=convergence_th, + format=b"fuzzy", + it_max=itermax, + dolog=True, + model_family=model, + proportion=proportion, + dispersion=variance_model, + init_mode=( + init_param_file if init in ["param_file", "init_from_old"] else init_random + ), + init_file=nem_dir_path.as_posix().encode("ascii") + + b"/nem_file_init_" + + str(kval).encode("ascii") + + b".m", + out_file_prefix=nem_dir_path.as_posix().encode("ascii") + + b"/nem_file_" + + str(kval).encode("ascii"), + seed=seed, + ) logging.getLogger("PPanGGOLiN").debug("After running NEM...") @@ -113,7 +156,9 @@ def run_partitioning(nem_dir_path: Path, nb_org: int, beta: float = 2.5, free_di # logging.getLogger("PPanGGOLiN").warning("No NEM output file found: "+ nem_dir_path+"/nem_file_"+str(K)+".uf") no_nem = True else: - logging.getLogger("PPanGGOLiN").debug(f"No NEM output file found: {nem_out_path.absolute().as_posix()}") + logging.getLogger("PPanGGOLiN").debug( + f"No NEM output file found: {nem_out_path.absolute().as_posix()}" + ) no_nem = True index_fam = [] @@ -126,8 +171,11 @@ def run_partitioning(nem_dir_path: Path, nb_org: int, beta: float = 2.5, free_di log_likelihood = None entropy = None try: - with open(nem_dir_path / f"nem_file_{str(kval)}.uf") as partitions_nem_file, \ - open(nem_dir_path / f"nem_file_{str(kval)}.mf") as parameters_nem_file: + with open( + nem_dir_path / f"nem_file_{str(kval)}.uf" + ) as partitions_nem_file, open( + nem_dir_path / f"nem_file_{str(kval)}.mf" + ) as parameters_nem_file: parameters = parameters_nem_file.readlines() log_likelihood = float(parameters[2].split()[3]) @@ -137,7 +185,7 @@ def run_partitioning(nem_dir_path: Path, nb_org: int, beta: float = 2.5, free_di for k, line in enumerate(parameters[-kval:]): vector = line.split() mu_k = [bool(float(mu_kj)) for mu_kj in vector[0:nb_org]] - epsilon_k = [float(epsilon_kj) for epsilon_kj in vector[nb_org + 1:]] + epsilon_k = [float(epsilon_kj) for epsilon_kj in vector[nb_org + 1 :]] proportion = float(vector[nb_org]) sum_mu_k.append(sum(mu_k)) sum_epsilon_k.append(sum(epsilon_k)) @@ -157,17 +205,28 @@ def run_partitioning(nem_dir_path: Path, nb_org: int, beta: float = 2.5, free_di for i, line in enumerate(partitions_nem_file): elements = [float(el) for el in line.split()] if just_log_likelihood: - entropy += sum([math.log(float(el)) * float(el) if float(el) > 0 else 0 for el in elements]) + entropy += sum( + [ + math.log(float(el)) * float(el) if float(el) > 0 else 0 + for el in elements + ] + ) else: max_prob = max([float(el) for el in elements]) - positions_max_prob = [pos for pos, prob in enumerate(elements) if prob == max_prob] + positions_max_prob = [ + pos for pos, prob in enumerate(elements) if prob == max_prob + ] if len(positions_max_prob) > 1 or max_prob < 0.5: - partitions_list[i] = "S_" # SHELL in case of doubt gene families is attributed to shell + partitions_list[i] = ( + "S_" # SHELL in case of doubt gene families is attributed to shell + ) else: partitions_list[i] = parti[positions_max_prob.pop()] except OSError: - logging.getLogger("PPanGGOLiN").warning("Partitioning did not work (the number of genomes used is probably too low), " - f"see logs here to obtain more details {nem_dir_path.as_posix()}") + logging.getLogger("PPanGGOLiN").warning( + "Partitioning did not work (the number of genomes used is probably too low), " + f"see logs here to obtain more details {nem_dir_path.as_posix()}" + ) return {}, None, None # return empty objects except ValueError: @@ -180,8 +239,9 @@ def run_partitioning(nem_dir_path: Path, nb_org: int, beta: float = 2.5, free_di return dict(zip(index_fam, partitions_list)), all_parameters, log_likelihood -def nem_single(args: List[Tuple[Path, int, float, bool, int, int, str, bool, int, bool]]) \ - -> Union[Tuple[dict, None, None], Tuple[int, float, float], Tuple[dict, dict, float]]: +def nem_single( + args: List[Tuple[Path, int, float, bool, int, int, str, bool, int, bool]] +) -> Union[Tuple[dict, None, None], Tuple[int, float, float], Tuple[dict, dict, float]]: """ Allow to run partitioning in multiprocessing to evaluate partition number @@ -192,10 +252,17 @@ def nem_single(args: List[Tuple[Path, int, float, bool, int, int, str, bool, int return run_partitioning(*args) -def partition_nem(index: int, kval: int, beta: float = 2.5, sm_degree: int = 10, - free_dispersion: bool = False, seed: int = 42, init: str = "param_file", - tmpdir: Path = None, keep_tmp_files: bool = False) \ - -> Union[Tuple[dict, None, None], Tuple[int, float, float], Tuple[dict, dict, float]]: +def partition_nem( + index: int, + kval: int, + beta: float = 2.5, + sm_degree: int = 10, + free_dispersion: bool = False, + seed: int = 42, + init: str = "param_file", + tmpdir: Path = None, + keep_tmp_files: bool = False, +) -> Union[Tuple[dict, None, None], Tuple[int, float, float], Tuple[dict, dict, float]]: """ :param index: Index of the sample group @@ -213,13 +280,25 @@ def partition_nem(index: int, kval: int, beta: float = 2.5, sm_degree: int = 10, currtmpdir = tmpdir / f"{str(index)}" # unique directory name samp = samples[index] # org_samples accessible because it is a global variable. - edges_weight, nb_fam = write_nem_input_files(tmpdir=currtmpdir, organisms=samp, sm_degree=sm_degree) - return run_partitioning(currtmpdir, len(samp), beta * (nb_fam / edges_weight), free_dispersion, kval=kval, - seed=seed, init=init, keep_files=keep_tmp_files) - - -def nem_samples(pack: tuple) -> Union[Tuple[dict, None, None], Tuple[int, float, float], Tuple[dict, dict, float]]: - """ run partitioning + edges_weight, nb_fam = write_nem_input_files( + tmpdir=currtmpdir, organisms=samp, sm_degree=sm_degree + ) + return run_partitioning( + currtmpdir, + len(samp), + beta * (nb_fam / edges_weight), + free_dispersion, + kval=kval, + seed=seed, + init=init, + keep_files=keep_tmp_files, + ) + + +def nem_samples( + pack: tuple, +) -> Union[Tuple[dict, None, None], Tuple[int, float, float], Tuple[dict, dict, float]]: + """run partitioning :param pack: {index: int, tmpdir: str, beta: float, sm_degree: int, free_dispersion: bool, kval: int, seed: int, init: str, keep_tmp_files: bool} :return: @@ -227,10 +306,12 @@ def nem_samples(pack: tuple) -> Union[Tuple[dict, None, None], Tuple[int, float, return partition_nem(*pack) -def write_nem_input_files(tmpdir: Path, organisms: set, sm_degree: int = 10) -> Tuple[float, int]: +def write_nem_input_files( + tmpdir: Path, organisms: set, sm_degree: int = 10 +) -> Tuple[float, int]: """ Create and format input files for partitioning with NEM - + :param tmpdir: temporary directory path :param organisms: Set of organism from pangenome :param sm_degree: Maximum degree of the nodes to be included in the smoothing process. @@ -243,11 +324,14 @@ def write_nem_input_files(tmpdir: Path, organisms: set, sm_degree: int = 10) -> with open(tmpdir / "column_org_file", "w") as org_file: org_file.write(" ".join([f'"{org.name}"' for org in organisms]) + "\n") - logging.getLogger("PPanGGOLiN").debug("Writing nem_file.str nem_file.index nem_file.nei and nem_file.dat files") - with open(tmpdir / "nem_file.str", "w") as str_file, \ - open(tmpdir / "nem_file.index", "w") as index_file, \ - open(tmpdir / "nem_file.nei", "w") as nei_file, \ - open(tmpdir / "nem_file.dat", "w") as dat_file: + logging.getLogger("PPanGGOLiN").debug( + "Writing nem_file.str nem_file.index nem_file.nei and nem_file.dat files" + ) + with open(tmpdir / "nem_file.str", "w") as str_file, open( + tmpdir / "nem_file.index", "w" + ) as index_file, open(tmpdir / "nem_file.nei", "w") as nei_file, open( + tmpdir / "nem_file.dat", "w" + ) as dat_file: nei_file.write("1\n") index_fam = {} @@ -255,7 +339,7 @@ def write_nem_input_files(tmpdir: Path, organisms: set, sm_degree: int = 10) -> index_org = {} default_dat = [] for index, org in enumerate(organisms): - default_dat.append('0') + default_dat.append("0") index_org[org] = index for fam in pan.gene_families: @@ -276,19 +360,39 @@ def write_nem_input_files(tmpdir: Path, organisms: set, sm_degree: int = 10) -> neighbor_number = 0 sum_dist_score = 0 for edge in fam.edges: # iter on the family's edges. - coverage = sum([len(gene_list) for org, gene_list in edge.get_organisms_dict().items() if org in organisms]) + coverage = sum( + [ + len(gene_list) + for org, gene_list in edge.get_organisms_dict().items() + if org in organisms + ] + ) if coverage == 0: continue # nothing interesting to write, this edge does not exist with this subset of organisms. distance_score = coverage / len(organisms) sum_dist_score += distance_score - row_fam.append(str(index_fam[edge.target if fam == edge.source else edge.source])) + row_fam.append( + str(index_fam[edge.target if fam == edge.source else edge.source]) + ) row_dist_score.append(str(round(distance_score, 4))) neighbor_number += 1 if neighbor_number > 0 and float(neighbor_number) < sm_degree: total_edges_weight += sum_dist_score - nei_file.write('\t'.join( - [str(item) for sublist in [[index_fam[fam]], [neighbor_number], row_fam, row_dist_score] for item in - sublist]) + "\n") + nei_file.write( + "\t".join( + [ + str(item) + for sublist in [ + [index_fam[fam]], + [neighbor_number], + row_fam, + row_dist_score, + ] + for item in sublist + ] + ) + + "\n" + ) else: nei_file.write(str(index_fam[fam]) + "\t0\n") @@ -296,9 +400,20 @@ def write_nem_input_files(tmpdir: Path, organisms: set, sm_degree: int = 10) -> return total_edges_weight / 2, len(index_fam) -def evaluate_nb_partitions(organisms: set, output: Path = None, sm_degree: int = 10, free_dispersion: bool = False, - chunk_size: int = 500, krange: list = None, icl_margin: float = 0.05, draw_icl: bool = False, - cpu: int = 1, seed: int = 42, tmpdir: Path = None, disable_bar: bool = False) -> int: +def evaluate_nb_partitions( + organisms: set, + output: Path = None, + sm_degree: int = 10, + free_dispersion: bool = False, + chunk_size: int = 500, + krange: list = None, + icl_margin: float = 0.05, + draw_icl: bool = False, + cpu: int = 1, + seed: int = 42, + tmpdir: Path = None, + disable_bar: bool = False, +) -> int: """ Evaluate the optimal number of partition for the pangenome @@ -329,13 +444,29 @@ def evaluate_nb_partitions(organisms: set, output: Path = None, sm_degree: int = max_icl_k = 0 args_partitionning = [] for k in range(krange[0] - 1, krange[1] + 1): - args_partitionning.append((newtmpdir, len(select_organisms), 0, free_dispersion, - k, seed, "param_file", True, 10, True)) # follow order run_partitionning args + args_partitionning.append( + ( + newtmpdir, + len(select_organisms), + 0, + free_dispersion, + k, + seed, + "param_file", + True, + 10, + True, + ) + ) # follow order run_partitionning args all_log_likelihood = [] if cpu > 1: - bar = tqdm(range(len(args_partitionning)), unit="Number of partitions", disable=disable_bar) - with get_context('fork').Pool(processes=cpu) as p: + bar = tqdm( + range(len(args_partitionning)), + unit="Number of partitions", + disable=disable_bar, + ) + with get_context("fork").Pool(processes=cpu) as p: for result in p.imap_unordered(nem_single, args_partitionning): all_log_likelihood.append(result) bar.update() @@ -351,8 +482,14 @@ def evaluate_nb_partitions(organisms: set, output: Path = None, sm_degree: int = all_lls = defaultdict(float) for k_candidate, log_likelihood, entropy in all_log_likelihood: if log_likelihood is not None: - nb_params = k_candidate * (len(select_organisms) + 1 + (len(select_organisms) if free_dispersion else 1)) - all_bics[k_candidate] = log_likelihood - 0.5 * (math.log(nb_params) * nb_fam) # Calculate BIC + nb_params = k_candidate * ( + len(select_organisms) + + 1 + + (len(select_organisms) if free_dispersion else 1) + ) + all_bics[k_candidate] = log_likelihood - 0.5 * ( + math.log(nb_params) * nb_fam + ) # Calculate BIC all_icls[k_candidate] = all_bics[k_candidate] - entropy all_lls[k_candidate] = log_likelihood @@ -362,45 +499,99 @@ def evaluate_nb_partitions(organisms: set, output: Path = None, sm_degree: int = if len(all_bics) > 3: max_icl_k = max(all_icls, key=all_icls.get) delta_icl = (all_icls[max_icl_k] - min(all_icls.values())) * icl_margin - best_k = min({k for k, icl in all_icls.items() if icl >= all_icls[max_icl_k] - delta_icl and k <= max_icl_k}) + best_k = min( + { + k + for k, icl in all_icls.items() + if icl >= all_icls[max_icl_k] - delta_icl and k <= max_icl_k + } + ) chosen_k = best_k if best_k >= 3 else chosen_k if len(all_bics) > 0 and draw_icl: - traces = [go.Scatter(x=sorted(all_bics.keys()), - y=[all_bics[key] for key in sorted(all_bics.keys())], - name="BIC", - mode="lines+markers"), go.Scatter(x=sorted(all_icls.keys()), - y=[all_icls[key] for key in sorted(all_icls.keys())], - name="ICL", - mode="lines+markers"), - go.Scatter(x=sorted(all_lls.keys()), - y=[all_lls[key] for key in sorted(all_lls.keys())], - name="log likelihood", - mode="lines+markers"), go.Scatter(x=sorted(all_bics.keys()), - y=[all_bics[key] for key in sorted(all_bics.keys())], - name="BIC", - mode="lines+markers"), - go.Scatter(x=sorted(all_icls.keys()), - y=[all_icls[key] for key in sorted(all_icls.keys())], - name="ICL", - mode="lines+markers"), go.Scatter(x=sorted(all_lls.keys()), - y=[all_lls[key] for key in sorted(all_lls.keys())], - name="log likelihood", - mode="lines+markers")] - layout = go.Layout(title='ICL curve (best K is ' + str(best_k) + ', ICL_th= is ' + str(icl_margin) + ")", - titlefont=dict(size=20), - xaxis=dict(title='number of partitions'), - yaxis=dict(title='ICL, BIC, log likelihood'), - plot_bgcolor='#ffffff', - shapes=[dict(type='line', x0=best_k, x1=best_k, y0=0, y1=all_icls[best_k], - line=dict(dict(width=1, dash='dashdot', color="black"))), - dict(type='line', x0=max_icl_k, x1=max_icl_k, y0=0, y1=all_icls[max_icl_k], - line=dict(dict(width=1, dash='dashdot', color="black"))), - dict(type='line', x0=best_k, x1=max_icl_k, y0=all_icls[max_icl_k], - y1=all_icls[max_icl_k], - line=dict(dict(width=1, dash='dashdot', color="black"))), - dict(type='line', x0=2, x1=krange[1], y0=all_icls[best_k], y1=all_icls[best_k], - line=dict(dict(width=1, dash='dashdot', color="black")))]) + traces = [ + go.Scatter( + x=sorted(all_bics.keys()), + y=[all_bics[key] for key in sorted(all_bics.keys())], + name="BIC", + mode="lines+markers", + ), + go.Scatter( + x=sorted(all_icls.keys()), + y=[all_icls[key] for key in sorted(all_icls.keys())], + name="ICL", + mode="lines+markers", + ), + go.Scatter( + x=sorted(all_lls.keys()), + y=[all_lls[key] for key in sorted(all_lls.keys())], + name="log likelihood", + mode="lines+markers", + ), + go.Scatter( + x=sorted(all_bics.keys()), + y=[all_bics[key] for key in sorted(all_bics.keys())], + name="BIC", + mode="lines+markers", + ), + go.Scatter( + x=sorted(all_icls.keys()), + y=[all_icls[key] for key in sorted(all_icls.keys())], + name="ICL", + mode="lines+markers", + ), + go.Scatter( + x=sorted(all_lls.keys()), + y=[all_lls[key] for key in sorted(all_lls.keys())], + name="log likelihood", + mode="lines+markers", + ), + ] + layout = go.Layout( + title="ICL curve (best K is " + + str(best_k) + + ", ICL_th= is " + + str(icl_margin) + + ")", + titlefont=dict(size=20), + xaxis=dict(title="number of partitions"), + yaxis=dict(title="ICL, BIC, log likelihood"), + plot_bgcolor="#ffffff", + shapes=[ + dict( + type="line", + x0=best_k, + x1=best_k, + y0=0, + y1=all_icls[best_k], + line=dict(dict(width=1, dash="dashdot", color="black")), + ), + dict( + type="line", + x0=max_icl_k, + x1=max_icl_k, + y0=0, + y1=all_icls[max_icl_k], + line=dict(dict(width=1, dash="dashdot", color="black")), + ), + dict( + type="line", + x0=best_k, + x1=max_icl_k, + y0=all_icls[max_icl_k], + y1=all_icls[max_icl_k], + line=dict(dict(width=1, dash="dashdot", color="black")), + ), + dict( + type="line", + x0=2, + x1=krange[1], + y0=all_icls[best_k], + y1=all_icls[best_k], + line=dict(dict(width=1, dash="dashdot", color="black")), + ), + ], + ) fig = go.Figure(data=traces, layout=layout) out_plot = output / f"ICL_curve_K{str(best_k)}.html" out_plotly.plot(fig, filename=out_plot.as_posix(), auto_open=False) @@ -414,17 +605,33 @@ def check_pangenome_former_partition(pangenome: Pangenome, force: bool = False): :param force: Allow to force write on Pangenome file """ if pangenome.status["partitioned"] == "inFile" and not force: - raise Exception("You are trying to partition a pangenome already partitioned." - " If you REALLY want to do that, " - "use --force (it will erase partitions and every feature computed from them.") + raise Exception( + "You are trying to partition a pangenome already partitioned." + " If you REALLY want to do that, " + "use --force (it will erase partitions and every feature computed from them." + ) elif pangenome.status["partitioned"] == "inFile" and force: erase_pangenome(pangenome, partition=True) -def partition(pangenome: Pangenome, output: Path = None, beta: float = 2.5, sm_degree: int = 10, - free_dispersion: bool = False, chunk_size: int = 500, kval: int = -1, krange: list = None, - icl_margin: float = 0.05, draw_icl: bool = False, cpu: int = 1, seed: int = 42, - tmpdir: Path = None, keep_tmp_files: bool = False, force: bool = False, disable_bar: bool = False): +def partition( + pangenome: Pangenome, + output: Path = None, + beta: float = 2.5, + sm_degree: int = 10, + free_dispersion: bool = False, + chunk_size: int = 500, + kval: int = -1, + krange: list = None, + icl_margin: float = 0.05, + draw_icl: bool = False, + cpu: int = 1, + seed: int = 42, + tmpdir: Path = None, + keep_tmp_files: bool = False, + force: bool = False, + disable_bar: bool = False, +): """ Partitioning the pangenome @@ -452,10 +659,18 @@ def partition(pangenome: Pangenome, output: Path = None, beta: float = 2.5, sm_d pan = pangenome if draw_icl and output is None: - raise Exception("Combination of option impossible: " - "You asked to draw the ICL curves but did not provide an output directory!") + raise Exception( + "Combination of option impossible: " + "You asked to draw the ICL curves but did not provide an output directory!" + ) check_pangenome_former_partition(pangenome, force) - check_pangenome_info(pangenome, need_annotations=True, need_families=True, need_graph=True, disable_bar=disable_bar) + check_pangenome_info( + pangenome, + need_annotations=True, + need_families=True, + need_graph=True, + disable_bar=disable_bar, + ) organisms = set(pangenome.organisms) if keep_tmp_files: @@ -468,8 +683,10 @@ def partition(pangenome: Pangenome, output: Path = None, beta: float = 2.5, sm_d tmp_path = Path(tmp_dir.name) if len(organisms) <= 10: - logging.getLogger("PPanGGOLiN").warning(f"The number of selected genomes is too low ({len(organisms)} " - f"genomes used) to robustly partition the graph") + logging.getLogger("PPanGGOLiN").warning( + f"The number of selected genomes is too low ({len(organisms)} " + f"genomes used) to robustly partition the graph" + ) pangenome.parameters["partition"] = {} pangenome.parameters["partition"]["beta"] = beta @@ -485,10 +702,26 @@ def partition(pangenome: Pangenome, output: Path = None, beta: float = 2.5, sm_d pangenome.parameters["partition"]["nb_of_partitions"] = kval if kval < 2: pangenome.parameters["partition"]["# computed nb of partitions"] = True - logging.getLogger("PPanGGOLiN").info("Estimating the optimal number of partitions...") - kval = evaluate_nb_partitions(organisms, output, sm_degree, free_dispersion, chunk_size, kmm, - icl_margin, draw_icl, cpu, seed, tmp_path, disable_bar) - logging.getLogger("PPanGGOLiN").info(f"The number of partitions has been evaluated at {kval}") + logging.getLogger("PPanGGOLiN").info( + "Estimating the optimal number of partitions..." + ) + kval = evaluate_nb_partitions( + organisms, + output, + sm_degree, + free_dispersion, + chunk_size, + kmm, + icl_margin, + draw_icl, + cpu, + seed, + tmp_path, + disable_bar, + ) + logging.getLogger("PPanGGOLiN").info( + f"The number of partitions has been evaluated at {kval}" + ) pangenome.parameters["partition"]["# final nb of partitions"] = kval pangenome.parameters["partition"]["krange"] = kmm @@ -521,8 +754,10 @@ def validate_family(res): for node, nem_class in res[0].items(): cpt_partition[node][nem_class[0]] += 1 sum_partionning = sum(cpt_partition[node].values()) - if (sum_partionning > len(organisms) / chunk_size and max( - cpt_partition[node].values()) >= sum_partionning * 0.5) or (sum_partionning > len(organisms)): + if ( + sum_partionning > len(organisms) / chunk_size + and max(cpt_partition[node].values()) >= sum_partionning * 0.5 + ) or (sum_partionning > len(organisms)): if node not in validated: if max(cpt_partition[node].values()) < sum_partionning * 0.5: cpt_partition[node]["U"] = len(organisms) @@ -548,21 +783,37 @@ def validate_family(res): args = [] # tmpdir, beta, sm_degree, free_dispersion, K, seed for i, _ in enumerate(samples[prev:], start=prev): - args.append((i, kval, beta, sm_degree, free_dispersion, seed, init, - tmp_path, keep_tmp_files)) + args.append( + ( + i, + kval, + beta, + sm_degree, + free_dispersion, + seed, + init, + tmp_path, + keep_tmp_files, + ) + ) logging.getLogger("PPanGGOLiN").info("Launching NEM") - with get_context('fork').Pool(processes=cpu) as p: + with get_context("fork").Pool(processes=cpu) as p: # launch partitioning - bar = tqdm(range(len(args)), unit=" samples partitioned", disable=disable_bar) + bar = tqdm( + range(len(args)), unit=" samples partitioned", disable=disable_bar + ) for result in p.imap_unordered(nem_samples, args): validate_family(result) bar.update() bar.close() - condition += 1 # if len(validated) < pan_size, we will want to resample more. + condition += ( + 1 # if len(validated) < pan_size, we will want to resample more. + ) logging.getLogger("PPanGGOLiN").debug( - f"There are {len(validated)} validated families out of {pansize} families.") + f"There are {len(validated)} validated families out of {pansize} families." + ) p.close() p.join() for fam, data in cpt_partition.items(): @@ -571,20 +822,34 @@ def validate_family(res): # need to compute the median vectors of each partition ??? partitioning_results = [partitioning_results, []] # introduces a 'non feature'. - logging.getLogger("PPanGGOLiN").info(f"Did {len(samples)} partitioning with chunks of size {chunk_size} among " - f"{len(organisms)} genomes in {round(time.time() - start_partitioning, 2)} seconds.") + logging.getLogger("PPanGGOLiN").info( + f"Did {len(samples)} partitioning with chunks of size {chunk_size} among " + f"{len(organisms)} genomes in {round(time.time() - start_partitioning, 2)} seconds." + ) else: - edges_weight, nb_fam = write_nem_input_files(tmp_path / f"{str(cpt)}", organisms, - sm_degree=sm_degree) - partitioning_results = run_partitioning(tmp_path / f"{str(cpt)}", len(organisms), - beta * (nb_fam / edges_weight), free_dispersion, kval=kval, seed=seed, - init=init, keep_files=keep_tmp_files) + edges_weight, nb_fam = write_nem_input_files( + tmp_path / f"{str(cpt)}", organisms, sm_degree=sm_degree + ) + partitioning_results = run_partitioning( + tmp_path / f"{str(cpt)}", + len(organisms), + beta * (nb_fam / edges_weight), + free_dispersion, + kval=kval, + seed=seed, + init=init, + keep_files=keep_tmp_files, + ) if partitioning_results == [{}, None, None]: - raise Exception("Statistical partitioning does not work on your data. " - "This usually happens because you used very few (<15) genomes.") + raise Exception( + "Statistical partitioning does not work on your data. " + "This usually happens because you used very few (<15) genomes." + ) cpt += 1 - logging.getLogger("PPanGGOLiN").info(f"Partitioned {len(organisms)} genomes in " - f"{round(time.time() - start_partitioning, 2)} seconds.") + logging.getLogger("PPanGGOLiN").info( + f"Partitioned {len(organisms)} genomes in " + f"{round(time.time() - start_partitioning, 2)} seconds." + ) # pangenome.savePartitionParameters(K, beta, free_dispersion, sm_degree, partitioning_results[1], chunk_size) @@ -608,9 +873,24 @@ def launch(args: argparse.Namespace): mk_outdir(args.output, args.force) global pan pan.add_file(args.pangenome) - partition(pan, args.output, args.beta, args.max_degree_smoothing, args.free_dispersion, args.chunk_size, - args.nb_of_partitions, args.krange, args.ICL_margin, args.draw_ICL, args.cpu, args.seed, args.tmpdir, - args.keep_tmp_files, args.force, disable_bar=args.disable_prog_bar) + partition( + pan, + args.output, + args.beta, + args.max_degree_smoothing, + args.free_dispersion, + args.chunk_size, + args.nb_of_partitions, + args.krange, + args.ICL_margin, + args.draw_ICL, + args.cpu, + args.seed, + args.tmpdir, + args.keep_tmp_files, + args.force, + disable_bar=args.disable_prog_bar, + ) logging.getLogger("PPanGGOLiN").debug("Write partition in pangenome") write_pangenome(pan, pan.file, args.force, disable_bar=args.disable_prog_bar) logging.getLogger("PPanGGOLiN").debug("Partitioning is finished") @@ -624,7 +904,9 @@ def subparser(sub_parser: argparse._SubParsersAction) -> argparse.ArgumentParser :return : parser arguments for align command """ - parser = sub_parser.add_parser("partition", formatter_class=argparse.RawTextHelpFormatter) + parser = sub_parser.add_parser( + "partition", formatter_class=argparse.RawTextHelpFormatter + ) parser_partition(parser) return parser @@ -635,57 +917,139 @@ def parser_partition(parser: argparse.ArgumentParser): :param parser: parser for align argument """ - required = parser.add_argument_group(title="Required arguments", - description="One of the following arguments is required :") - required.add_argument('-p', '--pangenome', required=False, type=Path, help="The pangenome.h5 file") + required = parser.add_argument_group( + title="Required arguments", + description="One of the following arguments is required :", + ) + required.add_argument( + "-p", "--pangenome", required=False, type=Path, help="The pangenome.h5 file" + ) optional = parser.add_argument_group(title="Optional arguments") - optional.add_argument("-b", "--beta", required=False, default=2.5, type=float, - help="beta is the strength of the smoothing using the graph topology during partitioning. " - "0 will deactivate spatial smoothing.") - optional.add_argument("-ms", "--max_degree_smoothing", required=False, default=10, type=float, - help="max. degree of the nodes to be included in the smoothing process.") - optional.add_argument('-o', '--output', required=False, type=Path, - default=Path( - f"ppanggolin_output{time.strftime('DATE%Y-%m-%d_HOUR%H.%M.%S', time.localtime())}" - f"_PID{str(os.getpid())}"), - help="Output directory") - optional.add_argument("-fd", "--free_dispersion", required=False, default=False, action="store_true", - help="use if the dispersion around the centroid vector of each partition during must be free." - " It will be the same for all genomes by default.") - optional.add_argument("-ck", "--chunk_size", required=False, default=500, type=int, - help="Size of the chunks when performing partitioning using chunks of genomes. " - "Chunk partitioning will be used automatically " - "if the number of genomes is above this number.") - optional.add_argument("-K", "--nb_of_partitions", required=False, default=-1, type=int, - help="Number of partitions to use. Must be at least 2. " - "If under 2, it will be detected automatically.") - optional.add_argument("-Kmm", "--krange", nargs=2, required=False, type=int, default=[3, 20], - help="Range of K values to test when detecting K automatically.") - optional.add_argument("-im", "--ICL_margin", required=False, type=float, default=0.05, - help="K is detected automatically by maximizing ICL. However at some point the ICL " - "reaches a plateau. Therefore we are looking for the minimal value of K without " - "significant gain from the larger values of K measured by ICL. For that we take the " - "lowest K that is found within a given 'margin' of the maximal ICL value. Basically, " - "change this option only if you truly understand it, otherwise just leave it be.") - optional.add_argument("--draw_ICL", required=False, default=False, action="store_true", - help="Use if you want to draw the ICL curve for all the tested K values. " - "Will not be done if K is given.") - optional.add_argument("--keep_tmp_files", required=False, default=False, action="store_true", - help="Use if you want to keep the temporary NEM files") - optional.add_argument("-se", "--seed", type=int, default=42, help="seed used to generate random numbers") - optional.add_argument("-c", "--cpu", required=False, default=1, type=int, help="Number of available cpus") - optional.add_argument("--tmpdir", required=False, type=str, default=Path(tempfile.gettempdir()), - help="directory for storing temporary files") - - -if __name__ == '__main__': + optional.add_argument( + "-b", + "--beta", + required=False, + default=2.5, + type=float, + help="beta is the strength of the smoothing using the graph topology during partitioning. " + "0 will deactivate spatial smoothing.", + ) + optional.add_argument( + "-ms", + "--max_degree_smoothing", + required=False, + default=10, + type=float, + help="max. degree of the nodes to be included in the smoothing process.", + ) + optional.add_argument( + "-o", + "--output", + required=False, + type=Path, + default=Path( + f"ppanggolin_output{time.strftime('DATE%Y-%m-%d_HOUR%H.%M.%S', time.localtime())}" + f"_PID{str(os.getpid())}" + ), + help="Output directory", + ) + optional.add_argument( + "-fd", + "--free_dispersion", + required=False, + default=False, + action="store_true", + help="use if the dispersion around the centroid vector of each partition during must be free." + " It will be the same for all genomes by default.", + ) + optional.add_argument( + "-ck", + "--chunk_size", + required=False, + default=500, + type=int, + help="Size of the chunks when performing partitioning using chunks of genomes. " + "Chunk partitioning will be used automatically " + "if the number of genomes is above this number.", + ) + optional.add_argument( + "-K", + "--nb_of_partitions", + required=False, + default=-1, + type=int, + help="Number of partitions to use. Must be at least 2. " + "If under 2, it will be detected automatically.", + ) + optional.add_argument( + "-Kmm", + "--krange", + nargs=2, + required=False, + type=int, + default=[3, 20], + help="Range of K values to test when detecting K automatically.", + ) + optional.add_argument( + "-im", + "--ICL_margin", + required=False, + type=float, + default=0.05, + help="K is detected automatically by maximizing ICL. However at some point the ICL " + "reaches a plateau. Therefore we are looking for the minimal value of K without " + "significant gain from the larger values of K measured by ICL. For that we take the " + "lowest K that is found within a given 'margin' of the maximal ICL value. Basically, " + "change this option only if you truly understand it, otherwise just leave it be.", + ) + optional.add_argument( + "--draw_ICL", + required=False, + default=False, + action="store_true", + help="Use if you want to draw the ICL curve for all the tested K values. " + "Will not be done if K is given.", + ) + optional.add_argument( + "--keep_tmp_files", + required=False, + default=False, + action="store_true", + help="Use if you want to keep the temporary NEM files", + ) + optional.add_argument( + "-se", + "--seed", + type=int, + default=42, + help="seed used to generate random numbers", + ) + optional.add_argument( + "-c", + "--cpu", + required=False, + default=1, + type=int, + help="Number of available cpus", + ) + optional.add_argument( + "--tmpdir", + required=False, + type=str, + default=Path(tempfile.gettempdir()), + help="directory for storing temporary files", + ) + + +if __name__ == "__main__": """To test local change and allow using debugger""" from ppanggolin.utils import set_verbosity_level, add_common_arguments main_parser = argparse.ArgumentParser( description="Depicting microbial species diversity via a Partitioned PanGenome Graph Of Linked Neighbors", - formatter_class=argparse.RawTextHelpFormatter) + formatter_class=argparse.RawTextHelpFormatter, + ) parser_partition(main_parser) add_common_arguments(main_parser) diff --git a/ppanggolin/nem/rarefaction.py b/ppanggolin/nem/rarefaction.py index 04e2f638..d22c02df 100644 --- a/ppanggolin/nem/rarefaction.py +++ b/ppanggolin/nem/rarefaction.py @@ -33,9 +33,17 @@ samples = [] -def raref_nem(index: int, tmpdir: Path, beta: float = 2.5, sm_degree: int = 10, - free_dispersion: bool = False, chunk_size: int = 500, kval: int = -1, - krange: list = None, seed: int = 42) -> Tuple[Dict[str, int], int]: +def raref_nem( + index: int, + tmpdir: Path, + beta: float = 2.5, + sm_degree: int = 10, + free_dispersion: bool = False, + chunk_size: int = 500, + kval: int = -1, + krange: list = None, + seed: int = 42, +) -> Tuple[Dict[str, int], int]: """ :param index: Index of the sample group organisms @@ -56,22 +64,42 @@ def raref_nem(index: int, tmpdir: Path, beta: float = 2.5, sm_degree: int = 10, kmm = [3, 20] if krange is None else krange if kval < 3: - kval = ppp.evaluate_nb_partitions(organisms=samp, sm_degree=sm_degree, free_dispersion=free_dispersion, - chunk_size=chunk_size, krange=kmm, seed=seed, - tmpdir=tmpdir / f"{str(index)}_eval") + kval = ppp.evaluate_nb_partitions( + organisms=samp, + sm_degree=sm_degree, + free_dispersion=free_dispersion, + chunk_size=chunk_size, + krange=kmm, + seed=seed, + tmpdir=tmpdir / f"{str(index)}_eval", + ) if len(samp) <= chunk_size: # all good, just write stuff. - edges_weight, nb_fam = ppp.write_nem_input_files(tmpdir=currtmpdir, organisms=set(samp), - sm_degree=sm_degree) - cpt_partition = ppp.run_partitioning(currtmpdir, len(samp), beta * (nb_fam / edges_weight), free_dispersion, - kval=kval, seed=seed, init="param_file")[0] + edges_weight, nb_fam = ppp.write_nem_input_files( + tmpdir=currtmpdir, organisms=set(samp), sm_degree=sm_degree + ) + cpt_partition = ppp.run_partitioning( + currtmpdir, + len(samp), + beta * (nb_fam / edges_weight), + free_dispersion, + kval=kval, + seed=seed, + init="param_file", + )[0] else: # going to need multiple partitioning for this sample... families = set() cpt_partition = {} validated = set() cpt = 0 - def validate_family(result: Union[Tuple[dict, None, None], Tuple[int, float, float], Tuple[dict, dict, float]]): + def validate_family( + result: Union[ + Tuple[dict, None, None], + Tuple[int, float, float], + Tuple[dict, dict, float], + ] + ): """ Validate partition assignation to families @@ -80,15 +108,19 @@ def validate_family(result: Union[Tuple[dict, None, None], Tuple[int, float, flo for node, nem_class in result[0].items(): cpt_partition[node][nem_class[0]] += 1 sum_partitioning = sum(cpt_partition[node].values()) - if (sum_partitioning > len(samp) / chunk_size and max( - cpt_partition[node].values()) >= sum_partitioning * 0.5) or (sum_partitioning > len(samp)): + if ( + sum_partitioning > len(samp) / chunk_size + and max(cpt_partition[node].values()) >= sum_partitioning * 0.5 + ) or (sum_partitioning > len(samp)): if node not in validated: if max(cpt_partition[node].values()) < sum_partitioning * 0.5: cpt_partition[node]["U"] = len(samp) validated.add(node) for fam in ppp.pan.gene_families: - if not samp.isdisjoint(set(fam.organisms)): # otherwise, useless to keep track of + if not samp.isdisjoint( + set(fam.organisms) + ): # otherwise, useless to keep track of families.add(fam) cpt_partition[fam.name] = {"P": 0, "S": 0, "C": 0, "U": 0} @@ -113,14 +145,29 @@ def validate_family(result: Union[Tuple[dict, None, None], Tuple[int, float, flo for samp in org_samples: if not currtmpdir.exists(): mk_outdir(currtmpdir) - edges_weight, nb_fam = ppp.write_nem_input_files(currtmpdir / f"{str(cpt)}", samp, - sm_degree=sm_degree) - validate_family(ppp.run_partitioning(currtmpdir / f"{str(cpt)}", len(samp), - beta * (nb_fam / edges_weight), free_dispersion, kval=kval, - seed=seed, init="param_file")) + edges_weight, nb_fam = ppp.write_nem_input_files( + currtmpdir / f"{str(cpt)}", samp, sm_degree=sm_degree + ) + validate_family( + ppp.run_partitioning( + currtmpdir / f"{str(cpt)}", + len(samp), + beta * (nb_fam / edges_weight), + free_dispersion, + kval=kval, + seed=seed, + init="param_file", + ) + ) cpt += 1 if len(cpt_partition) == 0: - counts = {"persistent": "NA", "shell": "NA", "cloud": "NA", "undefined": "NA", "K": kval} + counts = { + "persistent": "NA", + "shell": "NA", + "cloud": "NA", + "undefined": "NA", + "K": kval, + } else: counts = {"persistent": 0, "shell": 0, "cloud": 0, "undefined": 0, "K": kval} @@ -140,7 +187,9 @@ def validate_family(result: Union[Tuple[dict, None, None], Tuple[int, float, flo return counts, index -def launch_raref_nem(args: Tuple[int, Path, float, int, bool, int, int, list, int]) -> Tuple[Tuple[Dict[str, int], int]]: +def launch_raref_nem( + args: Tuple[int, Path, float, int, bool, int, int, list, int] +) -> Tuple[Tuple[Dict[str, int], int]]: """ Launch raref_nem in multiprocessing @@ -160,132 +209,275 @@ def draw_curve(output: Path, data: list, max_sampling: int = 10): :param data: """ logging.getLogger("PPanGGOLiN").info("Drawing the rarefaction curve ...") - raref_name = output/"rarefaction.csv" + raref_name = output / "rarefaction.csv" raref = open(raref_name, "w") - raref.write(",".join(["genomes_count", "persistent", "shell", "cloud", "undefined", "exact_core", "exact_accessory", - "soft_core", "soft_accessory", "pangenome", "K"]) + "\n") + raref.write( + ",".join( + [ + "genomes_count", + "persistent", + "shell", + "cloud", + "undefined", + "exact_core", + "exact_accessory", + "soft_core", + "soft_accessory", + "pangenome", + "K", + ] + ) + + "\n" + ) for part in data: - raref.write(",".join(map(str, [part["nborgs"], part["persistent"], part["shell"], part["cloud"], - part["undefined"], part["exact_core"], part["exact_accessory"], - part["soft_core"], part["soft_accessory"], part["exact_core"] + - part["exact_accessory"], part["K"]])) + "\n") + raref.write( + ",".join( + map( + str, + [ + part["nborgs"], + part["persistent"], + part["shell"], + part["cloud"], + part["undefined"], + part["exact_core"], + part["exact_accessory"], + part["soft_core"], + part["soft_accessory"], + part["exact_core"] + part["exact_accessory"], + part["K"], + ], + ) + ) + + "\n" + ) raref.close() def heap_law(n, p_kappa, p_gamma) -> float: - return p_kappa * n ** p_gamma + return p_kappa * n**p_gamma def poly_area(p_x: list, p_y: list) -> float: - return 0.5 * numpy.abs(numpy.dot(p_x, numpy.roll(p_y, 1)) - numpy.dot(p_y, numpy.roll(p_x, 1))) + return 0.5 * numpy.abs( + numpy.dot(p_x, numpy.roll(p_y, 1)) - numpy.dot(p_y, numpy.roll(p_x, 1)) + ) annotations = [] traces = [] data_raref = read_csv(raref_name, index_col=False) - params_file = open(output/"rarefaction_parameters.csv", "w") - params_file.write("partition,kappa,gamma,kappa_std_error,gamma_std_error,IQR_area\n") - for partition in ["persistent", "shell", "cloud", "undefined", "exact_core", "exact_accessory", "soft_core", - "soft_accessory", "pangenome"]: - percentiles_75 = Series({i: numpy.nanpercentile(data_raref[data_raref["genomes_count"] == i][partition], 75) for i in - range(1, max_sampling + 1)}).dropna() - percentiles_25 = Series({i: numpy.nanpercentile(data_raref[data_raref["genomes_count"] == i][partition], 25) for i in - range(1, max_sampling + 1)}).dropna() - mins = Series({i: numpy.min(data_raref[data_raref["genomes_count"] == i][partition]) for i in - range(1, max_sampling + 1)}).dropna() - maxs = Series({i: numpy.max(data_raref[data_raref["genomes_count"] == i][partition]) for i in - range(1, max_sampling + 1)}).dropna() - medians = Series({i: numpy.median(data_raref[data_raref["genomes_count"] == i][partition]) for i in - range(1, max_sampling + 1)}).dropna() - means = Series({i: numpy.mean(data_raref[data_raref["genomes_count"] == i][partition]) for i in - range(1, max_sampling + 1)}).dropna() + params_file = open(output / "rarefaction_parameters.csv", "w") + params_file.write( + "partition,kappa,gamma,kappa_std_error,gamma_std_error,IQR_area\n" + ) + for partition in [ + "persistent", + "shell", + "cloud", + "undefined", + "exact_core", + "exact_accessory", + "soft_core", + "soft_accessory", + "pangenome", + ]: + percentiles_75 = Series( + { + i: numpy.nanpercentile( + data_raref[data_raref["genomes_count"] == i][partition], 75 + ) + for i in range(1, max_sampling + 1) + } + ).dropna() + percentiles_25 = Series( + { + i: numpy.nanpercentile( + data_raref[data_raref["genomes_count"] == i][partition], 25 + ) + for i in range(1, max_sampling + 1) + } + ).dropna() + mins = Series( + { + i: numpy.min(data_raref[data_raref["genomes_count"] == i][partition]) + for i in range(1, max_sampling + 1) + } + ).dropna() + maxs = Series( + { + i: numpy.max(data_raref[data_raref["genomes_count"] == i][partition]) + for i in range(1, max_sampling + 1) + } + ).dropna() + medians = Series( + { + i: numpy.median(data_raref[data_raref["genomes_count"] == i][partition]) + for i in range(1, max_sampling + 1) + } + ).dropna() + means = Series( + { + i: numpy.mean(data_raref[data_raref["genomes_count"] == i][partition]) + for i in range(1, max_sampling + 1) + } + ).dropna() initial_kappa_gamma = numpy.array([0.0, 0.0]) x = percentiles_25.index.tolist() x += list(reversed(percentiles_25.index.tolist())) area_iqr = poly_area(x, percentiles_25.tolist() + percentiles_75.tolist()) nb_org_min_fitting = 15 - colors = {"pangenome": "black", "exact_accessory": "#EB37ED", "exact_core": "#FF2828", "soft_core": "#c7c938", - "soft_accessory": "#996633", "shell": "#00D860", "persistent": "#F7A507", "cloud": "#79DEFF", - "undefined": "#828282"} + colors = { + "pangenome": "black", + "exact_accessory": "#EB37ED", + "exact_core": "#FF2828", + "soft_core": "#c7c938", + "soft_accessory": "#996633", + "shell": "#00D860", + "persistent": "#F7A507", + "cloud": "#79DEFF", + "undefined": "#828282", + } try: - all_values = data_raref[data_raref["genomes_count"] > nb_org_min_fitting][partition].dropna() - res = optimization.curve_fit(heap_law, data_raref.loc[all_values.index]["genomes_count"], all_values, - initial_kappa_gamma) + all_values = data_raref[data_raref["genomes_count"] > nb_org_min_fitting][ + partition + ].dropna() + res = optimization.curve_fit( + heap_law, + data_raref.loc[all_values.index]["genomes_count"], + all_values, + initial_kappa_gamma, + ) kappa, gamma = res[0] - error_k, error_g = numpy.sqrt(numpy.diag(res[1])) # to calculate the fitting error. + error_k, error_g = numpy.sqrt( + numpy.diag(res[1]) + ) # to calculate the fitting error. # The variance of parameters are the diagonal elements of the variance-co variance matrix, # and the standard error is the square root of it. source : # https://stackoverflow.com/questions/25234996/getting-standard-error-associated-with-parameter-estimates-from-scipy-optimize-c if numpy.isinf(error_k) and numpy.isinf(error_g): - params_file.write(",".join([partition, "NA", "NA", "NA", "NA", str(area_iqr)]) + "\n") + params_file.write( + ",".join([partition, "NA", "NA", "NA", "NA", str(area_iqr)]) + "\n" + ) else: params_file.write( - ",".join([partition, str(kappa), str(gamma), str(error_k), str(error_g), str(area_iqr)]) + "\n") - regression = numpy.apply_along_axis(heap_law, 0, range(nb_org_min_fitting + 1, max_sampling + 1), kappa, - gamma) - regression_sd_top = numpy.apply_along_axis(heap_law, 0, range(nb_org_min_fitting + 1, max_sampling + 1), - kappa - error_k, gamma + error_g) - regression_sd_bottom = numpy.apply_along_axis(heap_law, 0, - range(nb_org_min_fitting + 1, max_sampling + 1), - kappa + error_k, gamma - error_g) - traces.append(go.Scatter(x=list(range(nb_org_min_fitting + 1, max_sampling + 1)), - y=regression, - name=partition + ": Heaps' law", - line=dict(color=colors[partition], - width=4, - dash='dash'), - visible="legendonly" if partition == "undefined" else True)) - traces.append(go.Scatter(x=list(range(nb_org_min_fitting + 1, max_sampling + 1)), - y=regression_sd_top, - name=partition + ": Heaps' law error +", - line=dict(color=colors[partition], - width=1, - dash='dash'), - visible="legendonly" if partition == "undefined" else True)) - traces.append(go.Scatter(x=list(range(nb_org_min_fitting + 1, max_sampling + 1)), - y=regression_sd_bottom, - name=partition + ": Heaps' law error -", - line=dict(color=colors[partition], - width=1, - dash='dash'), - visible="legendonly" if partition == "undefined" else True)) - annotations.append(dict(x=max_sampling, - y=heap_law(max_sampling, kappa, gamma), - ay=0, - ax=50, - text="F=" + str(round(kappa, 0)) + "N" + "" + str( - round(gamma, 5)) + "
IQRarea=" + str(round(area_iqr, 2)), - showarrow=True, - arrowhead=7, - font=dict(size=10, color='white'), - align='center', - arrowcolor=colors[partition], - bordercolor='#c7c7c7', - borderwidth=2, - borderpad=4, - bgcolor=colors[partition], - opacity=0.8)) + ",".join( + [ + partition, + str(kappa), + str(gamma), + str(error_k), + str(error_g), + str(area_iqr), + ] + ) + + "\n" + ) + regression = numpy.apply_along_axis( + heap_law, + 0, + range(nb_org_min_fitting + 1, max_sampling + 1), + kappa, + gamma, + ) + regression_sd_top = numpy.apply_along_axis( + heap_law, + 0, + range(nb_org_min_fitting + 1, max_sampling + 1), + kappa - error_k, + gamma + error_g, + ) + regression_sd_bottom = numpy.apply_along_axis( + heap_law, + 0, + range(nb_org_min_fitting + 1, max_sampling + 1), + kappa + error_k, + gamma - error_g, + ) + traces.append( + go.Scatter( + x=list(range(nb_org_min_fitting + 1, max_sampling + 1)), + y=regression, + name=partition + ": Heaps' law", + line=dict(color=colors[partition], width=4, dash="dash"), + visible="legendonly" if partition == "undefined" else True, + ) + ) + traces.append( + go.Scatter( + x=list(range(nb_org_min_fitting + 1, max_sampling + 1)), + y=regression_sd_top, + name=partition + ": Heaps' law error +", + line=dict(color=colors[partition], width=1, dash="dash"), + visible="legendonly" if partition == "undefined" else True, + ) + ) + traces.append( + go.Scatter( + x=list(range(nb_org_min_fitting + 1, max_sampling + 1)), + y=regression_sd_bottom, + name=partition + ": Heaps' law error -", + line=dict(color=colors[partition], width=1, dash="dash"), + visible="legendonly" if partition == "undefined" else True, + ) + ) + annotations.append( + dict( + x=max_sampling, + y=heap_law(max_sampling, kappa, gamma), + ay=0, + ax=50, + text="F=" + + str(round(kappa, 0)) + + "N" + + "" + + str(round(gamma, 5)) + + "
IQRarea=" + + str(round(area_iqr, 2)), + showarrow=True, + arrowhead=7, + font=dict(size=10, color="white"), + align="center", + arrowcolor=colors[partition], + bordercolor="#c7c7c7", + borderwidth=2, + borderpad=4, + bgcolor=colors[partition], + opacity=0.8, + ) + ) except (TypeError, RuntimeError, ValueError): # if fitting doesn't work - params_file.write(",".join([partition, "NA", "NA", "NA", "NA", str(area_iqr)]) + "\n") - - traces.append(go.Scatter(x=medians.index, - y=medians, - name=partition + " : medians", - mode="lines+markers", - error_y=dict(type='data', - symmetric=False, - array=maxs.subtract(medians), - arrayminus=medians.subtract(mins), - visible=True, - color=colors[partition], - thickness=0.5), - line=dict(color=colors[partition], - width=1), - marker=dict(color=colors[partition], symbol=3, size=8, opacity=0.5), - visible="legendonly" if partition == "undefined" else True)) - traces.append(go.Scatter(x=means.index, - y=means, - name=partition + " : means", - mode="markers", - marker=dict(color=colors[partition], symbol=4, size=8, opacity=0.5), - visible="legendonly" if partition == "undefined" else True)) + params_file.write( + ",".join([partition, "NA", "NA", "NA", "NA", str(area_iqr)]) + "\n" + ) + + traces.append( + go.Scatter( + x=medians.index, + y=medians, + name=partition + " : medians", + mode="lines+markers", + error_y=dict( + type="data", + symmetric=False, + array=maxs.subtract(medians), + arrayminus=medians.subtract(mins), + visible=True, + color=colors[partition], + thickness=0.5, + ), + line=dict(color=colors[partition], width=1), + marker=dict(color=colors[partition], symbol=3, size=8, opacity=0.5), + visible="legendonly" if partition == "undefined" else True, + ) + ) + traces.append( + go.Scatter( + x=means.index, + y=means, + name=partition + " : means", + mode="markers", + marker=dict(color=colors[partition], symbol=4, size=8, opacity=0.5), + visible="legendonly" if partition == "undefined" else True, + ) + ) # up = percentiles_75 # down = percentiles_25 # IQR_area = up.append(down[::-1]) @@ -299,41 +491,67 @@ def poly_area(p_x: list, p_y: list) -> float: # line=dict(color=COLORS[partition]), # marker=dict(color = COLORS[partition]), # visible = "legendonly" if partition == "undefined" else True)) - traces.append(go.Scatter(x=percentiles_75.index, - y=percentiles_75, - name=partition + " : 3rd quartile", - mode="lines", - hoveron="points", - # hovertext=[str(round(e)) for e in half_stds.multiply(2)], - line=dict(color=colors[partition]), - marker=dict(color=colors[partition]), - visible="legendonly" if partition == "undefined" else True)) - traces.append(go.Scatter(x=percentiles_25.index, - y=percentiles_25, - name=partition + " : 1st quartile", - fill='tonexty', - mode="lines", - hoveron="points", - # hovertext=[str(round(e)) for e in half_stds.multiply(2)], - line=dict(color=colors[partition]), - marker=dict(color=colors[partition]), - visible="legendonly" if partition == "undefined" else True)) - layout = go.Layout(title="Rarefaction curve ", - titlefont=dict(size=20), - xaxis=dict(title='size of genome subsets (N)'), - yaxis=dict(title='# of gene families (F)'), - annotations=annotations, - plot_bgcolor='#ffffff') + traces.append( + go.Scatter( + x=percentiles_75.index, + y=percentiles_75, + name=partition + " : 3rd quartile", + mode="lines", + hoveron="points", + # hovertext=[str(round(e)) for e in half_stds.multiply(2)], + line=dict(color=colors[partition]), + marker=dict(color=colors[partition]), + visible="legendonly" if partition == "undefined" else True, + ) + ) + traces.append( + go.Scatter( + x=percentiles_25.index, + y=percentiles_25, + name=partition + " : 1st quartile", + fill="tonexty", + mode="lines", + hoveron="points", + # hovertext=[str(round(e)) for e in half_stds.multiply(2)], + line=dict(color=colors[partition]), + marker=dict(color=colors[partition]), + visible="legendonly" if partition == "undefined" else True, + ) + ) + layout = go.Layout( + title="Rarefaction curve ", + titlefont=dict(size=20), + xaxis=dict(title="size of genome subsets (N)"), + yaxis=dict(title="# of gene families (F)"), + annotations=annotations, + plot_bgcolor="#ffffff", + ) fig = go.Figure(data=traces, layout=layout) - out_plotly.plot(fig, filename=output.as_posix() + "/rarefaction_curve.html", auto_open=False) + out_plotly.plot( + fig, filename=output.as_posix() + "/rarefaction_curve.html", auto_open=False + ) params_file.close() -def make_rarefaction_curve(pangenome: Pangenome, output: Path, tmpdir: Path = None, beta: float = 2.5, depth: int = 30, - min_sampling: int = 1, max_sampling: int = 100, sm_degree: int = 10, - free_dispersion: bool = False, chunk_size: int = 500, kval: int = -1, krange: list = None, - cpu: int = 1, seed: int = 42, kestimate: bool = False, soft_core: float = 0.95, - disable_bar: bool = False): +def make_rarefaction_curve( + pangenome: Pangenome, + output: Path, + tmpdir: Path = None, + beta: float = 2.5, + depth: int = 30, + min_sampling: int = 1, + max_sampling: int = 100, + sm_degree: int = 10, + free_dispersion: bool = False, + chunk_size: int = 500, + kval: int = -1, + krange: list = None, + cpu: int = 1, + seed: int = 42, + kestimate: bool = False, + soft_core: float = 0.95, + disable_bar: bool = False, +): """ Main function to make the rarefaction curve @@ -361,11 +579,25 @@ def make_rarefaction_curve(pangenome: Pangenome, output: Path, tmpdir: Path = No ppp.pan = pangenome # use the global from partition to store the pangenome, so that it is usable try: - krange[0] = ppp.pan.parameters["partition"]["# final nb of partitions"] if krange[0] < 0 else krange[0] - krange[1] = ppp.pan.parameters["partition"]["# final nb of partitions"] if krange[1] < 0 else krange[1] + krange[0] = ( + ppp.pan.parameters["partition"]["# final nb of partitions"] + if krange[0] < 0 + else krange[0] + ) + krange[1] = ( + ppp.pan.parameters["partition"]["# final nb of partitions"] + if krange[1] < 0 + else krange[1] + ) except KeyError: krange = [3, 20] - check_pangenome_info(pangenome, need_annotations=True, need_families=True, need_graph=True, disable_bar=disable_bar) + check_pangenome_info( + pangenome, + need_annotations=True, + need_families=True, + need_graph=True, + disable_bar=disable_bar, + ) tmpdir_obj = tempfile.TemporaryDirectory(dir=tmpdir) tmp_path = Path(tmpdir_obj.name) @@ -378,27 +610,48 @@ def make_rarefaction_curve(pangenome: Pangenome, output: Path, tmpdir: Path = No if kval < 3 and kestimate is False: # estimate K once and for all. try: kval = ppp.pan.parameters["partition"]["# final nb of partitions"] - logging.getLogger("PPanGGOLiN").info(f"Reuse the number of partitions {kval}") + logging.getLogger("PPanGGOLiN").info( + f"Reuse the number of partitions {kval}" + ) except KeyError: - logging.getLogger("PPanGGOLiN").info("Estimating the number of partitions...") - kval = ppp.evaluate_nb_partitions(organisms=set(pangenome.organisms), sm_degree=sm_degree, - free_dispersion=free_dispersion, chunk_size=chunk_size, krange=krange, - cpu=cpu, seed=seed, tmpdir=tmp_path) - logging.getLogger("PPanGGOLiN").info(f"The number of partitions has been evaluated at {kval}") + logging.getLogger("PPanGGOLiN").info( + "Estimating the number of partitions..." + ) + kval = ppp.evaluate_nb_partitions( + organisms=set(pangenome.organisms), + sm_degree=sm_degree, + free_dispersion=free_dispersion, + chunk_size=chunk_size, + krange=krange, + cpu=cpu, + seed=seed, + tmpdir=tmp_path, + ) + logging.getLogger("PPanGGOLiN").info( + f"The number of partitions has been evaluated at {kval}" + ) logging.getLogger("PPanGGOLiN").info("Extracting samples ...") all_samples = [] for i in range(min_sampling, max_sampling): # each point for _ in range(depth): # number of samples per points all_samples.append(set(random.sample(list(pangenome.organisms), i + 1))) - logging.getLogger("PPanGGOLiN").info(f"Done sampling genomes in the pan, there are {len(all_samples)} samples") + logging.getLogger("PPanGGOLiN").info( + f"Done sampling genomes in the pan, there are {len(all_samples)} samples" + ) samp_nb_per_part = [] logging.getLogger("PPanGGOLiN").info("Computing bitarrays for each family...") index_org = pangenome.compute_family_bitarrays() - logging.getLogger("PPanGGOLiN").info("Done computing bitarrays. Comparing them to get exact and soft core stats " - f"for {len(all_samples)} samples...") - bar = tqdm(range(len(all_samples) * pangenome.number_of_gene_families), unit="gene family", disable=disable_bar) + logging.getLogger("PPanGGOLiN").info( + "Done computing bitarrays. Comparing them to get exact and soft core stats " + f"for {len(all_samples)} samples..." + ) + bar = tqdm( + range(len(all_samples) * pangenome.number_of_gene_families), + unit="gene family", + disable=disable_bar, + ) for samp in all_samples: # make the sample's organism bitarray. samp_bitarray = gmpy2.xmpz() # pylint: disable=no-member @@ -411,7 +664,9 @@ def make_rarefaction_curve(pangenome: Pangenome, output: Path, tmpdir: Path = No part["exact_accessory"] = 0 part["soft_accessory"] = 0 for fam in pangenome.gene_families: - nb_common_org = gmpy2.popcount(fam.bitarray & samp_bitarray) # pylint: disable=no-member + nb_common_org = gmpy2.popcount( + fam.bitarray & samp_bitarray + ) # pylint: disable=no-member part["nborgs"] = len(samp) if nb_common_org != 0: # in that case the node 'does not exist' if nb_common_org == len(samp): @@ -433,13 +688,27 @@ def make_rarefaction_curve(pangenome: Pangenome, output: Path, tmpdir: Path = No args = [] for index, samp in enumerate(samples): - args.append((index, tmp_path, beta, sm_degree, free_dispersion, chunk_size, kval, krange, seed)) - - with get_context('fork').Pool(processes=cpu) as p: + args.append( + ( + index, + tmp_path, + beta, + sm_degree, + free_dispersion, + chunk_size, + kval, + krange, + seed, + ) + ) + + with get_context("fork").Pool(processes=cpu) as p: # launch partitioning logging.getLogger("PPanGGOLiN").info(" Partitioning all samples...") bar = tqdm(range(len(args)), unit="samples partitioned", disable=disable_bar) - random.shuffle(args) # shuffling the processing so that the progress bar is closer to reality. + random.shuffle( + args + ) # shuffling the processing so that the progress bar is closer to reality. for result in p.imap_unordered(launch_raref_nem, args): samp_nb_per_part[result[1]] = {**result[0], **samp_nb_per_part[result[1]]} bar.update() @@ -462,12 +731,25 @@ def launch(args: argparse.Namespace): mk_outdir(args.output, args.force) pangenome = Pangenome() pangenome.add_file(args.pangenome) - make_rarefaction_curve(pangenome=pangenome, output=args.output, tmpdir=args.tmpdir, beta=args.beta, - depth=args.depth, min_sampling=args.min, max_sampling=args.max, - sm_degree=args.max_degree_smoothing, free_dispersion=args.free_dispersion, - chunk_size=args.chunk_size, kval=args.nb_of_partitions, krange=args.krange, cpu=args.cpu, - seed=args.seed, kestimate=args.reestimate_K, soft_core=args.soft_core, - disable_bar=args.disable_prog_bar) + make_rarefaction_curve( + pangenome=pangenome, + output=args.output, + tmpdir=args.tmpdir, + beta=args.beta, + depth=args.depth, + min_sampling=args.min, + max_sampling=args.max, + sm_degree=args.max_degree_smoothing, + free_dispersion=args.free_dispersion, + chunk_size=args.chunk_size, + kval=args.nb_of_partitions, + krange=args.krange, + cpu=args.cpu, + seed=args.seed, + kestimate=args.reestimate_K, + soft_core=args.soft_core, + disable_bar=args.disable_prog_bar, + ) def subparser(sub_parser: argparse._SubParsersAction) -> argparse.ArgumentParser: @@ -478,8 +760,11 @@ def subparser(sub_parser: argparse._SubParsersAction) -> argparse.ArgumentParser :return : parser arguments for align command """ - parser = sub_parser.add_parser("rarefaction", description='Compute the rarefaction curve of the pangenome', - formatter_class=argparse.RawTextHelpFormatter) + parser = sub_parser.add_parser( + "rarefaction", + description="Compute the rarefaction curve of the pangenome", + formatter_class=argparse.RawTextHelpFormatter, + ) parser_rarefaction(parser) return parser @@ -490,59 +775,151 @@ def parser_rarefaction(parser: argparse.ArgumentParser): :param parser: parser for align argument """ - required = parser.add_argument_group(title="Required arguments", - description="One of the following arguments is required :") - required.add_argument('-p', '--pangenome', required=False, type=Path, help="The pangenome .h5 file") + required = parser.add_argument_group( + title="Required arguments", + description="One of the following arguments is required :", + ) + required.add_argument( + "-p", "--pangenome", required=False, type=Path, help="The pangenome .h5 file" + ) optional = parser.add_argument_group(title="Optional arguments") - optional.add_argument("-b", "--beta", required=False, default=2.5, type=float, - help="beta is the strength of the smoothing using the graph topology during partitioning. " - "0 will deactivate spatial smoothing.") - optional.add_argument("--depth", required=False, default=30, type=int, - help="Number of samplings at each sampling point") - optional.add_argument("--min", required=False, default=1, type=int, help="Minimum number of organisms in a sample") - optional.add_argument("--max", required=False, type=float, default=100, - help="Maximum number of organisms in a sample (if above the number of provided organisms, " - "the provided organisms will be the maximum)") - - optional.add_argument("-ms", "--max_degree_smoothing", required=False, default=10, type=float, - help="max. degree of the nodes to be included in the smoothing process.") - optional.add_argument('-o', '--output', required=False, type=Path, - default=Path( - f"ppanggolin_output{time.strftime('DATE%Y-%m-%d_HOUR%H.%M.%S', time.localtime())}" - f"_PID{str(os.getpid())}"), - help="Output directory") - optional.add_argument("-fd", "--free_dispersion", required=False, default=False, action="store_true", - help="use if the dispersion around the centroid vector of each partition during must be free." - " It will be the same for all organisms by default.") - optional.add_argument("-ck", "--chunk_size", required=False, default=500, type=int, - help="Size of the chunks when performing partitioning using chunks of organisms. " - "Chunk partitioning will be used automatically " - "if the number of genomes is above this number.") - optional.add_argument("-K", "--nb_of_partitions", required=False, default=-1, type=int, - help="Number of partitions to use. Must be at least 2. " - "By default reuse K if it exists else compute it.") - optional.add_argument("--reestimate_K", required=False, action="store_true", - help=" Will recompute the number of partitions for each sample " - "(between the values provided by --krange) (VERY intensive. Can take a long time.)") - optional.add_argument("-Kmm", "--krange", nargs=2, required=False, type=int, default=[3, -1], - help="Range of K values to test when detecting K automatically. " - "Default between 3 and the K previously computed " - "if there is one, or 20 if there are none.") - optional.add_argument("--soft_core", required=False, type=float, default=0.95, help="Soft core threshold") - optional.add_argument("-se", "--seed", type=int, default=42, help="seed used to generate random numbers") - optional.add_argument("-c", "--cpu", required=False, default=1, type=int, help="Number of available cpus") - optional.add_argument("--tmpdir", required=False, type=str, default=Path(tempfile.gettempdir()), - help="directory for storing temporary files") - - -if __name__ == '__main__': + optional.add_argument( + "-b", + "--beta", + required=False, + default=2.5, + type=float, + help="beta is the strength of the smoothing using the graph topology during partitioning. " + "0 will deactivate spatial smoothing.", + ) + optional.add_argument( + "--depth", + required=False, + default=30, + type=int, + help="Number of samplings at each sampling point", + ) + optional.add_argument( + "--min", + required=False, + default=1, + type=int, + help="Minimum number of organisms in a sample", + ) + optional.add_argument( + "--max", + required=False, + type=float, + default=100, + help="Maximum number of organisms in a sample (if above the number of provided organisms, " + "the provided organisms will be the maximum)", + ) + + optional.add_argument( + "-ms", + "--max_degree_smoothing", + required=False, + default=10, + type=float, + help="max. degree of the nodes to be included in the smoothing process.", + ) + optional.add_argument( + "-o", + "--output", + required=False, + type=Path, + default=Path( + f"ppanggolin_output{time.strftime('DATE%Y-%m-%d_HOUR%H.%M.%S', time.localtime())}" + f"_PID{str(os.getpid())}" + ), + help="Output directory", + ) + optional.add_argument( + "-fd", + "--free_dispersion", + required=False, + default=False, + action="store_true", + help="use if the dispersion around the centroid vector of each partition during must be free." + " It will be the same for all organisms by default.", + ) + optional.add_argument( + "-ck", + "--chunk_size", + required=False, + default=500, + type=int, + help="Size of the chunks when performing partitioning using chunks of organisms. " + "Chunk partitioning will be used automatically " + "if the number of genomes is above this number.", + ) + optional.add_argument( + "-K", + "--nb_of_partitions", + required=False, + default=-1, + type=int, + help="Number of partitions to use. Must be at least 2. " + "By default reuse K if it exists else compute it.", + ) + optional.add_argument( + "--reestimate_K", + required=False, + action="store_true", + help=" Will recompute the number of partitions for each sample " + "(between the values provided by --krange) (VERY intensive. Can take a long time.)", + ) + optional.add_argument( + "-Kmm", + "--krange", + nargs=2, + required=False, + type=int, + default=[3, -1], + help="Range of K values to test when detecting K automatically. " + "Default between 3 and the K previously computed " + "if there is one, or 20 if there are none.", + ) + optional.add_argument( + "--soft_core", + required=False, + type=float, + default=0.95, + help="Soft core threshold", + ) + optional.add_argument( + "-se", + "--seed", + type=int, + default=42, + help="seed used to generate random numbers", + ) + optional.add_argument( + "-c", + "--cpu", + required=False, + default=1, + type=int, + help="Number of available cpus", + ) + optional.add_argument( + "--tmpdir", + required=False, + type=str, + default=Path(tempfile.gettempdir()), + help="directory for storing temporary files", + ) + + +if __name__ == "__main__": """To test local change and allow using debugger""" from ppanggolin.utils import set_verbosity_level, add_common_arguments main_parser = argparse.ArgumentParser( description="Depicting microbial species diversity via a Partitioned PanGenome Graph Of Linked Neighbors", - formatter_class=argparse.RawTextHelpFormatter) + formatter_class=argparse.RawTextHelpFormatter, + ) parser_rarefaction(main_parser) add_common_arguments(main_parser) diff --git a/ppanggolin/pangenome.py b/ppanggolin/pangenome.py index a9b5d1de..c33ac94a 100644 --- a/ppanggolin/pangenome.py +++ b/ppanggolin/pangenome.py @@ -25,8 +25,7 @@ class Pangenome: """ def __init__(self): - """Constructor method. - """ + """Constructor method.""" self.file = None # basic parameters @@ -40,34 +39,38 @@ def __init__(self): self._spot_getter = {} self._module_getter = {} self.status = { - 'genomesAnnotated': "No", - 'geneSequences': "No", - 'genesClustered': "No", - 'defragmented': "No", - 'geneFamilySequences': "No", - 'neighborsGraph': "No", - 'partitioned': "No", - 'predictedRGP': "No", - 'spots': "No", - 'modules': 'No', - "metadata": {"families": 'No', - "genes": 'No', - "contigs": 'No', - "genomes": 'No', - "RGPs": 'No', - "spots": 'No', - "modules": 'No'}, - "metasources": {"families": [], - "genes": [], - "contigs": [], - "genomes": [], - "RGPs": [], - "spots": [], - "modules": []} + "genomesAnnotated": "No", + "geneSequences": "No", + "genesClustered": "No", + "defragmented": "No", + "geneFamilySequences": "No", + "neighborsGraph": "No", + "partitioned": "No", + "predictedRGP": "No", + "spots": "No", + "modules": "No", + "metadata": { + "families": "No", + "genes": "No", + "contigs": "No", + "genomes": "No", + "RGPs": "No", + "spots": "No", + "modules": "No", + }, + "metasources": { + "families": [], + "genes": [], + "contigs": [], + "genomes": [], + "RGPs": [], + "spots": [], + "modules": [], + }, } self.parameters = {} - def add_file(self, pangenome_file: Path, check_version:bool=True): + def add_file(self, pangenome_file: Path, check_version: bool = True): """ Links an HDF5 file to the pangenome. If needed elements will be loaded from this file, and anything that is computed will be saved to this file when @@ -77,9 +80,12 @@ def add_file(self, pangenome_file: Path, check_version:bool=True): :param check_version: Check ppanggolin version of the pangenome file to be compatible with the current version of ppaggolin being used. :raises AssertionError: If the `pangenome_file` is not an instance of the Path class """ - assert isinstance(pangenome_file, Path), "pangenome file should be a Path object type" + assert isinstance( + pangenome_file, Path + ), "pangenome file should be a Path object type" from ppanggolin.formats.readBinaries import get_status from ppanggolin.utils import check_version_compatibility + # importing on call instead of importing on top to avoid cross-reference problems. if not tables.is_hdf5_file(pangenome_file): raise TypeError("Pangenome file should be an HDF5 file type") @@ -90,13 +96,16 @@ def add_file(self, pangenome_file: Path, check_version:bool=True): self.file = pangenome_file.absolute().as_posix() """ Gene Methods""" + @property def genes(self) -> Generator[Gene, None, None]: """Generator of genes in the pangenome. - + :return: gene generator """ - if self.number_of_organisms > 0: # if we have organisms, they're supposed to have genes + if ( + self.number_of_organisms > 0 + ): # if we have organisms, they're supposed to have genes for org in self.organisms: for contig in org.contigs: for gene in contig.genes: @@ -107,7 +116,9 @@ def genes(self) -> Generator[Gene, None, None]: for gene in gene_fam.genes: yield gene else: - logging.getLogger("PPanGGOLiN").warning("There is no gene in your pangenome") + logging.getLogger("PPanGGOLiN").warning( + "There is no gene in your pangenome" + ) def _mk_gene_getter(self): """ @@ -132,14 +143,18 @@ def get_gene(self, gene_id: str) -> Gene: :raises AssertionError: If the `gene_id` is not a string :raises KeyError: If the `gene_id` is not in the pangenome """ - assert isinstance(gene_id, str), f"The provided gene id ({gene_id}) should be a string and not a {type(gene_id)}" + assert isinstance( + gene_id, str + ), f"The provided gene id ({gene_id}) should be a string and not a {type(gene_id)}" try: gene = self._gene_getter[gene_id] except AttributeError: # in that case, either the gene getter has not been computed, or the geneID is not in the pangenome. self._mk_gene_getter() # make it - return self.get_gene(gene_id) # Return what was expected. If geneID does not exist it will raise an error. + return self.get_gene( + gene_id + ) # Return what was expected. If geneID does not exist it will raise an error. except KeyError: raise KeyError(f"{gene_id} does not exist in the pangenome.") else: @@ -159,8 +174,8 @@ def number_of_genes(self) -> int: else: return nb_genes - """RNAs methods""" + @property def RNAs(self) -> Generator[Gene, None, None]: """Generator of genes in the pangenome. @@ -180,10 +195,10 @@ def number_of_rnas(self) -> int: return sum(ctg.number_of_rnas for ctg in self.contigs) """Gene families methods""" + @property def max_fam_id(self): - """Get the last family identifier - """ + """Get the last family identifier""" return self._max_fam_id @max_fam_id.setter @@ -197,7 +212,7 @@ def max_fam_id(self, value): @property def gene_families(self) -> Generator[GeneFamily, None, None]: """Returns all the gene families in the pangenome - + :return: Generator of gene families """ yield from self._fam_getter.values() @@ -233,7 +248,7 @@ def get_gene_family(self, name: str) -> GeneFamily: def add_gene_family(self, family: GeneFamily): """ Adds the given gene family to the pangenome. If a family with the same name already exists, raises a KeyError. - + :param family: The gene family to add to the pangenome :raises KeyError: If a family with the same name already exists :raises Exception: For any unexpected exceptions @@ -245,16 +260,20 @@ def add_gene_family(self, family: GeneFamily): self._fam_getter[family.name] = family self.max_fam_id += 1 except Exception as error: - raise Exception(f"An unexpected error occurred when adding family {family} to pangenome: {str(error)}") from error + raise Exception( + f"An unexpected error occurred when adding family {family} to pangenome: {str(error)}" + ) from error else: - raise KeyError(f"Cannot add family {family.name}: A family with the same name already exists.") - + raise KeyError( + f"Cannot add family {family.name}: A family with the same name already exists." + ) """Graph methods""" + @property def edges(self) -> Generator[Edge, None, None]: """Returns all the edges in the pangenome graph - + :return: Generator of edge """ yield from self._edge_getter.values() @@ -271,13 +290,17 @@ def add_edge(self, gene1: Gene, gene2: Gene) -> Edge: :raises AssertionError: Genes object are expected :raises AttributeError: Genes are not associated to any families """ - assert isinstance(gene1, Gene) and isinstance(gene2, Gene), "Gene object are expected" + assert isinstance(gene1, Gene) and isinstance( + gene2, Gene + ), "Gene object are expected" try: family_1, family_2 = gene1.family, gene2.family except AttributeError: - raise AttributeError("Genes are not linked to families. Check that you compute the gene families and post an" - " issue on our GitHub") - key = frozenset([family_1, family_2 ]) + raise AttributeError( + "Genes are not linked to families. Check that you compute the gene families and post an" + " issue on our GitHub" + ) + key = frozenset([family_1, family_2]) edge = self._edge_getter.get(key) if edge is None: edge = Edge(gene1, gene2) @@ -295,10 +318,11 @@ def number_of_edges(self) -> int: return len(self._edge_getter) """Organism methods""" + @property def organisms(self) -> Generator[Organism, None, None]: """Returns all the organisms in the pangenome - + :return: Generator :class:`ppanggolin.genome.Organism` """ yield from self._org_getter.values() @@ -306,7 +330,7 @@ def organisms(self) -> Generator[Organism, None, None]: @property def number_of_organisms(self) -> int: """Returns the number of organisms present in the pangenome - + :return: The number of organism """ return len(self._org_getter) @@ -334,16 +358,20 @@ def _mk_contig_getter(self, check_name: bool = False, name: str = ""): The assumption behind this is that the pangenome has been filled and no more contig will be added. """ if (check_name and name == "") or (not check_name and name != ""): - raise AssertionError('if you search the identifier corresponding to the name, ' - 'check_name must be True and name different than empty string.') + raise AssertionError( + "if you search the identifier corresponding to the name, " + "check_name must be True and name different than empty string." + ) names = set() identifier = None self._contig_getter = {} for contig in self.contigs: if check_name: if contig.name in names: - raise KeyError("Two contigs with the same name. " - "You should use the contig ID or give the genome name") + raise KeyError( + "Two contigs with the same name. " + "You should use the contig ID or give the genome name" + ) names.add(contig.name) if contig.name == name: identifier = contig.ID @@ -352,7 +380,9 @@ def _mk_contig_getter(self, check_name: bool = False, name: str = ""): def _get_contig_by_identifier(self, identifier: int = None) -> Contig: if identifier is None: - raise Exception("Unexpected error happened. Please report an issue to our GitHub.") + raise Exception( + "Unexpected error happened. Please report an issue to our GitHub." + ) else: if not isinstance(identifier, int): raise AssertionError("Contig ID should be an integer") @@ -361,13 +391,19 @@ def _get_contig_by_identifier(self, identifier: int = None) -> Contig: except AttributeError: # in that case, either the gene getter has not been computed, or the geneID is not in the pangenome. self._mk_contig_getter() # make it - return self.get_contig(identifier=identifier) # Return what was expected. If geneID does not exist it will raise an error. + return self.get_contig( + identifier=identifier + ) # Return what was expected. If geneID does not exist it will raise an error. except KeyError: - raise KeyError(f"Contig: {identifier}, does not exist in the pangenome.") + raise KeyError( + f"Contig: {identifier}, does not exist in the pangenome." + ) else: return contig - def get_contig(self, identifier: int = None, name: str = None, organism_name: str = None) -> Contig: + def get_contig( + self, identifier: int = None, name: str = None, organism_name: str = None + ) -> Contig: """Returns the contig by his identifier or by his name. If name is given the organism name is needed :param identifier: ID of the contig to look for @@ -379,8 +415,9 @@ def get_contig(self, identifier: int = None, name: str = None, organism_name: st :raises AssertionError: If the `contig_id` is not an integer :raises KeyError: If the `contig` is not in the pangenome """ - assert not all(x is None for x in [identifier, name, organism_name]), ("You must provide either contig_id or " - "name or genome_name") + assert not all(x is None for x in [identifier, name, organism_name]), ( + "You must provide either contig_id or " "name or genome_name" + ) if name: if not isinstance(name, str): raise AssertionError("Contig name should be a string") @@ -427,16 +464,22 @@ def add_organism(self, organism: Organism): :raise AssertionError: If the organism name is not a string :raises KeyError: if the provided organism is already in pangenome """ - assert isinstance(organism, Organism), "An organism object is expected to be add to pangenome" + assert isinstance( + organism, Organism + ), "An organism object is expected to be add to pangenome" try: self.get_organism(organism.name) except KeyError: self._org_getter[organism.name] = organism else: - raise KeyError(f"Redondant genome name was found ({organism.name})." - f"All of your genomes must have unique names.") - - def get_org_index(self) -> Dict[Organism, int]: # will not make a new index if it exists already + raise KeyError( + f"Redondant genome name was found ({organism.name})." + f"All of your genomes must have unique names." + ) + + def get_org_index( + self, + ) -> Dict[Organism, int]: # will not make a new index if it exists already """Creates an index for Organisms (each organism is assigned an Integer). :return: The index of organisms in pangenome @@ -447,7 +490,7 @@ def get_org_index(self) -> Dict[Organism, int]: # will not make a new index if self._org_index[org] = index return self._org_index - def compute_family_bitarrays(self, part: str = 'all') -> Dict[Organism, int]: + def compute_family_bitarrays(self, part: str = "all") -> Dict[Organism, int]: """ Based on the index generated by get_org_index, generate a bitarray for each gene family. If the family j is present in the organism with the index i, the bit at position i will be 1. If it is not, @@ -466,7 +509,9 @@ def compute_family_bitarrays(self, part: str = 'all') -> Dict[Organism, int]: # case where there is an index but the bitarrays have not been computed??? return self._org_index - def get_fam_index(self) -> Dict[GeneFamily, int]: # will not make a new index if it exists already + def get_fam_index( + self, + ) -> Dict[GeneFamily, int]: # will not make a new index if it exists already """Creates an index for gene families (each family is assigned an Integer). :return: The index of families in pangenome @@ -477,7 +522,7 @@ def get_fam_index(self) -> Dict[GeneFamily, int]: # will not make a new index i self._fam_index[fam] = index return self._fam_index - def compute_org_bitarrays(self, part='all') -> Dict[GeneFamily, int]: + def compute_org_bitarrays(self, part="all") -> Dict[GeneFamily, int]: """ Based on the index generated by get_fam_index, generate a bitarray for each gene family. If the family j is present in the organism with the index i, the bit at position i will be 1. If it is not, @@ -497,6 +542,7 @@ def compute_org_bitarrays(self, part='all') -> Dict[GeneFamily, int]: return self._fam_index """RGP methods""" + @property def regions(self) -> Generator[Region, None, None]: """returns all the regions (RGP) in the pangenome @@ -524,7 +570,9 @@ def get_region(self, name: str) -> Region: else: return rgp - def get_multigenics(self, dup_margin: float, persistent: bool = True) -> Set[GeneFamily]: + def get_multigenics( + self, dup_margin: float, persistent: bool = True + ) -> Set[GeneFamily]: """ Returns the multigenic persistent families of the pangenome graph. A family will be considered multigenic if it is duplicated in more than `dup_margin` of the genomes where it is present. @@ -540,14 +588,22 @@ def get_multigenics(self, dup_margin: float, persistent: bool = True) -> Set[Gen multigenics = set() for fam in self.gene_families: if fam.named_partition == "persistent" or not persistent: - dup = len([genes for org, genes in fam.get_org_dict().items() if - len([gene for gene in genes if not gene.is_fragment]) > 1]) - if (dup / fam.number_of_organisms) >= dup_margin: # tot / nborgs >= 1.05 + dup = len( + [ + genes + for org, genes in fam.get_org_dict().items() + if len([gene for gene in genes if not gene.is_fragment]) > 1 + ] + ) + if ( + dup / fam.number_of_organisms + ) >= dup_margin: # tot / nborgs >= 1.05 multigenics.add(fam) return multigenics - - def get_single_copy_persistent_families(self, dup_margin: float, exclude_fragments: bool) -> Set[GeneFamily]: + def get_single_copy_persistent_families( + self, dup_margin: float, exclude_fragments: bool + ) -> Set[GeneFamily]: """ Retrieves gene families that are both persistent and single copy based on the provided criteria. @@ -561,12 +617,13 @@ def get_single_copy_persistent_families(self, dup_margin: float, exclude_fragmen # Iterate through gene families and check for persistence and single copy status for fam in self.gene_families: - if fam.named_partition == "persistent" and fam.is_single_copy(dup_margin, exclude_fragments): + if fam.named_partition == "persistent" and fam.is_single_copy( + dup_margin, exclude_fragments + ): single_copy_fams.add(fam) return single_copy_fams - def add_region(self, region: Region): """Add a region to the pangenome @@ -582,7 +639,9 @@ def add_region(self, region: Region): except KeyError: self._region_getter[region.name] = region else: - raise KeyError(f"A RGP with this name ({region.name} already exist in pangenome") + raise KeyError( + f"A RGP with this name ({region.name} already exist in pangenome" + ) @property def number_of_rgp(self) -> int: @@ -593,6 +652,7 @@ def number_of_rgp(self) -> int: return len(self._region_getter) """Spot methods""" + @property def spots(self) -> Generator[Spot, None, None]: """Generate spots in the pangenome @@ -619,8 +679,10 @@ def get_spot(self, spot_id: Union[int, str]) -> Spot: if result: spot_id = int(result.group(1)) else: - raise ValueError(f"The provided spot ID '{spot_id}' does not have the expected format." - "It should be an integer or in the format 'spot_'.") + raise ValueError( + f"The provided spot ID '{spot_id}' does not have the expected format." + "It should be an integer or in the format 'spot_'." + ) try: spot = self._spot_getter[spot_id] except KeyError: @@ -655,10 +717,10 @@ def number_of_spots(self) -> int: return len(self._spot_getter) """Modules methods""" + @property def modules(self) -> Generator[Module, None, None]: - """Generate modules in the pangenome - """ + """Generate modules in the pangenome""" yield from self._module_getter.values() def get_module(self, module_id: Union[int, str]) -> Module: @@ -681,8 +743,10 @@ def get_module(self, module_id: Union[int, str]) -> Module: if result: module_id = int(result.group(1)) else: - raise ValueError(f"The provided module ID '{module_id}' does not have the expected format." - "It should be an integer or in the format 'module_'.") + raise ValueError( + f"The provided module ID '{module_id}' does not have the expected format." + "It should be an integer or in the format 'module_'." + ) try: module = self._module_getter[module_id] @@ -709,7 +773,7 @@ def add_module(self, module: Module): else: raise KeyError("Module already exist") - def compute_mod_bitarrays(self, part: str = 'all') -> Dict[GeneFamily, int]: + def compute_mod_bitarrays(self, part: str = "all") -> Dict[GeneFamily, int]: """Based on the index generated by get_fam_index, generated a bitarray for each gene family present in modules. If the family j is present in the module with the index i, the bit at position i will be 1. If it is not, @@ -740,7 +804,7 @@ def soft_core_families(self, soft_core_threshold: float) -> Set[GeneFamily]: """ Retrieves gene families considered part of the soft core based on the provided threshold. - :param soft_core_threshold: The threshold to determine the minimum fraction of organisms + :param soft_core_threshold: The threshold to determine the minimum fraction of organisms required for a gene family to be considered part of the soft core. :return: A set containing gene families identified as part of the soft core. """ @@ -768,12 +832,12 @@ def exact_core_families(self) -> Set[GeneFamily]: return exact_core_families """Metadata""" + def has_metadata(self) -> bool: """ Whether or not the pangenome has metadata associated with any of its elements. """ - return any( status != "No" for status in self.status['metadata'].values()) - + return any(status != "No" for status in self.status["metadata"].values()) def select_elem(self, metatype: str): """Get all the element for the given metatype @@ -829,8 +893,9 @@ def metadata(self, metatype: str) -> Generator[Metadata, None, None]: for elem in self.select_elem(metatype): yield elem.metadata - def get_elem_by_metadata(self, metatype: str, **kwargs - ) -> Generator[Union[GeneFamily, Gene, Organism, Region, Spot, Module], None, None]: + def get_elem_by_metadata( + self, metatype: str, **kwargs + ) -> Generator[Union[GeneFamily, Gene, Organism, Region, Spot, Module], None, None]: """Get element in pangenome with metadata attribute expected :param metatype: Select to which pangenome element metadata @@ -842,16 +907,27 @@ def get_elem_by_metadata(self, metatype: str, **kwargs if len(list(elem.get_metadata_by_attribute(**kwargs))) > 0: yield elem - def get_elem_by_source(self, source: str, metatype: str - ) -> Generator[Union[GeneFamily, Gene, Contig, Organism, Region, Spot, Module], None, None]: - """ Get gene families with a specific source in pangenome + def get_elem_by_source( + self, source: str, metatype: str + ) -> Generator[ + Union[GeneFamily, Gene, Contig, Organism, Region, Spot, Module], None, None + ]: + """Get gene families with a specific source in pangenome :param source: Name of the source :param metatype: select to which pangenome element metadata should be written :return: Gene families with the source """ - assert metatype in ["families", "genomes", "contigs", "genes", "RGPs", "spots", "modules"] + assert metatype in [ + "families", + "genomes", + "contigs", + "genes", + "RGPs", + "spots", + "modules", + ] for elem in self.select_elem(metatype): if elem.has_source(source): yield elem diff --git a/ppanggolin/projection/__init__.py b/ppanggolin/projection/__init__.py index 56bb37d6..f477784e 100644 --- a/ppanggolin/projection/__init__.py +++ b/ppanggolin/projection/__init__.py @@ -1 +1 @@ -from .projection import subparser, launch \ No newline at end of file +from .projection import subparser, launch diff --git a/ppanggolin/projection/projection.py b/ppanggolin/projection/projection.py index 91e4db75..e7021319 100644 --- a/ppanggolin/projection/projection.py +++ b/ppanggolin/projection/projection.py @@ -21,37 +21,68 @@ # # local libraries from ppanggolin.annotate.synta import read_fasta, get_dna_sequence -from ppanggolin.annotate.annotate import init_contig_counter, read_anno_file, annotate_organism, \ - local_identifiers_are_unique +from ppanggolin.annotate.annotate import ( + init_contig_counter, + read_anno_file, + annotate_organism, + local_identifiers_are_unique, +) from ppanggolin.annotate import subparser as annotate_subparser from ppanggolin.pangenome import Pangenome -from ppanggolin.utils import detect_filetype, create_tmpdir, read_compressed_or_not, write_compressed_or_not, \ - restricted_float, mk_outdir, get_config_args, parse_config_file, get_default_args, \ - check_input_files, parse_input_paths_file -from ppanggolin.align.alignOnPang import write_gene_to_gene_family, get_input_seq_to_family_with_rep, \ - get_input_seq_to_family_with_all, project_and_write_partition +from ppanggolin.utils import ( + detect_filetype, + create_tmpdir, + read_compressed_or_not, + write_compressed_or_not, + restricted_float, + mk_outdir, + get_config_args, + parse_config_file, + get_default_args, + check_input_files, + parse_input_paths_file, +) +from ppanggolin.align.alignOnPang import ( + write_gene_to_gene_family, + get_input_seq_to_family_with_rep, + get_input_seq_to_family_with_all, + project_and_write_partition, +) from ppanggolin.formats.writeSequences import write_gene_sequences_from_annotations from ppanggolin.formats.readBinaries import check_pangenome_info from ppanggolin.RGP.genomicIsland import naming_scheme, compute_org_rgp -from ppanggolin.RGP.spot import make_spot_graph, check_sim, add_new_node_in_spot_graph, write_spot_graph +from ppanggolin.RGP.spot import ( + make_spot_graph, + check_sim, + add_new_node_in_spot_graph, + write_spot_graph, +) from ppanggolin.genome import Organism from ppanggolin.geneFamily import GeneFamily from ppanggolin.region import Region, Spot, Module -from ppanggolin.formats.writeFlatGenomes import write_proksee_organism, manage_module_colors, write_gff_file, \ - write_tsv_genome_file -from ppanggolin.formats.writeFlatPangenome import summarize_spots, summarize_genome, write_summaries_in_tsv, \ - write_rgp_table +from ppanggolin.formats.writeFlatGenomes import ( + write_proksee_organism, + manage_module_colors, + write_gff_file, + write_tsv_genome_file, +) +from ppanggolin.formats.writeFlatPangenome import ( + summarize_spots, + summarize_genome, + write_summaries_in_tsv, + write_rgp_table, +) from ppanggolin.formats.writeSequences import read_genome_file class NewSpot(Spot): """ - This class represent a hotspot specifically + This class represent a hotspot specifically created for the projected genome. """ def __str__(self): - return f'new_spot_{str(self.ID)}' + return f"new_spot_{str(self.ID)}" def check_pangenome_for_projection(pangenome: Pangenome, fast_aln: bool): @@ -78,42 +109,69 @@ def check_pangenome_for_projection(pangenome: Pangenome, fast_aln: bool): project_spots = True if pangenome.status["partitioned"] not in ["Computed", "Loaded", "inFile"]: - raise NameError("The provided pangenome has not been partitioned. " - "Annotation of an external genome is therefore not possible. " - "See the 'partition' subcommands.") + raise NameError( + "The provided pangenome has not been partitioned. " + "Annotation of an external genome is therefore not possible. " + "See the 'partition' subcommands." + ) if pangenome.status["predictedRGP"] not in ["Computed", "Loaded", "inFile"]: - logging.getLogger('PPanGGOLiN').info("RGPs have not been predicted in the provided pangenome. " - "Projection of RGPs and spots into the provided " - "genome will not be performed.") + logging.getLogger("PPanGGOLiN").info( + "RGPs have not been predicted in the provided pangenome. " + "Projection of RGPs and spots into the provided " + "genome will not be performed." + ) predict_rgp = False project_spots = False elif pangenome.status["spots"] not in ["Computed", "Loaded", "inFile"]: - logging.getLogger('PPanGGOLiN').info("Spots have not been predicted in the provided pangenome. " - "Projection of spots into the provided genome will not be performed.") + logging.getLogger("PPanGGOLiN").info( + "Spots have not been predicted in the provided pangenome. " + "Projection of spots into the provided genome will not be performed." + ) project_spots = False if pangenome.status["modules"] not in ["Computed", "Loaded", "inFile"]: - logging.getLogger('PPanGGOLiN').info("Modules have not been predicted in the provided pangenome. " - "Projection of modules into the provided genome will not be performed.") + logging.getLogger("PPanGGOLiN").info( + "Modules have not been predicted in the provided pangenome. " + "Projection of modules into the provided genome will not be performed." + ) project_modules = False - if pangenome.status["geneSequences"] not in ["Loaded", "Computed", "inFile"] and not fast_aln: - raise Exception("The provided pangenome has no gene sequences. " - "Projection is still possible with the --fast option to use representative " - "sequences rather than all genes to annotate input genes.") + if ( + pangenome.status["geneSequences"] not in ["Loaded", "Computed", "inFile"] + and not fast_aln + ): + raise Exception( + "The provided pangenome has no gene sequences. " + "Projection is still possible with the --fast option to use representative " + "sequences rather than all genes to annotate input genes." + ) if pangenome.status["geneFamilySequences"] not in ["Loaded", "Computed", "inFile"]: - raise Exception("The provided pangenome has no gene families sequences. " - "This is not possible to annotate an input genome to this pangenome.") + raise Exception( + "The provided pangenome has no gene families sequences. " + "This is not possible to annotate an input genome to this pangenome." + ) return predict_rgp, project_spots, project_modules + def manage_input_genomes_annotation( - pangenome, input_mode: str, anno: str, fasta: str, organism_name: str, circular_contigs: list, - pangenome_params, cpu: int, use_pseudo: bool, disable_bar: bool, tmpdir: str, config: dict): + pangenome, + input_mode: str, + anno: str, + fasta: str, + organism_name: str, + circular_contigs: list, + pangenome_params, + cpu: int, + use_pseudo: bool, + disable_bar: bool, + tmpdir: str, + config: dict, +): """ Manage the input genomes annotation based on the provided mode and parameters. @@ -148,30 +206,28 @@ def manage_input_genomes_annotation( if anno: input_type = "annotation" genome_name_to_path = { - organism_name: { - "path": anno, - "circular_contigs": circular_contigs - } + organism_name: {"path": anno, "circular_contigs": circular_contigs} } elif fasta: input_type = "fasta" genome_name_to_path = { - organism_name: { - "path": fasta, - "circular_contigs": circular_contigs - } + organism_name: {"path": fasta, "circular_contigs": circular_contigs} } else: - raise ValueError(f"Input mode '{input_mode}' is not valid. Expected 'multiple' or 'single'.") + raise ValueError( + f"Input mode '{input_mode}' is not valid. Expected 'multiple' or 'single'." + ) # Process annotation input type if input_type == "annotation": check_input_names(pangenome, genome_name_to_path) organisms, org_2_has_fasta = read_annotation_files( - genome_name_to_path, cpu=cpu, pseudo=use_pseudo, + genome_name_to_path, + cpu=cpu, + pseudo=use_pseudo, translation_table=int(pangenome_params.cluster.translation_table), - disable_bar=disable_bar + disable_bar=disable_bar, ) # Check for genomes without associated sequence data @@ -186,10 +242,12 @@ def manage_input_genomes_annotation( genome_name_to_fasta_path = { organism_name: { "path": fasta, - "circular_contigs": circular_contigs + "circular_contigs": circular_contigs, } } - get_gene_sequences_from_fasta_files(organisms_with_no_fasta, genome_name_to_fasta_path) + get_gene_sequences_from_fasta_files( + organisms_with_no_fasta, genome_name_to_fasta_path + ) else: raise ValueError( f"GFF files provided for {len(organisms_with_no_fasta)} (out of {len(organisms)}) genomes without " @@ -200,34 +258,58 @@ def manage_input_genomes_annotation( # Process fasta input type elif input_type == "fasta": - annotate_param_names = ["norna", "kingdom", "allow_overlap", "prodigal_procedure"] - annotate_params = manage_annotate_param(annotate_param_names, pangenome_params.annotate, config) + annotate_param_names = [ + "norna", + "kingdom", + "allow_overlap", + "prodigal_procedure", + ] + annotate_params = manage_annotate_param( + annotate_param_names, pangenome_params.annotate, config + ) check_input_names(pangenome, genome_name_to_path) organisms = annotate_fasta_files( - genome_name_to_fasta_path=genome_name_to_path, tmpdir=tmpdir, cpu=cpu, + genome_name_to_fasta_path=genome_name_to_path, + tmpdir=tmpdir, + cpu=cpu, translation_table=int(pangenome_params.cluster.translation_table), - norna=annotate_params.norna, kingdom=annotate_params.kingdom, - allow_overlap=annotate_params.allow_overlap, procedure=annotate_params.prodigal_procedure, - disable_bar=disable_bar + norna=annotate_params.norna, + kingdom=annotate_params.kingdom, + allow_overlap=annotate_params.allow_overlap, + procedure=annotate_params.prodigal_procedure, + disable_bar=disable_bar, ) else: - raise ValueError(f"Input type '{input_type}' is not valid. Expected 'fasta' or 'annotation'.") + raise ValueError( + f"Input type '{input_type}' is not valid. Expected 'fasta' or 'annotation'." + ) return organisms, genome_name_to_path, input_type -def write_projection_results(pangenome: Pangenome, organisms: Set[Organism], - input_org_2_rgps: Dict[Organism, Set[Region]], - input_org_to_spots: Dict[Organism, Set[Spot]], - input_orgs_to_modules: Dict[Organism, Set[Module]], - input_org_to_lonely_genes_count: Dict[Organism, int], - write_proksee: bool, write_gff: bool, write_table: bool, - add_sequences: bool, - genome_name_to_path: Dict[str, dict], input_type: str, - output_dir: Path, dup_margin: float, soft_core: float, - metadata_sep: str, compress: bool, - need_regions: bool, need_spots: bool, need_modules: bool): +def write_projection_results( + pangenome: Pangenome, + organisms: Set[Organism], + input_org_2_rgps: Dict[Organism, Set[Region]], + input_org_to_spots: Dict[Organism, Set[Spot]], + input_orgs_to_modules: Dict[Organism, Set[Module]], + input_org_to_lonely_genes_count: Dict[Organism, int], + write_proksee: bool, + write_gff: bool, + write_table: bool, + add_sequences: bool, + genome_name_to_path: Dict[str, dict], + input_type: str, + output_dir: Path, + dup_margin: float, + soft_core: float, + metadata_sep: str, + compress: bool, + need_regions: bool, + need_spots: bool, + need_modules: bool, +): """ Write the results of the projection of pangneome onto input genomes. @@ -246,7 +328,7 @@ def write_projection_results(pangenome: Pangenome, organisms: Set[Organism], :param output_dir: The directory where the output files will be written. :param dup_margin: The duplication margin used to compute completeness. :param soft_core: Soft core threshold - + Note: - If `write_proksee` is True and input organisms have modules, module colors for ProkSee are obtained. @@ -264,9 +346,14 @@ def write_projection_results(pangenome: Pangenome, organisms: Set[Organism], # dup margin value here is specified in argument and is used to compute completeness. # That means it can be different than dup margin used in spot and RGPS. - pangenome_persistent_single_copy_families = pangenome.get_single_copy_persistent_families(dup_margin=dup_margin, - exclude_fragments=True) - pangenome_persistent_count = len([fam for fam in pangenome.gene_families if fam.named_partition == "persistent"]) + pangenome_persistent_single_copy_families = ( + pangenome.get_single_copy_persistent_families( + dup_margin=dup_margin, exclude_fragments=True + ) + ) + pangenome_persistent_count = len( + [fam for fam in pangenome.gene_families if fam.named_partition == "persistent"] + ) soft_core_families = pangenome.soft_core_families(soft_core) exact_core_families = pangenome.exact_core_families() @@ -278,70 +365,102 @@ def write_projection_results(pangenome: Pangenome, organisms: Set[Organism], # summarize projection for all input organisms singleton_gene_count = input_org_to_lonely_genes_count[organism] - org_summary = summarize_projected_genome(organism, - pangenome_persistent_count, - pangenome_persistent_single_copy_families, - soft_core_families=soft_core_families, - exact_core_families=exact_core_families, - input_org_rgps=input_org_2_rgps.get(organism, None), - input_org_spots=input_org_to_spots.get(organism, None), - input_org_modules=input_orgs_to_modules.get(organism, None), - pangenome_file=pangenome.file, - singleton_gene_count=singleton_gene_count) + org_summary = summarize_projected_genome( + organism, + pangenome_persistent_count, + pangenome_persistent_single_copy_families, + soft_core_families=soft_core_families, + exact_core_families=exact_core_families, + input_org_rgps=input_org_2_rgps.get(organism, None), + input_org_spots=input_org_to_spots.get(organism, None), + input_org_modules=input_orgs_to_modules.get(organism, None), + pangenome_file=pangenome.file, + singleton_gene_count=singleton_gene_count, + ) summaries.append(org_summary) yaml_outputfile = output_dir / organism.name / "projection_summary.yaml" write_summary_in_yaml(org_summary, yaml_outputfile) if (write_proksee or write_gff) and add_sequences: - genome_sequences = read_genome_file(genome_name_to_path[organism.name]['path'], organism) - genome_name_to_path[organism.name]['path'] + genome_sequences = read_genome_file( + genome_name_to_path[organism.name]["path"], organism + ) + genome_name_to_path[organism.name]["path"] else: genome_sequences = None if write_proksee: - org_module_to_color = {org_mod: module_to_colors[org_mod] for org_mod in - input_orgs_to_modules.get(organism, [])} + org_module_to_color = { + org_mod: module_to_colors[org_mod] + for org_mod in input_orgs_to_modules.get(organism, []) + } output_file = output_dir / organism.name / f"{organism.name}_proksee.json" - write_proksee_organism(organism, output_file, features='all', module_to_colors=org_module_to_color, - genome_sequences=genome_sequences, compress=compress) + write_proksee_organism( + organism, + output_file, + features="all", + module_to_colors=org_module_to_color, + genome_sequences=genome_sequences, + compress=compress, + ) if write_gff: - if input_type == "annotation": # if the genome has not been annotated by PPanGGOLiN - annotation_sources = {"rRNA": "external", - "tRNA": "external", - "CDS": "external"} + if ( + input_type == "annotation" + ): # if the genome has not been annotated by PPanGGOLiN + annotation_sources = { + "rRNA": "external", + "tRNA": "external", + "CDS": "external", + } else: annotation_sources = {} - write_gff_file(organism, output_dir / organism.name, - annotation_sources=annotation_sources, - genome_sequences=genome_sequences, metadata_sep=metadata_sep, - compress=compress) + write_gff_file( + organism, + output_dir / organism.name, + annotation_sources=annotation_sources, + genome_sequences=genome_sequences, + metadata_sep=metadata_sep, + compress=compress, + ) if write_table: - write_tsv_genome_file(organism, output_dir / organism.name, compress=compress, metadata_sep=metadata_sep, - need_regions=need_regions, need_spots=need_spots, need_modules=need_modules) + write_tsv_genome_file( + organism, + output_dir / organism.name, + compress=compress, + metadata_sep=metadata_sep, + need_regions=need_regions, + need_spots=need_spots, + need_modules=need_modules, + ) output_file = output_dir / "summary_projection.tsv" - write_summaries_in_tsv(summaries, - output_file=output_file, - dup_margin=dup_margin, - soft_core=soft_core, compress=compress) - - -def summarize_projected_genome(organism: Organism, - pangenome_persistent_count: int, - pangenome_persistent_single_copy_families: Set[GeneFamily], - soft_core_families: Set[GeneFamily], - exact_core_families: Set[GeneFamily], - input_org_rgps: List[Region], - input_org_spots: List[Spot], - input_org_modules: List[Module], - pangenome_file: str, - singleton_gene_count: int) -> Dict[str, any]: + write_summaries_in_tsv( + summaries, + output_file=output_file, + dup_margin=dup_margin, + soft_core=soft_core, + compress=compress, + ) + + +def summarize_projected_genome( + organism: Organism, + pangenome_persistent_count: int, + pangenome_persistent_single_copy_families: Set[GeneFamily], + soft_core_families: Set[GeneFamily], + exact_core_families: Set[GeneFamily], + input_org_rgps: List[Region], + input_org_spots: List[Spot], + input_org_modules: List[Module], + pangenome_file: str, + singleton_gene_count: int, +) -> Dict[str, any]: """ Summarizes the projected genome and generates an organism summary. @@ -371,35 +490,46 @@ def summarize_projected_genome(organism: Organism, exact_core_families=exact_core_families, rgp_count=rgp_count, spot_count=spot_count, - module_count=module_count + module_count=module_count, ) # Add specific values for the projected genome organism_summary["Pangenome_file"] = pangenome_file - cloud_without_specific_fams = organism_summary["Cloud"]["families"] - singleton_gene_count + cloud_without_specific_fams = ( + organism_summary["Cloud"]["families"] - singleton_gene_count + ) organism_summary["Cloud"]["families"] = cloud_without_specific_fams organism_summary["Cloud"]["specific families"] = singleton_gene_count input_org_spots = input_org_spots - new_spot_count = "Not computed" if input_org_spots is None else sum( - 1 for spot in input_org_spots if isinstance(spot, NewSpot)) + new_spot_count = ( + "Not computed" + if input_org_spots is None + else sum(1 for spot in input_org_spots if isinstance(spot, NewSpot)) + ) organism_summary["New_spots"] = new_spot_count return organism_summary -def annotate_fasta_files(genome_name_to_fasta_path: Dict[str, dict], tmpdir: str, cpu: int = 1, - translation_table: int = 11, - kingdom: str = "bacteria", norna: bool = False, allow_overlap: bool = False, - procedure: str = None, - disable_bar: bool = False): +def annotate_fasta_files( + genome_name_to_fasta_path: Dict[str, dict], + tmpdir: str, + cpu: int = 1, + translation_table: int = 11, + kingdom: str = "bacteria", + norna: bool = False, + allow_overlap: bool = False, + procedure: str = None, + disable_bar: bool = False, +): """ Main function to annotate a pangenome :param genome_name_to_fasta_path: :param fasta_list: List of fasta file containing sequences that will be base of pangenome :param tmpdir: Path to temporary directory - :param cpu: number of CPU cores to use + :param cpu: number of CPU cores to use :param translation_table: Translation table (genetic code) to use. :param kingdom: Kingdom to which the prokaryota belongs to, to know which models to use for rRNA annotation. :param norna: Use to avoid annotating RNA features. @@ -411,13 +541,30 @@ def annotate_fasta_files(genome_name_to_fasta_path: Dict[str, dict], tmpdir: str organisms = [] arguments = [] # Argument given to annotate organism in same order than prototype for org_name, org_info in genome_name_to_fasta_path.items(): - arguments.append((org_name, org_info['path'], org_info['circular_contigs'], tmpdir, translation_table, - norna, kingdom, allow_overlap, procedure)) + arguments.append( + ( + org_name, + org_info["path"], + org_info["circular_contigs"], + tmpdir, + translation_table, + norna, + kingdom, + allow_overlap, + procedure, + ) + ) - logging.getLogger("PPanGGOLiN").info(f"Annotating {len(arguments)} genomes using {cpu} cpus...") - contig_counter = Value('i', 0) - with ProcessPoolExecutor(mp_context=get_context('fork'), max_workers=cpu, - initializer=init_contig_counter, initargs=(contig_counter,)) as executor: + logging.getLogger("PPanGGOLiN").info( + f"Annotating {len(arguments)} genomes using {cpu} cpus..." + ) + contig_counter = Value("i", 0) + with ProcessPoolExecutor( + mp_context=get_context("fork"), + max_workers=cpu, + initializer=init_contig_counter, + initargs=(contig_counter,), + ) as executor: with tqdm(total=len(arguments), unit="file", disable=disable_bar) as progress: futures = [] @@ -431,8 +578,13 @@ def annotate_fasta_files(genome_name_to_fasta_path: Dict[str, dict], tmpdir: str return organisms -def read_annotation_files(genome_name_to_annot_path: Dict[str, dict], cpu: int = 1, pseudo: bool = False, translation_table: int = 11, - disable_bar: bool = False) -> Tuple[List[Organism], Dict[Organism, bool]]: +def read_annotation_files( + genome_name_to_annot_path: Dict[str, dict], + cpu: int = 1, + pseudo: bool = False, + translation_table: int = 11, + disable_bar: bool = False, +) -> Tuple[List[Organism], Dict[Organism, bool]]: """ Read the annotation from GBFF file @@ -451,12 +603,24 @@ def read_annotation_files(genome_name_to_annot_path: Dict[str, dict], cpu: int = # unless a gff file without fasta is met (which is the only case where sequences can be absent) org_to_has_fasta_flag = {} - args = [(org_name, org_info['path'], org_info['circular_contigs'], pseudo, translation_table) - for org_name, org_info in genome_name_to_annot_path.items()] - - contig_counter = Value('i', 0) - with ProcessPoolExecutor(mp_context=get_context('fork'), max_workers=cpu, - initializer=init_contig_counter, initargs=(contig_counter,)) as executor: + args = [ + ( + org_name, + org_info["path"], + org_info["circular_contigs"], + pseudo, + translation_table, + ) + for org_name, org_info in genome_name_to_annot_path.items() + ] + + contig_counter = Value("i", 0) + with ProcessPoolExecutor( + mp_context=get_context("fork"), + max_workers=cpu, + initializer=init_contig_counter, + initargs=(contig_counter,), + ) as executor: with tqdm(total=len(args), unit="file", disable=disable_bar) as progress: futures = [] @@ -474,14 +638,22 @@ def read_annotation_files(genome_name_to_annot_path: Dict[str, dict], cpu: int = if local_identifiers_are_unique(genes): for gene in genes: - gene.ID = gene.local_identifier # Erase ppanggolin generated gene ids and replace with local identifiers - gene.local_identifier = "" # this is now useless, setting it to default value - - logging.getLogger("PPanGGOLiN").info("Gene identifiers used in the provided annotation files were unique, " - "PPanGGOLiN will use them.") + gene.ID = ( + gene.local_identifier + ) # Erase ppanggolin generated gene ids and replace with local identifiers + gene.local_identifier = ( + "" # this is now useless, setting it to default value + ) + + logging.getLogger("PPanGGOLiN").info( + "Gene identifiers used in the provided annotation files were unique, " + "PPanGGOLiN will use them." + ) else: - logging.getLogger("PPanGGOLiN").info("Gene identifiers used in the provided annotation files were not unique, " - "PPanGGOLiN will use self-generated identifiers.") + logging.getLogger("PPanGGOLiN").info( + "Gene identifiers used in the provided annotation files were not unique, " + "PPanGGOLiN will use self-generated identifiers." + ) return organisms, org_to_has_fasta_flag @@ -497,12 +669,14 @@ def get_gene_sequences_from_fasta_files(organisms, genome_name_to_annot_path): if org_names & set(genome_name_to_annot_path) != org_names: missing = len(org_names - set(genome_name_to_annot_path)) - raise ValueError(f"You did not provided fasta for all the genomes found in annotation file. " - f"{missing} are missing (out of {len(organisms)}). Missing genomes: {','.join(missing)}") + raise ValueError( + f"You did not provided fasta for all the genomes found in annotation file. " + f"{missing} are missing (out of {len(organisms)}). Missing genomes: {','.join(missing)}" + ) for org in organisms: - org_fasta_file = genome_name_to_annot_path[org.name]['path'] + org_fasta_file = genome_name_to_annot_path[org.name]["path"] with read_compressed_or_not(org_fasta_file) as currFastaFile: org_contig_to_seq = read_fasta(org, currFastaFile) @@ -511,10 +685,14 @@ def get_gene_sequences_from_fasta_files(organisms, genome_name_to_annot_path): try: contig_seq = org_contig_to_seq[contig.name] except KeyError: - msg = f"Fasta file for genome {org.name} did not have the contig {contig.name} " \ - f"that was read from the annotation file. " - msg += f"The provided contigs in the fasta were : " \ - f"{', '.join(org_contig_to_seq)}." + msg = ( + f"Fasta file for genome {org.name} did not have the contig {contig.name} " + f"that was read from the annotation file. " + ) + msg += ( + f"The provided contigs in the fasta were : " + f"{', '.join(org_contig_to_seq)}." + ) raise KeyError(msg) for gene in contig.genes: @@ -535,7 +713,8 @@ def check_input_names(pangenome, input_names): duplicated_names = set(input_names) & {org.name for org in pangenome.organisms} if len(duplicated_names) != 0: raise NameError( - f"{len(duplicated_names)} provided genome name(s) already exist in the given pangenome: {' '.join(duplicated_names)}") + f"{len(duplicated_names)} provided genome name(s) already exist in the given pangenome: {' '.join(duplicated_names)}" + ) def write_summary_in_yaml(summary_info: Dict[str, Any], output_file: Path): @@ -549,19 +728,29 @@ def write_summary_in_yaml(summary_info: Dict[str, Any], output_file: Path): :param output_file: The file where the summary will be written. """ - yaml_string = yaml.dump(summary_info, default_flow_style=False, sort_keys=False, indent=4) + yaml_string = yaml.dump( + summary_info, default_flow_style=False, sort_keys=False, indent=4 + ) - with open(output_file, 'w') as flout: - flout.write('Projection_summary:') + with open(output_file, "w") as flout: + flout.write("Projection_summary:") flout.write(yaml_string) -def annotate_input_genes_with_pangenome_families(pangenome: Pangenome, input_organisms: Iterable[Organism], - output: Path, - cpu: int, use_representatives: bool, no_defrag: bool, - identity: float, coverage: float, tmpdir: Path, - translation_table: int, keep_tmp: bool = False, - disable_bar: bool = False): +def annotate_input_genes_with_pangenome_families( + pangenome: Pangenome, + input_organisms: Iterable[Organism], + output: Path, + cpu: int, + use_representatives: bool, + no_defrag: bool, + identity: float, + coverage: float, + tmpdir: Path, + translation_table: int, + keep_tmp: bool = False, + disable_bar: bool = False, +): """ Annotate input genes with pangenome gene families by associating them to a cluster. @@ -580,38 +769,58 @@ def annotate_input_genes_with_pangenome_families(pangenome: Pangenome, input_org :return: Number of genes that do not cluster with any of the gene families of the pangenome. """ - logging.getLogger('PPanGGOLiN').info('Writing gene sequences of input genomes.') + logging.getLogger("PPanGGOLiN").info("Writing gene sequences of input genomes.") input_genes = [gene for org in input_organisms for gene in org.genes] - seq_fasta_file = output / 'input_genes.fasta' + seq_fasta_file = output / "input_genes.fasta" - write_gene_sequences_from_annotations(input_genes, seq_fasta_file, disable_bar=True, add='ppanggolin_') + write_gene_sequences_from_annotations( + input_genes, seq_fasta_file, disable_bar=True, add="ppanggolin_" + ) - with create_tmpdir(main_dir=tmpdir, basename="projection_tmp", keep_tmp=keep_tmp) as new_tmpdir: + with create_tmpdir( + main_dir=tmpdir, basename="projection_tmp", keep_tmp=keep_tmp + ) as new_tmpdir: if use_representatives: - _, seqid_to_gene_family = get_input_seq_to_family_with_rep(pangenome=pangenome, - sequence_files=seq_fasta_file, output=new_tmpdir, - tmpdir=new_tmpdir, input_type="nucleotide", - is_input_slf=True, cpu=cpu, no_defrag=no_defrag, - identity=identity, coverage=coverage, - translation_table=translation_table) + _, seqid_to_gene_family = get_input_seq_to_family_with_rep( + pangenome=pangenome, + sequence_files=seq_fasta_file, + output=new_tmpdir, + tmpdir=new_tmpdir, + input_type="nucleotide", + is_input_slf=True, + cpu=cpu, + no_defrag=no_defrag, + identity=identity, + coverage=coverage, + translation_table=translation_table, + ) else: - _, seqid_to_gene_family = get_input_seq_to_family_with_all(pangenome=pangenome, - sequence_files=seq_fasta_file, - output=new_tmpdir, tmpdir=new_tmpdir, - input_type="nucleotide", is_input_slf=True, - cpu=cpu, no_defrag=no_defrag, identity=identity, - coverage=coverage, - translation_table=translation_table, - disable_bar=disable_bar) + _, seqid_to_gene_family = get_input_seq_to_family_with_all( + pangenome=pangenome, + sequence_files=seq_fasta_file, + output=new_tmpdir, + tmpdir=new_tmpdir, + input_type="nucleotide", + is_input_slf=True, + cpu=cpu, + no_defrag=no_defrag, + identity=identity, + coverage=coverage, + translation_table=translation_table, + disable_bar=disable_bar, + ) input_org_to_lonely_genes_count = {} for input_organism in input_organisms: org_outdir = output / input_organism.name mk_outdir(org_outdir, force=True) - seq_set = {gene.ID if gene.local_identifier == "" else gene.local_identifier for gene in input_organism.genes} + seq_set = { + gene.ID if gene.local_identifier == "" else gene.local_identifier + for gene in input_organism.genes + } project_and_write_partition(seqid_to_gene_family, seq_set, org_outdir) @@ -635,10 +844,11 @@ def annotate_input_genes_with_pangenome_families(pangenome: Pangenome, input_org else: # gene id already exists. new_name = f"{input_organism.name}_{gene_id}" - logging.getLogger('PPanGGOLiN').warning( - 'The input genome as a specific gene that does not align to any ' - f'pangenome families with the same id ({gene_id}) than an existing gene family in the pangenome. ' - f'The genome name is added to the family name: {new_name}') + logging.getLogger("PPanGGOLiN").warning( + "The input genome as a specific gene that does not align to any " + f"pangenome families with the same id ({gene_id}) than an existing gene family in the pangenome. " + f"The genome name is added to the family name: {new_name}" + ) gene_family = GeneFamily(pangenome.max_fam_id, new_name) pangenome.add_gene_family(gene_family) @@ -648,10 +858,11 @@ def annotate_input_genes_with_pangenome_families(pangenome: Pangenome, input_org if gene_family.contains_gene_id(gene_id): new_name = f"{input_organism.name}_{gene_id}" - logging.getLogger('PPanGGOLiN').warning( + logging.getLogger("PPanGGOLiN").warning( "The input genome contains a gene that aligns to a pangenome family " f"which already contains a gene with the same ID ({gene_id}). " - f"The genome name has been appended to the family name: {new_name}") + f"The genome name has been appended to the family name: {new_name}" + ) gene.ID = new_name @@ -660,22 +871,37 @@ def annotate_input_genes_with_pangenome_families(pangenome: Pangenome, input_org pangenome._mk_gene_getter() # re-build the gene getter - logging.getLogger('PPanGGOLiN').info( + logging.getLogger("PPanGGOLiN").info( f"{input_organism.name} has {len(lonely_genes)}/{input_organism.number_of_genes()} " - "specific genes that do not align to any gene of the pangenome.") + "specific genes that do not align to any gene of the pangenome." + ) # Write specific gene ids in a file with open(org_outdir / "specific_genes.tsv", "w") as fl: - fl.write('\n'.join( - gene.ID if gene.local_identifier == "" else gene.local_identifier for gene in lonely_genes) + '\n') + fl.write( + "\n".join( + gene.ID if gene.local_identifier == "" else gene.local_identifier + for gene in lonely_genes + ) + + "\n" + ) input_org_to_lonely_genes_count[input_organism] = len(lonely_genes) return input_org_to_lonely_genes_count -def predict_RGP(pangenome: Pangenome, input_organisms: List[Organism], persistent_penalty: int, variable_gain: int, - min_length: int, min_score: int, multigenics: Set[GeneFamily], - output_dir: Path, disable_bar: bool, compress: bool) -> Dict[Organism, Set[Region]]: +def predict_RGP( + pangenome: Pangenome, + input_organisms: List[Organism], + persistent_penalty: int, + variable_gain: int, + min_length: int, + min_score: int, + multigenics: Set[GeneFamily], + output_dir: Path, + disable_bar: bool, + compress: bool, +) -> Dict[Organism, Set[Region]]: """ Compute Regions of Genomic Plasticity (RGP) for the given input organisms. @@ -693,20 +919,30 @@ def predict_RGP(pangenome: Pangenome, input_organisms: List[Organism], persisten :return: Dictionary mapping organism with the set of predicted regions """ - logging.getLogger('PPanGGOLiN').info("Computing Regions of Genomic Plasticity...") + logging.getLogger("PPanGGOLiN").info("Computing Regions of Genomic Plasticity...") name_scheme = naming_scheme(chain(pangenome.organisms, input_organisms)) organism_to_rgps = {} for input_organism in input_organisms: - rgps = compute_org_rgp(input_organism, multigenics, persistent_penalty, variable_gain, min_length, - min_score, naming=name_scheme, disable_bar=disable_bar) + rgps = compute_org_rgp( + input_organism, + multigenics, + persistent_penalty, + variable_gain, + min_length, + min_score, + naming=name_scheme, + disable_bar=disable_bar, + ) # turn on projected attribute in rgp objects # useful when associating spot to prevent failure when multiple spot are associated to a projected RGP for rgp in rgps: rgp.projected = True - logging.getLogger('PPanGGOLiN').info(f"{len(rgps)} RGPs have been predicted in the input genomes.") + logging.getLogger("PPanGGOLiN").info( + f"{len(rgps)} RGPs have been predicted in the input genomes." + ) org_outdir = output_dir / input_organism.name @@ -716,7 +952,12 @@ def predict_RGP(pangenome: Pangenome, input_organisms: List[Organism], persisten return organism_to_rgps -def write_rgp_to_spot_table(rgp_to_spots: Dict[Region, Set[str]], output: Path, filename: str, compress: bool = False): +def write_rgp_to_spot_table( + rgp_to_spots: Dict[Region, Set[str]], + output: Path, + filename: str, + compress: bool = False, +): """ Write a table mapping RGPs to corresponding spot IDs. @@ -726,21 +967,21 @@ def write_rgp_to_spot_table(rgp_to_spots: Dict[Region, Set[str]], output: Path, :param compress: Whether to compress the file. """ fname = output / filename - logging.getLogger('PPanGGOLiN').debug( - f'Writing RGPs to spot table in {fname}') + logging.getLogger("PPanGGOLiN").debug(f"Writing RGPs to spot table in {fname}") with write_compressed_or_not(fname, compress) as tab: fieldnames = ["region", "spot_id"] - writer = csv.DictWriter(tab, fieldnames=fieldnames, delimiter='\t') + writer = csv.DictWriter(tab, fieldnames=fieldnames, delimiter="\t") writer.writeheader() - regions = sorted(rgp_to_spots.keys(), key=lambda x: ( - x.organism.name, x.contig.name, x.ID)) + regions = sorted( + rgp_to_spots.keys(), key=lambda x: (x.organism.name, x.contig.name, x.ID) + ) for region in regions: row = { "region": region.name, - "spot_id": ';'.join(map(str, rgp_to_spots[region])) + "spot_id": ";".join(map(str, rgp_to_spots[region])), } writer.writerow(row) @@ -760,21 +1001,27 @@ def retrieve_gene_sequences_from_fasta_file(input_organism, fasta_file): for contig in input_organism.contigs: try: for gene in contig.genes: - gene.add_dna(get_dna_sequence( - contig_id2seq[contig.name], gene)) + gene.add_dna(get_dna_sequence(contig_id2seq[contig.name], gene)) for rna in contig.RNAs: rna.add_dna(get_dna_sequence(contig_id2seq[contig.name], rna)) except KeyError: - msg = f"Fasta file for input genome {input_organism.name} did not have the contig {contig.name} " \ - f"that was read from the annotation file. " - msg += f"The provided contigs in the fasta were : " \ - f"{', '.join(contig_id2seq.keys())}." + msg = ( + f"Fasta file for input genome {input_organism.name} did not have the contig {contig.name} " + f"that was read from the annotation file. " + ) + msg += ( + f"The provided contigs in the fasta were : " + f"{', '.join(contig_id2seq.keys())}." + ) raise KeyError(msg) -def manage_annotate_param(annotate_param_names: List[str], pangenome_args: argparse.Namespace, - config_file: Optional[str]) -> argparse.Namespace: +def manage_annotate_param( + annotate_param_names: List[str], + pangenome_args: argparse.Namespace, + config_file: Optional[str], +) -> argparse.Namespace: """ Manage annotate parameters by collecting them from different sources and merging them. @@ -785,14 +1032,20 @@ def manage_annotate_param(annotate_param_names: List[str], pangenome_args: argpa :return: An argparse.Namespace containing the merged annotate parameters with their values. """ - default_annotate_args = get_default_args('annotate', annotate_subparser) + default_annotate_args = get_default_args("annotate", annotate_subparser) if config_file is None: config_annotate_args = argparse.Namespace() else: config = defaultdict(dict, parse_config_file(config_file)) config_annotate_args = get_config_args( - 'annotate', annotate_subparser, config, "annotate", annotate_param_names, strict_config_check=False) + "annotate", + annotate_subparser, + config, + "annotate", + annotate_param_names, + strict_config_check=False, + ) annotate_param_from_pangenome = {} annotate_param_from_config = {} @@ -822,25 +1075,31 @@ def manage_annotate_param(annotate_param_names: List[str], pangenome_args: argpa # Log the sources of the annotate parameters if len(annotate_param_from_pangenome) > 0: - param_val_string = ' '.join( - [f'--{k} {v}' for k, v in annotate_param_from_pangenome.items()]) + param_val_string = " ".join( + [f"--{k} {v}" for k, v in annotate_param_from_pangenome.items()] + ) logging.getLogger("PPanGGOLiN").debug( f"{len(annotate_param_from_pangenome)}/{len(annotate_param_names)} annotate parameters extracted from pangenome parameters " - f"(the parameters used to build the input pangenome): {param_val_string}") + f"(the parameters used to build the input pangenome): {param_val_string}" + ) if len(annotate_param_from_config) > 0: - param_val_string = ';'.join( - [f' {k} : {v}' for k, v in annotate_param_from_config.items()]) + param_val_string = ";".join( + [f" {k} : {v}" for k, v in annotate_param_from_config.items()] + ) logging.getLogger("PPanGGOLiN").debug( f"{len(annotate_param_from_config)}/{len(annotate_param_names)} annotate parameters were not found in pangenome internal parameters." - f" They have been parsed from the annotate section in the config file: {param_val_string}") + f" They have been parsed from the annotate section in the config file: {param_val_string}" + ) if len(annotate_param_from_default) > 0: - param_val_string = ';'.join( - [f' {k} : {v}' for k, v in annotate_param_from_default.items()]) + param_val_string = ";".join( + [f" {k} : {v}" for k, v in annotate_param_from_default.items()] + ) logging.getLogger("PPanGGOLiN").debug( f"{len(annotate_param_from_default)}/{len(annotate_param_names)} annotate parameters were not found in the pangenome parameters " - f"nor in the config file. Default values have been used: {param_val_string}") + f"nor in the config file. Default values have been used: {param_val_string}" + ) return annotate_params @@ -864,8 +1123,9 @@ def check_spots_congruency(graph_spot: nx.Graph, spots: List[Spot]) -> None: # check that region in cc are the regions of a spot spot_in_cc = {rgp_to_spot[rgp] for rgp in regions_in_cc} - assert len( - spot_in_cc) == 1, "More than one spot in a connected_components. Something went wrong when recomputing spots." + assert ( + len(spot_in_cc) == 1 + ), "More than one spot in a connected_components. Something went wrong when recomputing spots." current_spot = spot_in_cc.pop() # Add spot id to the graph for node in cc: @@ -874,17 +1134,18 @@ def check_spots_congruency(graph_spot: nx.Graph, spots: List[Spot]) -> None: def predict_spots_in_input_organisms( - initial_spots: List[Spot], - initial_regions: List[Region], - input_org_2_rgps: Dict[Organism, Set[Region]], - multigenics: Set[GeneFamily], - output: Path, - write_graph_flag: bool = False, - graph_formats: List[str] = ['gexf'], - overlapping_match: int = 2, - set_size: int = 3, - exact_match: int = 1, - compress: bool = False) -> Dict[Organism, Set[Spot]]: + initial_spots: List[Spot], + initial_regions: List[Region], + input_org_2_rgps: Dict[Organism, Set[Region]], + multigenics: Set[GeneFamily], + output: Path, + write_graph_flag: bool = False, + graph_formats: List[str] = ["gexf"], + overlapping_match: int = 2, + set_size: int = 3, + exact_match: int = 1, + compress: bool = False, +) -> Dict[Organism, Set[Spot]]: """ Create a spot graph from pangenome RGP and predict spots for input organism RGPs. @@ -904,22 +1165,31 @@ def predict_spots_in_input_organisms( """ logging.getLogger("PPanGGOLiN").debug("Rebuilding original spot graph.") - graph_spot = make_spot_graph(rgps=initial_regions, multigenics=multigenics, - overlapping_match=overlapping_match, set_size=set_size, exact_match=exact_match) + graph_spot = make_spot_graph( + rgps=initial_regions, + multigenics=multigenics, + overlapping_match=overlapping_match, + set_size=set_size, + exact_match=exact_match, + ) original_nodes = set(graph_spot.nodes) # Check congruency with already computed spot and add spot id in node attributes check_spots_congruency(graph_spot, initial_spots) - new_spot_id_counter = max(s.ID for s in initial_spots) + 1 if len(initial_spots) != 0 else 1 + new_spot_id_counter = ( + max(s.ID for s in initial_spots) + 1 if len(initial_spots) != 0 else 1 + ) input_org_to_spots = {} for input_organism, rgps in input_org_2_rgps.items(): if len(rgps) == 0: - logging.getLogger('PPanGGOLiN').debug(f"{input_organism.name}: No RGPs have been found. " - "As a result, spot prediction and RGP output will be skipped.") + logging.getLogger("PPanGGOLiN").debug( + f"{input_organism.name}: No RGPs have been found. " + "As a result, spot prediction and RGP output will be skipped." + ) input_org_to_spots[input_organism] = set() continue @@ -928,14 +1198,21 @@ def predict_spots_in_input_organisms( # Copy the graph spot, as each input organism are processed independently graph_spot_cp = graph_spot.copy() - input_org_spots = predict_spot_in_one_organism(graph_spot_cp, input_org_rgps=rgps, - original_nodes=original_nodes, - new_spot_id_counter=new_spot_id_counter, multigenics=multigenics, - organism_name=input_organism.name, - output=outdir_org, write_graph_flag=write_graph_flag, - graph_formats=graph_formats, - overlapping_match=overlapping_match, set_size=set_size, - exact_match=exact_match, compress=compress) + input_org_spots = predict_spot_in_one_organism( + graph_spot_cp, + input_org_rgps=rgps, + original_nodes=original_nodes, + new_spot_id_counter=new_spot_id_counter, + multigenics=multigenics, + organism_name=input_organism.name, + output=outdir_org, + write_graph_flag=write_graph_flag, + graph_formats=graph_formats, + overlapping_match=overlapping_match, + set_size=set_size, + exact_match=exact_match, + compress=compress, + ) if len(input_org_spots) > 0: new_spot_id_counter = max(s.ID for s in input_org_spots) + 1 @@ -946,19 +1223,20 @@ def predict_spots_in_input_organisms( def predict_spot_in_one_organism( - graph_spot: nx.Graph, - input_org_rgps: List[Region], - original_nodes: Set[int], - new_spot_id_counter: int, - multigenics: Set[GeneFamily], - organism_name: str, - output: Path, - write_graph_flag: bool = False, - graph_formats: List[str] = ['gexf'], - overlapping_match: int = 2, - set_size: int = 3, - exact_match: int = 1, - compress: bool = False) -> Set[Spot]: + graph_spot: nx.Graph, + input_org_rgps: List[Region], + original_nodes: Set[int], + new_spot_id_counter: int, + multigenics: Set[GeneFamily], + organism_name: str, + output: Path, + write_graph_flag: bool = False, + graph_formats: List[str] = ["gexf"], + overlapping_match: int = 2, + set_size: int = 3, + exact_match: int = 1, + compress: bool = False, +) -> Set[Spot]: """ Predict spots for input organism RGPs. @@ -999,7 +1277,8 @@ def predict_spot_in_one_organism( f"{organism_name}: no RGPs of the input genome will be associated with any spot of insertion " "as they are on a contig border (or have " f"less than {set_size} persistent gene families until the contig border). " - "Projection of spots stops here") + "Projection of spots stops here" + ) return set() # remove node that were already in the graph @@ -1007,10 +1286,12 @@ def predict_spot_in_one_organism( logging.getLogger("PPanGGOLiN").debug( f"{organism_name}: {lost} RGPs were not used as they are on a contig border (or have" - f"less than {set_size} persistent gene families until the contig border)") + f"less than {set_size} persistent gene families until the contig border)" + ) logging.getLogger("PPanGGOLiN").debug( - f"{organism_name}: {used} RGPs of the input genome will be associated to a spot of insertion") + f"{organism_name}: {used} RGPs of the input genome will be associated to a spot of insertion" + ) # add potential edges from new nodes to the rest of the nodes all_nodes = list(graph_spot.nodes) @@ -1020,9 +1301,13 @@ def predict_spot_in_one_organism( continue node_obj_i = graph_spot.nodes[nodei] node_obj_j = graph_spot.nodes[nodej] - if check_sim([node_obj_i["border0"], node_obj_i["border1"]], - [node_obj_j["border0"], node_obj_j["border1"]], - overlapping_match, set_size, exact_match): + if check_sim( + [node_obj_i["border0"], node_obj_i["border1"]], + [node_obj_j["border0"], node_obj_j["border1"]], + overlapping_match, + set_size, + exact_match, + ): graph_spot.add_edge(nodei, nodej) input_rgp_to_spots = {} @@ -1049,8 +1334,10 @@ def predict_spot_in_one_organism( elif len(spots_of_the_cc) > 1: # more than one spot in the cc - logging.getLogger("PPanGGOLiN").debug(f'{organism_name}: Some RGPs of the input genome ' - f"are connected to {len(spots_of_the_cc)} original spots of the pangenome.") + logging.getLogger("PPanGGOLiN").debug( + f"{organism_name}: Some RGPs of the input genome " + f"are connected to {len(spots_of_the_cc)} original spots of the pangenome." + ) input_rgps_of_the_cc = set() for node in comp: @@ -1060,8 +1347,9 @@ def predict_spot_in_one_organism( if write_graph_flag: graph_spot.nodes[node]["spots"] = spots_of_the_cc - graph_spot.nodes[node]["spot_id"] = ';'.join( - str(spot) for spot in spots_of_the_cc) + graph_spot.nodes[node]["spot_id"] = ";".join( + str(spot) for spot in spots_of_the_cc + ) graph_spot.nodes[node]["includes_RGPs_from_the_input_genome"] = True for spot in spots_of_the_cc: @@ -1069,35 +1357,46 @@ def predict_spot_in_one_organism( spot.add(region) input_rgp_to_spots.update( - {rgp: spots_of_the_cc for rgp in input_rgps_of_the_cc}) + {rgp: spots_of_the_cc for rgp in input_rgps_of_the_cc} + ) if write_graph_flag: # remove node that would not be writable in graph file for node in graph_spot.nodes: del graph_spot.nodes[node]["spots"] - write_spot_graph(graph_spot, output, graph_formats, - file_basename='projected_spotGraph') + write_spot_graph( + graph_spot, output, graph_formats, file_basename="projected_spotGraph" + ) - write_rgp_to_spot_table(input_rgp_to_spots, output=output, - filename='input_genome_rgp_to_spot.tsv', compress=compress) + write_rgp_to_spot_table( + input_rgp_to_spots, + output=output, + filename="input_genome_rgp_to_spot.tsv", + compress=compress, + ) - input_org_spots = {spot for spots in input_rgp_to_spots.values() - for spot in spots} + input_org_spots = {spot for spots in input_rgp_to_spots.values() for spot in spots} new_spots = {spot for spot in input_org_spots if isinstance(spot, NewSpot)} - logging.getLogger('PPanGGOLiN').debug( - f'{organism_name}: {len(new_spots)} new spots have been created for the input genome.') + logging.getLogger("PPanGGOLiN").debug( + f"{organism_name}: {len(new_spots)} new spots have been created for the input genome." + ) if new_spots: - summarize_spots(new_spots, output, compress=compress, - file_name="new_spots_summary.tsv") + summarize_spots( + new_spots, output, compress=compress, file_name="new_spots_summary.tsv" + ) return input_org_spots -def project_and_write_modules(pangenome: Pangenome, input_organisms: Iterable[Organism], - output: Path, compress: bool = False): +def project_and_write_modules( + pangenome: Pangenome, + input_organisms: Iterable[Organism], + output: Path, + compress: bool = False, +): """ Write a tsv file providing association between modules and the input organism @@ -1118,29 +1417,38 @@ def project_and_write_modules(pangenome: Pangenome, input_organisms: Iterable[Or for mod in pangenome.modules: module_in_input_organism = any( - fam in input_organism_families for fam in mod.families) + fam in input_organism_families for fam in mod.families + ) if module_in_input_organism: counter += 1 modules_in_input_org.append(mod) completion = round( - len(set(input_organism.families) & set(mod.families)) / len(set(mod.families)), 2) + len(set(input_organism.families) & set(mod.families)) + / len(set(mod.families)), + 2, + ) fout.write( - f"module_{mod.ID}\t{input_organism.name}\t{completion}\n") + f"module_{mod.ID}\t{input_organism.name}\t{completion}\n" + ) - logging.getLogger('PPanGGOLiN').debug( - f"{input_organism.name}: {counter} modules have been projected to the input genomes.") + logging.getLogger("PPanGGOLiN").debug( + f"{input_organism.name}: {counter} modules have been projected to the input genomes." + ) - logging.getLogger('PPanGGOLiN').debug( - f"{input_organism.name}: Projected modules have been written in: '{output_file}'") + logging.getLogger("PPanGGOLiN").debug( + f"{input_organism.name}: Projected modules have been written in: '{output_file}'" + ) input_orgs_to_modules[input_organism] = modules_in_input_org return input_orgs_to_modules -def infer_input_mode(input_file: Path, expected_types: List[str], parser: argparse.ArgumentParser) -> str: +def infer_input_mode( + input_file: Path, expected_types: List[str], parser: argparse.ArgumentParser +) -> str: """ Determine the input mode based on the provided input file and expected file types. @@ -1156,25 +1464,33 @@ def infer_input_mode(input_file: Path, expected_types: List[str], parser: argpar filetype = detect_filetype(input_file) except Exception: parser.error( - "Based on its content, the provided file is not recognized as a valid input file. Please ensure it is in one of the supported formats (FASTA, GFF/GBFF, or TSV).") + "Based on its content, the provided file is not recognized as a valid input file. Please ensure it is in one of the supported formats (FASTA, GFF/GBFF, or TSV)." + ) if filetype == "tsv": - logging.getLogger('PPanGGOLiN').debug(f"The provided file ({input_file}) is detected as a TSV file.") + logging.getLogger("PPanGGOLiN").debug( + f"The provided file ({input_file}) is detected as a TSV file." + ) mode = "multiple" elif filetype in expected_types: - logging.getLogger('PPanGGOLiN').debug( - f"The provided file ({input_file}) is detected as a single {'/'.join(expected_types)} file.") + logging.getLogger("PPanGGOLiN").debug( + f"The provided file ({input_file}) is detected as a single {'/'.join(expected_types)} file." + ) mode = "single" else: - logging.getLogger('PPanGGOLiN').error( - f"The provided file {input_file} is not recognized as a valid {'/'.join(expected_types)} file or a TSV file listing names and {'/'.join(expected_types)} files of genomes to annotate.") + logging.getLogger("PPanGGOLiN").error( + f"The provided file {input_file} is not recognized as a valid {'/'.join(expected_types)} file or a TSV file listing names and {'/'.join(expected_types)} files of genomes to annotate." + ) parser.error( - f"The provided file {input_file} is not recognized as a valid {'/'.join(expected_types)} file or a TSV file listing names and files of genomes to annotate.") + f"The provided file {input_file} is not recognized as a valid {'/'.join(expected_types)} file or a TSV file listing names and files of genomes to annotate." + ) return mode -def check_projection_arguments(args: argparse.Namespace, parser: argparse.ArgumentParser) -> str: +def check_projection_arguments( + args: argparse.Namespace, parser: argparse.ArgumentParser +) -> str: """ Check the arguments provided for genome projection and raise errors if they are incompatible or missing. @@ -1188,32 +1504,38 @@ def check_projection_arguments(args: argparse.Namespace, parser: argparse.Argume parser.error( "Please provide either a FASTA file or a tab-separated file listing sequence files using the '--fasta' option, " "or an annotation file or a tab-separated file listing annotation files using the '--anno' option. " - "You can specify these either through the command line or the configuration file.") + "You can specify these either through the command line or the configuration file." + ) mode_from_fasta, mode_from_anno = None, None if args.fasta: - mode_from_fasta = infer_input_mode(args.fasta, ['fasta'], parser) + mode_from_fasta = infer_input_mode(args.fasta, ["fasta"], parser) input_mode = mode_from_fasta if args.anno: - mode_from_anno = infer_input_mode(args.anno, ['gff', "gbff"], parser) + mode_from_anno = infer_input_mode(args.anno, ["gff", "gbff"], parser) input_mode = mode_from_anno - logging.getLogger('PPanGGOLiN').debug("") + logging.getLogger("PPanGGOLiN").debug("") if mode_from_fasta and mode_from_anno and mode_from_fasta != mode_from_anno: - single_input, multiple_input = ("fasta", "anno") if mode_from_fasta == "single" else ("anno", "fasta") + single_input, multiple_input = ( + ("fasta", "anno") if mode_from_fasta == "single" else ("anno", "fasta") + ) parser.error( f"You've provided both a single annotation/fasta file using the '--{single_input}' option and a list of files using " - f"the '--{multiple_input}' option. Please choose either a single file or a tab-separated file listing genome files, but not both.") + f"the '--{multiple_input}' option. Please choose either a single file or a tab-separated file listing genome files, but not both." + ) if input_mode == "multiple": # We are in paths file mode if args.circular_contigs: - parser.error("You provided a TSV file listing the files of genomes you wish to annotate. " - "Therefore, the argument '--circular_contigs' is incompatible with this multiple genomes file.") + parser.error( + "You provided a TSV file listing the files of genomes you wish to annotate. " + "Therefore, the argument '--circular_contigs' is incompatible with this multiple genomes file." + ) if args.fasta: check_input_files(args.fasta, True) @@ -1239,86 +1561,134 @@ def launch(args: argparse.Namespace): pangenome = Pangenome() pangenome.add_file(args.pangenome) - predict_rgp, project_spots, project_modules = check_pangenome_for_projection(pangenome, args.fast) + predict_rgp, project_spots, project_modules = check_pangenome_for_projection( + pangenome, args.fast + ) need_graph = True if args.table else False - check_pangenome_info(pangenome, need_annotations=True, need_families=True, disable_bar=args.disable_prog_bar, - need_rgp=predict_rgp, need_modules=project_modules, need_gene_sequences=False, - need_spots=project_spots, need_graph=need_graph, need_metadata=True) + check_pangenome_info( + pangenome, + need_annotations=True, + need_families=True, + disable_bar=args.disable_prog_bar, + need_rgp=predict_rgp, + need_modules=project_modules, + need_gene_sequences=False, + need_spots=project_spots, + need_graph=need_graph, + need_metadata=True, + ) - logging.getLogger('PPanGGOLiN').info('Retrieving parameters from the provided pangenome file.') + logging.getLogger("PPanGGOLiN").info( + "Retrieving parameters from the provided pangenome file." + ) pangenome_params = argparse.Namespace( - **{step: argparse.Namespace(**k_v) for step, k_v in pangenome.parameters.items()}) + **{ + step: argparse.Namespace(**k_v) + for step, k_v in pangenome.parameters.items() + } + ) if predict_rgp: # computing multigenics for rgp prediction first to have original family.number_of_genomes # and the same multigenics list as when rgp and spot were predicted multigenics = pangenome.get_multigenics(pangenome_params.rgp.dup_margin) - organisms, genome_name_to_path, input_type = manage_input_genomes_annotation(pangenome=pangenome, - input_mode=args.input_mode, - anno=args.anno, fasta=args.fasta, - organism_name=args.genome_name, - circular_contigs=args.circular_contigs, - pangenome_params=pangenome_params, - cpu=args.cpu, - use_pseudo=args.use_pseudo, - disable_bar=args.disable_prog_bar, - tmpdir=args.tmpdir, config=args.config) - - input_org_to_lonely_genes_count = annotate_input_genes_with_pangenome_families(pangenome, input_organisms=organisms, - output=output_dir, cpu=args.cpu, - use_representatives=args.fast, - no_defrag=args.no_defrag, - identity=args.identity, - coverage=args.coverage, - tmpdir=args.tmpdir, - translation_table=int( - pangenome_params.cluster.translation_table), - keep_tmp=args.keep_tmp, - disable_bar=args.disable_prog_bar) + organisms, genome_name_to_path, input_type = manage_input_genomes_annotation( + pangenome=pangenome, + input_mode=args.input_mode, + anno=args.anno, + fasta=args.fasta, + organism_name=args.genome_name, + circular_contigs=args.circular_contigs, + pangenome_params=pangenome_params, + cpu=args.cpu, + use_pseudo=args.use_pseudo, + disable_bar=args.disable_prog_bar, + tmpdir=args.tmpdir, + config=args.config, + ) + + input_org_to_lonely_genes_count = annotate_input_genes_with_pangenome_families( + pangenome, + input_organisms=organisms, + output=output_dir, + cpu=args.cpu, + use_representatives=args.fast, + no_defrag=args.no_defrag, + identity=args.identity, + coverage=args.coverage, + tmpdir=args.tmpdir, + translation_table=int(pangenome_params.cluster.translation_table), + keep_tmp=args.keep_tmp, + disable_bar=args.disable_prog_bar, + ) input_org_2_rgps, input_org_to_spots, input_orgs_to_modules = {}, {}, {} if predict_rgp: - logging.getLogger('PPanGGOLiN').info('Detecting RGPs in input genomes.') - - input_org_2_rgps = predict_RGP(pangenome, organisms, persistent_penalty=pangenome_params.rgp.persistent_penalty, - variable_gain=pangenome_params.rgp.variable_gain, - min_length=pangenome_params.rgp.min_length, - min_score=pangenome_params.rgp.min_score, multigenics=multigenics, - output_dir=output_dir, - disable_bar=args.disable_prog_bar, compress=args.compress) + logging.getLogger("PPanGGOLiN").info("Detecting RGPs in input genomes.") + + input_org_2_rgps = predict_RGP( + pangenome, + organisms, + persistent_penalty=pangenome_params.rgp.persistent_penalty, + variable_gain=pangenome_params.rgp.variable_gain, + min_length=pangenome_params.rgp.min_length, + min_score=pangenome_params.rgp.min_score, + multigenics=multigenics, + output_dir=output_dir, + disable_bar=args.disable_prog_bar, + compress=args.compress, + ) if project_spots: - logging.getLogger('PPanGGOLiN').info('Predicting spot of insertion in input genomes.') - input_org_to_spots = predict_spots_in_input_organisms(initial_spots=list(pangenome.spots), - initial_regions=pangenome.regions, - input_org_2_rgps=input_org_2_rgps, - multigenics=multigenics, - output=output_dir, - write_graph_flag=args.spot_graph, - graph_formats=args.graph_formats, - overlapping_match=pangenome_params.spot.overlapping_match, - set_size=pangenome_params.spot.set_size, - exact_match=pangenome_params.spot.exact_match_size, - compress=args.compress) + logging.getLogger("PPanGGOLiN").info( + "Predicting spot of insertion in input genomes." + ) + input_org_to_spots = predict_spots_in_input_organisms( + initial_spots=list(pangenome.spots), + initial_regions=pangenome.regions, + input_org_2_rgps=input_org_2_rgps, + multigenics=multigenics, + output=output_dir, + write_graph_flag=args.spot_graph, + graph_formats=args.graph_formats, + overlapping_match=pangenome_params.spot.overlapping_match, + set_size=pangenome_params.spot.set_size, + exact_match=pangenome_params.spot.exact_match_size, + compress=args.compress, + ) if project_modules: - input_orgs_to_modules = project_and_write_modules(pangenome, organisms, output_dir, compress=args.compress) + input_orgs_to_modules = project_and_write_modules( + pangenome, organisms, output_dir, compress=args.compress + ) - write_projection_results(pangenome, organisms, input_org_2_rgps, - input_org_to_spots, - input_orgs_to_modules, - input_org_to_lonely_genes_count, - write_proksee=args.proksee, write_gff=args.gff, write_table=args.table, - add_sequences=args.add_sequences, - genome_name_to_path=genome_name_to_path, input_type=input_type, - output_dir=output_dir, dup_margin=args.dup_margin, soft_core=args.soft_core, - metadata_sep=args.metadata_sep, compress=args.compress, - need_modules=project_modules, need_spots=project_spots, need_regions=predict_rgp) + write_projection_results( + pangenome, + organisms, + input_org_2_rgps, + input_org_to_spots, + input_orgs_to_modules, + input_org_to_lonely_genes_count, + write_proksee=args.proksee, + write_gff=args.gff, + write_table=args.table, + add_sequences=args.add_sequences, + genome_name_to_path=genome_name_to_path, + input_type=input_type, + output_dir=output_dir, + dup_margin=args.dup_margin, + soft_core=args.soft_core, + metadata_sep=args.metadata_sep, + compress=args.compress, + need_modules=project_modules, + need_spots=project_spots, + need_regions=predict_rgp, + ) def subparser(sub_parser: argparse._SubParsersAction) -> argparse.ArgumentParser: @@ -1330,7 +1700,8 @@ def subparser(sub_parser: argparse._SubParsersAction) -> argparse.ArgumentParser :return : parser arguments for projection command """ parser = sub_parser.add_parser( - "projection", formatter_class=argparse.RawTextHelpFormatter) + "projection", formatter_class=argparse.RawTextHelpFormatter + ) parser_projection(parser) return parser @@ -1343,108 +1714,222 @@ def parser_projection(parser: argparse.ArgumentParser): """ required = parser.add_argument_group(title="Required arguments") - required.add_argument('-p', '--pangenome', required=False, - type=Path, help="The pangenome.h5 file") + required.add_argument( + "-p", "--pangenome", required=False, type=Path, help="The pangenome.h5 file" + ) - required.add_argument('--fasta', required=False, type=Path, - help="Specify a FASTA file containing the genomic sequences of the genome(s) you wish to annotate, " - "or provide a tab-separated file listing genome names alongside their respective FASTA filepaths, with one line per genome.") + required.add_argument( + "--fasta", + required=False, + type=Path, + help="Specify a FASTA file containing the genomic sequences of the genome(s) you wish to annotate, " + "or provide a tab-separated file listing genome names alongside their respective FASTA filepaths, with one line per genome.", + ) - required.add_argument('--anno', required=False, type=Path, - help="Specify an annotation file in GFF/GBFF format for the genome you wish to annotate. " - "Alternatively, you can provide a tab-separated file listing genome names alongside their respective annotation filepaths, " - "with one line per genome. If both an annotation file and a FASTA file are provided, the annotation file will take precedence.") + required.add_argument( + "--anno", + required=False, + type=Path, + help="Specify an annotation file in GFF/GBFF format for the genome you wish to annotate. " + "Alternatively, you can provide a tab-separated file listing genome names alongside their respective annotation filepaths, " + "with one line per genome. If both an annotation file and a FASTA file are provided, the annotation file will take precedence.", + ) - required_single = parser.add_argument_group(title="Single Genome Arguments", - description="Use these options when providing a single FASTA or annotation file:") + required_single = parser.add_argument_group( + title="Single Genome Arguments", + description="Use these options when providing a single FASTA or annotation file:", + ) - required_single.add_argument("-n", '--genome_name', required=False, type=str, default="input_genome", - help="Specify the name of the genome whose genome you want to annotate when providing a single FASTA or annotation file.") + required_single.add_argument( + "-n", + "--genome_name", + required=False, + type=str, + default="input_genome", + help="Specify the name of the genome whose genome you want to annotate when providing a single FASTA or annotation file.", + ) - required_single.add_argument('--circular_contigs', nargs="+", required=False, type=tuple, - help="Specify the contigs of the input genome that should be treated as circular when providing a single FASTA or annotation file.") + required_single.add_argument( + "--circular_contigs", + nargs="+", + required=False, + type=tuple, + help="Specify the contigs of the input genome that should be treated as circular when providing a single FASTA or annotation file.", + ) optional = parser.add_argument_group(title="Optional arguments") - optional.add_argument('-o', '--output', required=False, type=Path, - default="ppanggolin_projection" + time.strftime("_DATE%Y-%m-%d_HOUR%H.%M.%S", - time.localtime()) + "_PID" + str(os.getpid()), - help="Output directory") + optional.add_argument( + "-o", + "--output", + required=False, + type=Path, + default="ppanggolin_projection" + + time.strftime("_DATE%Y-%m-%d_HOUR%H.%M.%S", time.localtime()) + + "_PID" + + str(os.getpid()), + help="Output directory", + ) - optional.add_argument('--no_defrag', required=False, action="store_true", - help="DO NOT Realign gene families to link fragments with " - "their non-fragmented gene family. (default: False)") + optional.add_argument( + "--no_defrag", + required=False, + action="store_true", + help="DO NOT Realign gene families to link fragments with " + "their non-fragmented gene family. (default: False)", + ) - optional.add_argument("--fast", required=False, action="store_true", - help="Use representative sequences of gene families for input gene alignment. " - "This option is faster but may be less sensitive. By default, all pangenome genes are used.") + optional.add_argument( + "--fast", + required=False, + action="store_true", + help="Use representative sequences of gene families for input gene alignment. " + "This option is faster but may be less sensitive. By default, all pangenome genes are used.", + ) - optional.add_argument('--identity', required=False, type=restricted_float, default=0.8, - help="min identity percentage threshold") + optional.add_argument( + "--identity", + required=False, + type=restricted_float, + default=0.8, + help="min identity percentage threshold", + ) - optional.add_argument('--coverage', required=False, type=restricted_float, default=0.8, - help="min coverage percentage threshold") + optional.add_argument( + "--coverage", + required=False, + type=restricted_float, + default=0.8, + help="min coverage percentage threshold", + ) - optional.add_argument("--use_pseudo", required=False, action="store_true", - help="In the context of provided annotation, use this option to read pseudogenes. " - "(Default behavior is to ignore them)") + optional.add_argument( + "--use_pseudo", + required=False, + action="store_true", + help="In the context of provided annotation, use this option to read pseudogenes. " + "(Default behavior is to ignore them)", + ) - optional.add_argument("--dup_margin", required=False, type=restricted_float, default=0.05, - help="minimum ratio of genomes in which the family must have multiple genes " - "for it to be considered 'duplicated'. " - "This metric is used to compute completeness and duplication of the input genomes") + optional.add_argument( + "--dup_margin", + required=False, + type=restricted_float, + default=0.05, + help="minimum ratio of genomes in which the family must have multiple genes " + "for it to be considered 'duplicated'. " + "This metric is used to compute completeness and duplication of the input genomes", + ) - optional.add_argument("--soft_core", required=False, type=restricted_float, default=0.95, - help="Soft core threshold used when generating general statistics on the projected genome. " - "This threshold does not influence PPanGGOLiN's partitioning. " - "The value determines the minimum fraction of genomes that must possess a gene family " - "for it to be considered part of the soft core.") + optional.add_argument( + "--soft_core", + required=False, + type=restricted_float, + default=0.95, + help="Soft core threshold used when generating general statistics on the projected genome. " + "This threshold does not influence PPanGGOLiN's partitioning. " + "The value determines the minimum fraction of genomes that must possess a gene family " + "for it to be considered part of the soft core.", + ) - optional.add_argument("--spot_graph", required=False, action="store_true", - help="Write the spot graph to a file, with pairs of blocks of single copy markers flanking RGPs " - "as nodes. This graph can be used to visualize nodes that have RGPs from the input genome.") + optional.add_argument( + "--spot_graph", + required=False, + action="store_true", + help="Write the spot graph to a file, with pairs of blocks of single copy markers flanking RGPs " + "as nodes. This graph can be used to visualize nodes that have RGPs from the input genome.", + ) - optional.add_argument('--graph_formats', required=False, type=str, choices=['gexf', "graphml"], nargs="+", - default=['gexf'], help="Format of the output graph.") + optional.add_argument( + "--graph_formats", + required=False, + type=str, + choices=["gexf", "graphml"], + nargs="+", + default=["gexf"], + help="Format of the output graph.", + ) - optional.add_argument("--gff", required=False, action="store_true", - help="Generate GFF files with projected pangenome annotations for each input genome.") + optional.add_argument( + "--gff", + required=False, + action="store_true", + help="Generate GFF files with projected pangenome annotations for each input genome.", + ) - optional.add_argument("--proksee", required=False, action="store_true", - help="Generate JSON map files for PROKSEE with projected pangenome annotations for each input genome.") + optional.add_argument( + "--proksee", + required=False, + action="store_true", + help="Generate JSON map files for PROKSEE with projected pangenome annotations for each input genome.", + ) - optional.add_argument("--table", required=False, action="store_true", - help="Generate a tsv file for each input genome with pangenome annotations.") + optional.add_argument( + "--table", + required=False, + action="store_true", + help="Generate a tsv file for each input genome with pangenome annotations.", + ) - optional.add_argument("--compress", required=False, action="store_true", - help="Compress the files in .gz") + optional.add_argument( + "--compress", + required=False, + action="store_true", + help="Compress the files in .gz", + ) - optional.add_argument("--add_sequences", required=False, action="store_true", - help="Include input genome DNA sequences in GFF and Proksee output.") + optional.add_argument( + "--add_sequences", + required=False, + action="store_true", + help="Include input genome DNA sequences in GFF and Proksee output.", + ) - optional.add_argument("-c", "--cpu", required=False, - default=1, type=int, help="Number of available cpus") + optional.add_argument( + "-c", + "--cpu", + required=False, + default=1, + type=int, + help="Number of available cpus", + ) - optional.add_argument("--tmpdir", required=False, type=Path, default=Path(tempfile.gettempdir()), - help="directory for storing temporary files") + optional.add_argument( + "--tmpdir", + required=False, + type=Path, + default=Path(tempfile.gettempdir()), + help="directory for storing temporary files", + ) - optional.add_argument("--keep_tmp", required=False, default=False, action="store_true", - help="Keeping temporary files (useful for debugging).") + optional.add_argument( + "--keep_tmp", + required=False, + default=False, + action="store_true", + help="Keeping temporary files (useful for debugging).", + ) - optional.add_argument("--add_metadata", - required=False, - action="store_true", - help="Include metadata information in the output files " - "if any have been added to pangenome elements (see ppanggolin metadata command).") + optional.add_argument( + "--add_metadata", + required=False, + action="store_true", + help="Include metadata information in the output files " + "if any have been added to pangenome elements (see ppanggolin metadata command).", + ) - optional.add_argument("--metadata_sources", - default=None, - nargs="+", - help="Which source of metadata should be written. " - "By default all metadata sources are included.") + optional.add_argument( + "--metadata_sources", + default=None, + nargs="+", + help="Which source of metadata should be written. " + "By default all metadata sources are included.", + ) - optional.add_argument("--metadata_sep", - required=False, - default='|', - help="The separator used to join multiple metadata values for elements with multiple metadata" - " values from the same source. This character should not appear in metadata values.") + optional.add_argument( + "--metadata_sep", + required=False, + default="|", + help="The separator used to join multiple metadata values for elements with multiple metadata" + " values from the same source. This character should not appear in metadata values.", + ) diff --git a/ppanggolin/region.py b/ppanggolin/region.py index 504cb842..e2589e13 100644 --- a/ppanggolin/region.py +++ b/ppanggolin/region.py @@ -13,7 +13,11 @@ from ppanggolin.genome import Gene, Organism, Contig from ppanggolin.geneFamily import GeneFamily from ppanggolin.metadata import MetaFeatures -from ppanggolin.utils import find_region_border_position, get_consecutive_region_positions +from ppanggolin.utils import ( + find_region_border_position, + get_consecutive_region_positions, +) + class Region(MetaFeatures): """ @@ -36,6 +40,7 @@ class Region(MetaFeatures): - 'Starter': the first gene in the region. - 'stopper': the last gene in the region. """ + id_counter = 0 def __init__(self, name: str): @@ -55,7 +60,7 @@ def __init__(self, name: str): self._organism = None self.ID = Region.id_counter self._spot = None - self.projected = False # If the rgp is from a projected genome. If true can have multiple spots + self.projected = False # If the rgp is from a projected genome. If true can have multiple spots Region.id_counter += 1 def __str__(self): @@ -68,8 +73,7 @@ def __repr__(self) -> str: return f"RGP name:{self.name}" def __hash__(self) -> int: - """Create a hash value for the region - """ + """Create a hash value for the region""" return id(self) def __lt__(self, obj): @@ -89,16 +93,21 @@ def __eq__(self, other: Region) -> bool: :raises TypeError: Try to compare a region with another type object """ if not isinstance(other, Region): - raise TypeError(f"'Region' type object was expected, but '{type(other)}' type object was provided.") - if [gene.family for gene in self.genes] == [gene.family for gene in other.genes]: + raise TypeError( + f"'Region' type object was expected, but '{type(other)}' type object was provided." + ) + if [gene.family for gene in self.genes] == [ + gene.family for gene in other.genes + ]: return True - if [gene.family for gene in self.genes] == [gene.family for gene in list(other.genes)[::-1]]: + if [gene.family for gene in self.genes] == [ + gene.family for gene in list(other.genes)[::-1] + ]: return True return False def __len__(self) -> int: - """Get the number of genes in the region - """ + """Get the number of genes in the region""" return len(self._genes_getter) def __setitem__(self, position: int, gene: Gene): @@ -114,7 +123,9 @@ def __setitem__(self, position: int, gene: Gene): """ if position != gene.position: - raise ValueError(f"The given gene position ({position}) to set the gene in the region and the position of the gene ({gene.position}) are different. ") + raise ValueError( + f"The given gene position ({position}) to set the gene in the region and the position of the gene ({gene.position}) are different. " + ) if len(self) == 0: # first gene to be added to the region @@ -123,11 +134,15 @@ def __setitem__(self, position: int, gene: Gene): if len(self) > 0: if gene.organism != self.organism: - raise ValueError(f"Gene {gene.name} is from a different genome than the first defined in RGP. " - "That's not possible") + raise ValueError( + f"Gene {gene.name} is from a different genome than the first defined in RGP. " + "That's not possible" + ) if gene.contig != self.contig: - raise ValueError(f"Gene {gene.name} is from a different contig than the first defined in RGP. " - "That's not possible") + raise ValueError( + f"Gene {gene.name} is from a different contig than the first defined in RGP. " + "That's not possible" + ) if position in self._genes_getter and self[position] != gene: raise KeyError("Another gene already exist at this position") self._genes_getter[position] = gene @@ -142,18 +157,21 @@ def __setitem__(self, position: int, gene: Gene): def identify_rgp_last_and_first_genes(self): """ - Identify first and last genes of the rgp by taking into account the circularity of contigs. + Identify first and last genes of the rgp by taking into account the circularity of contigs. Set the attributes _starter: first gene of the region and _stopper: last gene of the region and _coordinates """ - rgp_genes_positions = list(self._genes_getter.keys() ) + rgp_genes_positions = list(self._genes_getter.keys()) if len(rgp_genes_positions) == 0: - raise ValueError(f'RGP ({self.name}) has no gene associated.') + raise ValueError(f"RGP ({self.name}) has no gene associated.") - gene = self._genes_getter[rgp_genes_positions[0]] # get a gene of the region - first_gene_position, last_gene_position = find_region_border_position(region_positions=rgp_genes_positions, contig_gene_count=gene.contig.number_of_genes) + gene = self._genes_getter[rgp_genes_positions[0]] # get a gene of the region + first_gene_position, last_gene_position = find_region_border_position( + region_positions=rgp_genes_positions, + contig_gene_count=gene.contig.number_of_genes, + ) self._starter = self._genes_getter[first_gene_position] self._stopper = self._genes_getter[last_gene_position] @@ -161,11 +179,16 @@ def identify_rgp_last_and_first_genes(self): if self._starter.start > self._stopper.stop: # this means region is overlapping the contig edge if not gene.contig.is_circular: - raise ValueError(f'Region seems to be overlapping the contig (first gene {self._starter.position}:{self._starter.coordinates} ' - f'and last gene {self._stopper.position}:{self._stopper.coordinates} ) ' - f'but the contig is not circular. This is unexpected. {rgp_genes_positions}') - - self._coordinates = [(self._starter.start, self._starter.contig.length), (1, self._stopper.stop)] + raise ValueError( + f"Region seems to be overlapping the contig (first gene {self._starter.position}:{self._starter.coordinates} " + f"and last gene {self._stopper.position}:{self._stopper.coordinates} ) " + f"but the contig is not circular. This is unexpected. {rgp_genes_positions}" + ) + + self._coordinates = [ + (self._starter.start, self._starter.contig.length), + (1, self._stopper.stop), + ] self._overlaps_contig_edge = True else: self._coordinates = [(self._starter.start, self._stopper.stop)] @@ -178,17 +201,23 @@ def get_ordered_genes(self) -> List[Gene]: :return: A list of genes ordered by their positions in the region. """ - rgp_genes_positions = list(self._genes_getter.keys() ) + rgp_genes_positions = list(self._genes_getter.keys()) - gene = self._genes_getter[rgp_genes_positions[0]] # get a gene of the region + gene = self._genes_getter[rgp_genes_positions[0]] # get a gene of the region - consecutive_region_positions = get_consecutive_region_positions(region_positions=rgp_genes_positions, contig_gene_count=gene.contig.number_of_genes) + consecutive_region_positions = get_consecutive_region_positions( + region_positions=rgp_genes_positions, + contig_gene_count=gene.contig.number_of_genes, + ) - ordered_genes = [self._genes_getter[position] for ordered_positions in consecutive_region_positions for position in ordered_positions] + ordered_genes = [ + self._genes_getter[position] + for ordered_positions in consecutive_region_positions + for position in ordered_positions + ] return ordered_genes - def __getitem__(self, position: int) -> Gene: """Get the gene at the given position @@ -201,7 +230,9 @@ def __getitem__(self, position: int) -> Gene: try: gene = self._genes_getter[position] except KeyError: - raise KeyError(f"There is no gene at position {position} in RGP {self.name}") + raise KeyError( + f"There is no gene at position {position} in RGP {self.name}" + ) else: return gene @@ -240,7 +271,7 @@ def string_coordinates(self) -> str: """ Return a string representation of the coordinates """ - return ','.join([f'{start}..{stop}' for start, stop in self.coordinates]) + return ",".join([f"{start}..{stop}" for start, stop in self.coordinates]) @property def overlaps_contig_edge(self) -> bool: @@ -255,7 +286,7 @@ def spot(self) -> Union[Spot, None]: @spot.setter def spot(self, spot: Spot): """Sets the spot of the RGP - + :param spot: spot to which the RGP is added :raise TypeError: if the given spot is not a Spot. @@ -263,7 +294,9 @@ def spot(self, spot: Spot): if isinstance(spot, Spot): self._spot = spot # only 1 spot possible else: - raise TypeError(f"Unexpected class / type for {type(spot)} when adding spot to a RGP") + raise TypeError( + f"Unexpected class / type for {type(spot)} when adding spot to a RGP" + ) def __delitem__(self, position): """Remove the gene at the given position @@ -274,7 +307,9 @@ def __delitem__(self, position): try: del self._genes_getter[position] except KeyError: - raise KeyError(f"There is no gene at position {position} in RGP {self.name}") + raise KeyError( + f"There is no gene at position {position} in RGP {self.name}" + ) def add(self, gene: Gene): """Add a gene to the region @@ -282,10 +317,12 @@ def add(self, gene: Gene): :param gene: Gene to add """ if not isinstance(gene, Gene): - raise TypeError(f"Unexpected class / type for {type(gene)} " - f"when adding it to a region of genomic plasticity") + raise TypeError( + f"Unexpected class / type for {type(gene)} " + f"when adding it to a region of genomic plasticity" + ) if gene.position is None: - raise AttributeError(f'Gene {gene.name} is not fill with position') + raise AttributeError(f"Gene {gene.name} is not fill with position") self[gene.position] = gene def get(self, position: int) -> Gene: @@ -298,7 +335,9 @@ def get(self, position: int) -> Gene: :raises TypeError: Position is not an integer """ if not isinstance(position, int): - raise TypeError(f"Position to get gene must be an integer. The provided type was {type(position)}") + raise TypeError( + f"Position to get gene must be an integer. The provided type was {type(position)}" + ) return self[position] def remove(self, position): @@ -309,7 +348,9 @@ def remove(self, position): :raises TypeError: Position is not an integer """ if not isinstance(position, int): - raise TypeError(f"Position to get gene must be an integer. The provided type was {type(position)}") + raise TypeError( + f"Position to get gene must be an integer. The provided type was {type(position)}" + ) del self[position] @property @@ -335,7 +376,9 @@ def modules(self) -> Set[Module]: :return: Modules found in families of the RGP """ - modules = {family.module for family in self.families if family.module is not None} + modules = { + family.module for family in self.families if family.module is not None + } return modules @property @@ -352,11 +395,11 @@ def length(self): :return: Size of the region """ - return sum([(stop - start +1) for start, stop in self.coordinates]) + return sum([(stop - start + 1) for start, stop in self.coordinates]) @property def organism(self) -> Organism: - """ Get the Organism link to RGP + """Get the Organism link to RGP :return: Organism corresponding to the region """ @@ -364,7 +407,7 @@ def organism(self) -> Organism: @property def contig(self) -> Contig: - """ Get the starter contig link to RGP + """Get the starter contig link to RGP :return: Contig corresponding to the region """ @@ -372,7 +415,7 @@ def contig(self) -> Contig: @property def start(self) -> int: - """ + """ Get the starter start link to RGP :return: start position in the contig of the first gene of the RGP @@ -381,7 +424,7 @@ def start(self) -> int: @property def stop(self) -> int: - """ + """ Get the stopper stop link to RGP :return: start position in the contig of the last gene of the RGP @@ -394,7 +437,10 @@ def is_whole_contig(self) -> bool: :return: True if whole contig else False """ - if self.starter.position == 0 and self.stopper.position == self.contig.number_of_genes - 1: + if ( + self.starter.position == 0 + and self.stopper.position == self.contig.number_of_genes - 1 + ): return True return False @@ -416,16 +462,18 @@ def is_contig_border(self) -> bool: return True return False - def get_bordering_genes(self, n: int, multigenics: Set[GeneFamily], return_only_persistents:bool = True) -> List[List[Gene], List[Gene]]: - """ + def get_bordering_genes( + self, n: int, multigenics: Set[GeneFamily], return_only_persistents: bool = True + ) -> List[List[Gene], List[Gene]]: + """ Get the bordered genes in the region. Find the n persistent and single copy gene bordering the region. If return_only_persistents is False, the method return all genes included between the n single copy and persistent genes. :param n: Number of genes to get :param multigenics: pangenome graph multigenic persistent families - :param return_only_persistents: return only non multgenic persistent genes identify as the region. - If False return all genes included between - the borders made of n persistent and single copy genes around the region. + :param return_only_persistents: return only non multgenic persistent genes identify as the region. + If False return all genes included between + the borders made of n persistent and single copy genes around the region. :return: A list of bordering genes in start and stop position """ @@ -435,7 +483,9 @@ def get_bordering_genes(self, n: int, multigenics: Set[GeneFamily], return_only_ pos = self.starter.position init = pos single_copy_persistent_count = 0 - while single_copy_persistent_count < n and (pos != 0 or self.contig.is_circular): + while single_copy_persistent_count < n and ( + pos != 0 or self.contig.is_circular + ): curr_gene = None if pos == 0: if self.contig.is_circular: @@ -443,11 +493,19 @@ def get_bordering_genes(self, n: int, multigenics: Set[GeneFamily], return_only_ else: curr_gene = self.contig[pos - 1] - if curr_gene is not None and curr_gene.family not in multigenics and \ - curr_gene.family.named_partition == "persistent" and curr_gene not in genes_in_region: + if ( + curr_gene is not None + and curr_gene.family not in multigenics + and curr_gene.family.named_partition == "persistent" + and curr_gene not in genes_in_region + ): left_border.append(curr_gene) - single_copy_persistent_count +=1 - elif curr_gene is not None and curr_gene not in genes_in_region and not return_only_persistents: + single_copy_persistent_count += 1 + elif ( + curr_gene is not None + and curr_gene not in genes_in_region + and not return_only_persistents + ): left_border.append(curr_gene) pos -= 1 @@ -456,23 +514,33 @@ def get_bordering_genes(self, n: int, multigenics: Set[GeneFamily], return_only_ if pos == init: break # looped around the contig - # Identifying right border + # Identifying right border right_border = [] pos = self.stopper.position init = pos single_copy_persistent_count = 0 - while single_copy_persistent_count < n and (pos != self.contig.number_of_genes - 1 or self.contig.is_circular): + while single_copy_persistent_count < n and ( + pos != self.contig.number_of_genes - 1 or self.contig.is_circular + ): curr_gene = None if pos == self.contig.number_of_genes - 1: if self.contig.is_circular: curr_gene = self.contig[0] else: curr_gene = self.contig[pos + 1] - if curr_gene is not None and curr_gene.family not in multigenics and \ - curr_gene.family.named_partition == "persistent" and curr_gene not in genes_in_region: + if ( + curr_gene is not None + and curr_gene.family not in multigenics + and curr_gene.family.named_partition == "persistent" + and curr_gene not in genes_in_region + ): right_border.append(curr_gene) - single_copy_persistent_count +=1 - elif curr_gene is not None and curr_gene not in genes_in_region and not return_only_persistents: + single_copy_persistent_count += 1 + elif ( + curr_gene is not None + and curr_gene not in genes_in_region + and not return_only_persistents + ): right_border.append(curr_gene) pos += 1 if pos == self.contig.number_of_genes and self.contig.is_circular: @@ -487,7 +555,7 @@ def get_bordering_genes(self, n: int, multigenics: Set[GeneFamily], return_only_ class Spot(MetaFeatures): """ The 'Spot' class represents a region of genomic plasticity. - + Methods: - 'regions': the property that generates the regions in the spot. - 'families': the property that generates the gene families in the spot. @@ -509,7 +577,9 @@ def __init__(self, spot_id: int): :param spot_id: Identifier of the spot """ if not isinstance(spot_id, int): - raise TypeError(f"Spot identifier must be an integer. Given type is {type(spot_id)}") + raise TypeError( + f"Spot identifier must be an integer. Given type is {type(spot_id)}" + ) super().__init__() self.ID = spot_id self._region_getter = {} @@ -517,13 +587,11 @@ def __init__(self, spot_id: int): self._uniqContent = {} def __repr__(self) -> str: - """Spot representation - """ + """Spot representation""" return f"Spot {self.ID} - #RGP: {len(self)}" def __str__(self): - """String representation of the spot - """ + """String representation of the spot""" return f"spot_{self.ID}" def __setitem__(self, name: str, region: Region): @@ -542,8 +610,10 @@ def __setitem__(self, name: str, region: Region): # where a projected RGP might link two spots in the spot graph. # To handle this scenario without triggering failure, we check the 'projected' attribute of the given region. - raise ValueError(f"The region '{region.name}' is already associated with spot '{region.spot.ID}' while being associated with spot '{self.ID}'. " - "A region should only belong to one spot.") + raise ValueError( + f"The region '{region.name}' is already associated with spot '{region.spot.ID}' while being associated with spot '{self.ID}'. " + "A region should only belong to one spot." + ) self._region_getter[name] = region region.spot = self @@ -559,7 +629,9 @@ def __getitem__(self, name) -> Region: :raises TypeError: Name is not a string """ if not isinstance(name, str): - raise TypeError(f"Name of the region must be a string. The provided type was {type(name)}") + raise TypeError( + f"Name of the region must be a string. The provided type was {type(name)}" + ) try: region = self._region_getter[name] except KeyError: @@ -576,15 +648,16 @@ def __delitem__(self, name): :raises TypeError: Name is not a string """ if not isinstance(name, str): - raise TypeError(f"Name of the region must be a string. The provided type was {type(name)}") + raise TypeError( + f"Name of the region must be a string. The provided type was {type(name)}" + ) try: del self._region_getter[name] except KeyError: raise KeyError(f"Region with {name} does not exist in spot") def __len__(self) -> int: - """Get the number of regions in the spot - """ + """Get the number of regions in the spot""" return len(self._region_getter) def add(self, region: Region): @@ -596,7 +669,9 @@ def add(self, region: Region): :raises TypeError: Region is not an instance Region """ if not isinstance(region, Region): - raise TypeError(f"A Region object is expected to be added to the spot. find type is {type(region)}") + raise TypeError( + f"A Region object is expected to be added to the spot. find type is {type(region)}" + ) self[region.name] = region def get(self, name: str) -> Region: @@ -647,26 +722,31 @@ def number_of_families(self) -> int: return len({family for region in self.regions for family in region.families}) def spot_2_families(self): - """Add to Gene Families a link to spot - """ + """Add to Gene Families a link to spot""" for family in self.families: family.add_spot(self) - def borders(self, set_size: int, multigenics) -> List[List[int, List[GeneFamily], List[GeneFamily]]]: - """ Extracts all the borders of all RGPs belonging to the spot + def borders( + self, set_size: int, multigenics + ) -> List[List[int, List[GeneFamily], List[GeneFamily]]]: + """Extracts all the borders of all RGPs belonging to the spot :param set_size: Number of genes to get :param multigenics: pangenome graph multigenic persistent families :return: Families that bordering spot """ - all_borders = [rgp.get_bordering_genes(set_size, multigenics) - for rgp in self.regions] + all_borders = [ + rgp.get_bordering_genes(set_size, multigenics) for rgp in self.regions + ] family_borders = [] for borders in all_borders: new = True - curr_set = [[gene.family for gene in borders[0]], [gene.family for gene in borders[1]]] + curr_set = [ + [gene.family for gene in borders[0]], + [gene.family for gene in borders[1]], + ] for i, (c, former_borders) in enumerate(family_borders): if former_borders == curr_set or former_borders == curr_set[::-1]: family_borders[i][0] += 1 @@ -678,8 +758,7 @@ def borders(self, set_size: int, multigenics) -> List[List[int, List[GeneFamily] return family_borders def _mk_uniq_ordered_set_obj(self): - """cluster RGP into groups that have an identical synteny - """ + """cluster RGP into groups that have an identical synteny""" for rgp in self.regions: z = True for seen_rgp in self._uniqOrderedSet: @@ -690,7 +769,7 @@ def _mk_uniq_ordered_set_obj(self): self._uniqOrderedSet[rgp] = {rgp} def _get_ordered_set(self) -> Dict[Region, Set[Region]]: - """ Creates the _uniqSyn object if it was never computed. Return it in any case + """Creates the _uniqSyn object if it was never computed. Return it in any case :return: RGP groups that have an identical synteny """ @@ -699,7 +778,7 @@ def _get_ordered_set(self) -> Dict[Region, Set[Region]]: return self._uniqOrderedSet def get_uniq_to_rgp(self) -> Dict[Region, Set[Region]]: - """ Get dictionary with a representing RGP as the key, and all identical RGPs as value + """Get dictionary with a representing RGP as the key, and all identical RGPs as value :return: Dictionary with a representing RGP as the key, and set of identical RGPs as value """ @@ -713,8 +792,7 @@ def get_uniq_ordered_set(self) -> Set[Region]: return set(self._get_ordered_set().keys()) def _mk_uniq_content(self): - """cluster RGP into groups that have identical gene content - """ + """cluster RGP into groups that have identical gene content""" for rgp in self.regions: z = True for seen_rgp in self._uniqContent: @@ -734,7 +812,7 @@ def _get_content(self) -> Dict[Region, Set[Region]]: return self._uniqContent def get_uniq_content(self) -> Set[Region]: - """ Get an Iterable of all the unique rgp (in terms of gene family content) in the spot + """Get an Iterable of all the unique rgp (in terms of gene family content) in the spot :return: Iterable of all the unique rgp (in terms of gene family content) in the spot """ @@ -776,7 +854,9 @@ def __init__(self, module_id: int, families: set = None): :param families: Set of families which define the module """ if not isinstance(module_id, int): - raise TypeError(f"Module identifier must be an integer. Given type is {type(module_id)}") + raise TypeError( + f"Module identifier must be an integer. Given type is {type(module_id)}" + ) super().__init__() self.ID = module_id self._families_getter = {} @@ -786,23 +866,19 @@ def __init__(self, module_id: int, families: set = None): self.add(family) def __repr__(self) -> str: - """Module representation - """ + """Module representation""" return f"Module {self.ID} - #Families: {len(self)}" def __str__(self) -> str: - """String representation of the module - """ + """String representation of the module""" return f"module_{self.ID}" def __hash__(self) -> int: - """Create a hash value for the module - """ + """Create a hash value for the module""" return id(self) def __len__(self) -> int: - """Get the number of families in the module - """ + """Get the number of families in the module""" return len(self._families_getter) def __eq__(self, other: Module) -> bool: @@ -816,7 +892,9 @@ def __eq__(self, other: Module) -> bool: :raises TypeError: Try to compare a module with another type object """ if not isinstance(other, Module): - raise TypeError(f"Another module is expected to be compared to the first one. You give a {type(other)}") + raise TypeError( + f"Another module is expected to be compared to the first one. You give a {type(other)}" + ) return set(self.families) == set(other.families) def __setitem__(self, name: str, family: GeneFamily): @@ -829,7 +907,9 @@ def __setitem__(self, name: str, family: GeneFamily): :raises KeyError: Another family with the same name already exists in the module """ if name in self._families_getter and self[name] != family: - raise KeyError("A different gene family with the same name already exist in the module") + raise KeyError( + "A different gene family with the same name already exist in the module" + ) self._families_getter[name] = family family.set_module(self) @@ -845,7 +925,9 @@ def __getitem__(self, name) -> GeneFamily: try: family = self._families_getter[name] except KeyError: - raise KeyError(f"There isn't gene family with the name {name} in the module") + raise KeyError( + f"There isn't gene family with the name {name} in the module" + ) else: return family @@ -859,7 +941,9 @@ def __delitem__(self, name): try: fam = self._families_getter[name] except KeyError: - raise KeyError(f"There isn't gene family with the name {name} in the module") + raise KeyError( + f"There isn't gene family with the name {name} in the module" + ) else: del self._families_getter[name] fam._module = None # TODO define method to remove a module from family @@ -873,7 +957,9 @@ def add(self, family: GeneFamily): :raises TypeError: Region is not an instance Region """ if not isinstance(family, GeneFamily): - raise TypeError(f"A gene family is expected to be added to module. Given type was {type(family)}") + raise TypeError( + f"A gene family is expected to be added to module. Given type was {type(family)}" + ) self[family.name] = family def get(self, name: str) -> GeneFamily: @@ -913,7 +999,7 @@ def organisms(self) -> Generator[Organism, None, None]: organisms |= set(fam.organisms) yield from organisms - def mk_bitarray(self, index: Dict[GeneFamily, int], partition: str = 'all'): + def mk_bitarray(self, index: Dict[GeneFamily, int], partition: str = "all"): """Produces a bitarray representing the presence / absence of families in the organism using the provided index The bitarray is stored in the :attr:`bitarray` attribute and is a :class:`gmpy2.xmpz` type. @@ -921,27 +1007,29 @@ def mk_bitarray(self, index: Dict[GeneFamily, int], partition: str = 'all'): :param index: The index computed by :func:`ppanggolin.pangenome.Pangenome.getIndex` """ self.bitarray = gmpy2.xmpz() # pylint: disable=no-member - if partition == 'all': + if partition == "all": logging.getLogger("PPanGGOLiN").debug("all") for fam in self.families: self.bitarray[index[fam]] = 1 - elif partition == 'persistent': + elif partition == "persistent": logging.getLogger("PPanGGOLiN").debug("persistent") for fam in self.families: - if fam.named_partition in ['persistent']: + if fam.named_partition in ["persistent"]: self.bitarray[index[fam]] = 1 - elif partition in ['shell', 'cloud']: + elif partition in ["shell", "cloud"]: logging.getLogger("PPanGGOLiN").debug("shell, cloud") for fam in self.families: if fam.named_partition == partition: self.bitarray[index[fam]] = 1 - elif partition == 'accessory': + elif partition == "accessory": logging.getLogger("PPanGGOLiN").debug("accessory") for fam in self.families: - if fam.named_partition in ['shell', 'cloud']: + if fam.named_partition in ["shell", "cloud"]: self.bitarray[index[fam]] = 1 else: - raise Exception("There is not any partition corresponding please report a github issue") + raise Exception( + "There is not any partition corresponding please report a github issue" + ) class GeneContext: @@ -958,7 +1046,12 @@ class GeneContext: - graph: context graph corresponding to the gene context """ - def __init__(self, gc_id: int, families: Set[GeneFamily] = None, families_of_interest: Set[GeneFamily] = None): + def __init__( + self, + gc_id: int, + families: Set[GeneFamily] = None, + families_of_interest: Set[GeneFamily] = None, + ): """Constructor method :param gc_id: Identifier of the gene context. @@ -967,7 +1060,9 @@ def __init__(self, gc_id: int, families: Set[GeneFamily] = None, families_of_int """ if not isinstance(gc_id, int): - raise TypeError(f"Gene context identifier must be an integer. Given type is {type(gc_id)}") + raise TypeError( + f"Gene context identifier must be an integer. Given type is {type(gc_id)}" + ) self.ID = gc_id self._families_getter = {} @@ -975,28 +1070,26 @@ def __init__(self, gc_id: int, families: Set[GeneFamily] = None, families_of_int self._graph = None if families is not None: if not all(isinstance(fam, GeneFamily) for fam in families): - raise Exception("You provided elements that were not GeneFamily objects. " - "GeneContexts are only made of GeneFamily objects.") + raise Exception( + "You provided elements that were not GeneFamily objects. " + "GeneContexts are only made of GeneFamily objects." + ) self._families_getter = {family.name: family for family in families} def __repr__(self) -> str: - """Context representation - """ + """Context representation""" return f"Context {self.ID} - #Families: {len(self)}" def __str__(self) -> str: - """String representation of the gene context - """ - return f'GC_{str(self.ID)}' + """String representation of the gene context""" + return f"GC_{str(self.ID)}" def __hash__(self) -> int: - """Create a hash value for the region - """ + """Create a hash value for the region""" return id(self) def __len__(self) -> int: - """Get the number of families in the context - """ + """Get the number of families in the context""" return len(self._families_getter) def __eq__(self, other: GeneContext) -> bool: @@ -1010,7 +1103,9 @@ def __eq__(self, other: GeneContext) -> bool: :raises TypeError: Try to compare a gene context with another type object """ if not isinstance(other, GeneContext): - raise TypeError(f"Another context is expected to be compared to the first one. You give a {type(other)}") + raise TypeError( + f"Another context is expected to be compared to the first one. You give a {type(other)}" + ) return set(self.families) == set(other.families) def __setitem__(self, name, family): @@ -1023,9 +1118,13 @@ def __setitem__(self, name, family): :raises KeyError: Another family with the same name already exists in the context """ if not isinstance(family, GeneFamily): - raise TypeError(f"A gene family is expected to be added to gene context. Given type was {type(family)}") + raise TypeError( + f"A gene family is expected to be added to gene context. Given type was {type(family)}" + ) if name in self._families_getter and self[name] != family: - raise KeyError("A different gene family with the same name already exist in the gene context") + raise KeyError( + "A different gene family with the same name already exist in the gene context" + ) self._families_getter[name] = family def __getitem__(self, name) -> GeneFamily: @@ -1040,7 +1139,9 @@ def __getitem__(self, name) -> GeneFamily: try: family = self._families_getter[name] except KeyError: - raise KeyError(f"There isn't gene family with the name {name} in the gene context") + raise KeyError( + f"There isn't gene family with the name {name} in the gene context" + ) else: return family @@ -1054,7 +1155,9 @@ def __delitem__(self, name): try: del self._families_getter[name] except KeyError: - raise KeyError(f"There isn't gene family with the name {name} in the gene context") + raise KeyError( + f"There isn't gene family with the name {name} in the gene context" + ) @property def graph(self): @@ -1089,6 +1192,8 @@ def add_family(self, family: GeneFamily): :param family: The gene family to add. """ if not isinstance(family, GeneFamily): - raise Exception("You did not provide a GeneFamily object. " - "GeneContexts are only made of GeneFamily objects.") + raise Exception( + "You did not provide a GeneFamily object. " + "GeneContexts are only made of GeneFamily objects." + ) self[family.name] = family diff --git a/ppanggolin/utility/__init__.py b/ppanggolin/utility/__init__.py index 162e4744..b35b161f 100644 --- a/ppanggolin/utility/__init__.py +++ b/ppanggolin/utility/__init__.py @@ -1 +1 @@ -from .utils import subparser, launch \ No newline at end of file +from .utils import subparser, launch diff --git a/ppanggolin/utility/utils.py b/ppanggolin/utility/utils.py index cd85be7a..612eafce 100644 --- a/ppanggolin/utility/utils.py +++ b/ppanggolin/utility/utils.py @@ -6,9 +6,19 @@ import os from pathlib import Path from typing import List + # local libraries -from ppanggolin.utils import get_subcommand_parser, check_log, ALL_INPUT_PARAMS, ALL_GENERAL_PARAMS, \ - WORKFLOW_SUBCOMMANDS, ALL_WORKFLOW_DEPENDENCIES, WRITE_PAN_FLAG_DEFAULT_IN_WF, WRITE_GENOME_FLAG_DEFAULT_IN_WF, DRAW_FLAG_DEFAULT_IN_WF +from ppanggolin.utils import ( + get_subcommand_parser, + check_log, + ALL_INPUT_PARAMS, + ALL_GENERAL_PARAMS, + WORKFLOW_SUBCOMMANDS, + ALL_WORKFLOW_DEPENDENCIES, + WRITE_PAN_FLAG_DEFAULT_IN_WF, + WRITE_GENOME_FLAG_DEFAULT_IN_WF, + DRAW_FLAG_DEFAULT_IN_WF, +) from ppanggolin import SUBCOMMAND_TO_SUBPARSER """ Utility scripts to help formatting input files of PPanggolin.""" @@ -16,27 +26,35 @@ def split(list_object: list, chunk_count: int) -> List[List[int]]: """ - Split list into n chunk. + Split list into n chunk. :params list_object: list to split :params chunk_count: number of final chunk - :return : list of chunk of the initial list. + :return : list of chunk of the initial list. """ quotient, remainder = divmod(len(list_object), chunk_count) - return [list_object[index * quotient + min(index, remainder):(index + 1) * quotient + min(index + 1, remainder)] for - index in range(chunk_count)] + return [ + list_object[ + index * quotient + + min(index, remainder) : (index + 1) * quotient + + min(index + 1, remainder) + ] + for index in range(chunk_count) + ] -def split_comment_string(comment_string: str, max_word_count: int = 20, prefix: str = "\n # ") -> str: +def split_comment_string( + comment_string: str, max_word_count: int = 20, prefix: str = "\n # " +) -> str: """ Split a line of comment into multiple line. :params comment_string: comment string to split :params max_word_count: maximum number of word per line :params prefix: prefix used to start a new comment line - + :return : the split comment line. """ @@ -44,21 +62,23 @@ def split_comment_string(comment_string: str, max_word_count: int = 20, prefix: word_count = len(splitted_comment) line_count = round(word_count / max_word_count) + 1 - comment_lines = [' '.join(words) for words in split(splitted_comment, line_count)] + comment_lines = [" ".join(words) for words in split(splitted_comment, line_count)] return prefix.join(comment_lines) -def get_input_argument_lines(argument_actions: List[argparse._SubParsersAction]) -> List[str]: +def get_input_argument_lines( + argument_actions: List[argparse._SubParsersAction], +) -> List[str]: """ Manage input argument from a specific list of parser actions and format them for the yaml output. Input arguments are commented in the config file: as no default is valid. - Help and possible values of the argument is added as comment line. + Help and possible values of the argument is added as comment line. - :param argument_actions: list of parser action for input arguments. + :param argument_actions: list of parser action for input arguments. - :return: default arguments for the given command + :return: default arguments for the given command """ arg_default_lines = [] @@ -71,15 +91,17 @@ def get_input_argument_lines(argument_actions: List[argparse._SubParsersAction]) return arg_default_lines -def get_default_argument_lines(argument_actions: List[argparse._SubParsersAction]) -> List[str]: +def get_default_argument_lines( + argument_actions: List[argparse._SubParsersAction], +) -> List[str]: """ Get default arguments for a specific list of parser actions and format them for the yaml output. - Help and possible values of the argument is added as comment line. + Help and possible values of the argument is added as comment line. - :param argument_actions: list of parser action arguments. + :param argument_actions: list of parser action arguments. - :return: default arguments for the given command + :return: default arguments for the given command """ arg_default_lines = [] @@ -92,7 +114,9 @@ def get_default_argument_lines(argument_actions: List[argparse._SubParsersAction arg_default_lines.append(f" # {action.help}") if action.choices: - arg_default_lines.append(f" # Choices: {', '.join([str(choice) for choice in action.choices])}") + arg_default_lines.append( + f" # Choices: {', '.join([str(choice) for choice in action.choices])}" + ) # When default is None, it is replaced by False to omit the arg and get the None value as expected. default = action.default if action.default is not None else False @@ -101,7 +125,9 @@ def get_default_argument_lines(argument_actions: List[argparse._SubParsersAction return arg_default_lines -def deduplicate_actions(actions: List[argparse._SubParsersAction]) -> List[argparse._SubParsersAction]: +def deduplicate_actions( + actions: List[argparse._SubParsersAction], +) -> List[argparse._SubParsersAction]: """ Deduplicate duplicate actions based on their dest. @@ -132,25 +158,33 @@ def launch_default_config(args: argparse.Namespace): initial_command = args.default_config if args.output.exists() and not args.force: - raise FileExistsError(f"{args.output} already exists. Use -f if you want to overwrite it.") + raise FileExistsError( + f"{args.output} already exists. Use -f if you want to overwrite it." + ) - ignored_params = ['config', 'help'] + ignored_params = ["config", "help"] - workflow_dependencies = {sub_cmd for sub_cmd in ALL_WORKFLOW_DEPENDENCIES if - sub_cmd not in ["rgp", "spot", "module"]} + workflow_dependencies = { + sub_cmd + for sub_cmd in ALL_WORKFLOW_DEPENDENCIES + if sub_cmd not in ["rgp", "spot", "module"] + } - if initial_command in ['panrgp', 'all']: + if initial_command in ["panrgp", "all"]: workflow_dependencies |= {"rgp", "spot"} - if initial_command in ['panmodule', 'all']: - workflow_dependencies.add('module') + if initial_command in ["panmodule", "all"]: + workflow_dependencies.add("module") if initial_command in WORKFLOW_SUBCOMMANDS: # it is clearer if the order of the subcommand is conserved in wf config file - commands = [initial_command] + [sub_cmd for sub_cmd in ALL_WORKFLOW_DEPENDENCIES if - sub_cmd in workflow_dependencies] + commands = [initial_command] + [ + sub_cmd + for sub_cmd in ALL_WORKFLOW_DEPENDENCIES + if sub_cmd in workflow_dependencies + ] elif initial_command == "projection": - commands = [initial_command] + ['annotate'] + commands = [initial_command] + ["annotate"] else: commands = [initial_command] @@ -168,12 +202,18 @@ def launch_default_config(args: argparse.Namespace): specific_actions = [] # overwrite some default value for write cmd in a workflow context - if initial_command in WORKFLOW_SUBCOMMANDS and sub_command in ['write_pangenome', "write_genomes"]: + if initial_command in WORKFLOW_SUBCOMMANDS and sub_command in [ + "write_pangenome", + "write_genomes", + ]: for sub_action in sub._actions: - if sub_action.dest in WRITE_PAN_FLAG_DEFAULT_IN_WF + WRITE_GENOME_FLAG_DEFAULT_IN_WF : + if ( + sub_action.dest + in WRITE_PAN_FLAG_DEFAULT_IN_WF + WRITE_GENOME_FLAG_DEFAULT_IN_WF + ): sub_action.default = True # overwrite some default value for draw cmd in a workflow context - if initial_command in WORKFLOW_SUBCOMMANDS and sub_command == 'draw': + if initial_command in WORKFLOW_SUBCOMMANDS and sub_command == "draw": for sub_action in sub._actions: if sub_action.dest in DRAW_FLAG_DEFAULT_IN_WF: sub_action.default = True @@ -199,10 +239,10 @@ def launch_default_config(args: argparse.Namespace): inputs_actions = deduplicate_actions(inputs_actions) general_actions = deduplicate_actions(general_actions) - arg_lines = ['input_parameters:'] + arg_lines = ["input_parameters:"] arg_lines += get_input_argument_lines(inputs_actions) - arg_lines.append('\ngeneral_parameters:') + arg_lines.append("\ngeneral_parameters:") arg_lines += get_default_argument_lines(general_actions) for sub_command, specific_actions in sub_cmd_to_actions.items(): @@ -213,9 +253,9 @@ def launch_default_config(args: argparse.Namespace): arg_lines.append(f"\n{sub_command}:") arg_lines += get_default_argument_lines(specific_actions) - logging.getLogger("PPanGGOLiN").info(f'Writting default config in {args.output}') - with open(args.output, 'w') as fl: - fl.write('\n'.join(arg_lines) + '\n') + logging.getLogger("PPanGGOLiN").info(f"Writting default config in {args.output}") + with open(args.output, "w") as fl: + fl.write("\n".join(arg_lines) + "\n") def launch(args: argparse.Namespace): @@ -240,46 +280,77 @@ def subparser(sub_parser: argparse._SubParsersAction) -> argparse.ArgumentParser :return : parser arguments for info command """ - parser = sub_parser.add_parser("utils", formatter_class=argparse.RawTextHelpFormatter) + parser = sub_parser.add_parser( + "utils", formatter_class=argparse.RawTextHelpFormatter + ) parser_default_config(parser) return parser def parser_default_config(parser: argparse.ArgumentParser): """ - Parser for specific argument of utils command + Parser for specific argument of utils command :param parser: parser for utils argument """ subcommands = list(SUBCOMMAND_TO_SUBPARSER.keys()) - required = parser.add_argument_group(title="Required arguments", - description="All of the following arguments are required :") + required = parser.add_argument_group( + title="Required arguments", + description="All of the following arguments are required :", + ) - required.add_argument('--default_config', required=False, type=str, default=None, # nargs="*",, - help="Generate a config file with default values for the given subcommand.", - choices=subcommands) + required.add_argument( + "--default_config", + required=False, + type=str, + default=None, # nargs="*",, + help="Generate a config file with default values for the given subcommand.", + choices=subcommands, + ) optional = parser.add_argument_group(title="Config arguments") - optional.add_argument('-o', '--output', type=Path, default='default_config.yaml', - help='name and path of the config file with default parameters written in yaml.') - - optional.add_argument("--verbose", required=False, type=int, default=1, choices=[0, 1, 2], - help="Indicate verbose level (0 for warning and errors only, 1 for info, 2 for debug)") - - optional.add_argument("--log", required=False, type=check_log, default="stdout", help="log output file") - - optional.add_argument('-f', '--force', action="store_true", - help="Overwrite the given output file if it exists.") - - -if __name__ == '__main__': + optional.add_argument( + "-o", + "--output", + type=Path, + default="default_config.yaml", + help="name and path of the config file with default parameters written in yaml.", + ) + + optional.add_argument( + "--verbose", + required=False, + type=int, + default=1, + choices=[0, 1, 2], + help="Indicate verbose level (0 for warning and errors only, 1 for info, 2 for debug)", + ) + + optional.add_argument( + "--log", + required=False, + type=check_log, + default="stdout", + help="log output file", + ) + + optional.add_argument( + "-f", + "--force", + action="store_true", + help="Overwrite the given output file if it exists.", + ) + + +if __name__ == "__main__": """To test local change and allow using debugger""" main_parser = argparse.ArgumentParser( description="Depicting microbial species diversity via a Partitioned PanGenome Graph Of Linked Neighbors", - formatter_class=argparse.RawTextHelpFormatter) + formatter_class=argparse.RawTextHelpFormatter, + ) parser_default_config(main_parser) diff --git a/ppanggolin/utils.py b/ppanggolin/utils.py index d0ecc29d..b9661a68 100755 --- a/ppanggolin/utils.py +++ b/ppanggolin/utils.py @@ -29,24 +29,64 @@ from collections import defaultdict # all input params that exists in ppanggolin -ALL_INPUT_PARAMS = ['fasta', 'anno', 'clusters', 'pangenome', - "fasta_file", "annot_file", "genome_name"] # the last three params is for projection cmd +ALL_INPUT_PARAMS = [ + "fasta", + "anno", + "clusters", + "pangenome", + "fasta_file", + "annot_file", + "genome_name", +] # the last three params is for projection cmd # all params that should be in the general_parameters section of the config file -ALL_GENERAL_PARAMS = ['output', 'basename', 'rarefaction', 'no_flat_files', 'tmpdir', 'verbose', 'log', - 'disable_prog_bar', 'force', "config"] - -WORKFLOW_SUBCOMMANDS = {'all', 'workflow', 'panrgp', 'panmodule'} +ALL_GENERAL_PARAMS = [ + "output", + "basename", + "rarefaction", + "no_flat_files", + "tmpdir", + "verbose", + "log", + "disable_prog_bar", + "force", + "config", +] + +WORKFLOW_SUBCOMMANDS = {"all", "workflow", "panrgp", "panmodule"} # command that can be launched inside a workflow subcommand -ALL_WORKFLOW_DEPENDENCIES = ["annotate", "cluster", "graph", "partition", "rarefaction", "rgp", "spot", "module", - "draw", "write_pangenome", "write_genomes"] +ALL_WORKFLOW_DEPENDENCIES = [ + "annotate", + "cluster", + "graph", + "partition", + "rarefaction", + "rgp", + "spot", + "module", + "draw", + "write_pangenome", + "write_genomes", +] # Inside a workflow command, write output default is overwrite to output some flat files -WRITE_PAN_FLAG_DEFAULT_IN_WF = ["csv", "Rtab", "gexf", "light_gexf", - 'stats', 'json', 'partitions', 'regions', - 'borders', 'modules', 'spot_modules', "spots", "families_tsv"] -WRITE_GENOME_FLAG_DEFAULT_IN_WF = ['table', 'proksee', "gff"] +WRITE_PAN_FLAG_DEFAULT_IN_WF = [ + "csv", + "Rtab", + "gexf", + "light_gexf", + "stats", + "json", + "partitions", + "regions", + "borders", + "modules", + "spot_modules", + "spots", + "families_tsv", +] +WRITE_GENOME_FLAG_DEFAULT_IN_WF = ["table", "proksee", "gff"] DRAW_FLAG_DEFAULT_IN_WF = ["tile_plot", "ucurve", "draw_spots"] @@ -71,23 +111,29 @@ def check_log(log_file: str) -> TextIO: if os.access(log_file, os.W_OK): return log_file else: - raise OSError(f"The given log file {log_file} is not writable. Please check if it is accessible.") + raise OSError( + f"The given log file {log_file} is not writable. Please check if it is accessible." + ) else: - raise OSError(f"The given log file: {log_file} is a directory. Please provide a valid log file.") + raise OSError( + f"The given log file: {log_file} is a directory. Please provide a valid log file." + ) # target does not exist, check perms on parent dir parent_dir = os.path.dirname(log_file) if not parent_dir: - parent_dir = '.' + parent_dir = "." # target is creatable if parent dir is writable if os.access(parent_dir, os.W_OK): return log_file else: - raise OSError(f"The given log file {log_file} is not writable. Please check if it is accessible.") + raise OSError( + f"The given log file {log_file} is not writable. Please check if it is accessible." + ) def check_tsv_sanity(tsv: Path): - """ Check if the given tsv is readable for the next PPanGGOLiN step + """Check if the given tsv is readable for the next PPanGGOLiN step :param tsv: Path to the tsv containing organims information """ @@ -96,8 +142,10 @@ def check_tsv_sanity(tsv: Path): except OSError as ios_error: raise OSError(ios_error) except Exception as exception_error: - raise Exception(f"The following unexpected error happened when opening the list of genomes path: " - f"{exception_error}") + raise Exception( + f"The following unexpected error happened when opening the list of genomes path: " + f"{exception_error}" + ) else: name_set = set() duplicated_names = set() @@ -107,9 +155,11 @@ def check_tsv_sanity(tsv: Path): if len(elements) <= 1: raise Exception(f"No tabulation separator found in given file: {tsv}") if " " in elements[0]: - raise Exception(f"Your genome names contain spaces (The first encountered genome name that had " - f"this string: '{elements[0]}'). To ensure compatibility with all of the dependencies " - f"of PPanGGOLiN this is not allowed. Please remove spaces from your genome names.") + raise Exception( + f"Your genome names contain spaces (The first encountered genome name that had " + f"this string: '{elements[0]}'). To ensure compatibility with all of the dependencies " + f"of PPanGGOLiN this is not allowed. Please remove spaces from your genome names." + ) old_len = len(name_set) name_set.add(elements[0]) if len(name_set) == old_len: @@ -118,16 +168,20 @@ def check_tsv_sanity(tsv: Path): if not org_path.exists() and not tsv.parent.joinpath(org_path).exists(): non_existing_files.add(elements[1]) if len(non_existing_files) != 0: - raise Exception(f"Some of the given files do not exist. The non-existing files are the following : " - f"'{' '.join(non_existing_files)}'") + raise Exception( + f"Some of the given files do not exist. The non-existing files are the following : " + f"'{' '.join(non_existing_files)}'" + ) if len(duplicated_names) != 0: - raise Exception(f"Some of your genomes have identical names. The duplicated names are the following : " - f"'{' '.join(duplicated_names)}'") + raise Exception( + f"Some of your genomes have identical names. The duplicated names are the following : " + f"'{' '.join(duplicated_names)}'" + ) input_file.close() def check_input_files(file: Path, check_tsv: bool = False): - """ Checks if the provided input files exist and are of the proper format + """Checks if the provided input files exist and are of the proper format :param file: Path to the file :param check_tsv: Allow checking tsv file for annotation or fasta list @@ -136,7 +190,9 @@ def check_input_files(file: Path, check_tsv: bool = False): if check_tsv: check_tsv_sanity(file) else: - raise FileNotFoundError(f"No such file or directory: '{file.absolute().as_posix()}'") + raise FileNotFoundError( + f"No such file or directory: '{file.absolute().as_posix()}'" + ) def set_verbosity_level(args): @@ -151,26 +207,32 @@ def set_verbosity_level(args): elif args.verbose == 0: level = logging.WARNING # only warnings and errors - if args.log != sys.stdout and not args.disable_prog_bar: # if output is not to stdout we remove progress bars. + if ( + args.log != sys.stdout and not args.disable_prog_bar + ): # if output is not to stdout we remove progress bars. args.disable_prog_bar = True str_format = "%(asctime)s %(filename)s:l%(lineno)d %(levelname)s\t%(message)s" - datefmt = '%Y-%m-%d %H:%M:%S' + datefmt = "%Y-%m-%d %H:%M:%S" if args.log in [sys.stdout, sys.stderr]: # use stream - logging.basicConfig(stream=args.log, level=level, - format=str_format, - datefmt=datefmt) + logging.basicConfig( + stream=args.log, level=level, format=str_format, datefmt=datefmt + ) else: # log is written in a files. basic condif uses filename - logging.basicConfig(filename=args.log, level=level, - format=str_format, - datefmt=datefmt) - logging.getLogger("PPanGGOLiN").info("Command: " + " ".join(arg for arg in sys.argv)) - logging.getLogger("PPanGGOLiN").info(f"PPanGGOLiN version: {distribution('ppanggolin').version}") + logging.basicConfig( + filename=args.log, level=level, format=str_format, datefmt=datefmt + ) + logging.getLogger("PPanGGOLiN").info( + "Command: " + " ".join(arg for arg in sys.argv) + ) + logging.getLogger("PPanGGOLiN").info( + f"PPanGGOLiN version: {distribution('ppanggolin').version}" + ) def jaccard_similarities(mat: csc_matrix, jaccard_similarity_th) -> csc_matrix: - """ Compute the jaccard similarities + """Compute the jaccard similarities :param mat: :param jaccard_similarity_th: threshold @@ -184,13 +246,15 @@ def jaccard_similarities(mat: csc_matrix, jaccard_similarity_th) -> csc_matrix: # for columns bb = cols_sum[ab.indices] similarities = ab.copy() - similarities.data /= (aa + bb - ab.data) + similarities.data /= aa + bb - ab.data similarities.data[similarities.data < jaccard_similarity_th] = 0 similarities.eliminate_zeros() return similarities -def is_compressed(file_or_file_path: Union[Path, BinaryIO, TextIOWrapper, TextIO]) -> Tuple[bool, Union[str, None]]: +def is_compressed( + file_or_file_path: Union[Path, BinaryIO, TextIOWrapper, TextIO] +) -> Tuple[bool, Union[str, None]]: """ Detects if a file is compressed based on its file signature. @@ -201,10 +265,10 @@ def is_compressed(file_or_file_path: Union[Path, BinaryIO, TextIOWrapper, TextIO :raises TypeError: If the file type is not supported. """ file_signatures = { - b'\x1f\x8b': 'gzip', - b'BZh': 'bz2', - b'\x50\x4b\x03\x04': 'zip', - b'\xfd\x37\x7a\x58\x5a\x00': 'xz' + b"\x1f\x8b": "gzip", + b"BZh": "bz2", + b"\x50\x4b\x03\x04": "zip", + b"\xfd\x37\x7a\x58\x5a\x00": "xz", } def check_file_signature(byte_stream) -> Tuple[bool, Union[str, None]]: @@ -222,7 +286,7 @@ def check_file_signature(byte_stream) -> Tuple[bool, Union[str, None]]: # Determine the type of file and read its first few bytes if isinstance(file_or_file_path, Path): - with file_or_file_path.open('rb') as file: + with file_or_file_path.open("rb") as file: first_bytes = file.read(4) else: if isinstance(file_or_file_path, BinaryIO): @@ -238,8 +302,9 @@ def check_file_signature(byte_stream) -> Tuple[bool, Union[str, None]]: return check_file_signature(first_bytes) -def read_compressed_or_not(file_or_file_path: Union[Path, BinaryIO, TextIOWrapper, TextIO]) \ - -> Union[TextIOWrapper, BinaryIO, TextIO]: +def read_compressed_or_not( + file_or_file_path: Union[Path, BinaryIO, TextIOWrapper, TextIO] +) -> Union[TextIOWrapper, BinaryIO, TextIO]: """ Opens and reads a file, decompressing it if necessary. @@ -256,15 +321,19 @@ def read_compressed_or_not(file_or_file_path: Union[Path, BinaryIO, TextIOWrappe is_comp, comp_type = is_compressed(file_or_file_path) if is_comp: if comp_type == "gzip": - return gzip.open(file_or_file_path, 'rt') + return gzip.open(file_or_file_path, "rt") elif comp_type == "bz2": - return bz2.open(file_or_file_path, 'rt') + return bz2.open(file_or_file_path, "rt") elif comp_type == "xz": - raise NotImplementedError("Unfortunately PPanGGOLiN does not support xz compressed files. " - "Please report an issue on our GitHub to let us know we should work on it.") + raise NotImplementedError( + "Unfortunately PPanGGOLiN does not support xz compressed files. " + "Please report an issue on our GitHub to let us know we should work on it." + ) elif comp_type == "zip": with zipfile.ZipFile(file_or_file_path, "r") as z: - logging.getLogger("PPanGGOLiN").warning("Assuming we want to read the first file in the ZIP archive") + logging.getLogger("PPanGGOLiN").warning( + "Assuming we want to read the first file in the ZIP archive" + ) file_list = z.namelist() if file_list: return TextIOWrapper(z.open(file_list[0], "r")) @@ -275,7 +344,9 @@ def read_compressed_or_not(file_or_file_path: Union[Path, BinaryIO, TextIOWrappe return file_or_file_path -def write_compressed_or_not(file_path: Path, compress: bool = False) -> Union[gzip.GzipFile, TextIOWrapper]: +def write_compressed_or_not( + file_path: Path, compress: bool = False +) -> Union[gzip.GzipFile, TextIOWrapper]: """ Create a file-like object, compressed or not. @@ -285,13 +356,13 @@ def write_compressed_or_not(file_path: Path, compress: bool = False) -> Union[gz :return: file-like object, compressed or not """ if compress: - return gzip.open(file_path.parent / (file_path.name + '.gz'), mode="wt") + return gzip.open(file_path.parent / (file_path.name + ".gz"), mode="wt") else: return open(file_path, "w") def mk_outdir(output: Path, force: bool = False, exist_ok: bool = False): - """ Create a directory at the given output if it doesn't exist already + """Create a directory at the given output if it doesn't exist already :param output: Path where to create directory :param force: Force to write in the directory @@ -300,12 +371,15 @@ def mk_outdir(output: Path, force: bool = False, exist_ok: bool = False): :raise FileExistError: The current path already exist and force is false """ if not output.is_dir(): - logging.getLogger("PPanGGOLiN").debug(f"Create output directory {output.absolute().as_posix()}") + logging.getLogger("PPanGGOLiN").debug( + f"Create output directory {output.absolute().as_posix()}" + ) Path.mkdir(output, exist_ok=exist_ok) else: if not force: raise FileExistsError( - f"{output} already exists. Use -f if you want to overwrite the files in the directory") + f"{output} already exists. Use -f if you want to overwrite the files in the directory" + ) @contextmanager @@ -315,7 +389,8 @@ def create_tmpdir(main_dir, basename="tmpdir", keep_tmp=False): new_tmpdir = main_dir / dir_name logging.getLogger("PPanGGOLiN").debug( - f'Creating a temporary directory: {new_tmpdir.as_posix()}. This directory will be retained.') + f"Creating a temporary directory: {new_tmpdir.as_posix()}. This directory will be retained." + ) mk_outdir(new_tmpdir, force=True) yield new_tmpdir @@ -323,7 +398,8 @@ def create_tmpdir(main_dir, basename="tmpdir", keep_tmp=False): else: with tempfile.TemporaryDirectory(dir=main_dir, prefix=basename) as new_tmpdir: logging.getLogger("PPanGGOLiN").debug( - f"Creating a temporary directory: {new_tmpdir}. This directory won't be retained.") + f"Creating a temporary directory: {new_tmpdir}. This directory won't be retained." + ) yield Path(new_tmpdir) @@ -343,7 +419,9 @@ def mk_file_name(basename: str, output: Path, force: bool = False) -> Path: mk_outdir(output, force) if filename.exists() and not force: - raise FileExistsError(f"{filename.name} already exists. Use -f if you want to overwrite the file") + raise FileExistsError( + f"{filename.name} already exists. Use -f if you want to overwrite the file" + ) return filename @@ -360,17 +438,20 @@ def detect_filetype(filename: Path) -> str: first_line = f.readline() if first_line.startswith("LOCUS "): # then this is probably a gbff/gbk file return "gbff" - elif re.match(r"##gff-version\s{1,3}3", - first_line): # prodigal gff header has two spaces between gff-version and 3... some gff user can have a tab - return 'gff' + elif re.match( + r"##gff-version\s{1,3}3", first_line + ): # prodigal gff header has two spaces between gff-version and 3... some gff user can have a tab + return "gff" elif first_line.startswith(">"): - return 'fasta' + return "fasta" elif "\t" in first_line: return "tsv" else: - raise Exception(f"Filetype {filename} was not gff3 (file starts with '##gff-version 3') " - "nor gbff/gbk (file starts with 'LOCUS ') " - "nor fasta (file starts with '>') nor tsv (file has '\t' in the first line). ") + raise Exception( + f"Filetype {filename} was not gff3 (file starts with '##gff-version 3') " + "nor gbff/gbk (file starts with 'LOCUS ') " + "nor fasta (file starts with '>') nor tsv (file has '\t' in the first line). " + ) def restricted_float(x: Union[int, float]) -> float: @@ -442,8 +523,10 @@ def _plain_bfs(g: nx.Graph, source: Any, removed: set, weight: float): edge_genes_v = g[v][n]["genes"][v] edge_genes_n = g[v][n]["genes"][n] # if the edge is indeed existent for most genes of both families, we use it - if len(edge_genes_n) / len(g.nodes[n]["genes"]) >= weight and len(edge_genes_v) / len( - g.nodes[v]["genes"]) >= weight: + if ( + len(edge_genes_n) / len(g.nodes[n]["genes"]) >= weight + and len(edge_genes_v) / len(g.nodes[v]["genes"]) >= weight + ): nextlevel.add(n) @@ -476,13 +559,17 @@ def check_option_workflow(args): :param args: list of arguments """ if args.clusters is not None and not any([args.fasta, args.anno]): - raise Exception("If you give --clusters option, you must give at least --fasta or --anno") + raise Exception( + "If you give --clusters option, you must give at least --fasta or --anno" + ) if not any([args.fasta, args.anno]): raise Exception("At least one of --fasta or --anno must be given") if args.infer_singletons and args.clusters is None: - logging.getLogger("PPanGGOLiN").warning("--infer_singleton works only with --clusters.") + logging.getLogger("PPanGGOLiN").warning( + "--infer_singleton works only with --clusters." + ) def parse_config_file(yaml_config_file: str) -> dict: @@ -491,7 +578,7 @@ def parse_config_file(yaml_config_file: str) -> dict: :param yaml_config_file: config file in yaml - :return: dict of config with key the command and as value another dict with param as key and value as value. + :return: dict of config with key the command and as value another dict with param as key and value as value. """ with yaml_config_file as yaml_fh: @@ -502,11 +589,15 @@ def parse_config_file(yaml_config_file: str) -> dict: # if config has a Parameters key. Update config with its content if config and "Parameters" in config: - config.update(config['Parameters']) - del config['Parameters'] + config.update(config["Parameters"]) + del config["Parameters"] # remove empty section that have no parameter specified in it. In this case they have a None value - config = {section: param_val_dict for section, param_val_dict in config.items() if param_val_dict is not None} + config = { + section: param_val_dict + for section, param_val_dict in config.items() + if param_val_dict is not None + } return config @@ -517,17 +608,44 @@ def add_common_arguments(subparser: argparse.ArgumentParser): :param subparser: A subparser object from any subcommand. """ - common = subparser._action_groups.pop(1) # get the 'optional arguments' action group. + common = subparser._action_groups.pop( + 1 + ) # get the 'optional arguments' action group. common.title = "Common arguments" - common.add_argument("--verbose", required=False, type=int, default=1, choices=[0, 1, 2], - help="Indicate verbose level (0 for warning and errors only, 1 for info, 2 for debug)") - common.add_argument("--log", required=False, type=check_log, default="stdout", help="log output file") - common.add_argument("-d", "--disable_prog_bar", required=False, action="store_true", - help="disables the progress bars") - common.add_argument('-f', '--force', action="store_true", - help="Force writing in output directory and in pangenome output file.") - common.add_argument("--config", required=False, type=argparse.FileType(), - help="Specify command arguments through a YAML configuration file.") + common.add_argument( + "--verbose", + required=False, + type=int, + default=1, + choices=[0, 1, 2], + help="Indicate verbose level (0 for warning and errors only, 1 for info, 2 for debug)", + ) + common.add_argument( + "--log", + required=False, + type=check_log, + default="stdout", + help="log output file", + ) + common.add_argument( + "-d", + "--disable_prog_bar", + required=False, + action="store_true", + help="disables the progress bars", + ) + common.add_argument( + "-f", + "--force", + action="store_true", + help="Force writing in output directory and in pangenome output file.", + ) + common.add_argument( + "--config", + required=False, + type=argparse.FileType(), + help="Specify command arguments through a YAML configuration file.", + ) subparser._action_groups.append(common) @@ -545,7 +663,11 @@ def get_arg_name(arg_val: Union[str, TextIOWrapper]) -> Union[str, TextIOWrapper return arg_val -def overwrite_args(default_args: argparse.Namespace, config_args: argparse.Namespace, cli_args: argparse.Namespace): +def overwrite_args( + default_args: argparse.Namespace, + config_args: argparse.Namespace, + cli_args: argparse.Namespace, +): """ Overwrite args objects. @@ -559,12 +681,12 @@ def overwrite_args(default_args: argparse.Namespace, config_args: argparse.Names :return: final arguments """ args = argparse.Namespace() - all_params = [arg for arg in dir(default_args) if not arg.startswith('_')] + all_params = [arg for arg in dir(default_args) if not arg.startswith("_")] for param in all_params: default_val = getattr(default_args, param) - cli_val = getattr(cli_args, param, 'unspecified') - config_val = getattr(config_args, param, 'unspecified') + cli_val = getattr(cli_args, param, "unspecified") + config_val = getattr(config_args, param, "unspecified") if param in cli_args and param not in config_args: # Use the value from the command line argument @@ -573,7 +695,8 @@ def overwrite_args(default_args: argparse.Namespace, config_args: argparse.Names if default_val != cli_val and param != "config": logging.getLogger("PPanGGOLiN").debug( f'The parameter "--{param}: {get_arg_name(cli_val)}" has been specified in the command line with a non-default value.' - f' Its value overwrites the default value ({get_arg_name(default_val)}).') + f" Its value overwrites the default value ({get_arg_name(default_val)})." + ) elif param not in cli_args and param in config_args: # Use the value from the config file @@ -582,7 +705,8 @@ def overwrite_args(default_args: argparse.Namespace, config_args: argparse.Names if default_val != config_val: logging.getLogger("PPanGGOLiN").debug( f'The parameter "--{param}: {get_arg_name(config_val)}" has been specified in the config file with a non-default value.' - f' Its value overwrites the default value ({get_arg_name(default_val)}).') + f" Its value overwrites the default value ({get_arg_name(default_val)})." + ) elif param in cli_args and param in config_args: # Use the value from the command line argument (cli) if it's different from the config file (config) @@ -591,15 +715,17 @@ def overwrite_args(default_args: argparse.Namespace, config_args: argparse.Names if cli_val == config_val and cli_val != default_val: logging.getLogger("PPanGGOLiN").debug( f'The parameter "--{param} {get_arg_name(cli_val)}" has been specified in both the command line ' - f'and the config file with the same values, but with non-default value. ' - f'Its value overwrites the default value ({get_arg_name(default_val)}).') + f"and the config file with the same values, but with non-default value. " + f"Its value overwrites the default value ({get_arg_name(default_val)})." + ) elif cli_val != config_val and param != "config": # Values in cli and config differ. Use the value from the command line argument (cli) logging.getLogger("PPanGGOLiN").debug( f'The parameter "--{param}" has been specified in both the command line ("{get_arg_name(cli_val)}") ' f'and the config file ("{get_arg_name(config_val)}") with different values. ' - f'The value from the command line argument is used.') + f"The value from the command line argument is used." + ) else: # Parameter is not defined in cli and in config. Use the default value. setattr(args, param, default_val) @@ -617,7 +743,7 @@ def combine_args(args: argparse.Namespace, another_args: argparse.Namespace): :return: object with combined arguments """ - other_arg_names = [arg for arg in dir(another_args) if not arg.startswith('_')] + other_arg_names = [arg for arg in dir(another_args) if not arg.startswith("_")] for arg_name in other_arg_names: arg_val = getattr(another_args, arg_name) @@ -626,8 +752,11 @@ def combine_args(args: argparse.Namespace, another_args: argparse.Namespace): return args -def get_args_differing_from_default(default_args: argparse.Namespace, final_args: argparse.Namespace, - param_to_ignore: Union[List[str], Set[str]] = None) -> dict: +def get_args_differing_from_default( + default_args: argparse.Namespace, + final_args: argparse.Namespace, + param_to_ignore: Union[List[str], Set[str]] = None, +) -> dict: """ Get the parameters that have different value than default values. @@ -638,25 +767,35 @@ def get_args_differing_from_default(default_args: argparse.Namespace, final_args :return: A dict with param that differ from default as key and the final value of the param as value """ param_to_ignore = [] if param_to_ignore is None else param_to_ignore - all_params = [arg for arg in dir(final_args) if not arg.startswith('_') if arg not in param_to_ignore] - - params_that_differ = {param: getattr(final_args, param) for param in all_params if - getattr(default_args, param) != getattr(final_args, param)} + all_params = [ + arg + for arg in dir(final_args) + if not arg.startswith("_") + if arg not in param_to_ignore + ] + + params_that_differ = { + param: getattr(final_args, param) + for param in all_params + if getattr(default_args, param) != getattr(final_args, param) + } return params_that_differ -def manage_cli_and_config_args(subcommand: str, config_file: str, subcommand_to_subparser: dict) -> argparse.Namespace: +def manage_cli_and_config_args( + subcommand: str, config_file: str, subcommand_to_subparser: dict +) -> argparse.Namespace: """ Manage command line and config arguments for the given subcommand. This function parse arguments from the cmd line and config file and set up the following priority: cli > config > default - When the subcommand is a workflow, the subcommand used in workflows are also parsed in the config. + When the subcommand is a workflow, the subcommand used in workflows are also parsed in the config. :params subcommand: Name of the subcommand. :params config_file: Path to the config file given in argument. If None, only default and cli arguments value are used. - :params subcommand_to_subparser: Dict with subcommand name as key and the corresponding subparser function as value. + :params subcommand_to_subparser: Dict with subcommand name as key and the corresponding subparser function as value. """ if config_file: config = parse_config_file(config_file) @@ -672,32 +811,54 @@ def manage_cli_and_config_args(subcommand: str, config_file: str, subcommand_to_ cli_args = get_cli_args(cmd_subparser) - all_cmd_param_names = {arg_name for arg_name in dir(default_args) if not arg_name.startswith('_')} + all_cmd_param_names = { + arg_name for arg_name in dir(default_args) if not arg_name.startswith("_") + } input_params = {param for param in all_cmd_param_names if param in ALL_INPUT_PARAMS} - general_params = {param for param in all_cmd_param_names if param in ALL_GENERAL_PARAMS} + general_params = { + param for param in all_cmd_param_names if param in ALL_GENERAL_PARAMS + } specific_params = all_cmd_param_names - (input_params | general_params) all_unspecific_params = ALL_INPUT_PARAMS + ALL_GENERAL_PARAMS # manage logging first to correctly set it up and to be able to log any issue when using config file later on - config_general_args = get_config_args(subcommand, cmd_subparser, config, "general_parameters", general_params, - strict_config_check=False) + config_general_args = get_config_args( + subcommand, + cmd_subparser, + config, + "general_parameters", + general_params, + strict_config_check=False, + ) general_args = overwrite_args(default_args, config_general_args, cli_args) set_verbosity_level(general_args) - config_input_args = get_config_args(subcommand, cmd_subparser, config, "input_parameters", input_params, - strict_config_check=True) + config_input_args = get_config_args( + subcommand, + cmd_subparser, + config, + "input_parameters", + input_params, + strict_config_check=True, + ) if subcommand in WORKFLOW_SUBCOMMANDS: # for workflow commands there is no section dedicated in the config: so no specific_args # only general_parameters and sections of commands launched in the worklow commands are used config_args = combine_args(config_general_args, config_input_args) else: - config_specific_args = get_config_args(subcommand, cmd_subparser, config, subcommand, specific_params, - strict_config_check=True) + config_specific_args = get_config_args( + subcommand, + cmd_subparser, + config, + subcommand, + specific_params, + strict_config_check=True, + ) config_args = combine_args(config_general_args, config_specific_args) config_args = combine_args(config_args, config_input_args) @@ -705,40 +866,64 @@ def manage_cli_and_config_args(subcommand: str, config_file: str, subcommand_to_ # cli > config > default args = overwrite_args(default_args, config_args, cli_args) - params_that_differ = get_args_differing_from_default(default_args, args, input_params) + params_that_differ = get_args_differing_from_default( + default_args, args, input_params + ) if params_that_differ: - params_that_differ_str = ', '.join(f'{p}={v}' for p, v in params_that_differ.items()) + params_that_differ_str = ", ".join( + f"{p}={v}" for p, v in params_that_differ.items() + ) logging.getLogger("PPanGGOLiN").debug( - f"{len(params_that_differ)} {subcommand} parameters have non-default value: {params_that_differ_str}") + f"{len(params_that_differ)} {subcommand} parameters have non-default value: {params_that_differ_str}" + ) # manage workflow command workflow_steps = [] if subcommand in WORKFLOW_SUBCOMMANDS: for workflow_step in ALL_WORKFLOW_DEPENDENCIES: - if (workflow_step in ["rgp", "spot"] and subcommand in ["workflow", "panmodule"]) or \ - (workflow_step == "module" and subcommand in ["workflow", "panrgp"]): + if ( + workflow_step in ["rgp", "spot"] + and subcommand in ["workflow", "panmodule"] + ) or (workflow_step == "module" and subcommand in ["workflow", "panrgp"]): continue - logging.getLogger("PPanGGOLiN").debug(f'Parsing {workflow_step} arguments in config file.') + logging.getLogger("PPanGGOLiN").debug( + f"Parsing {workflow_step} arguments in config file." + ) step_subparser = subcommand_to_subparser[workflow_step] - default_step_args = get_default_args(workflow_step, step_subparser, unwanted_args=all_unspecific_params) + default_step_args = get_default_args( + workflow_step, step_subparser, unwanted_args=all_unspecific_params + ) # remove general args - all_param_names = {arg_name for arg_name in dir(default_step_args) if not arg_name.startswith('_')} - specific_step_params = {param_name for param_name in all_param_names if - param_name not in all_unspecific_params} - config_step_args = get_config_args(workflow_step, step_subparser, config, workflow_step, - specific_step_params, strict_config_check=True) + all_param_names = { + arg_name + for arg_name in dir(default_step_args) + if not arg_name.startswith("_") + } + specific_step_params = { + param_name + for param_name in all_param_names + if param_name not in all_unspecific_params + } + config_step_args = get_config_args( + workflow_step, + step_subparser, + config, + workflow_step, + specific_step_params, + strict_config_check=True, + ) # overwrite write and draw default when not specified in config - if workflow_step == 'write_pangenome': + if workflow_step == "write_pangenome": for out_flag in WRITE_PAN_FLAG_DEFAULT_IN_WF: if out_flag not in config[workflow_step]: setattr(default_step_args, out_flag, True) - if workflow_step == 'write_genomes': + if workflow_step == "write_genomes": for out_flag in WRITE_GENOME_FLAG_DEFAULT_IN_WF: if out_flag not in config[workflow_step]: setattr(default_step_args, out_flag, True) @@ -750,16 +935,24 @@ def manage_cli_and_config_args(subcommand: str, config_file: str, subcommand_to_ step_args = overwrite_args(default_step_args, config_step_args, cli_args) - step_params_that_differ = get_args_differing_from_default(default_step_args, step_args) + step_params_that_differ = get_args_differing_from_default( + default_step_args, step_args + ) if step_params_that_differ: - step_params_that_differ_str = ', '.join(f'{p}={v}' for p, v in step_params_that_differ.items()) - logging.getLogger("PPanGGOLiN").debug(f"{len(step_params_that_differ)} {workflow_step} parameters have " - f"a non-default value: {step_params_that_differ_str}") + step_params_that_differ_str = ", ".join( + f"{p}={v}" for p, v in step_params_that_differ.items() + ) + logging.getLogger("PPanGGOLiN").debug( + f"{len(step_params_that_differ)} {workflow_step} parameters have " + f"a non-default value: {step_params_that_differ_str}" + ) # add step name to differentiate the params - step_params_that_differ = {f'{workflow_step}:{param}': value for param, value in - step_params_that_differ.items()} + step_params_that_differ = { + f"{workflow_step}:{param}": value + for param, value in step_params_that_differ.items() + } params_that_differ.update(step_params_that_differ) @@ -767,7 +960,9 @@ def manage_cli_and_config_args(subcommand: str, config_file: str, subcommand_to_ setattr(args, workflow_step, step_args) if params_that_differ: - logging.getLogger("PPanGGOLiN").info(f'{len(params_that_differ)} parameters have a non-default value.') + logging.getLogger("PPanGGOLiN").info( + f"{len(params_that_differ)} parameters have a non-default value." + ) check_config_consistency(config, workflow_steps) @@ -776,9 +971,9 @@ def manage_cli_and_config_args(subcommand: str, config_file: str, subcommand_to_ def check_config_consistency(config: dict, workflow_steps: list): """ - Check that the same parameter used in different subcommand inside a workflow has the same value. + Check that the same parameter used in different subcommand inside a workflow has the same value. - If not, the function throw a logging.getLogger("PPanGGOLiN").warning. + If not, the function throw a logging.getLogger("PPanGGOLiN").warning. :params config_dict: config dict with as key the section of the config file and as value another dict pairing name and value of parameters. :params workflow_steps: list of subcommand names used in the workflow execution. @@ -798,17 +993,25 @@ def count_different_values(values: Iterable[Union[int, str, Tuple, List]]) -> in return len(hashable_values) # params used in multiple subcommands - all_params = [param for subcmd, param_to_value_dict in config.items() for param in param_to_value_dict if - subcmd in workflow_steps] + all_params = [ + param + for subcmd, param_to_value_dict in config.items() + for param in param_to_value_dict + if subcmd in workflow_steps + ] duplicate_params = [param for param in all_params if all_params.count(param) > 1] for duplicate_param in set(duplicate_params): - step_to_value = {step: param_to_value[duplicate_param] for step, param_to_value in config.items() if - duplicate_param in param_to_value} + step_to_value = { + step: param_to_value[duplicate_param] + for step, param_to_value in config.items() + if duplicate_param in param_to_value + } if count_different_values(step_to_value.values()) > 1: logging.getLogger("PPanGGOLiN").warning( - f'The parameter {duplicate_param} used in multiple subcommands of the workflow is specified with different values in config file: {step_to_value}.') + f"The parameter {duplicate_param} used in multiple subcommands of the workflow is specified with different values in config file: {step_to_value}." + ) def set_up_config_param_to_parser(config_param_val: dict) -> list: @@ -841,8 +1044,9 @@ def set_up_config_param_to_parser(config_param_val: dict) -> list: return arguments_to_parse -def get_subcommand_parser(subparser_fct: Callable, name: str = '') \ - -> Tuple[argparse._SubParsersAction, argparse.ArgumentParser]: +def get_subcommand_parser( + subparser_fct: Callable, name: str = "" +) -> Tuple[argparse._SubParsersAction, argparse.ArgumentParser]: """ Get subcommand parser object using the given subparser function. @@ -860,10 +1064,11 @@ def get_subcommand_parser(subparser_fct: Callable, name: str = '') \ prog = f"Parsing section {name} in config file" usage = "Yaml config file" - parser = argparse.ArgumentParser(prog=prog, - allow_abbrev=False, add_help=False) + parser = argparse.ArgumentParser(prog=prog, allow_abbrev=False, add_help=False) - subparsers = parser.add_subparsers(metavar="", dest="subcommand", title="subcommands", description="") + subparsers = parser.add_subparsers( + metavar="", dest="subcommand", title="subcommands", description="" + ) sub = subparser_fct(subparsers) sub.usage = usage @@ -876,7 +1081,9 @@ def get_subcommand_parser(subparser_fct: Callable, name: str = '') \ return parser, sub -def get_default_args(subcommand: str, subparser_fct: Callable, unwanted_args: list = None) -> argparse.Namespace: +def get_default_args( + subcommand: str, subparser_fct: Callable, unwanted_args: list = None +) -> argparse.Namespace: """ Get default value for the arguments for the given subparser function. @@ -884,21 +1091,29 @@ def get_default_args(subcommand: str, subparser_fct: Callable, unwanted_args: li :params subparser_fct: Subparser function to use. This subparser give the expected argument for the subcommand. :params unwanted_args: List of arguments to filter out. - :return args: arguments with default values. + :return args: arguments with default values. """ unwanted_args = [] if unwanted_args is None else unwanted_args parser, sub = get_subcommand_parser(subparser_fct, subcommand) # remove unwanted argumnents - sub._actions = [p_action for p_action in sub._actions if p_action.dest not in unwanted_args] + sub._actions = [ + p_action for p_action in sub._actions if p_action.dest not in unwanted_args + ] args = parser.parse_args([subcommand]) return args -def get_config_args(subcommand: str, subparser_fct: Callable, config_dict: dict, config_section: str, - expected_params: Union[List[str], Set[str]], strict_config_check: bool) -> argparse.Namespace: +def get_config_args( + subcommand: str, + subparser_fct: Callable, + config_dict: dict, + config_section: str, + expected_params: Union[List[str], Set[str]], + strict_config_check: bool, +) -> argparse.Namespace: """ Parsing parameters of a specific section of the config file. @@ -921,18 +1136,27 @@ def get_config_args(subcommand: str, subparser_fct: Callable, config_dict: dict, erase_default_value(sub) # Manage args - sub._actions = [p_action for p_action in sub._actions if p_action.dest in expected_params] + sub._actions = [ + p_action for p_action in sub._actions if p_action.dest in expected_params + ] if not strict_config_check: # remove param found in config that are not expected by parser. useful for general_parameters. expected_args_names = [p_action.dest for p_action in sub._actions] - unexpected_config = [f'{name}:{value}' for name, value in config.items() if name not in expected_args_names] - config = {name: value for name, value in config.items() if name in expected_args_names} + unexpected_config = [ + f"{name}:{value}" + for name, value in config.items() + if name not in expected_args_names + ] + config = { + name: value for name, value in config.items() if name in expected_args_names + } if unexpected_config: logging.getLogger("PPanGGOLiN").info( - f'While parsing {config_section} section in config file, {len(unexpected_config)} unexpected parameters ' - f'were ignored : {" ".join(unexpected_config)}') + f"While parsing {config_section} section in config file, {len(unexpected_config)} unexpected parameters " + f'were ignored : {" ".join(unexpected_config)}' + ) else: for param_name in config: if param_name not in expected_params: @@ -951,7 +1175,7 @@ def get_config_args(subcommand: str, subparser_fct: Callable, config_dict: dict, def get_cli_args(subparser_fct: Callable) -> argparse.Namespace: """ - Parse command line arguments using the specified parsing function. + Parse command line arguments using the specified parsing function. :params subparser_fct: Subparser function to use. This subparser give the expected argument for the subcommand. """ @@ -965,14 +1189,14 @@ def get_cli_args(subparser_fct: Callable) -> argparse.Namespace: # remove argument that have not been specified delete_unspecified_args(cli_args) - delattr(cli_args, 'subcommand') + delattr(cli_args, "subcommand") return cli_args def erase_default_value(parser: argparse.ArgumentParser): """ - Remove default action in the given list of argument parser actions. + Remove default action in the given list of argument parser actions. This is dnoe to distinguish specified arguments. @@ -996,8 +1220,12 @@ def delete_unspecified_args(args: argparse.Namespace): delattr(args, arg_name) -def extract_contig_window(contig_size: int, positions_of_interest: Iterable[int], window_size: int, - is_circular: bool = False): +def extract_contig_window( + contig_size: int, + positions_of_interest: Iterable[int], + window_size: int, + is_circular: bool = False, +): """ Extracts contiguous windows around positions of interest within a contig. @@ -1014,8 +1242,10 @@ def extract_contig_window(contig_size: int, positions_of_interest: Iterable[int] # Check if any position of interest is out of range if sorted_positions[0] < 0 or sorted_positions[-1] >= contig_size: - raise IndexError(f'Positions of interest are out of range. ' - f"Contig has {contig_size} genes while given min={sorted_positions[0]} & max={sorted_positions[-1]} positions") + raise IndexError( + f"Positions of interest are out of range. " + f"Contig has {contig_size} genes while given min={sorted_positions[0]} & max={sorted_positions[-1]} positions" + ) if is_circular: first_position = sorted_positions[0] @@ -1053,7 +1283,9 @@ def extract_contig_window(contig_size: int, positions_of_interest: Iterable[int] return windows_coordinates -def parse_input_paths_file(path_list_file: Path) -> Dict[str, Dict[str, Union[Path, List[str]]]]: +def parse_input_paths_file( + path_list_file: Path, +) -> Dict[str, Dict[str, Union[Path, List[str]]]]: """ Parse an input paths file to extract genome information. @@ -1066,7 +1298,9 @@ def parse_input_paths_file(path_list_file: Path) -> Dict[str, Dict[str, Union[Pa :raises FileNotFoundError: If a specified genome file path does not exist. :raises Exception: If there are no genomes in the provided file. """ - logging.getLogger("PPanGGOLiN").info(f"Reading {path_list_file} to process genome files") + logging.getLogger("PPanGGOLiN").info( + f"Reading {path_list_file} to process genome files" + ) genome_name_to_genome_path = {} for line in read_compressed_or_not(path_list_file): @@ -1081,13 +1315,14 @@ def parse_input_paths_file(path_list_file: Path) -> Dict[str, Dict[str, Union[Pa if not genome_file_path_alt.exists(): raise FileNotFoundError( - f"The file path '{genome_file_path}' for genome '{genome_name}' specified in '{path_list_file}' does not exist.") + f"The file path '{genome_file_path}' for genome '{genome_name}' specified in '{path_list_file}' does not exist." + ) else: genome_file_path = genome_file_path_alt genome_name_to_genome_path[genome_name] = { "path": genome_file_path, - "circular_contigs": putative_circular_contigs + "circular_contigs": putative_circular_contigs, } if len(genome_name_to_genome_path) == 0: @@ -1096,7 +1331,9 @@ def parse_input_paths_file(path_list_file: Path) -> Dict[str, Dict[str, Union[Pa return genome_name_to_genome_path -def flatten_nested_dict(nested_dict: Dict[str, Union[Dict, int, str, float]]) -> Dict[str, Union[int, str, float]]: +def flatten_nested_dict( + nested_dict: Dict[str, Union[Dict, int, str, float]] +) -> Dict[str, Union[int, str, float]]: """ Flattens a nested dictionary into a flat dictionary by concatenating keys at different levels. @@ -1105,7 +1342,7 @@ def flatten_nested_dict(nested_dict: Dict[str, Union[Dict, int, str, float]]) -> """ flat_dict = {} - def flatten(dictionary, parent_key=''): + def flatten(dictionary, parent_key=""): for key, val in dictionary.items(): new_key = f"{parent_key}_{key}" if parent_key else key if isinstance(val, dict): @@ -1126,7 +1363,7 @@ def get_major_version(version: str) -> int: :raises ValueError: If the input version does not have the expected format. """ try: - major_version = int(version.split('.')[0]) + major_version = int(version.split(".")[0]) except ValueError: raise ValueError(f"Version {version} does not have the expected format.") @@ -1140,27 +1377,31 @@ def check_version_compatibility(file_version: str) -> None: :param file_version: A string representing the version of the pangenome file. """ # Get the current PPanGGOLiN version - current_version = distribution('ppanggolin').version + current_version = distribution("ppanggolin").version current_version_major = get_major_version(current_version) file_major_version = get_major_version(file_version) # Check for compatibility issues if file_major_version != current_version_major: - logging.getLogger("PPanGGOLiN").error('Your pangenome file has been created with a different major version ' - 'of PPanGGOLiN than the one installed in the system. This mismatch may lead to compatibility issues.') + logging.getLogger("PPanGGOLiN").error( + "Your pangenome file has been created with a different major version " + "of PPanGGOLiN than the one installed in the system. This mismatch may lead to compatibility issues." + ) if file_major_version < 2 and current_version_major >= 2: - raise ValueError(f'The provided pangenome file was created by PPanGGOLiN version {file_version}, which is ' - f'incompatible with the current PPanGGOLiN version {current_version}.') + raise ValueError( + f"The provided pangenome file was created by PPanGGOLiN version {file_version}, which is " + f"incompatible with the current PPanGGOLiN version {current_version}." + ) def find_consecutive_sequences(sequence: List[int]) -> List[List[int]]: """ Find consecutive sequences in a list of integers. - + :param sequence: The input list of integers. - + :return: A list of lists containing consecutive sequences of integers. """ s_sequence = sorted(sequence) @@ -1177,39 +1418,47 @@ def find_consecutive_sequences(sequence: List[int]) -> List[List[int]]: return consecutive_sequences -def find_region_border_position(region_positions: List[int], contig_gene_count: int) -> Tuple[int, int]: +def find_region_border_position( + region_positions: List[int], contig_gene_count: int +) -> Tuple[int, int]: """ Find the start and stop integers of the region considering circularity of the contig. - + :param region_positions: List of positions that belong to the region. :param contig_gene_count: Number of gene in the contig. The contig is considered circular. - + :return: A tuple containing the start and stop integers of the region. """ - consecutive_region_positions = get_consecutive_region_positions(region_positions, contig_gene_count) + consecutive_region_positions = get_consecutive_region_positions( + region_positions, contig_gene_count + ) return consecutive_region_positions[0][0], consecutive_region_positions[-1][-1] -def get_consecutive_region_positions(region_positions: List[int], contig_gene_count: int) -> List[List[int]]: +def get_consecutive_region_positions( + region_positions: List[int], contig_gene_count: int +) -> List[List[int]]: """ Order integers position of the region considering circularity of the contig. - + :param region_positions: List of positions that belong to the region. :param contig_gene_count: Number of gene in the contig. The contig is considered circular. - + :return: An ordered list of integers of the region. - + :raises ValueError: If unexpected conditions are encountered. """ if len(region_positions) == 0: - raise ValueError('Region has no position. This is unexpected.') + raise ValueError("Region has no position. This is unexpected.") consecutive_sequences = sorted(find_consecutive_sequences(region_positions)) if len(consecutive_sequences) == 0: - raise ValueError('No consecutive sequences found in the region. This is unexpected.') + raise ValueError( + "No consecutive sequences found in the region. This is unexpected." + ) elif len(consecutive_sequences) == 1: return consecutive_sequences @@ -1217,22 +1466,32 @@ def get_consecutive_region_positions(region_positions: List[int], contig_gene_co elif len(consecutive_sequences) == 2: # Check for overlaps at the edge of the contig if consecutive_sequences[0][0] != 0: - raise ValueError(f'Two sequences of consecutive positions ({consecutive_sequences}) ' - f'indicate an overlap on the edge of the contig, but neither starts at the beginning of the contig (0).') + raise ValueError( + f"Two sequences of consecutive positions ({consecutive_sequences}) " + f"indicate an overlap on the edge of the contig, but neither starts at the beginning of the contig (0)." + ) elif consecutive_sequences[-1][-1] != contig_gene_count - 1: - raise ValueError(f'Two sequences of consecutive positions ({consecutive_sequences}) ' - f'indicate an overlap on the edge of the contig, but neither ends at the end of the contig ({contig_gene_count - 1}).') + raise ValueError( + f"Two sequences of consecutive positions ({consecutive_sequences}) " + f"indicate an overlap on the edge of the contig, but neither ends at the end of the contig ({contig_gene_count - 1})." + ) return [consecutive_sequences[-1], consecutive_sequences[0]] elif len(consecutive_sequences) > 2: - raise ValueError(f'More than two consecutive sequences found ({len(consecutive_sequences)}). ' - f'This is unexpected. Consecutive sequences: {consecutive_sequences}. ' - 'The region should consist of consecutive positions along the contig.') - - -def run_subprocess(cmd: List[str], output: Path = None, msg: str = "Subprocess failed with the following error:\n"): + raise ValueError( + f"More than two consecutive sequences found ({len(consecutive_sequences)}). " + f"This is unexpected. Consecutive sequences: {consecutive_sequences}. " + "The region should consist of consecutive positions along the contig." + ) + + +def run_subprocess( + cmd: List[str], + output: Path = None, + msg: str = "Subprocess failed with the following error:\n", +): """Run a subprocess command and write the output to the given path. :param cmd: list of program arguments @@ -1252,11 +1511,10 @@ def run_subprocess(cmd: List[str], output: Path = None, msg: str = "Subprocess f raise Exception(msg + subprocess_err.stderr) else: if output is not None: - with open(output, 'w') as fout: + with open(output, "w") as fout: fout.write(result.stdout) - def has_non_ascii(string_to_test: str) -> bool: """ Check if a string contains any non-ASCII characters. @@ -1265,11 +1523,12 @@ def has_non_ascii(string_to_test: str) -> bool: :return: True if the string contains non-ASCII characters, False otherwise. """ try: - string_to_test.encode('ascii') + string_to_test.encode("ascii") except UnicodeEncodeError: return True return False + def replace_non_ascii(string_with_ascii: str, replacement_string: str = "_") -> str: """ Replace all non-ASCII characters in a string with a specified replacement string. @@ -1278,4 +1537,4 @@ def replace_non_ascii(string_with_ascii: str, replacement_string: str = "_") -> :param replacement_string: The string to replace non-ASCII characters with (default is '_'). :return: A new string where all non-ASCII characters have been replaced. """ - return re.sub(r'[^\x00-\x7F]+', replacement_string, string_with_ascii) + return re.sub(r"[^\x00-\x7F]+", replacement_string, string_with_ascii) diff --git a/ppanggolin/workflow/all.py b/ppanggolin/workflow/all.py index f3b8d922..3ce60b7c 100644 --- a/ppanggolin/workflow/all.py +++ b/ppanggolin/workflow/all.py @@ -10,9 +10,18 @@ # local libraries from ppanggolin.pangenome import Pangenome -from ppanggolin.utils import mk_file_name, mk_outdir, check_option_workflow, restricted_float -from ppanggolin.annotate.annotate import annotate_pangenome, read_annotations, get_gene_sequences_from_fastas, \ - check_annotate_args +from ppanggolin.utils import ( + mk_file_name, + mk_outdir, + check_option_workflow, + restricted_float, +) +from ppanggolin.annotate.annotate import ( + annotate_pangenome, + read_annotations, + get_gene_sequences_from_fastas, + check_annotate_args, +) from ppanggolin.cluster.cluster import clustering, read_clustering from ppanggolin.graph.makeGraph import compute_neighbors_graph from ppanggolin.nem.rarefaction import make_rarefaction_curve @@ -31,8 +40,9 @@ """a global workflow that does everything in one go.""" -def launch_workflow(args: argparse.Namespace, panrgp: bool = True, - panmodule: bool = True): +def launch_workflow( + args: argparse.Namespace, panrgp: bool = True, panmodule: bool = True +): """ Unified function to launch ppanggolin workflow. @@ -47,39 +57,70 @@ def launch_workflow(args: argparse.Namespace, panrgp: bool = True, filename = mk_file_name(args.basename, args.output, args.force) - writing_time, anno_time, clust_time, mod_time, desc_time = (None, None, None, None, None) + writing_time, anno_time, clust_time, mod_time, desc_time = ( + None, + None, + None, + None, + None, + ) if args.anno: # if the annotations are provided, we read from it start_anno = time.time() - read_annotations(pangenome, args.anno, pseudo=args.annotate.use_pseudo, - cpu=args.annotate.cpu, translation_table=args.annotate.translation_table, - disable_bar=args.disable_prog_bar) + read_annotations( + pangenome, + args.anno, + pseudo=args.annotate.use_pseudo, + cpu=args.annotate.cpu, + translation_table=args.annotate.translation_table, + disable_bar=args.disable_prog_bar, + ) anno_time = time.time() - start_anno start_writing = time.time() - write_pangenome(pangenome, filename, args.force, disable_bar=args.disable_prog_bar) + write_pangenome( + pangenome, filename, args.force, disable_bar=args.disable_prog_bar + ) writing_time = time.time() - start_writing if args.clusters is not None: start_clust = time.time() - read_clustering(pangenome, args.clusters, infer_singleton=args.cluster.infer_singletons, - code=args.cluster.translation_table, cpu=args.cluster.cpu, tmpdir=args.tmpdir, - keep_tmp=args.cluster.keep_tmp, force=args.force, disable_bar=args.disable_prog_bar) + read_clustering( + pangenome, + args.clusters, + infer_singleton=args.cluster.infer_singletons, + code=args.cluster.translation_table, + cpu=args.cluster.cpu, + tmpdir=args.tmpdir, + keep_tmp=args.cluster.keep_tmp, + force=args.force, + disable_bar=args.disable_prog_bar, + ) else: # args.cluster is None if pangenome.status["geneSequences"] == "No": if args.fasta is None: - raise Exception("The gff/gbff provided did not have any sequence information, " - "you did not provide clusters and you did not provide fasta file. " - "Thus, we do not have the information we need to continue the analysis.") + raise Exception( + "The gff/gbff provided did not have any sequence information, " + "you did not provide clusters and you did not provide fasta file. " + "Thus, we do not have the information we need to continue the analysis." + ) else: get_gene_sequences_from_fastas(pangenome, args.fasta) start_clust = time.time() - clustering(pangenome, tmpdir=args.tmpdir, cpu=args.cluster.cpu, force=args.force, - disable_bar=args.disable_prog_bar, - defrag=not args.cluster.no_defrag, code=args.cluster.translation_table, - coverage=args.cluster.coverage, identity=args.cluster.identity, mode=args.cluster.mode, - keep_tmp_files=args.cluster.keep_tmp) + clustering( + pangenome, + tmpdir=args.tmpdir, + cpu=args.cluster.cpu, + force=args.force, + disable_bar=args.disable_prog_bar, + defrag=not args.cluster.no_defrag, + code=args.cluster.translation_table, + coverage=args.cluster.coverage, + identity=args.cluster.identity, + mode=args.cluster.mode, + keep_tmp_files=args.cluster.keep_tmp, + ) clust_time = time.time() - start_clust elif args.fasta is not None: @@ -92,51 +133,73 @@ def launch_workflow(args: argparse.Namespace, panrgp: bool = True, raise argparse.ArgumentError(argument=None, message=message) start_anno = time.time() - annotate_pangenome(pangenome, args.fasta, tmpdir=args.tmpdir, cpu=args.annotate.cpu, - disable_bar=args.disable_prog_bar, - procedure=args.annotate.prodigal_procedure, - translation_table=args.annotate.translation_table, kingdom=args.annotate.kingdom, - norna=args.annotate.norna, - allow_overlap=args.annotate.allow_overlap) + annotate_pangenome( + pangenome, + args.fasta, + tmpdir=args.tmpdir, + cpu=args.annotate.cpu, + disable_bar=args.disable_prog_bar, + procedure=args.annotate.prodigal_procedure, + translation_table=args.annotate.translation_table, + kingdom=args.annotate.kingdom, + norna=args.annotate.norna, + allow_overlap=args.annotate.allow_overlap, + ) anno_time = time.time() - start_anno start_writing = time.time() - write_pangenome(pangenome, filename, args.force, disable_bar=args.disable_prog_bar) + write_pangenome( + pangenome, filename, args.force, disable_bar=args.disable_prog_bar + ) writing_time = time.time() - start_writing start_clust = time.time() - clustering(pangenome, tmpdir=args.tmpdir, cpu=args.cluster.cpu, force=args.force, - disable_bar=args.disable_prog_bar, defrag=not args.cluster.no_defrag, - code=args.cluster.translation_table, coverage=args.cluster.coverage, - identity=args.cluster.identity, mode=args.cluster.mode, - keep_tmp_files=args.cluster.keep_tmp) + clustering( + pangenome, + tmpdir=args.tmpdir, + cpu=args.cluster.cpu, + force=args.force, + disable_bar=args.disable_prog_bar, + defrag=not args.cluster.no_defrag, + code=args.cluster.translation_table, + coverage=args.cluster.coverage, + identity=args.cluster.identity, + mode=args.cluster.mode, + keep_tmp_files=args.cluster.keep_tmp, + ) clust_time = time.time() - start_clust write_pangenome(pangenome, filename, args.force, disable_bar=args.disable_prog_bar) start_graph = time.time() - compute_neighbors_graph(pangenome, args.graph.remove_high_copy_number, args.force, - disable_bar=args.disable_prog_bar) + compute_neighbors_graph( + pangenome, + args.graph.remove_high_copy_number, + args.force, + disable_bar=args.disable_prog_bar, + ) graph_time = time.time() - start_graph start_part = time.time() - partition(pangenome, - tmpdir=args.tmpdir, - output=args.output, - beta=args.partition.beta, - sm_degree=args.partition.max_degree_smoothing, - free_dispersion=args.partition.free_dispersion, - chunk_size=args.partition.chunk_size, - kval=args.partition.nb_of_partitions, - krange=args.partition.krange, - icl_margin=args.partition.ICL_margin, - draw_icl=args.partition.draw_ICL, - seed=args.partition.seed, - keep_tmp_files=args.partition.keep_tmp_files, - cpu=args.partition.cpu, - force=args.force, - disable_bar=args.disable_prog_bar) + partition( + pangenome, + tmpdir=args.tmpdir, + output=args.output, + beta=args.partition.beta, + sm_degree=args.partition.max_degree_smoothing, + free_dispersion=args.partition.free_dispersion, + chunk_size=args.partition.chunk_size, + kval=args.partition.nb_of_partitions, + krange=args.partition.krange, + icl_margin=args.partition.ICL_margin, + draw_icl=args.partition.draw_ICL, + seed=args.partition.seed, + keep_tmp_files=args.partition.keep_tmp_files, + cpu=args.partition.cpu, + force=args.force, + disable_bar=args.disable_prog_bar, + ) part_time = time.time() - start_part start_writing = time.time() @@ -146,23 +209,44 @@ def launch_workflow(args: argparse.Namespace, panrgp: bool = True, regions_time, spot_time = (0, 0) if panrgp: start_regions = time.time() - predict_rgp(pangenome, persistent_penalty=args.rgp.persistent_penalty, variable_gain=args.rgp.variable_gain, - min_length=args.rgp.min_length, min_score=args.rgp.min_score, dup_margin=args.rgp.dup_margin, - force=args.force, disable_bar=args.disable_prog_bar) + predict_rgp( + pangenome, + persistent_penalty=args.rgp.persistent_penalty, + variable_gain=args.rgp.variable_gain, + min_length=args.rgp.min_length, + min_score=args.rgp.min_score, + dup_margin=args.rgp.dup_margin, + force=args.force, + disable_bar=args.disable_prog_bar, + ) regions_time = time.time() - start_regions start_spots = time.time() - predict_hotspots(pangenome, args.output, force=args.force, spot_graph=args.spot.spot_graph, - overlapping_match=args.spot.overlapping_match, set_size=args.spot.set_size, - exact_match=args.spot.exact_match_size, disable_bar=args.disable_prog_bar) + predict_hotspots( + pangenome, + args.output, + force=args.force, + spot_graph=args.spot.spot_graph, + overlapping_match=args.spot.overlapping_match, + set_size=args.spot.set_size, + exact_match=args.spot.exact_match_size, + disable_bar=args.disable_prog_bar, + ) spot_time = time.time() - start_spots if panmodule: start_mods = time.time() - predict_modules(pangenome=pangenome, dup_margin=args.module.dup_margin, size=args.module.size, - min_presence=args.module.min_presence, transitive=args.module.transitive, - jaccard=args.module.jaccard, force=args.force, disable_bar=args.disable_prog_bar) + predict_modules( + pangenome=pangenome, + dup_margin=args.module.dup_margin, + size=args.module.size, + min_presence=args.module.min_presence, + transitive=args.module.transitive, + jaccard=args.module.jaccard, + force=args.force, + disable_bar=args.disable_prog_bar, + ) mod_time = time.time() - start_mods @@ -171,116 +255,201 @@ def launch_workflow(args: argparse.Namespace, panrgp: bool = True, writing_time = writing_time + time.time() - start_writing if args.rarefaction_flag: - make_rarefaction_curve(pangenome=pangenome, output=args.output, tmpdir=args.tmpdir, - beta=args.rarefaction.beta, - depth=args.rarefaction.depth, - min_sampling=args.rarefaction.min, - max_sampling=args.rarefaction.max, - sm_degree=args.rarefaction.max_degree_smoothing, - free_dispersion=args.rarefaction.free_dispersion, - chunk_size=args.rarefaction.chunk_size, - kval=args.rarefaction.nb_of_partitions, - krange=args.rarefaction.krange, - seed=args.rarefaction.seed, - kestimate=args.rarefaction.reestimate_K, - soft_core=args.rarefaction.soft_core, - cpu=args.rarefaction.cpu, disable_bar=args.disable_prog_bar) + make_rarefaction_curve( + pangenome=pangenome, + output=args.output, + tmpdir=args.tmpdir, + beta=args.rarefaction.beta, + depth=args.rarefaction.depth, + min_sampling=args.rarefaction.min, + max_sampling=args.rarefaction.max, + sm_degree=args.rarefaction.max_degree_smoothing, + free_dispersion=args.rarefaction.free_dispersion, + chunk_size=args.rarefaction.chunk_size, + kval=args.rarefaction.nb_of_partitions, + krange=args.rarefaction.krange, + seed=args.rarefaction.seed, + kestimate=args.rarefaction.reestimate_K, + soft_core=args.rarefaction.soft_core, + cpu=args.rarefaction.cpu, + disable_bar=args.disable_prog_bar, + ) if not args.no_flat_files: if panrgp and args.draw.spots: start_spot_drawing = time.time() - mk_outdir(args.output / 'spot_figures', force=True) - draw_spots(pangenome=pangenome, output=args.output / 'spot_figures', spot_list='all', - disable_bar=args.disable_prog_bar) + mk_outdir(args.output / "spot_figures", force=True) + draw_spots( + pangenome=pangenome, + output=args.output / "spot_figures", + spot_list="all", + disable_bar=args.disable_prog_bar, + ) spot_time += time.time() - start_spot_drawing if args.draw.tile_plot: - if pangenome.number_of_organisms < 65000 or pangenome.number_of_gene_families < 65000: - nocloud = args.draw.nocloud if pangenome.number_of_organisms < 32767 or pangenome.number_of_gene_families < 32767 else True - draw_tile_plot(pangenome, args.output, nocloud=nocloud, disable_bar=args.disable_prog_bar, - draw_dendrogram=args.draw.add_dendrogram, add_metadata=True) + if ( + pangenome.number_of_organisms < 65000 + or pangenome.number_of_gene_families < 65000 + ): + nocloud = ( + args.draw.nocloud + if pangenome.number_of_organisms < 32767 + or pangenome.number_of_gene_families < 32767 + else True + ) + draw_tile_plot( + pangenome, + args.output, + nocloud=nocloud, + disable_bar=args.disable_prog_bar, + draw_dendrogram=args.draw.add_dendrogram, + add_metadata=True, + ) else: logging.getLogger("PPanGGOLiN").warning( - 'Tile plot output have been requested but there are too many genomes or families to produce a viewable tile plot.') + "Tile plot output have been requested but there are too many genomes or families to produce a viewable tile plot." + ) if args.draw.ucurve: - draw_ucurve(pangenome, args.output, disable_bar=args.disable_prog_bar, soft_core=args.draw.soft_core) + draw_ucurve( + pangenome, + args.output, + disable_bar=args.disable_prog_bar, + soft_core=args.draw.soft_core, + ) start_desc = time.time() - write_pangenome_arguments = ["gexf", "light_gexf", 'json', "csv", "Rtab", "stats", "partitions", "families_tsv"] + write_pangenome_arguments = [ + "gexf", + "light_gexf", + "json", + "csv", + "Rtab", + "stats", + "partitions", + "families_tsv", + ] # Check that we don't ask write to output something not computed. - borders, spots, spot_modules, modules, regions = (False, False, False, False, False) + borders, spots, spot_modules, modules, regions = ( + False, + False, + False, + False, + False, + ) if panmodule: modules = args.write_pangenome.modules - write_pangenome_arguments.append('modules') + write_pangenome_arguments.append("modules") if panrgp: borders, spots, regions = ( - args.write_pangenome.borders, args.write_pangenome.spots, args.write_pangenome.regions) + args.write_pangenome.borders, + args.write_pangenome.spots, + args.write_pangenome.regions, + ) write_pangenome_arguments += ["borders", "spots", "regions"] if panmodule and panrgp: spot_modules = args.write_pangenome.spot_modules - write_pangenome_arguments.append('spot_modules') + write_pangenome_arguments.append("spot_modules") # check that at least one output file is requested. if not write is not call. - if any(getattr(args.write_pangenome, arg) is True for arg in write_pangenome_arguments): + if any( + getattr(args.write_pangenome, arg) is True + for arg in write_pangenome_arguments + ): # some parameters are set to false because they have not been computed in this workflow - write_pangenome_flat_files(pangenome, args.output, cpu=args.write_pangenome.cpu, - disable_bar=args.disable_prog_bar, - soft_core=args.write_pangenome.soft_core, - dup_margin=args.write_pangenome.dup_margin, - csv=args.write_pangenome.csv, gene_pa=args.write_pangenome.Rtab, - gexf=args.write_pangenome.gexf, - light_gexf=args.write_pangenome.light_gexf, - stats=args.write_pangenome.stats, json=args.write_pangenome.json, - partitions=args.write_pangenome.partitions, - families_tsv=args.write_pangenome.families_tsv, regions=regions, - compress=args.write_pangenome.compress, - spot_modules=spot_modules, modules=modules, spots=spots, borders=borders) + write_pangenome_flat_files( + pangenome, + args.output, + cpu=args.write_pangenome.cpu, + disable_bar=args.disable_prog_bar, + soft_core=args.write_pangenome.soft_core, + dup_margin=args.write_pangenome.dup_margin, + csv=args.write_pangenome.csv, + gene_pa=args.write_pangenome.Rtab, + gexf=args.write_pangenome.gexf, + light_gexf=args.write_pangenome.light_gexf, + stats=args.write_pangenome.stats, + json=args.write_pangenome.json, + partitions=args.write_pangenome.partitions, + families_tsv=args.write_pangenome.families_tsv, + regions=regions, + compress=args.write_pangenome.compress, + spot_modules=spot_modules, + modules=modules, + spots=spots, + borders=borders, + ) else: logging.getLogger("PPanGGOLiN").info( - 'No flat file describing the pangenome has been requested in config file. ' - 'Writing output pangenome flat file is skipped.') - - write_genomes_arguments = ['proksee', "table", "gff"] - if any(getattr(args.write_genomes, arg) is True for arg in write_genomes_arguments): - write_flat_genome_files(pangenome, args.output, - proksee=args.write_genomes.proksee, - table=args.write_genomes.table, - gff=args.write_genomes.gff, - add_metadata=True, - compress=args.write_genomes.compress, - disable_bar=args.disable_prog_bar, cpu=args.write_genomes.cpu) + "No flat file describing the pangenome has been requested in config file. " + "Writing output pangenome flat file is skipped." + ) + + write_genomes_arguments = ["proksee", "table", "gff"] + if any( + getattr(args.write_genomes, arg) is True for arg in write_genomes_arguments + ): + write_flat_genome_files( + pangenome, + args.output, + proksee=args.write_genomes.proksee, + table=args.write_genomes.table, + gff=args.write_genomes.gff, + add_metadata=True, + compress=args.write_genomes.compress, + disable_bar=args.disable_prog_bar, + cpu=args.write_genomes.cpu, + ) else: logging.getLogger("PPanGGOLiN").info( - 'No flat file of genomes with pangenome annotation has been requested in config file. ' - 'Writing output genomes flat file is skipped.') + "No flat file of genomes with pangenome annotation has been requested in config file. " + "Writing output genomes flat file is skipped." + ) desc_time = time.time() - start_desc - logging.getLogger("PPanGGOLiN").info(f"Annotation took : {round(anno_time, 2)} seconds") - logging.getLogger("PPanGGOLiN").info(f"Clustering took : {round(clust_time, 2)} seconds") - logging.getLogger("PPanGGOLiN").info(f"Building the graph took : {round(graph_time, 2)} seconds") - logging.getLogger("PPanGGOLiN").info(f"Partitioning the pangenome took : {round(part_time, 2)} seconds") + logging.getLogger("PPanGGOLiN").info( + f"Annotation took : {round(anno_time, 2)} seconds" + ) + logging.getLogger("PPanGGOLiN").info( + f"Clustering took : {round(clust_time, 2)} seconds" + ) + logging.getLogger("PPanGGOLiN").info( + f"Building the graph took : {round(graph_time, 2)} seconds" + ) + logging.getLogger("PPanGGOLiN").info( + f"Partitioning the pangenome took : {round(part_time, 2)} seconds" + ) if panrgp: - logging.getLogger("PPanGGOLiN").info(f"Predicting RGP took : {round(regions_time, 2)} seconds") - logging.getLogger("PPanGGOLiN").info(f"Gathering RGP into spots took : {round(spot_time, 2)} seconds") + logging.getLogger("PPanGGOLiN").info( + f"Predicting RGP took : {round(regions_time, 2)} seconds" + ) + logging.getLogger("PPanGGOLiN").info( + f"Gathering RGP into spots took : {round(spot_time, 2)} seconds" + ) if panmodule: - logging.getLogger("PPanGGOLiN").info(f"Predicting modules took : {round(mod_time, 2)} seconds") + logging.getLogger("PPanGGOLiN").info( + f"Predicting modules took : {round(mod_time, 2)} seconds" + ) - logging.getLogger("PPanGGOLiN").info(f"Writing the pangenome data in HDF5 took : {round(writing_time, 2)} seconds") + logging.getLogger("PPanGGOLiN").info( + f"Writing the pangenome data in HDF5 took : {round(writing_time, 2)} seconds" + ) if not args.no_flat_files: logging.getLogger("PPanGGOLiN").info( - f"Writing descriptive files for the pangenome took : {round(desc_time, 2)} seconds") + f"Writing descriptive files for the pangenome took : {round(desc_time, 2)} seconds" + ) print_info(filename, content=True) @@ -310,74 +479,157 @@ def subparser(sub_parser: argparse._SubParsersAction) -> argparse.ArgumentParser def add_workflow_args(parser: argparse.ArgumentParser): """ - Parser for important arguments that can be changed in CLI. + Parser for important arguments that can be changed in CLI. Other (less important) arguments that are step specific can be changed in the config file. :param parser: parser for workflow argument """ date = time.strftime("_DATE%Y-%m-%d_HOUR%H.%M.%S", time.localtime()) - required = parser.add_argument_group(title="Input arguments", description="The possible input arguments :") - - required.add_argument('--fasta', required=False, type=Path, - help="A tab-separated file listing the genome names, " - "and the fasta filepath of its genomic sequence(s) (the fastas can be compressed). " - "One line per genome. This option can be used alone.") - - required.add_argument('--anno', required=False, type=Path, - help="A tab-separated file listing the genome names, and the gff filepath of " - "its annotations (the gffs can be compressed). One line per genome. " - "This option can be used alone IF the fasta sequences are in the gff files, " - "otherwise --fasta needs to be used.") - - required.add_argument("--clusters", required=False, type=Path, - help="a tab-separated file listing the cluster names, the gene IDs, " - "and optionally whether they are a fragment or not.") + required = parser.add_argument_group( + title="Input arguments", description="The possible input arguments :" + ) + + required.add_argument( + "--fasta", + required=False, + type=Path, + help="A tab-separated file listing the genome names, " + "and the fasta filepath of its genomic sequence(s) (the fastas can be compressed). " + "One line per genome. This option can be used alone.", + ) + + required.add_argument( + "--anno", + required=False, + type=Path, + help="A tab-separated file listing the genome names, and the gff filepath of " + "its annotations (the gffs can be compressed). One line per genome. " + "This option can be used alone IF the fasta sequences are in the gff files, " + "otherwise --fasta needs to be used.", + ) + + required.add_argument( + "--clusters", + required=False, + type=Path, + help="a tab-separated file listing the cluster names, the gene IDs, " + "and optionally whether they are a fragment or not.", + ) optional = parser.add_argument_group(title="Optional arguments") - optional.add_argument('-o', '--output', required=False, type=Path, - default=Path(f'ppanggolin_output{date}_PID{str(os.getpid())}'), - help="Output directory") - - optional.add_argument("--basename", required=False, default="pangenome", - help="basename for the output file") - - optional.add_argument("--rarefaction", required=False, action="store_true", dest="rarefaction_flag", - help="Use to compute the rarefaction curves (WARNING: can be time consuming)") - - optional.add_argument("-c", "--cpu", required=False, default=1, type=int, help="Number of available cpus") - - optional.add_argument("--translation_table", required=False, type=int, default=11, - help="Translation table (genetic code) to use.") - - optional.add_argument("--kingdom", required=False, type=str.lower, default="bacteria", - choices=["bacteria", "archaea"], - help="Kingdom to which the prokaryota belongs to, " - "to know which models to use for rRNA annotation.") - - optional.add_argument("--mode", required=False, default="1", choices=["0", "1", "2", "3"], - help="the cluster mode of MMseqs2. 0: Setcover, 1: single linkage (or connected component)," - " 2: CD-HIT-like, 3: CD-HIT-like (lowmem)") - - optional.add_argument("--coverage", required=False, type=restricted_float, default=0.8, - help="Minimal coverage of the alignment for two proteins to be in the same cluster") - - optional.add_argument("--identity", required=False, type=restricted_float, default=0.8, - help="Minimal identity percent for two proteins to be in the same cluster") - - optional.add_argument("--infer_singletons", required=False, action="store_true", - help="Use this option together with --clusters. " - "If a gene is not present in the provided clustering result file, " - "it will be assigned to its own unique cluster as a singleton.") - - optional.add_argument("-K", "--nb_of_partitions", required=False, default=-1, type=int, - help="Number of partitions to use. Must be at least 2. If under 2, " - "it will be detected automatically.") + optional.add_argument( + "-o", + "--output", + required=False, + type=Path, + default=Path(f"ppanggolin_output{date}_PID{str(os.getpid())}"), + help="Output directory", + ) + + optional.add_argument( + "--basename", + required=False, + default="pangenome", + help="basename for the output file", + ) + + optional.add_argument( + "--rarefaction", + required=False, + action="store_true", + dest="rarefaction_flag", + help="Use to compute the rarefaction curves (WARNING: can be time consuming)", + ) + + optional.add_argument( + "-c", + "--cpu", + required=False, + default=1, + type=int, + help="Number of available cpus", + ) + + optional.add_argument( + "--translation_table", + required=False, + type=int, + default=11, + help="Translation table (genetic code) to use.", + ) + + optional.add_argument( + "--kingdom", + required=False, + type=str.lower, + default="bacteria", + choices=["bacteria", "archaea"], + help="Kingdom to which the prokaryota belongs to, " + "to know which models to use for rRNA annotation.", + ) + + optional.add_argument( + "--mode", + required=False, + default="1", + choices=["0", "1", "2", "3"], + help="the cluster mode of MMseqs2. 0: Setcover, 1: single linkage (or connected component)," + " 2: CD-HIT-like, 3: CD-HIT-like (lowmem)", + ) + + optional.add_argument( + "--coverage", + required=False, + type=restricted_float, + default=0.8, + help="Minimal coverage of the alignment for two proteins to be in the same cluster", + ) + + optional.add_argument( + "--identity", + required=False, + type=restricted_float, + default=0.8, + help="Minimal identity percent for two proteins to be in the same cluster", + ) + + optional.add_argument( + "--infer_singletons", + required=False, + action="store_true", + help="Use this option together with --clusters. " + "If a gene is not present in the provided clustering result file, " + "it will be assigned to its own unique cluster as a singleton.", + ) + + optional.add_argument( + "-K", + "--nb_of_partitions", + required=False, + default=-1, + type=int, + help="Number of partitions to use. Must be at least 2. If under 2, " + "it will be detected automatically.", + ) # This ensures compatibility with workflows built with the old option "defrag" when it was not the default - optional.add_argument("--no_defrag", required=False, action="store_true", - help="DO NOT Realign gene families to link fragments with their non-fragmented gene family.") - - optional.add_argument("--no_flat_files", required=False, action="store_true", - help="Generate only the HDF5 pangenome file.") - optional.add_argument("--tmpdir", required=False, type=str, default=Path(tempfile.gettempdir()), - help="directory for storing temporary files") + optional.add_argument( + "--no_defrag", + required=False, + action="store_true", + help="DO NOT Realign gene families to link fragments with their non-fragmented gene family.", + ) + + optional.add_argument( + "--no_flat_files", + required=False, + action="store_true", + help="Generate only the HDF5 pangenome file.", + ) + optional.add_argument( + "--tmpdir", + required=False, + type=str, + default=Path(tempfile.gettempdir()), + help="directory for storing temporary files", + ) diff --git a/ppanggolin/workflow/panModule.py b/ppanggolin/workflow/panModule.py index 9105da05..bac562a0 100644 --- a/ppanggolin/workflow/panModule.py +++ b/ppanggolin/workflow/panModule.py @@ -25,7 +25,9 @@ def subparser(sub_parser: argparse._SubParsersAction) -> argparse.ArgumentParser :param sub_parser : sub_parser for all command :return : parser arguments for all command """ - parser = sub_parser.add_parser("panmodule", formatter_class=argparse.RawTextHelpFormatter) + parser = sub_parser.add_parser( + "panmodule", formatter_class=argparse.RawTextHelpFormatter + ) add_workflow_args(parser) diff --git a/ppanggolin/workflow/panRGP.py b/ppanggolin/workflow/panRGP.py index 7f024ec3..e2fd112a 100644 --- a/ppanggolin/workflow/panRGP.py +++ b/ppanggolin/workflow/panRGP.py @@ -26,7 +26,9 @@ def subparser(sub_parser: argparse._SubParsersAction) -> argparse.ArgumentParser :param sub_parser : sub_parser for all command :return : parser arguments for all command """ - parser = sub_parser.add_parser("panrgp", formatter_class=argparse.RawTextHelpFormatter) + parser = sub_parser.add_parser( + "panrgp", formatter_class=argparse.RawTextHelpFormatter + ) add_workflow_args(parser) diff --git a/ppanggolin/workflow/workflow.py b/ppanggolin/workflow/workflow.py index bf2e44e4..269eab2f 100644 --- a/ppanggolin/workflow/workflow.py +++ b/ppanggolin/workflow/workflow.py @@ -8,6 +8,7 @@ """ a global workflow that does everything in one go. """ + def launch(args: argparse.Namespace): """ Command launcher @@ -24,7 +25,9 @@ def subparser(sub_parser: argparse._SubParsersAction) -> argparse.ArgumentParser :param sub_parser : sub_parser for all command :return : parser arguments for all command """ - parser = sub_parser.add_parser("workflow", formatter_class=argparse.RawTextHelpFormatter) + parser = sub_parser.add_parser( + "workflow", formatter_class=argparse.RawTextHelpFormatter + ) add_workflow_args(parser) diff --git a/setup.py b/setup.py index 5b922969..b762db14 100755 --- a/setup.py +++ b/setup.py @@ -7,16 +7,20 @@ setup( ext_modules=[ Extension( - extra_compile_args=['-fcommon', '-Wno-int-conversion'], + extra_compile_args=["-fcommon", "-Wno-int-conversion"], name="nem_stats", - sources=[NEM_DIR_PATH + 'nem_stats.pyx', - NEM_DIR_PATH + 'nem_exe.c', - NEM_DIR_PATH + 'nem_alg.c', - NEM_DIR_PATH + 'nem_nei.c', - NEM_DIR_PATH + 'nem_mod.c', - NEM_DIR_PATH + 'nem_rnd.c', - NEM_DIR_PATH + 'lib_io.c', - NEM_DIR_PATH + 'nem_hlp.c', - NEM_DIR_PATH + 'genmemo.c'], - include_dirs=[NEM_DIR_PATH])] + sources=[ + NEM_DIR_PATH + "nem_stats.pyx", + NEM_DIR_PATH + "nem_exe.c", + NEM_DIR_PATH + "nem_alg.c", + NEM_DIR_PATH + "nem_nei.c", + NEM_DIR_PATH + "nem_mod.c", + NEM_DIR_PATH + "nem_rnd.c", + NEM_DIR_PATH + "lib_io.c", + NEM_DIR_PATH + "nem_hlp.c", + NEM_DIR_PATH + "genmemo.c", + ], + include_dirs=[NEM_DIR_PATH], + ) + ] ) diff --git a/testingDataset/compare_results.py b/testingDataset/compare_results.py index f33a05c0..d6d6f217 100644 --- a/testingDataset/compare_results.py +++ b/testingDataset/compare_results.py @@ -19,11 +19,12 @@ def ordered(obj): return sorted(ordered(x) for x in obj) else: return obj - + + def read_json_file(json_file): proper_open_1 = gzip.open if json_file.suffix == ".gz" else open - with proper_open_1(json_file.as_posix(), 'rt') as f1: + with proper_open_1(json_file.as_posix(), "rt") as f1: return json.load(f1) @@ -32,7 +33,7 @@ def are_json_files_identical(file1, file2): data1 = read_json_file(file1) data2 = read_json_file(file2) # Load data from the second file - + return ordered(data1) == ordered(data2), [] @@ -48,57 +49,96 @@ def are_text_files_identical(expected_file, file2, outdir=Path("./")): proper_open_e = gzip.open if expected_file.suffix == ".gz" else open proper_open_t = gzip.open if file2.suffix == ".gz" else open - with proper_open_e(expected_file, 'rt') as f1, proper_open_t(file2, 'rt') as f2: + with proper_open_e(expected_file, "rt") as f1, proper_open_t(file2, "rt") as f2: f1_content, f2_content = sorted(f1.readlines()), sorted(f2.readlines()) f1_line_count = len(f1_content) f2_line_count = len(f2_content) - diff = difflib.unified_diff(f1_content, f2_content, fromfile=expected_file.as_posix(), tofile=file2.as_posix()) + diff = difflib.unified_diff( + f1_content, + f2_content, + fromfile=expected_file.as_posix(), + tofile=file2.as_posix(), + ) diff = [line.rstrip() for line in diff] if len(diff) == 0: return True, diff_details - - diff_event_counter = {"+":0, "-":0} - + + diff_event_counter = {"+": 0, "-": 0} + diff_file = outdir / f"{common_file}.diff" - with open(diff_file, 'w') as out: - out.write('\n'.join(diff) + '\n') + with open(diff_file, "w") as out: + out.write("\n".join(diff) + "\n") # gather stat on diff - diff_event_counter = Counter((line[0] for line in diff[2:] if line[0] in ['+', '-'])) - + diff_event_counter = Counter( + (line[0] for line in diff[2:] if line[0] in ["+", "-"]) + ) + prct_inserted = 100 * diff_event_counter["+"] / f1_line_count prct_deleted = 100 * diff_event_counter["-"] / f2_line_count diff_prct = max(prct_inserted, prct_deleted) - diff_details.append(f'{diff_event_counter["+"]} insertions(+), {diff_event_counter["-"]} deletions(-) - {diff_prct:.1f}% difference') - diff_details.append(f'Check out diff in {diff_file}') + diff_details.append( + f'{diff_event_counter["+"]} insertions(+), {diff_event_counter["-"]} deletions(-) - {diff_prct:.1f}% difference' + ) + diff_details.append(f"Check out diff in {diff_file}") # vs code command to diff the files - # diff_details.append(f'code --diff {expected_file} {file2}') + # diff_details.append(f'code --diff {expected_file} {file2}') return False, diff_details + def add_subdir_to_files(subdir, files): - return [os.path.join(subdir, file) for file in files] + return [os.path.join(subdir, file) for file in files] + def compare_dir_recursively(expected_dir, tested_dir, ignored_files): dcmp_result = filecmp.dircmp(expected_dir, tested_dir, ignore=ignored_files) - for subdir in dcmp_result.common_dirs: - sub_dcmp_result = compare_dir_recursively(expected_dir/subdir, tested_dir/subdir, ignored_files) - for files_attr in ['right_only', 'left_only', 'common_files', "same_files", "diff_files"]: + for subdir in dcmp_result.common_dirs: + sub_dcmp_result = compare_dir_recursively( + expected_dir / subdir, tested_dir / subdir, ignored_files + ) + for files_attr in [ + "right_only", + "left_only", + "common_files", + "same_files", + "diff_files", + ]: files_list = getattr(dcmp_result, files_attr) - files_list += add_subdir_to_files(subdir, getattr(sub_dcmp_result, files_attr)) - + files_list += add_subdir_to_files( + subdir, getattr(sub_dcmp_result, files_attr) + ) + return dcmp_result + def get_suffix_except_gz(path: Path): for ext in path.suffixes[::-1]: if ext != ".gz": return ext - -def compare_directories(expected_dir, tested_dir, ignored_files, diff_outdir, report_identical_files, extension_to_compare=[".tsv", ".aln", ".json", '.gff', '.txt', '.csv', '.faa', '.fasta', ".yaml"]): + +def compare_directories( + expected_dir, + tested_dir, + ignored_files, + diff_outdir, + report_identical_files, + extension_to_compare=[ + ".tsv", + ".aln", + ".json", + ".gff", + ".txt", + ".csv", + ".faa", + ".fasta", + ".yaml", + ], +): # Define directory information with color expected_dir_info = f"- Expected directory: {expected_dir}" tested_dir_info = f"- Tested directory: {tested_dir}" @@ -106,11 +146,17 @@ def compare_directories(expected_dir, tested_dir, ignored_files, diff_outdir, re # Create the panel print("\n===Comparison of Directories===") print("\n".join([expected_dir_info, tested_dir_info])) - print('===============================') + print("===============================") # Compare directories - dcmp = compare_dir_recursively(expected_dir, tested_dir, ignored_files=ignored_files) - ignored_files_ext = [common_file for common_file in dcmp.common_files if get_suffix_except_gz(Path(common_file)) not in extension_to_compare] + dcmp = compare_dir_recursively( + expected_dir, tested_dir, ignored_files=ignored_files + ) + ignored_files_ext = [ + common_file + for common_file in dcmp.common_files + if get_suffix_except_gz(Path(common_file)) not in extension_to_compare + ] if ignored_files: print("\nFiles ignored for comparison:") for ignored_file in ignored_files: @@ -135,8 +181,7 @@ def compare_directories(expected_dir, tested_dir, ignored_files, diff_outdir, re different_files = [] identical_files = [] - - files_to_compare = list( set(dcmp.common_files) - set(ignored_files_ext)) + files_to_compare = list(set(dcmp.common_files) - set(ignored_files_ext)) for common_file in files_to_compare: file1 = expected_dir / common_file @@ -145,7 +190,9 @@ def compare_directories(expected_dir, tested_dir, ignored_files, diff_outdir, re if get_suffix_except_gz(Path(common_file)) == ".json": identical_tables, details = are_json_files_identical(file1, file2) else: - identical_tables, details = are_text_files_identical(file1, file2, outdir=diff_outdir) + identical_tables, details = are_text_files_identical( + file1, file2, outdir=diff_outdir + ) if identical_tables: identical_files.append(common_file) @@ -159,12 +206,11 @@ def compare_directories(expected_dir, tested_dir, ignored_files, diff_outdir, re if different_files: print("\nDifferent files:") - for file, details in different_files: + for file, details in different_files: print(f" - {file}") for detail in details: print(f"{detail}") print() - # Generate summary report print("\nSummary:") @@ -182,34 +228,56 @@ def compare_directories(expected_dir, tested_dir, ignored_files, diff_outdir, re # Display different files count print(f"{len(different_files)} file(s) differ.") - - if different_files or dcmp.left_only or dcmp.right_only: - print('\nSome difference exist between the tested and the expected result directories') + print( + "\nSome difference exist between the tested and the expected result directories" + ) exit(1) else: - print('\nNo difference have been found between the tested and the expected result directories') + print( + "\nNo difference have been found between the tested and the expected result directories" + ) + def parse_arguments(): """Parse script arguments.""" - parser = ArgumentParser(description="...", - formatter_class=ArgumentDefaultsHelpFormatter) - - - parser.add_argument('-e', '--expected_dir', help="Expected result directory", required=True, type=Path) - - parser.add_argument('-t', '--tested_dir', help="Tested result directory", required=True, type=Path) - - parser.add_argument('-o', '--outdir', help="Directories where to write diff files", default='out_diff', type=Path) + parser = ArgumentParser( + description="...", formatter_class=ArgumentDefaultsHelpFormatter + ) + + parser.add_argument( + "-e", + "--expected_dir", + help="Expected result directory", + required=True, + type=Path, + ) + + parser.add_argument( + "-t", "--tested_dir", help="Tested result directory", required=True, type=Path + ) + + parser.add_argument( + "-o", + "--outdir", + help="Directories where to write diff files", + default="out_diff", + type=Path, + ) + + parser.add_argument( + "-i", + "--ignored_files", + nargs="+", + help="File to ignore for the comparison", + default=["pangenomeGraph.json", "pangenomeGraph.json.gz"], + ) - parser.add_argument('-i', '--ignored_files', nargs="+", help="File to ignore for the comparison", default=['pangenomeGraph.json', "pangenomeGraph.json.gz"]) - - - args = parser.parse_args() return args + def main(): args = parse_arguments() @@ -217,12 +285,17 @@ def main(): report_identical_files = True logging.basicConfig(level=logging.INFO, format="%(message)s") - + Path.mkdir(args.outdir, exist_ok=True) + compare_directories( + expected_dir=args.expected_dir, + tested_dir=args.tested_dir, + diff_outdir=args.outdir, + ignored_files=args.ignored_files, + report_identical_files=report_identical_files, + ) - compare_directories(expected_dir=args.expected_dir, tested_dir=args.tested_dir, diff_outdir=args.outdir, ignored_files=args.ignored_files, report_identical_files=report_identical_files) -if __name__ == '__main__': +if __name__ == "__main__": main() - diff --git a/testingDataset/launch_test_locally.py b/testingDataset/launch_test_locally.py index 4bac2eee..eaf4ba28 100644 --- a/testingDataset/launch_test_locally.py +++ b/testingDataset/launch_test_locally.py @@ -11,15 +11,17 @@ from pathlib import Path import yaml + def parse_yaml_file(yaml_file): # Load the YAML file - with open(yaml_file, 'r') as stream: + with open(yaml_file, "r") as stream: workflow = yaml.safe_load(stream) return workflow + def create_symbolic_links(source_dir, target_dir): # Convert paths to Path objects source_dir = Path(source_dir) @@ -38,31 +40,59 @@ def create_symbolic_links(source_dir, target_dir): except FileExistsError: pass + def parse_arguments(default_ci_yaml, testing_datadir): """Parse script arguments.""" - parser = ArgumentParser(description="...", - formatter_class=ArgumentDefaultsHelpFormatter) - - - parser.add_argument('--ci_yaml', help="increase output verbosity", default=default_ci_yaml, type=Path,) - - parser.add_argument('--data_dir', help="Directory where dataset files are located", default=testing_datadir, type=Path,) - - parser.add_argument('-o', '--outdir', help="increase output verbosity", default='local_CI', type=Path) - - parser.add_argument('-c', '--cpu', type=int, default=4, - help="Use this amount of cpu when number of cpu is specified in the command.") - - parser.add_argument("-v", "--verbose", help="increase output verbosity", - action="store_true") - - parser.add_argument('--skip_msa', action="store_true", - help="Skip msa command as it takes quite some time to complete.") - - - parser.add_argument('-f', '--force', action="store_true", - help="Force writing in output directory if exists.") - + parser = ArgumentParser( + description="...", formatter_class=ArgumentDefaultsHelpFormatter + ) + + parser.add_argument( + "--ci_yaml", + help="increase output verbosity", + default=default_ci_yaml, + type=Path, + ) + + parser.add_argument( + "--data_dir", + help="Directory where dataset files are located", + default=testing_datadir, + type=Path, + ) + + parser.add_argument( + "-o", + "--outdir", + help="increase output verbosity", + default="local_CI", + type=Path, + ) + + parser.add_argument( + "-c", + "--cpu", + type=int, + default=4, + help="Use this amount of cpu when number of cpu is specified in the command.", + ) + + parser.add_argument( + "-v", "--verbose", help="increase output verbosity", action="store_true" + ) + + parser.add_argument( + "--skip_msa", + action="store_true", + help="Skip msa command as it takes quite some time to complete.", + ) + + parser.add_argument( + "-f", + "--force", + action="store_true", + help="Force writing in output directory if exists.", + ) args = parser.parse_args() return args @@ -70,82 +100,82 @@ def parse_arguments(default_ci_yaml, testing_datadir): def main(): - script_path = Path(__file__).resolve() ppanggolin_main_dir = script_path.parent.parent default_ci_yaml = ppanggolin_main_dir / ".github/workflows/main.yml" testing_datadir = ppanggolin_main_dir / "testingDataset" - args = parse_arguments(default_ci_yaml, testing_datadir) if args.verbose: logging.basicConfig(format="%(levelname)s: %(message)s", level=logging.DEBUG) - logging.info('Mode verbose ON') + logging.info("Mode verbose ON") else: logging.basicConfig(format="%(levelname)s: %(message)s", level=logging.INFO) - if not args.outdir.is_dir(): logging.debug(f"Create output directory {args.outdir.absolute().as_posix()}") Path.mkdir(args.outdir) - + elif not args.force: raise FileExistsError( - f"{args.outdir} already exists. Use -f if you want to overwrite the files in the directory") + f"{args.outdir} already exists. Use -f if you want to overwrite the files in the directory" + ) # setup test dir # execution_dir = args.outdir # / args.data_dir.name create_symbolic_links(args.data_dir, args.outdir) - workflow = parse_yaml_file(args.ci_yaml) - excluded_steps = ['Install ppanggolin', "Get core number on linux", "Get core number on macos"] + excluded_steps = [ + "Install ppanggolin", + "Get core number on linux", + "Get core number on macos", + ] - test_script = args.outdir / 'launch_test_command.sh' + test_script = args.outdir / "launch_test_command.sh" with open(test_script, "w") as fl: - - fl.write('#!/bin/bash\nset -e\n') - # Iterate over jobs and steps - for job in workflow['jobs'].values(): + fl.write("#!/bin/bash\nset -e\n") + + # Iterate over jobs and steps + for job in workflow["jobs"].values(): - if 'steps' not in job: + if "steps" not in job: continue - - for step in job['steps']: - if 'run' not in step: + + for step in job["steps"]: + if "run" not in step: continue - if step['name'] in excluded_steps: - logging.info(f'Ignoring: {step}') + if step["name"] in excluded_steps: + logging.info(f"Ignoring: {step}") continue # Execute the command line - command = step['run'].strip() + command = step["run"].strip() # process the command - command = command.replace('$NUM_CPUS', f"{args.cpu}") - command = command.replace('cd ', "# cd ") + command = command.replace("$NUM_CPUS", f"{args.cpu}") + command = command.replace("cd ", "# cd ") if args.skip_msa: - command = command.replace('ppanggolin msa', "# ppanggolin msa") + command = command.replace("ppanggolin msa", "# ppanggolin msa") if command == "pytest": command = f"pytest {ppanggolin_main_dir}" - - + # log the step name logging.info(f'Executing: {step["name"]}') logging.debug(f" {command}\n") - + # write the command in the script fl.write(f'\n# {step["name"]}\n\n') fl.write(command) - print(f"(cd {args.outdir}; bash {test_script.name})") -if __name__ == '__main__': + +if __name__ == "__main__": main() diff --git a/tests/align/test_align.py b/tests/align/test_align.py index 42d1cd5f..99840aff 100644 --- a/tests/align/test_align.py +++ b/tests/align/test_align.py @@ -7,76 +7,82 @@ @pytest.fixture def single_line_fasta_nt() -> List: - - return ['>Gene_1 seq_description\n', - 'ATGCGTTGTCGTTG\n', - ">Gene_2\n", - "TGTGACCTGCT\n" - ] + + return [ + ">Gene_1 seq_description\n", + "ATGCGTTGTCGTTG\n", + ">Gene_2\n", + "TGTGACCTGCT\n", + ] + @pytest.fixture def single_line_fasta_aa() -> List: - - return ['>Gene_1 seq_description\n', - 'YWTPRPFFYAAEYNN\n', - ">Gene_2\n", - "YWTPRPSYWTPAAEYNN\n" - ] + + return [ + ">Gene_1 seq_description\n", + "YWTPRPFFYAAEYNN\n", + ">Gene_2\n", + "YWTPRPSYWTPAAEYNN\n", + ] + @pytest.fixture def multi_line_fasta_nt() -> List: - - return ['>Gene_1 seq_description\n', - 'ATGCGT\n', - 'TGTCGTTG\n', - ">Gene_2\n", - "TGTGACCTGCT\n" - ] + + return [ + ">Gene_1 seq_description\n", + "ATGCGT\n", + "TGTCGTTG\n", + ">Gene_2\n", + "TGTGACCTGCT\n", + ] + @pytest.fixture def multi_line_fasta_aa() -> List: - - return ['>Gene_1 seq_description\n', - 'AAEYNN\n', - 'YWTPRPFFY\n', - ">Gene_2\n", - "YWTPRPS\n", - "YWTPAAEYNN\n" - ] + + return [ + ">Gene_1 seq_description\n", + "AAEYNN\n", + "YWTPRPFFY\n", + ">Gene_2\n", + "YWTPRPS\n", + "YWTPAAEYNN\n", + ] def test_get_seq_ids_single_line_nt(single_line_fasta_nt): - - + seq_set, is_nucleotide, single_line_fasta = get_seq_ids(single_line_fasta_nt) assert len(seq_set) == 2 - assert seq_set == {'Gene_1', 'Gene_2'} + assert seq_set == {"Gene_1", "Gene_2"} assert is_nucleotide assert single_line_fasta + def test_get_seq_ids_single_line_aa(single_line_fasta_aa): seq_set, is_nucleotide, single_line_fasta = get_seq_ids(single_line_fasta_aa) assert len(seq_set) == 2 - assert seq_set == {'Gene_1', 'Gene_2'} + assert seq_set == {"Gene_1", "Gene_2"} assert not is_nucleotide assert single_line_fasta + def test_get_seq_ids_multi_line_nt(multi_line_fasta_nt): seq_set, is_nucleotide, single_line_fasta = get_seq_ids(multi_line_fasta_nt) assert len(seq_set) == 2 - assert seq_set == {'Gene_1', 'Gene_2'} + assert seq_set == {"Gene_1", "Gene_2"} assert is_nucleotide assert not single_line_fasta + def test_get_seq_ids_multi_line_aa(multi_line_fasta_aa): seq_set, is_nucleotide, single_line_fasta = get_seq_ids(multi_line_fasta_aa) assert len(seq_set) == 2 - assert seq_set == {'Gene_1', 'Gene_2'} + assert seq_set == {"Gene_1", "Gene_2"} assert not is_nucleotide assert not single_line_fasta - - - diff --git a/tests/annotate/test_annotate.py b/tests/annotate/test_annotate.py index e52868c2..cd933eab 100644 --- a/tests/annotate/test_annotate.py +++ b/tests/annotate/test_annotate.py @@ -2,34 +2,85 @@ from pathlib import Path from ppanggolin.genome import Contig -from ppanggolin.annotate.annotate import extract_positions, read_anno_file, parse_contig_header_lines, \ - parse_gbff_by_contig, parse_feature_lines, parse_dna_seq_lines, read_org_gbff, combine_contigs_metadata, \ - fix_partial_gene_coordinates, shift_start_coordinates, shift_end_coordinates +from ppanggolin.annotate.annotate import ( + extract_positions, + read_anno_file, + parse_contig_header_lines, + parse_gbff_by_contig, + parse_feature_lines, + parse_dna_seq_lines, + read_org_gbff, + combine_contigs_metadata, + fix_partial_gene_coordinates, + shift_start_coordinates, + shift_end_coordinates, +) @pytest.mark.parametrize( - "input_string, expected_positions, expected_complement, expected_partialgene_start, expected_partialgene_end", [ - ("join(190..7695,7695..12071)", [(190, 7695), (7695, 12071)], False, False, False), - ("order(190..7695,7995..12071)", [(190, 7695), (7995, 12071)], False, False, False), - ("complement(join(4359800..4360707,4360707..4360962,1..100))", - [(4359800, 4360707), (4360707, 4360962), (1, 100)], - True, False, False), - ("complement(order(4359800..4360707,4360707..4360962,1..100))", - [(4359800, 4360707), (4360707, 4360962), (1, 100)], - True, False, False), - ("join(6835405..6835731,1..1218)", [(6835405, 6835731), (1, 1218)], False, False, False), - ("join(1375484..1375555,1375557..1376579)", [(1375484, 1375555), (1375557, 1376579)], False, False, False), + "input_string, expected_positions, expected_complement, expected_partialgene_start, expected_partialgene_end", + [ + ( + "join(190..7695,7695..12071)", + [(190, 7695), (7695, 12071)], + False, + False, + False, + ), + ( + "order(190..7695,7995..12071)", + [(190, 7695), (7995, 12071)], + False, + False, + False, + ), + ( + "complement(join(4359800..4360707,4360707..4360962,1..100))", + [(4359800, 4360707), (4360707, 4360962), (1, 100)], + True, + False, + False, + ), + ( + "complement(order(4359800..4360707,4360707..4360962,1..100))", + [(4359800, 4360707), (4360707, 4360962), (1, 100)], + True, + False, + False, + ), + ( + "join(6835405..6835731,1..1218)", + [(6835405, 6835731), (1, 1218)], + False, + False, + False, + ), + ( + "join(1375484..1375555,1375557..1376579)", + [(1375484, 1375555), (1375557, 1376579)], + False, + False, + False, + ), ("complement(6815492..6816265)", [(6815492, 6816265)], True, False, False), ("6811501..6812109", [(6811501, 6812109)], False, False, False), ("complement(6792573..>6795461)", [(6792573, 6795461)], True, False, True), ("complement(<6792573..6795461)", [(6792573, 6795461)], True, True, False), ("complement(<6792573..>6795461)", [(6792573, 6795461)], True, True, True), ("join(1038313,1..1016)", [(1038313, 1038313), (1, 1016)], False, False, False), - ("1038313", [(1038313, 1038313)], False, False, False) - ]) -def test_extract_positions(input_string, expected_positions, expected_complement, expected_partialgene_start, - expected_partialgene_end): - positions, is_complement, has_partial_start, has_partial_end = extract_positions(input_string) + ("1038313", [(1038313, 1038313)], False, False, False), + ], +) +def test_extract_positions( + input_string, + expected_positions, + expected_complement, + expected_partialgene_start, + expected_partialgene_end, +): + positions, is_complement, has_partial_start, has_partial_end = extract_positions( + input_string + ) assert positions == expected_positions assert is_complement == expected_complement assert has_partial_start == expected_partialgene_start @@ -43,23 +94,33 @@ def test_extract_positions_with_wrong_positions_format(): def test_extract_positions_with_strange_chevrons(): with pytest.raises(ValueError): - extract_positions("complement(join(4359800..>4360707,1..100))") # chevron in inner position + extract_positions( + "complement(join(4359800..>4360707,1..100))" + ) # chevron in inner position with pytest.raises(ValueError): - extract_positions("complement(join(4359800..4360707,<1..100))") # chevron in inner position + extract_positions( + "complement(join(4359800..4360707,<1..100))" + ) # chevron in inner position with pytest.raises(ValueError): - extract_positions("complement(join(4359800..4360707,1..<100))") # start chevron in ending position + extract_positions( + "complement(join(4359800..4360707,1..<100))" + ) # start chevron in ending position def test_extract_positions_with_wrong_positions_format2(): with pytest.raises(ValueError): extract_positions("start..stop") # start and stop are not integer with pytest.raises(ValueError): - extract_positions("complement(join(start..6816265, 1..stop))") # start and stop are not integer + extract_positions( + "complement(join(start..6816265, 1..stop))" + ) # start and stop are not integer with pytest.raises(ValueError): extract_positions("start..stop") # start and stop are not integer with pytest.raises(ValueError): - extract_positions("complement(join(start..6816265, 1..stop))") # start and stop are not integer + extract_positions( + "complement(join(start..6816265, 1..stop))" + ) # start and stop are not integer @pytest.fixture @@ -70,7 +131,10 @@ def genome_data(): script_path = Path(__file__).resolve() ppanggolin_main_dir = script_path.parent.parent.parent - genome_path = ppanggolin_main_dir / "testingDataset/GBFF/GCF_000026905.1_ASM2690v1_genomic.gbff.gz" + genome_path = ( + ppanggolin_main_dir + / "testingDataset/GBFF/GCF_000026905.1_ASM2690v1_genomic.gbff.gz" + ) circular_contigs = [] genome_name = "GCF_000026905" return genome_name, genome_path, circular_contigs @@ -84,7 +148,10 @@ def genome_data_with_joined_genes(): script_path = Path(__file__).resolve() ppanggolin_main_dir = script_path.parent.parent.parent - genome_path = ppanggolin_main_dir / "testingDataset/GBFF/GCF_002776845.1_ASM277684v1_genomic.gbff.gz" + genome_path = ( + ppanggolin_main_dir + / "testingDataset/GBFF/GCF_002776845.1_ASM277684v1_genomic.gbff.gz" + ) circular_contigs = [] genome_name = "GCF_002776845" return genome_name, genome_path, circular_contigs @@ -97,7 +164,9 @@ def test_read_anno_file(genome_data): genome_name, genome_path, circular_contigs = genome_data use_pseudogene = False - genome, has_sequence = read_anno_file(genome_name, genome_path, circular_contigs, use_pseudogene) + genome, has_sequence = read_anno_file( + genome_name, genome_path, circular_contigs, use_pseudogene + ) assert has_sequence is True assert genome.name == genome_name @@ -112,7 +181,9 @@ def test_read_anno_file_with_pseudo_enable(genome_data): genome_name, genome_path, circular_contigs = genome_data use_pseudogene = True - genome, has_sequence = read_anno_file(genome_name, genome_path, circular_contigs, use_pseudogene) + genome, has_sequence = read_anno_file( + genome_name, genome_path, circular_contigs, use_pseudogene + ) assert has_sequence is True assert genome.name == genome_name @@ -123,17 +194,21 @@ def test_read_anno_file_with_pseudo_enable(genome_data): def test_with_joined_genes(genome_data_with_joined_genes): genome_name, genome_path, circular_contigs = genome_data_with_joined_genes use_pseudogene = True - genome, _ = read_anno_file(genome_name, genome_path, circular_contigs, use_pseudogene) + genome, _ = read_anno_file( + genome_name, genome_path, circular_contigs, use_pseudogene + ) - # this genome has 2 genes that are joined. + # this genome has 2 genes that are joined. assert genome.number_of_genes() == 917 def test_read_org_gbff(genome_data_with_joined_genes): genome_name, genome_path, circular_contigs = genome_data_with_joined_genes - genome, _ = read_org_gbff(genome_name, genome_path, circular_contigs, use_pseudogenes=True) + genome, _ = read_org_gbff( + genome_name, genome_path, circular_contigs, use_pseudogenes=True + ) - # this genome has 2 genes that are joined. + # this genome has 2 genes that are joined. assert genome.number_of_genes() == 917 @@ -155,7 +230,7 @@ def test_gbff_header_parser(): "DEFINITION": "Chlamydia trachomatis strain D/14-96 genome.", "VERSION": "NC_022109.1", "SOURCE": "Chlamydia trachomatis", - "ORGANISM": "Chlamydia trachomatis\nBacteria; Chlamydiae; Chlamydiales; Chlamydiaceae;\nChlamydia/Chlamydophila group; Chlamydia." + "ORGANISM": "Chlamydia trachomatis\nBacteria; Chlamydiae; Chlamydiales; Chlamydiaceae;\nChlamydia/Chlamydophila group; Chlamydia.", } @@ -215,196 +290,244 @@ def test_parse_gbff_by_contig(sample_gbff_path): # Check second contig header_2, feature_2, sequence_2 = contigs[1] assert len(header_2) == 5 - assert list(feature_2) == [{"feature_type": "source", "location": "1..2041595", - "organism": 'Chlamydia trachomatis', "mol_type": "genomic DNA"}] + assert list(feature_2) == [ + { + "feature_type": "source", + "location": "1..2041595", + "organism": "Chlamydia trachomatis", + "mol_type": "genomic DNA", + } + ] assert sequence_2 == "AAACCGGGTTCCAAATTTGGGGCCCCTTTT" # Define test cases -@pytest.mark.parametrize("input_lines, expected_output", [ - ([" gene 123..456", - " /locus_tag=ABC123", - " /note=Some note", - " CDS 789..1011", - " /protein_id=DEF456", - " /translation=ATGCTAGCATCG"], - [{"feature_type": "gene", "location": "123..456", "locus_tag": "ABC123", "note": "Some note"}, - {"feature_type": "CDS", "location": "789..1011", "protein_id": "DEF456", "translation": "ATGCTAGCATCG"}]), - ([" gene 123..456", - " /locus_tag=ABC123", - " /note=Some note", - " CDS 789..1011", - ' /protein_id="DEF456"', - ' /translation="ATGCTAGCATCG"', - " gene 789..1011", - " /locus_tag=DEF789", - " /note=Another note"], - [{"feature_type": "gene", "location": "123..456", "locus_tag": "ABC123", "note": "Some note"}, - {"feature_type": "CDS", "location": "789..1011", "protein_id": "DEF456", "translation": "ATGCTAGCATCG"}, - {"feature_type": "gene", "location": "789..1011", "locus_tag": "DEF789", "note": "Another note"}]), - # Add more test cases as needed -]) +@pytest.mark.parametrize( + "input_lines, expected_output", + [ + ( + [ + " gene 123..456", + " /locus_tag=ABC123", + " /note=Some note", + " CDS 789..1011", + " /protein_id=DEF456", + " /translation=ATGCTAGCATCG", + ], + [ + { + "feature_type": "gene", + "location": "123..456", + "locus_tag": "ABC123", + "note": "Some note", + }, + { + "feature_type": "CDS", + "location": "789..1011", + "protein_id": "DEF456", + "translation": "ATGCTAGCATCG", + }, + ], + ), + ( + [ + " gene 123..456", + " /locus_tag=ABC123", + " /note=Some note", + " CDS 789..1011", + ' /protein_id="DEF456"', + ' /translation="ATGCTAGCATCG"', + " gene 789..1011", + " /locus_tag=DEF789", + " /note=Another note", + ], + [ + { + "feature_type": "gene", + "location": "123..456", + "locus_tag": "ABC123", + "note": "Some note", + }, + { + "feature_type": "CDS", + "location": "789..1011", + "protein_id": "DEF456", + "translation": "ATGCTAGCATCG", + }, + { + "feature_type": "gene", + "location": "789..1011", + "locus_tag": "DEF789", + "note": "Another note", + }, + ], + ), + # Add more test cases as needed + ], +) def test_parse_feature_lines(input_lines, expected_output): assert list(parse_feature_lines(input_lines)) == expected_output def test_parse_dna_seq_lines(): - lines = [" 1 aaacc gggtt", - " 11 ccaaa tttgg", - " 21 ggccc ctttt"] + lines = [" 1 aaacc gggtt", " 11 ccaaa tttgg", " 21 ggccc ctttt"] assert parse_dna_seq_lines(lines) == "AAACCGGGTTCCAAATTTGGGGCCCCTTTT" def test_combine_contigs_metadata(): - contig1, contig2, contig3 = Contig(1, "contig1"), Contig(2, "contig2"), Contig(3, "contig3") + contig1, contig2, contig3 = ( + Contig(1, "contig1"), + Contig(2, "contig2"), + Contig(3, "contig3"), + ) contig_to_metadata = { contig1: {"sp": "spA", "strain": "123", "contig_feat": "ABC"}, contig2: {"sp": "spA", "strain": "123", "contig_feat": "XYZ"}, - contig3: {"sp": "spA", "strain": "123"} + contig3: {"sp": "spA", "strain": "123"}, } genome_metadata, contig_metadata = combine_contigs_metadata(contig_to_metadata) assert genome_metadata == {"sp": "spA", "strain": "123"} - assert contig_metadata == {contig1: {"contig_feat": "ABC"}, contig2: {"contig_feat": "XYZ"}, } - - -@pytest.mark.parametrize("coordinates, is_complement, start_shift, expected", [ - # Case 1: No partial start or end, expect no change in non-complement strand - # Coordinates are already correct, no need to modify anything. - ([(11, 40)], False, 0, [(11, 40)]), - - # Case 2: Partial start, no partial end (Non-complement) - # A shift of 1 is added to the start coordinate. - ([(10, 40)], False, 1, [(11, 40)]), # start_shift of 1 added to start - - # Case 2: Partial start, no partial end (Non-complement) - # A shift of 2 is added to the start coordinate. - ([(2, 33)], False, 2, [(4, 33)]), # start_shift of 2 added to start - - # Case 3: No partial start, partial end (Non-complement) - # Adjust last coordinate to make gene length a multiple of 3. - ([(11, 41)], False, 0, [(11, 40)]), # last end adjusted to be a multiple of 3 - - # Case 3: No partial start, partial end (Non-complement) - # Gene length is already a multiple of 3, so no changes needed. - ([(11, 40)], False, 0, [(11, 40)]), # gene length already a multiple of 3 so no change is made - - # Case 4: Partial start and end (Non-complement) - # Both start and end need adjustment: add shift to start and adjust end to make gene length a multiple of 3. - ([(10, 41)], False, 1, [(11, 40)]), # start_shift added to start, and length adjusted - - # Case 5: Partial start and no partial end on complement strand - # Adjust start since we are on the complement strand. - ([(9, 40)], True, 0, [(11, 40)]), # length adjusted - - # Case 5: No partial start but partial end on complement strand - # Shift removed from the last end on the complement strand. - ([(9, 40)], True, 2, [(9, 38)]), # start_shift removed - - # Case 5: Partial start and end on complement strand - # Adjust both start and end since we are on the complement strand, ensuring gene length is a multiple of 3. - ([(8, 40)], True, 2, [(9, 38)]), # start_shift removed and length adjusted - - # Case 5: Joined coordinates without partial start or end - # Nothing to adjust as the gene is properly framed. - ([(1, 9), (7, 12)], False, 0, [(1, 9), (7, 12)]), # nothing to do - - # Case 5: Joined coordinates with partial start - # Adjust the first start coordinate by the shift. - ([(3, 9), (7, 12)], False, 1, [(4, 9), (7, 12)]), # adjust start - - # Case 5: Joined coordinates with partial end - # Adjust the last end to ensure the gene length is a multiple of 3. - ([(3, 9), (7, 12)], False, 0, [(3, 9), (7, 11)]), # adjust end - - # Case 5: Joined coordinates with partial start and partial end - # Adjust both start and end for correct gene length and frame shift. - ([(3, 9), (7, 12)], False, 2, [(5, 9), (7, 10)]), # adjust start and end - - # Case 5: Joined coordinates with partial start and end on complement strand - # Adjust both start and end on the complement strand. - ([(4, 9), (7, 12)], True, 2, [(5, 9), (7, 10)]), # adjust start and end in complement mode - - # Real tricky case from GCF_000623275.1 - ([(4681814, 4682911), (1, 1)], False, 0, [(4681814, 4682911)]), - # ajust the end by removing one nt. In this case that remove the second part of the coordinates - - # Tricky case inspired by last case - ([(30, 60), (1, 1)], False, 0, [(30, 59)]), - # ajust the end by removing two nt. In this case that remove the second part of the coordinates and one nt in the first part - - # Tricky case inspired by last case - ([(60, 60), (1, 9)], False, 1, [(1, 9)]), - # ajust the end by removing one nt. In this case that remove the second part of the coordinates - - # Tricky case inspired by last case - ([(60, 60), (1, 10)], False, 2, [(2, 10)]), - # ajust the end by removing one nt. In this case that remove the second part of the coordinates - - # Very tricky case inspired by last case - ([(59, 60), (60, 60), (1, 9)], False, 3, [(1, 9)]), - # ajust the end by removing one nt. In this case that remove the second part of the coordinates + assert contig_metadata == { + contig1: {"contig_feat": "ABC"}, + contig2: {"contig_feat": "XYZ"}, + } - # Very tricky case inspired by last case - ([(60, 61), (1, 8)], True, 3, [(61, 61), (1, 5)]), # -]) -def test_fix_partial_gene_coordinates(coordinates, is_complement, start_shift, expected): +@pytest.mark.parametrize( + "coordinates, is_complement, start_shift, expected", + [ + # Case 1: No partial start or end, expect no change in non-complement strand + # Coordinates are already correct, no need to modify anything. + ([(11, 40)], False, 0, [(11, 40)]), + # Case 2: Partial start, no partial end (Non-complement) + # A shift of 1 is added to the start coordinate. + ([(10, 40)], False, 1, [(11, 40)]), # start_shift of 1 added to start + # Case 2: Partial start, no partial end (Non-complement) + # A shift of 2 is added to the start coordinate. + ([(2, 33)], False, 2, [(4, 33)]), # start_shift of 2 added to start + # Case 3: No partial start, partial end (Non-complement) + # Adjust last coordinate to make gene length a multiple of 3. + ([(11, 41)], False, 0, [(11, 40)]), # last end adjusted to be a multiple of 3 + # Case 3: No partial start, partial end (Non-complement) + # Gene length is already a multiple of 3, so no changes needed. + ( + [(11, 40)], + False, + 0, + [(11, 40)], + ), # gene length already a multiple of 3 so no change is made + # Case 4: Partial start and end (Non-complement) + # Both start and end need adjustment: add shift to start and adjust end to make gene length a multiple of 3. + ( + [(10, 41)], + False, + 1, + [(11, 40)], + ), # start_shift added to start, and length adjusted + # Case 5: Partial start and no partial end on complement strand + # Adjust start since we are on the complement strand. + ([(9, 40)], True, 0, [(11, 40)]), # length adjusted + # Case 5: No partial start but partial end on complement strand + # Shift removed from the last end on the complement strand. + ([(9, 40)], True, 2, [(9, 38)]), # start_shift removed + # Case 5: Partial start and end on complement strand + # Adjust both start and end since we are on the complement strand, ensuring gene length is a multiple of 3. + ([(8, 40)], True, 2, [(9, 38)]), # start_shift removed and length adjusted + # Case 5: Joined coordinates without partial start or end + # Nothing to adjust as the gene is properly framed. + ([(1, 9), (7, 12)], False, 0, [(1, 9), (7, 12)]), # nothing to do + # Case 5: Joined coordinates with partial start + # Adjust the first start coordinate by the shift. + ([(3, 9), (7, 12)], False, 1, [(4, 9), (7, 12)]), # adjust start + # Case 5: Joined coordinates with partial end + # Adjust the last end to ensure the gene length is a multiple of 3. + ([(3, 9), (7, 12)], False, 0, [(3, 9), (7, 11)]), # adjust end + # Case 5: Joined coordinates with partial start and partial end + # Adjust both start and end for correct gene length and frame shift. + ([(3, 9), (7, 12)], False, 2, [(5, 9), (7, 10)]), # adjust start and end + # Case 5: Joined coordinates with partial start and end on complement strand + # Adjust both start and end on the complement strand. + ( + [(4, 9), (7, 12)], + True, + 2, + [(5, 9), (7, 10)], + ), # adjust start and end in complement mode + # Real tricky case from GCF_000623275.1 + ([(4681814, 4682911), (1, 1)], False, 0, [(4681814, 4682911)]), + # ajust the end by removing one nt. In this case that remove the second part of the coordinates + # Tricky case inspired by last case + ([(30, 60), (1, 1)], False, 0, [(30, 59)]), + # ajust the end by removing two nt. In this case that remove the second part of the coordinates and one nt in the first part + # Tricky case inspired by last case + ([(60, 60), (1, 9)], False, 1, [(1, 9)]), + # ajust the end by removing one nt. In this case that remove the second part of the coordinates + # Tricky case inspired by last case + ([(60, 60), (1, 10)], False, 2, [(2, 10)]), + # ajust the end by removing one nt. In this case that remove the second part of the coordinates + # Very tricky case inspired by last case + ([(59, 60), (60, 60), (1, 9)], False, 3, [(1, 9)]), + # ajust the end by removing one nt. In this case that remove the second part of the coordinates + # Very tricky case inspired by last case + ([(60, 61), (1, 8)], True, 3, [(61, 61), (1, 5)]), # + ], +) +def test_fix_partial_gene_coordinates( + coordinates, is_complement, start_shift, expected +): result = fix_partial_gene_coordinates(coordinates, is_complement, start_shift) assert result == expected def test_fix_partial_gene_coordinates_with_wrong_coordinates(): with pytest.raises(ValueError): - fix_partial_gene_coordinates(coordinates=[(1, 1)], is_complement=False, - start_shift=0) # gene is too small, the length adjustement at the end lead to no gene + fix_partial_gene_coordinates( + coordinates=[(1, 1)], is_complement=False, start_shift=0 + ) # gene is too small, the length adjustement at the end lead to no gene with pytest.raises(ValueError): - fix_partial_gene_coordinates([(1, 1)], False, - 1) # gene is too small, the length adjustement at the start lead to no gene + fix_partial_gene_coordinates( + [(1, 1)], False, 1 + ) # gene is too small, the length adjustement at the start lead to no gene with pytest.raises(ValueError): - fix_partial_gene_coordinates([(60, 60), (1, 1)], False, - 1) # gene is too small, the length adjustement at the start and at the end lead to no gene + fix_partial_gene_coordinates( + [(60, 60), (1, 1)], False, 1 + ) # gene is too small, the length adjustement at the start and at the end lead to no gene with pytest.raises(ValueError): fix_partial_gene_coordinates([], False, 1) # chevron in inner position -@pytest.mark.parametrize("coordinates, shift, expected", [ - - ([(11, 40)], 0, [(11, 40)]), - - ([(1, 2)], 1, [(2, 2)]), - - ([(1, 1), (1, 4)], 1, [(1, 4)]), - - ([(1, 1), (1, 1), (1, 4)], 2, [(1, 4)]), - - ([(1, 1), (1, 2), (1, 4)], 2, [(2, 2), (1, 4)]), - -]) +@pytest.mark.parametrize( + "coordinates, shift, expected", + [ + ([(11, 40)], 0, [(11, 40)]), + ([(1, 2)], 1, [(2, 2)]), + ([(1, 1), (1, 4)], 1, [(1, 4)]), + ([(1, 1), (1, 1), (1, 4)], 2, [(1, 4)]), + ([(1, 1), (1, 2), (1, 4)], 2, [(2, 2), (1, 4)]), + ], +) def test_shift_start_coordinates(coordinates, shift, expected): result = shift_start_coordinates(coordinates, shift) assert result == expected -@pytest.mark.parametrize("coordinates, shift, expected", [ - - ([(11, 40)], 0, [(11, 40)]), - - ([(1, 2)], 1, [(1, 1)]), - - ([(1, 1), (1, 4)], 1, [(1, 1), (1, 3)]), - - ([(1, 4), (4, 4), (4, 4)], 2, [(1, 4)]), - - ([(18, 18), (1, 4)], 4, [(18, 18)]), - -]) +@pytest.mark.parametrize( + "coordinates, shift, expected", + [ + ([(11, 40)], 0, [(11, 40)]), + ([(1, 2)], 1, [(1, 1)]), + ([(1, 1), (1, 4)], 1, [(1, 1), (1, 3)]), + ([(1, 4), (4, 4), (4, 4)], 2, [(1, 4)]), + ([(18, 18), (1, 4)], 4, [(18, 18)]), + ], +) def test_shift_end_coordinates(coordinates, shift, expected): result = shift_end_coordinates(coordinates, shift) assert result == expected diff --git a/tests/context/test_context.py b/tests/context/test_context.py index 453a1f5d..cd6440e8 100644 --- a/tests/context/test_context.py +++ b/tests/context/test_context.py @@ -1,8 +1,12 @@ #! /usr/bin/env python3 import pytest -from ppanggolin.context.searchGeneContext import (extract_contig_window, get_n_next_genes_index, - add_edges_to_context_graph, compute_gene_context_graph) +from ppanggolin.context.searchGeneContext import ( + extract_contig_window, + get_n_next_genes_index, + add_edges_to_context_graph, + compute_gene_context_graph, +) from ppanggolin.geneFamily import GeneFamily from ppanggolin.genome import Gene, Contig, Organism @@ -11,38 +15,71 @@ def test_extract_contig_window(): - #TODO try to use @pytest.mark.parametrize to test different combinations - assert extract_contig_window(contig_size=15, positions_of_interest={8}, window_size=1) == [(7, 9)] + # TODO try to use @pytest.mark.parametrize to test different combinations + assert extract_contig_window( + contig_size=15, positions_of_interest={8}, window_size=1 + ) == [(7, 9)] # check that extracted window is inside contig limit - assert extract_contig_window(contig_size=16, positions_of_interest={15}, window_size=4) == [(11, 15)] + assert extract_contig_window( + contig_size=16, positions_of_interest={15}, window_size=4 + ) == [(11, 15)] - assert extract_contig_window(contig_size=10, positions_of_interest={2, 8}, window_size=2) == [(0, 4), (6, 9)] + assert extract_contig_window( + contig_size=10, positions_of_interest={2, 8}, window_size=2 + ) == [(0, 4), (6, 9)] # 12 window is (9,15) # 19 window is (16,22) # so when 12 and 19 are of interest window merge (9,22) - assert extract_contig_window(contig_size=200, positions_of_interest={12}, window_size=3) == [(9, 15)] - assert extract_contig_window(contig_size=200, positions_of_interest={19}, window_size=3) == [(16, 22)] - assert extract_contig_window(contig_size=200, positions_of_interest={12, 19}, window_size=3) == [(9, 22)] + assert extract_contig_window( + contig_size=200, positions_of_interest={12}, window_size=3 + ) == [(9, 15)] + assert extract_contig_window( + contig_size=200, positions_of_interest={19}, window_size=3 + ) == [(16, 22)] + assert extract_contig_window( + contig_size=200, positions_of_interest={12, 19}, window_size=3 + ) == [(9, 22)] - assert extract_contig_window(contig_size=10, positions_of_interest={2, 5, 8}, window_size=2) == [(0, 9)] + assert extract_contig_window( + contig_size=10, positions_of_interest={2, 5, 8}, window_size=2 + ) == [(0, 9)] def test_extract_contig_window_with_circular_contig(): # TODO try to use @pytest.mark.parametrize to test different combinations # # check that circularity is properly taken into account - assert extract_contig_window(contig_size=12, positions_of_interest={1}, window_size=2, is_circular=True) == [(0, 3), (11, 11)] - assert extract_contig_window(contig_size=12, positions_of_interest={1}, window_size=3, is_circular=True) == [(0, 4), (10, 11)] - assert extract_contig_window(contig_size=12, positions_of_interest={10}, window_size=3, is_circular=True) == [(0, 1), (7, 11)] - - assert extract_contig_window(contig_size=12, positions_of_interest={6}, window_size=6, is_circular=True) == [(0, 11)] - assert extract_contig_window(contig_size=12, positions_of_interest={1}, window_size=6, is_circular=True) == [(0, 11)] - assert extract_contig_window(contig_size=12, positions_of_interest={1}, window_size=6, is_circular=False) == [(0, 7)] - - assert extract_contig_window(contig_size=12, positions_of_interest={0, 9}, window_size=2, is_circular=False) == [(0, 2), (7, 11)] - - assert extract_contig_window(contig_size=894, positions_of_interest=[151, 152, 153, 893], window_size=4, is_circular=True) == [(0, 3), (147, 157), (889, 893)] + assert extract_contig_window( + contig_size=12, positions_of_interest={1}, window_size=2, is_circular=True + ) == [(0, 3), (11, 11)] + assert extract_contig_window( + contig_size=12, positions_of_interest={1}, window_size=3, is_circular=True + ) == [(0, 4), (10, 11)] + assert extract_contig_window( + contig_size=12, positions_of_interest={10}, window_size=3, is_circular=True + ) == [(0, 1), (7, 11)] + + assert extract_contig_window( + contig_size=12, positions_of_interest={6}, window_size=6, is_circular=True + ) == [(0, 11)] + assert extract_contig_window( + contig_size=12, positions_of_interest={1}, window_size=6, is_circular=True + ) == [(0, 11)] + assert extract_contig_window( + contig_size=12, positions_of_interest={1}, window_size=6, is_circular=False + ) == [(0, 7)] + + assert extract_contig_window( + contig_size=12, positions_of_interest={0, 9}, window_size=2, is_circular=False + ) == [(0, 2), (7, 11)] + + assert extract_contig_window( + contig_size=894, + positions_of_interest=[151, 152, 153, 893], + window_size=4, + is_circular=True, + ) == [(0, 3), (147, 157), (889, 893)] def test_extract_contig_window_out_of_range(): @@ -55,20 +92,43 @@ def test_extract_contig_window_out_of_range(): def test_get_n_next_genes_index(): - assert list(get_n_next_genes_index(current_index=6, next_genes_count=3, contig_size=100, is_circular=False)) == [7, 8, 9] + assert list( + get_n_next_genes_index( + current_index=6, next_genes_count=3, contig_size=100, is_circular=False + ) + ) == [7, 8, 9] # there is no next gene because the current index is at the end of a non circular contig - assert list(get_n_next_genes_index(current_index=11, next_genes_count=2, contig_size=12, is_circular=False)) == [] + assert ( + list( + get_n_next_genes_index( + current_index=11, next_genes_count=2, contig_size=12, is_circular=False + ) + ) + == [] + ) def test_get_n_next_genes_index_circular(): - assert list(get_n_next_genes_index(current_index=10, next_genes_count=3, contig_size=12, is_circular=True)) == [11, 0, 1] - assert list(get_n_next_genes_index(current_index=10, next_genes_count=16, contig_size=12, is_circular=True)) == [11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9] + assert list( + get_n_next_genes_index( + current_index=10, next_genes_count=3, contig_size=12, is_circular=True + ) + ) == [11, 0, 1] + assert list( + get_n_next_genes_index( + current_index=10, next_genes_count=16, contig_size=12, is_circular=True + ) + ) == [11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9] def test_get_n_next_genes_index_out_of_range(): with pytest.raises(IndexError): - assert list(get_n_next_genes_index(current_index=10, next_genes_count=16, contig_size=8, is_circular=False)) + assert list( + get_n_next_genes_index( + current_index=10, next_genes_count=16, contig_size=8, is_circular=False + ) + ) @pytest.fixture() @@ -79,10 +139,10 @@ def simple_contig(): contig_size = 6 contig.length = contig_size genes = [Gene(str(i)) for i in range(contig_size)] - organism = Organism('organism_A') - for i, (gene, family_name) in enumerate(zip(genes, 'ABCDEFGHIJKLMNOP')): - family = GeneFamily(i, family_name) - gene.fill_annotations(start=i+1, stop=i+2, strand="+", position=i) + organism = Organism("organism_A") + for i, (gene, family_name) in enumerate(zip(genes, "ABCDEFGHIJKLMNOP")): + family = GeneFamily(i, family_name) + gene.fill_annotations(start=i + 1, stop=i + 2, strand="+", position=i) gene.fill_parents(organism, contig) @@ -100,7 +160,7 @@ def simple_circular_contig(): contig_size = 6 genes = [Gene(str(i)) for i in range(contig_size)] - for i, (gene, family_name) in enumerate(zip(genes, 'ABCDEFGHIJKLMNOP')): + for i, (gene, family_name) in enumerate(zip(genes, "ABCDEFGHIJKLMNOP")): family = GeneFamily(i, family_name) gene.fill_annotations(start=0, stop=0, strand=0, position=i) @@ -115,20 +175,15 @@ def test_add_edges_to_context_graph(simple_contig): # simple_contig families : ABCDEF - add_edges_to_context_graph(context_graph, - contig=simple_contig, - contig_windows=[(0, 3)], - transitivity=1) + add_edges_to_context_graph( + context_graph, contig=simple_contig, contig_windows=[(0, 3)], transitivity=1 + ) nodes = sorted([n.name for n in context_graph.nodes()]) edges = {tuple(sorted([n.name, v.name])) for n, v in context_graph.edges()} - assert nodes == ['A', "B", "C", "D"] - assert edges == {('A', 'B'), - ('A', 'C'), - ('B', 'C'), - ('B', 'D'), - ('C', 'D')} + assert nodes == ["A", "B", "C", "D"] + assert edges == {("A", "B"), ("A", "C"), ("B", "C"), ("B", "D"), ("C", "D")} def test_add_edges_to_context_graph_2(simple_contig): @@ -136,17 +191,15 @@ def test_add_edges_to_context_graph_2(simple_contig): # simple_contig families : A B-C-D E F - add_edges_to_context_graph(context_graph, - contig=simple_contig, - contig_windows=[(1, 3)], - transitivity=0) + add_edges_to_context_graph( + context_graph, contig=simple_contig, contig_windows=[(1, 3)], transitivity=0 + ) nodes = sorted([n.name for n in context_graph.nodes()]) edges = {tuple(sorted([n.name, v.name])) for n, v in context_graph.edges()} assert nodes == ["B", "C", "D"] - assert edges == {('B', 'C'), - ('C', 'D')} + assert edges == {("B", "C"), ("C", "D")} def test_add_edges_to_context_graph_linear(simple_contig): @@ -157,19 +210,22 @@ def test_add_edges_to_context_graph_linear(simple_contig): context_graph = nx.Graph() - add_edges_to_context_graph(context_graph, - contig=simple_contig, - contig_windows=[(4, 5), (0, 2)], - transitivity=0) + add_edges_to_context_graph( + context_graph, + contig=simple_contig, + contig_windows=[(4, 5), (0, 2)], + transitivity=0, + ) nodes = sorted([n.name for n in context_graph.nodes()]) edges = {tuple(sorted([n.name, v.name])) for n, v in context_graph.edges()} assert nodes == ["A", "B", "C", "E", "F"] - assert edges == {('A', 'B'), - ('B', 'C'), - ('E', "F"), - } + assert edges == { + ("A", "B"), + ("B", "C"), + ("E", "F"), + } def test_add_edges_to_context_graph_circular(simple_contig): @@ -180,19 +236,23 @@ def test_add_edges_to_context_graph_circular(simple_contig): context_graph = nx.Graph() simple_contig.is_circular = True - add_edges_to_context_graph(context_graph, - contig=simple_contig, - contig_windows=[(4, 5), (0, 2)], - transitivity=0) + add_edges_to_context_graph( + context_graph, + contig=simple_contig, + contig_windows=[(4, 5), (0, 2)], + transitivity=0, + ) nodes = sorted([n.name for n in context_graph.nodes()]) edges = {tuple(sorted([n.name, v.name])) for n, v in context_graph.edges()} assert nodes == ["A", "B", "C", "E", "F"] - assert edges == {('A', 'B'), - ('B', 'C'), - ('E', "F"), - ('A', 'F')} # circular so F and A are linked + assert edges == { + ("A", "B"), + ("B", "C"), + ("E", "F"), + ("A", "F"), + } # circular so F and A are linked def test_compute_gene_context_graph(simple_contig): @@ -206,16 +266,15 @@ def test_compute_gene_context_graph(simple_contig): families_in_contigs = [g.family for g in simple_contig.genes] family_names_of_interest = ["C"] - families_of_interest = {f for f in families_in_contigs if f.name in family_names_of_interest} + families_of_interest = { + f for f in families_in_contigs if f.name in family_names_of_interest + } - context_graph, _ = compute_gene_context_graph(families_of_interest, - transitive=0, - window_size=2) + context_graph, _ = compute_gene_context_graph( + families_of_interest, transitive=0, window_size=2 + ) nodes = sorted([n.name for n in context_graph.nodes()]) edges = {tuple(sorted([n.name, v.name])) for n, v in context_graph.edges()} assert nodes == ["A", "B", "C", "D", "E"] - assert edges == {('A', 'B'), - ('B', 'C'), - ('C', "D"), - ('D', 'E')} + assert edges == {("A", "B"), ("B", "C"), ("C", "D"), ("D", "E")} diff --git a/tests/formats/test_writeFlatGenomes.py b/tests/formats/test_writeFlatGenomes.py index a028152b..d5197b65 100644 --- a/tests/formats/test_writeFlatGenomes.py +++ b/tests/formats/test_writeFlatGenomes.py @@ -1,39 +1,56 @@ from ppanggolin.formats.writeFlatGenomes import convert_overlapping_coordinates_for_gff + def test_convert_overlapping_coordinates_for_gff(): # test case where coordinates are have no frameshift and no edge overlap coordinates = [(7, 10)] contig_length = 15 - assert convert_overlapping_coordinates_for_gff(coordinates, contig_length) == [(7, 10)] - + assert convert_overlapping_coordinates_for_gff(coordinates, contig_length) == [ + (7, 10) + ] # test case where coordinates are simply a frameshift with not edge overlap coordinates = [(1, 5), (7, 10)] contig_length = 15 - assert convert_overlapping_coordinates_for_gff(coordinates, contig_length) == [(1, 5), (7, 10)] + assert convert_overlapping_coordinates_for_gff(coordinates, contig_length) == [ + (1, 5), + (7, 10), + ] # Test case where the gene overlaps. Coordinates are adjusted for GFF format coordinates = [(4, 8), (1, 2)] contig_length = 8 - assert convert_overlapping_coordinates_for_gff(coordinates, contig_length) == [(4, 10)] + assert convert_overlapping_coordinates_for_gff(coordinates, contig_length) == [ + (4, 10) + ] # Test case where coordinates overlap and has frameshift coordinates = [(4, 8), (7, 13), (1, 2)] contig_length = 13 - assert convert_overlapping_coordinates_for_gff(coordinates, contig_length) == [(4, 8), (7, 15)] + assert convert_overlapping_coordinates_for_gff(coordinates, contig_length) == [ + (4, 8), + (7, 15), + ] # Test case where coordinates overlap and has frameshift at the edge of the contig coordinates = [(12, 18), (1, 4)] contig_length = 20 - assert convert_overlapping_coordinates_for_gff(coordinates, contig_length) == [(12, 18), (21, 24)] + assert convert_overlapping_coordinates_for_gff(coordinates, contig_length) == [ + (12, 18), + (21, 24), + ] # Test case where coordinates overlap and has frameshift at the edge of the contig coordinates = [(12, 20), (2, 4)] contig_length = 20 - assert convert_overlapping_coordinates_for_gff(coordinates, contig_length) == [(12, 20), (22, 24)] - + assert convert_overlapping_coordinates_for_gff(coordinates, contig_length) == [ + (12, 20), + (22, 24), + ] # Test case where coordinates have just the last nt of the contig and the rest is at th ebegining of the contig coordinates = [(20, 20), (1, 10)] contig_length = 20 - assert convert_overlapping_coordinates_for_gff(coordinates, contig_length) == [(20, 30)] \ No newline at end of file + assert convert_overlapping_coordinates_for_gff(coordinates, contig_length) == [ + (20, 30) + ] diff --git a/tests/region/test_genomicIsland.py b/tests/region/test_genomicIsland.py index bfece3b0..fce5c6c6 100644 --- a/tests/region/test_genomicIsland.py +++ b/tests/region/test_genomicIsland.py @@ -1,13 +1,23 @@ -from ppanggolin.utils import find_consecutive_sequences, find_region_border_position, get_consecutive_region_positions +from ppanggolin.utils import ( + find_consecutive_sequences, + find_region_border_position, + get_consecutive_region_positions, +) import pytest + def test_find_consecutive_sequences_single_sequence(): sequence = [1, 2, 3, 4, 5] assert find_consecutive_sequences(sequence) == [[1, 2, 3, 4, 5]] + def test_find_consecutive_sequences_multiple_sequences(): sequence = [1, 2, 3, 7, 8, 9, 11, 12, 13, 0] - assert find_consecutive_sequences(sequence) == [[0, 1, 2, 3], [7, 8, 9], [11, 12, 13]] + assert find_consecutive_sequences(sequence) == [ + [0, 1, 2, 3], + [7, 8, 9], + [11, 12, 13], + ] def test_find_region_border_position_single_sequence(): @@ -15,23 +25,27 @@ def test_find_region_border_position_single_sequence(): contig_length = 10 assert find_region_border_position(region_positions, contig_length) == (1, 5) + def test_find_region_border_position_edge_overlap(): region_positions = [0, 1, 2, 3, 7, 8, 9, 10, 11, 12, 13, 14] contig_length = 15 assert find_region_border_position(region_positions, contig_length) == (7, 3) + def test_find_region_border_position_empty_sequence(): region_positions = [] contig_length = 10 with pytest.raises(ValueError): find_region_border_position(region_positions, contig_length) + def test_find_region_border_position_multiple_fragments(): region_positions = [1, 3, 4, 5, 8, 9] contig_length = 10 with pytest.raises(ValueError): find_region_border_position(region_positions, contig_length) + def test_find_region_border_position_fragmented_but_no_zero(): # region is in two pieces but it miss position 0 to be correct overlap region_positions = [8, 9, 1, 2, 3, 4] @@ -39,6 +53,7 @@ def test_find_region_border_position_fragmented_but_no_zero(): with pytest.raises(ValueError): find_region_border_position(region_positions, contig_length) + def test_find_region_border_position_fragmented_but_wrong_max_po(): # region does not reach the end of the contig. It misses position 9 region_positions = [7, 8, 0, 1, 2, 3, 4] @@ -46,18 +61,27 @@ def test_find_region_border_position_fragmented_but_wrong_max_po(): with pytest.raises(ValueError): find_region_border_position(region_positions, contig_length) + def test_get_consecutive_region_positions_regular(): region_positions = [2, 3, 4, 5, 6] contig_length = 15 - assert get_consecutive_region_positions(region_positions, contig_length) == [[2, 3, 4, 5, 6]] + assert get_consecutive_region_positions(region_positions, contig_length) == [ + [2, 3, 4, 5, 6] + ] def test_get_consecutive_region_positions_overlap(): region_positions = [0, 1, 2, 3, 7, 8, 9, 10, 11, 12, 13, 14] contig_length = 15 - assert get_consecutive_region_positions(region_positions, contig_length) == [[7, 8, 9, 10, 11, 12, 13, 14], [0, 1, 2, 3]] + assert get_consecutive_region_positions(region_positions, contig_length) == [ + [7, 8, 9, 10, 11, 12, 13, 14], + [0, 1, 2, 3], + ] + def test_get_consecutive_region_positions_all_genes(): region_positions = [4, 5, 6, 7, 0, 1, 2, 3] contig_length = 8 - assert get_consecutive_region_positions(region_positions, contig_length) == [[0, 1, 2, 3, 4, 5, 6, 7]] \ No newline at end of file + assert get_consecutive_region_positions(region_positions, contig_length) == [ + [0, 1, 2, 3, 4, 5, 6, 7] + ] diff --git a/tests/region/test_rgp_cluster.py b/tests/region/test_rgp_cluster.py index 51cf6eb7..d8b914a7 100644 --- a/tests/region/test_rgp_cluster.py +++ b/tests/region/test_rgp_cluster.py @@ -12,14 +12,15 @@ @pytest.fixture def genes() -> Generator[Set[Gene], None, None]: - """Create a set of genes to fill gene families - """ + """Create a set of genes to fill gene families""" organism = Organism("organism") contig = Contig(0, "contig") genes = [] for i in range(randint(11, 20)): gene = Gene(f"gene_{str(i)}") - gene.fill_annotations(start=10 * i + 1, stop=10 * (i + 1), strand='+', position=i, genetic_code=4) + gene.fill_annotations( + start=10 * i + 1, stop=10 * (i + 1), strand="+", position=i, genetic_code=4 + ) gene.fill_parents(organism, contig) contig[gene.start] = gene genes.append(gene) @@ -28,8 +29,7 @@ def genes() -> Generator[Set[Gene], None, None]: @pytest.fixture def families(genes) -> Generator[Set[GeneFamily], None, None]: - """Create a set of gene families fill with genes to test edges - """ + """Create a set of gene families fill with genes to test edges""" families = set() genes = list(genes) nb_families = randint(9, 20) @@ -59,8 +59,7 @@ def families(genes) -> Generator[Set[GeneFamily], None, None]: @pytest.fixture def identical_rgps(genes, families) -> Generator[Set[Region], None, None]: - """Create a set of identical rgps - """ + """Create a set of identical rgps""" identical_rgps = set() for i in range(1, randint(6, 21)): rgp = Region(f"RGP_{i}") @@ -74,61 +73,54 @@ def identical_rgps(genes, families) -> Generator[Set[Region], None, None]: class TestIdenticalRegions: def test_init_with_valid_inputs(self, identical_rgps, families): - """Tests that the IdenticalRegions object is initialized correctly with valid inputs. - """ + """Tests that the IdenticalRegions object is initialized correctly with valid inputs.""" is_contig_border = True - identical_regions = IdenticalRegions("IdenticalRegions", identical_rgps, families, is_contig_border) + identical_regions = IdenticalRegions( + "IdenticalRegions", identical_rgps, families, is_contig_border + ) assert identical_regions.name == "IdenticalRegions" assert identical_regions.rgps == identical_rgps assert identical_regions.families == families assert identical_regions.is_contig_border == is_contig_border - @pytest.mark.parametrize("wrong_type", - ["string", - 1, - 0.8, - list(), - dict()]) + @pytest.mark.parametrize("wrong_type", ["string", 1, 0.8, list(), dict()]) def test_init_with_identical_rgps_not_isintance_set(self, wrong_type, families): - """Tests that the IdenticalRegions object cannot be initialized with a not instance set for identical_rgps. - """ + """Tests that the IdenticalRegions object cannot be initialized with a not instance set for identical_rgps.""" with pytest.raises(TypeError): IdenticalRegions("IdenticalRegions", wrong_type, families, True) - def test_init_with_rgp_is_not_instance_region_in_identical_rgps(self, identical_rgps, families): - """Tests that the IdenticalRegions object raise TypeError if one element is not instance Region. - """ + def test_init_with_rgp_is_not_instance_region_in_identical_rgps( + self, identical_rgps, families + ): + """Tests that the IdenticalRegions object raise TypeError if one element is not instance Region.""" with pytest.raises(TypeError): - IdenticalRegions("IdenticalRegions", identical_rgps.union({1}), families, True) + IdenticalRegions( + "IdenticalRegions", identical_rgps.union({1}), families, True + ) def test_init_with_empty_identical_rgps(self, families): - """Tests that the IdenticalRegions object cannot be initialized with an empty set of identical regions. - """ + """Tests that the IdenticalRegions object cannot be initialized with an empty set of identical regions.""" with pytest.raises(ValueError): IdenticalRegions("IdenticalRegions", set(), families, True) - @pytest.mark.parametrize("wrong_type", - ["string", - 1, - 0.8, - list(), - dict()]) + @pytest.mark.parametrize("wrong_type", ["string", 1, 0.8, list(), dict()]) def test_init_with_families_not_isintance_set(self, wrong_type, identical_rgps): - """Tests that the IdenticalRegions object cannot be initialized with a not instance set. - """ + """Tests that the IdenticalRegions object cannot be initialized with a not instance set.""" with pytest.raises(TypeError): IdenticalRegions("IdenticalRegions", identical_rgps, wrong_type, True) - def test_init_with_family_is_not_instance_genefamilies_in_families(self, identical_rgps, families): - """Tests that the IdenticalRegions object raise TypeError if one element is not instance Region. - """ + def test_init_with_family_is_not_instance_genefamilies_in_families( + self, identical_rgps, families + ): + """Tests that the IdenticalRegions object raise TypeError if one element is not instance Region.""" with pytest.raises(TypeError): - IdenticalRegions("IdenticalRegions", identical_rgps, families.union({1}), True) + IdenticalRegions( + "IdenticalRegions", identical_rgps, families.union({1}), True + ) def test_init_with_empty_families(self, identical_rgps): - """Tests that the IdenticalRegions object cannot be initialized with an empty set of identical regions. - """ + """Tests that the IdenticalRegions object cannot be initialized with an empty set of identical regions.""" with pytest.raises(ValueError): IdenticalRegions("IdenticalRegions", identical_rgps, set(), True) @@ -146,8 +138,12 @@ def test_eq_with_equal_identical_regions(self): families2 = {family1, family2} is_contig_border = True - identical_regions1 = IdenticalRegions("IdenticalRegions", identical_rgps1, families1, is_contig_border) - identical_regions2 = IdenticalRegions("IdenticalRegions", identical_rgps2, families2, is_contig_border) + identical_regions1 = IdenticalRegions( + "IdenticalRegions", identical_rgps1, families1, is_contig_border + ) + identical_regions2 = IdenticalRegions( + "IdenticalRegions", identical_rgps2, families2, is_contig_border + ) assert identical_regions1 == identical_regions2 @@ -165,15 +161,18 @@ def test_eq_with_non_identical_regions(self): families2 = {family1} is_contig_border = True - identical_regions1 = IdenticalRegions("IdenticalRegions", identical_rgps1, families1, is_contig_border) - identical_regions2 = IdenticalRegions("IdenticalRegions", identical_rgps2, families2, is_contig_border) + identical_regions1 = IdenticalRegions( + "IdenticalRegions", identical_rgps1, families1, is_contig_border + ) + identical_regions2 = IdenticalRegions( + "IdenticalRegions", identical_rgps2, families2, is_contig_border + ) assert identical_regions1 != identical_regions2 def test_compute_grr(): - """Tests that compute_grr returns the correct value when there is a non-zero intersection between families - """ + """Tests that compute_grr returns the correct value when there is a non-zero intersection between families""" set1 = {1, 2, 3, 4, 5} set2 = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10} @@ -186,10 +185,12 @@ def test_dereplicate_rgp(identical_rgps): rgp1 = list_identical_rgps[0] assert rgp_cluster.dereplicate_rgp({rgp1}) == [rgp1] - identical_region_obj = rgp_cluster.IdenticalRegions(name="identical_rgps_0", - identical_rgps=identical_rgps, - families=set(list_identical_rgps[0].families), - is_contig_border=True) + identical_region_obj = rgp_cluster.IdenticalRegions( + name="identical_rgps_0", + identical_rgps=identical_rgps, + families=set(list_identical_rgps[0].families), + is_contig_border=True, + ) assert rgp_cluster.dereplicate_rgp(rgps=identical_rgps)[0] == identical_region_obj @@ -207,16 +208,27 @@ def test_compute_rgp_metric(genes, families): assert not RGP_b.is_contig_border shared_families = len(set(RGP_a.families).intersection(set(RGP_b.families))) - expected_grr = (RGP_a.ID, RGP_b.ID, {'incomplete_aware_grr': shared_families / min(len(set(RGP_a.families)), len(set(RGP_b.families))), - "min_grr": shared_families / min(len(set(RGP_a.families)), len(set(RGP_b.families))), - 'max_grr': shared_families / max(len(set(RGP_a.families)), len(set(RGP_b.families))), - 'shared_family': shared_families}) + expected_grr = ( + RGP_a.ID, + RGP_b.ID, + { + "incomplete_aware_grr": shared_families + / min(len(set(RGP_a.families)), len(set(RGP_b.families))), + "min_grr": shared_families + / min(len(set(RGP_a.families)), len(set(RGP_b.families))), + "max_grr": shared_families + / max(len(set(RGP_a.families)), len(set(RGP_b.families))), + "shared_family": shared_families, + }, + ) # min_grr min_result = rgp_cluster.compute_rgp_metric(RGP_a, RGP_b, 0, "min_grr") assert min_result == expected_grr - # incomplete_aware_grr: same as min grr as rgp1 is incomplete - incomplete_aware_result = rgp_cluster.compute_rgp_metric(RGP_a, RGP_b, 0, "incomplete_aware_grr") + # incomplete_aware_grr: same as min grr as rgp1 is incomplete + incomplete_aware_result = rgp_cluster.compute_rgp_metric( + RGP_a, RGP_b, 0, "incomplete_aware_grr" + ) assert incomplete_aware_result == expected_grr diff --git a/tests/test_edge.py b/tests/test_edge.py index 0702cdc7..cdf43499 100644 --- a/tests/test_edge.py +++ b/tests/test_edge.py @@ -11,20 +11,19 @@ class TestEdge: @pytest.fixture def organism(self) -> Generator[Organism, None, None]: - """Generate a basic organism object - """ + """Generate a basic organism object""" yield Organism("organism") @pytest.fixture def families_pair(self) -> Generator[Tuple[GeneFamily, GeneFamily], None, None]: - """Generate a families pair - """ + """Generate a families pair""" yield GeneFamily(1, "family1"), GeneFamily(2, "family2") @pytest.fixture - def genes_pair(self, organism, families_pair) -> Generator[Tuple[Gene, Gene], None, None]: - """Generate genes_pair - """ + def genes_pair( + self, organism, families_pair + ) -> Generator[Tuple[Gene, Gene], None, None]: + """Generate genes_pair""" gene1, gene2 = Gene("gene1"), Gene("gene2") gene1.fill_parents(organism, None) gene2.fill_parents(organism, None) @@ -33,14 +32,12 @@ def genes_pair(self, organism, families_pair) -> Generator[Tuple[Gene, Gene], No @pytest.fixture def edge(self, genes_pair): - """Generate a basic edge - """ + """Generate a basic edge""" edge = Edge(*genes_pair) yield edge def test_constructor(self, genes_pair, organism, families_pair): - """Tests that an Edge object can be created with two genes belonging to different families - """ + """Tests that an Edge object can be created with two genes belonging to different families""" gene1, gene2 = genes_pair edge = Edge(gene1, gene2) assert edge.source == gene1.family @@ -54,9 +51,9 @@ def test_constructor_attribute_error(self): Tests that an AttributeError is raised when creating an Edge object with a gene that does not belong to any family """ - gene1 = Gene('gene1') - gene1.family = GeneFamily(0, 'test') - gene2 = Gene('gene2') + gene1 = Gene("gene1") + gene1.family = GeneFamily(0, "test") + gene2 = Gene("gene2") with pytest.raises(AttributeError): # Test target attribute error Edge(gene1, gene2) @@ -65,44 +62,40 @@ def test_constructor_attribute_error(self): Edge(gene2, gene1) def test_gene_pairs(self, edge, genes_pair): - """Tests that gene pairs' generator return what's expected - """ + """Tests that gene pairs' generator return what's expected""" assert set(edge.gene_pairs) == {genes_pair} def test_get_organisms(self, edge, organism): - """Tests that organism generator return what's expected - """ + """Tests that organism generator return what's expected""" assert set(edge.organisms) == {organism} def test_get_number_of_organisms(self, edge): - """Tests that the good number of organism is returned - """ + """Tests that the good number of organism is returned""" assert isinstance(edge.number_of_organisms, int) assert edge.number_of_organisms == 1 def test_get_organisms_dict(self, edge, organism, genes_pair): - """Tests that organism-gene_pairs dict is built as expected - """ + """Tests that organism-gene_pairs dict is built as expected""" assert edge.get_organisms_dict() == {organism: [genes_pair]} def test_get_organism_genes_pairs(self, edge, organism, genes_pair): - """Tests that the gene pairs corresponding to the organism is returned - """ + """Tests that the gene pairs corresponding to the organism is returned""" assert edge.get_organism_genes_pairs(organism) == [genes_pair] def test_edge_add_genes_same_organism(self, edge, genes_pair, organism): - """Tests that genes can be added to the edge that are on the same organism - """ - gene1, gene2, gene3, gene4 = *genes_pair, Gene('gene3'), Gene('gene4') + """Tests that genes can be added to the edge that are on the same organism""" + gene1, gene2, gene3, gene4 = *genes_pair, Gene("gene3"), Gene("gene4") gene3.fill_parents(organism, None) gene4.fill_parents(organism, None) edge.add_genes(gene3, gene4) - assert edge.get_organism_genes_pairs(organism) == [(gene1, gene2), (gene3, gene4)] + assert edge.get_organism_genes_pairs(organism) == [ + (gene1, gene2), + (gene3, gene4), + ] def test_edge_add_genes_different_organisms(self, edge, organism): - """Tests that an Exception is raised when adding genes to the edge that are not on the same organism - """ - gene1, gene2 = Gene('gene3'), Gene('gene4') + """Tests that an Exception is raised when adding genes to the edge that are not on the same organism""" + gene1, gene2 = Gene("gene3"), Gene("gene4") gene1.fill_parents(organism, None) org = Organism("org") gene2.fill_parents(org, None) @@ -110,9 +103,8 @@ def test_edge_add_genes_different_organisms(self, edge, organism): edge.add_genes(gene1, gene2) def test_edge_add_genes_one_none_gene(self, edge, organism): - """Tests that a TypeError is raised when adding genes to the edge where one gene is None - """ - gene1 = Gene('gene1') + """Tests that a TypeError is raised when adding genes to the edge where one gene is None""" + gene1 = Gene("gene1") gene1.fill_parents(organism) with pytest.raises(TypeError): edge.add_genes(gene1, None) @@ -120,9 +112,8 @@ def test_edge_add_genes_one_none_gene(self, edge, organism): edge.add_genes(None, gene1) def test_edge_add_genes_without_organisms(self, edge, organism): - """Tests that a ValueError is raised when adding genes not filled with organism - """ - gene1, gene2 = Gene('gene1'), Gene('gene2') + """Tests that a ValueError is raised when adding genes not filled with organism""" + gene1, gene2 = Gene("gene1"), Gene("gene2") gene1.fill_parents(organism, None) with pytest.raises(ValueError): edge.add_genes(gene1, gene2) diff --git a/tests/test_genefamily.py b/tests/test_genefamily.py index 594ad8d5..d985a0c0 100644 --- a/tests/test_genefamily.py +++ b/tests/test_genefamily.py @@ -12,26 +12,53 @@ class TestGeneFamily: - """Tests the gene family class - """ + """Tests the gene family class""" + @pytest.fixture def family(self) -> Generator[GeneFamily, None, None]: - """Create a gene family for all tests - """ + """Create a gene family for all tests""" yield GeneFamily(1, "test") def test_construct_gene_family(self, family): - """Tests that a GeneFamily object can be created with valid family_id and name - """ + """Tests that a GeneFamily object can be created with valid family_id and name""" assert isinstance(family, GeneFamily) - assert all(attr in ["ID", "name", "_edges_getter", "_genePerOrg", "_genes_getter", "_representative", - "removed", "sequence", "_partition", "_spots", "_module", "bitarray", "_metadata_getter"] - for attr in family.__dict__) # Check that no attribute was added else it should be tested - assert all(hasattr(family, attr) for attr in ["ID", "name", "_edges_getter", "_genePerOrg", "_genes_getter", - "removed", "sequence", "_partition", "_spots", "_module", - "bitarray"]) # Check that no attribute was removed else it should be tested + assert all( + attr + in [ + "ID", + "name", + "_edges_getter", + "_genePerOrg", + "_genes_getter", + "_representative", + "removed", + "sequence", + "_partition", + "_spots", + "_module", + "bitarray", + "_metadata_getter", + ] + for attr in family.__dict__ + ) # Check that no attribute was added else it should be tested + assert all( + hasattr(family, attr) + for attr in [ + "ID", + "name", + "_edges_getter", + "_genePerOrg", + "_genes_getter", + "removed", + "sequence", + "_partition", + "_spots", + "_module", + "bitarray", + ] + ) # Check that no attribute was removed else it should be tested assert family.ID == 1 - assert family.name == 'test' + assert family.name == "test" assert family._edges_getter == {} assert family._genePerOrg == {} assert family._genes_getter == dict() @@ -42,52 +69,49 @@ def test_construct_gene_family(self, family): assert family._module is None assert family.bitarray is None - @pytest.mark.parametrize("partition, name", - [ - ("P", "persistent"), - ("Pp", "persistent"), - ("P whatever, only first letter is important", "persistent"), - ("C", "cloud"), - ("C loud", "cloud"), - ("C whatever, only first letter is important", "cloud"), - ("S", "shell"), - ("Shut", "shell"), - ("S whatever, only first letter is important", "shell"), - ("un de troa kvar", "undefined"), - ("1", "undefined"), - ("p", "undefined"), - ("c", "undefined"), - ("s", "undefined"), - ]) + @pytest.mark.parametrize( + "partition, name", + [ + ("P", "persistent"), + ("Pp", "persistent"), + ("P whatever, only first letter is important", "persistent"), + ("C", "cloud"), + ("C loud", "cloud"), + ("C whatever, only first letter is important", "cloud"), + ("S", "shell"), + ("Shut", "shell"), + ("S whatever, only first letter is important", "shell"), + ("un de troa kvar", "undefined"), + ("1", "undefined"), + ("p", "undefined"), + ("c", "undefined"), + ("s", "undefined"), + ], + ) def test_get_named_partition_of_gene_family_object(self, family, partition, name): - """Tests that the named partition of a GeneFamily object can be retrieved - """ + """Tests that the named partition of a GeneFamily object can be retrieved""" family.partition = partition assert family.named_partition == name def test_get_named_partition_error_partition_empty(self, family): - """Tests that if no partition given to gene family, raise a ValueError - """ + """Tests that if no partition given to gene family, raise a ValueError""" with pytest.raises(ValueError): _ = family.named_partition def test_add_sequence_to_gene_family(self, family): - """Tests that a sequence can be added to a GeneFamily object - """ - family.add_sequence('ATCG') - assert family.sequence == 'ATCG' + """Tests that a sequence can be added to a GeneFamily object""" + family.add_sequence("ATCG") + assert family.sequence == "ATCG" def test_add_gene_to_gene_family(self, family): - """Tests that a Gene object can be added to a GeneFamily object - """ - gene = Gene('gene1') + """Tests that a Gene object can be added to a GeneFamily object""" + gene = Gene("gene1") family.add(gene) assert gene in family.genes assert gene.family == family def test_add_gene_error(self, family): - """Tests that a non-gene object can't be added to a GeneFamily as gene - """ + """Tests that a non-gene object can't be added to a GeneFamily as gene""" with pytest.raises(TypeError): family.add(33) @@ -103,7 +127,7 @@ def test_get_representative_gene(self, family): def test_raise_typeerror_with_no_gene_type_as_representative(self, family): with pytest.raises(TypeError): - family.representative = 'test' + family.representative = "test" def test_raise_exception_if_representative_not_set(self, family): with pytest.raises(Exception): @@ -111,18 +135,22 @@ def test_raise_exception_if_representative_not_set(self, family): @pytest.fixture def genes(self) -> Generator[Set[Gene], None, None]: - """Creeate a set of genes to fill gene families - """ + """Creeate a set of genes to fill gene families""" genes = set() for i in range(1, randint(11, 20)): gene = Gene(f"gene_{str(i)}") - gene.fill_annotations(start=10*(i-1) + 1, stop=10*i, strand='+', position=i, genetic_code=4) + gene.fill_annotations( + start=10 * (i - 1) + 1, + stop=10 * i, + strand="+", + position=i, + genetic_code=4, + ) genes.add(gene) yield genes def test_get_number_of_genes(self, family, genes): - """Tests that the number of genes can be retrieved - """ + """Tests that the number of genes can be retrieved""" for gene in genes: family.add(gene) assert isinstance(len(family), int) @@ -130,8 +158,7 @@ def test_get_number_of_genes(self, family, genes): @pytest.fixture def organisms(self, genes) -> Generator[Set[Organism], None, None]: - """Create a set of organisms fill with genes to test edges - """ + """Create a set of organisms fill with genes to test edges""" organisms = set() genes = list(genes) nb_organisms = randint(2, 10) @@ -165,59 +192,58 @@ def organisms(self, genes) -> Generator[Set[Organism], None, None]: yield organisms def test_get_org_dict(self, family, genes, organisms): - """Tests that all organisms and genes are retrieved as expected - """ + """Tests that all organisms and genes are retrieved as expected""" for gene in genes: family.add(gene) org_dict = family.get_org_dict() assert isinstance(org_dict, dict) assert all(isinstance(org, Organism) for org in org_dict.keys()) - assert all(isinstance(gene, Gene) for gene_set in org_dict.values() for gene in gene_set) + assert all( + isinstance(gene, Gene) + for gene_set in org_dict.values() + for gene in gene_set + ) assert set(org_dict.keys()) == organisms - assert set([gene for gene_set in org_dict.values() for gene in gene_set]) == genes + assert ( + set([gene for gene_set in org_dict.values() for gene in gene_set]) == genes + ) def test_get_org_dict_with_no_organism_fill_to_genes(self, family, genes): - """Tests that if genes are not fill with organism an AttributeError is returned - """ + """Tests that if genes are not fill with organism an AttributeError is returned""" for gene in genes: family.add(gene) with pytest.raises(AttributeError): _ = family.get_org_dict() def test_organisms(self, family, organisms, genes): - """Tests that all organisms are retrieved as expected - """ + """Tests that all organisms are retrieved as expected""" for gene in genes: family.add(gene) assert set(family.organisms) == organisms def test_number_of_organism(self, family, organisms, genes): - """Tests that the expected number of organisms is found - """ + """Tests that the expected number of organisms is found""" for gene in genes: family.add(gene) assert isinstance(family.number_of_organisms, int) assert family.number_of_organisms == len(organisms) def test_get_genes_per_org(self, family, organisms, genes): - """Tests that for a giver organism, all the genes are retrieved as expected - """ + """Tests that for a giver organism, all the genes are retrieved as expected""" for gene in genes: family.add(gene) for organism in organisms: assert set(family.get_genes_per_org(organism)) == set(organism.genes) def test_get_genes_per_org_if_org_not_in_family(self, family): - """Test that a KeyError is generated if an organism not belonging to the family is given - """ + """Test that a KeyError is generated if an organism not belonging to the family is given""" with pytest.raises(KeyError): org = Organism("organism") _ = set(family.get_genes_per_org(org)) @pytest.fixture def families(self, genes) -> Generator[Set[GeneFamily], None, None]: - """Create a set of gene families fill with genes to test edges - """ + """Create a set of gene families fill with genes to test edges""" families = set() genes = list(genes) nb_families = randint(2, 10) @@ -246,11 +272,12 @@ def families(self, genes) -> Generator[Set[GeneFamily], None, None]: @pytest.fixture def edges(self, families, genes, organisms) -> Generator[Set[Edge], None, None]: - """Create a set of edges fill with genes and gene families to test edges - """ + """Create a set of edges fill with genes and gene families to test edges""" edges = {} - pair_genes = filter(lambda x: x[0] != x[1] and x[0].organism == x[1].organism, - combinations_with_replacement(genes, 2)) + pair_genes = filter( + lambda x: x[0] != x[1] and x[0].organism == x[1].organism, + combinations_with_replacement(genes, 2), + ) for pair in pair_genes: key = frozenset([pair[0].family, pair[1].family]) edge = edges.get(key) @@ -264,65 +291,71 @@ def edges(self, families, genes, organisms) -> Generator[Set[Edge], None, None]: yield set(edges.values()) def test_get_neighbors_of_gene_family(self, families, edges): - """Tests get all the expected neighbor of the family in the graph - """ + """Tests get all the expected neighbor of the family in the graph""" for family in families: - assert all(isinstance(neighbor, GeneFamily) for neighbor in family.neighbors) - expected_neighbors = set([edge.source for edge in edges - if edge.target == family]).union(set([edge.target for edge in edges - if edge.source == family])) + assert all( + isinstance(neighbor, GeneFamily) for neighbor in family.neighbors + ) + expected_neighbors = set( + [edge.source for edge in edges if edge.target == family] + ).union(set([edge.target for edge in edges if edge.source == family])) assert set(family.neighbors) == expected_neighbors def test_get_number_of_neighbors(self, families, edges): - """Tests that the expected number of neighbors is found - """ + """Tests that the expected number of neighbors is found""" for family in families: - expected_neighbors = set([edge.source for edge in edges - if edge.target == family]).union(set([edge.target for edge in edges - if edge.source == family])) + expected_neighbors = set( + [edge.source for edge in edges if edge.target == family] + ).union(set([edge.target for edge in edges if edge.source == family])) assert isinstance(family.number_of_neighbors, int) assert family.number_of_neighbors == len(expected_neighbors) # Tests that the edges of a GeneFamily object can be retrieved def test_get_edges_of_gene_family(self, families, edges): - """Tests that all the edges belonging to the family are retrieved - """ + """Tests that all the edges belonging to the family are retrieved""" for family in families: - expected_edges = set([edge for edge in edges if edge.source == family or edge.target == family]) + expected_edges = set( + [ + edge + for edge in edges + if edge.source == family or edge.target == family + ] + ) assert all(isinstance(edge, Edge) for edge in family.edges) assert set(family.edges) == expected_edges def test_get_number_of_edges(self, families, edges): - """Tests that the expected number of edges is found - """ + """Tests that the expected number of edges is found""" for family in families: - expected_edges = set([edge for edge in edges if edge.source == family or edge.target == family]) + expected_edges = set( + [ + edge + for edge in edges + if edge.source == family or edge.target == family + ] + ) assert isinstance(family.number_of_edges, int) assert family.number_of_neighbors == len(expected_edges) def test_add_spot_to_gene_family(self, family): - """Tests that a Spot object can be added to a GeneFamily object - """ + """Tests that a Spot object can be added to a GeneFamily object""" spot = Spot(1) family.add_spot(spot) assert spot in family.spots def test_add_non_spot_as_spot_in_family(self, family): - """Tests that a non-spot object cannot be added to Gene Family - """ + """Tests that a non-spot object cannot be added to Gene Family""" with pytest.raises(TypeError): family.add_spot(323) def test_add_module_to_gene_family(self, family): - """Tests that a Module object can be added to a GeneFamily object - """ + """Tests that a Module object can be added to a GeneFamily object""" module = Module(1) family.set_module(module) assert module == family.module def test_add_non_module_as_module_in_family(self, family): - """Tests that a non-module object cannot be added to Gene Family - """ + """Tests that a non-module object cannot be added to Gene Family""" with pytest.raises(TypeError): family.set_module(323) diff --git a/tests/test_genome.py b/tests/test_genome.py index 9e29133f..42fa16b9 100644 --- a/tests/test_genome.py +++ b/tests/test_genome.py @@ -10,21 +10,18 @@ class TestFeature: - """Tests Feature class - """ + """Tests Feature class""" @pytest.fixture def feature(self) -> Generator[Feature, None, None]: - """Generate a basic feature for tests - """ - yield Feature('test_id') + """Generate a basic feature for tests""" + yield Feature("test_id") def test_creation(self, feature): - """Tests that 'Feature' is created successfully with the given identifier - """ - assert feature.ID == 'test_id' + """Tests that 'Feature' is created successfully with the given identifier""" + assert feature.ID == "test_id" assert not feature.is_fragment - assert feature.type == '' + assert feature.type == "" assert feature.start is None assert feature.stop is None assert feature.strand is None @@ -36,187 +33,176 @@ def test_creation(self, feature): assert feature.dna is None def test_create_feature_with_identifier_not_instance_string(self): - """Tests that a Feature object cannot be created with a non-string type identifier - """ + """Tests that a Feature object cannot be created with a non-string type identifier""" with pytest.raises(AssertionError): Feature(4) def test_create_feature_empty_identifier(self): - """Tests that a Feature object cannot be created with an empty identifier - """ + """Tests that a Feature object cannot be created with an empty identifier""" with pytest.raises(ValueError): - Feature('') + Feature("") def tests_write_organism(self, feature): - """Tests that write feature return feature name as string - """ + """Tests that write feature return feature name as string""" assert str(feature) == "test_id" def test_fill_annotations(self, feature): - """Tests that 'fill_annotations' method fills the attributes correctly - """ - feature.fill_annotations(1, 10, '+', 'gene_type', 'name', 'product', 'local_id') + """Tests that 'fill_annotations' method fills the attributes correctly""" + feature.fill_annotations(1, 10, "+", "gene_type", "name", "product", "local_id") assert feature.start == 1 assert feature.stop == 10 - assert feature.type == 'gene_type' - assert feature.strand == '+' - assert feature.product == 'product' - assert feature.name == 'name' - assert feature.local_identifier == 'local_id' + assert feature.type == "gene_type" + assert feature.strand == "+" + assert feature.product == "product" + assert feature.name == "name" + assert feature.local_identifier == "local_id" def test_fill_annotations_type_error(self, feature): - """Tests that 'fill_annotations' method raises a TypeError if attribute value is not with the correct type - """ + """Tests that 'fill_annotations' method raises a TypeError if attribute value is not with the correct type""" with pytest.raises(TypeError): - feature.fill_annotations('1', 10, '+', 'gene_type', 'name', 'product', 'local_id') + feature.fill_annotations( + "1", 10, "+", "gene_type", "name", "product", "local_id" + ) with pytest.raises(TypeError): - feature.fill_annotations(1, "10", '+', 'gene_type', 'name', 'product', 'local_id') + feature.fill_annotations( + 1, "10", "+", "gene_type", "name", "product", "local_id" + ) with pytest.raises(TypeError): - feature.fill_annotations(1, 10, 4, 'gene_type', 'name', 'product', 'local_id') + feature.fill_annotations( + 1, 10, 4, "gene_type", "name", "product", "local_id" + ) with pytest.raises(TypeError): - feature.fill_annotations(1, 10, "+", 4, 'name', 'product', 'local_id') + feature.fill_annotations(1, 10, "+", 4, "name", "product", "local_id") with pytest.raises(TypeError): - feature.fill_annotations(1, 10, '+', 'gene_type', 4, 'product', 'local_id') + feature.fill_annotations(1, 10, "+", "gene_type", 4, "product", "local_id") with pytest.raises(TypeError): - feature.fill_annotations(1, 10, '+', 'gene_type', 'name', 4, 'local_id') + feature.fill_annotations(1, 10, "+", "gene_type", "name", 4, "local_id") with pytest.raises(TypeError): - feature.fill_annotations(1, 10, '+', 'gene_type', 'name', 'product', 4) + feature.fill_annotations(1, 10, "+", "gene_type", "name", "product", 4) def test_fill_annotations_value_error(self, feature): - """Tests that 'fill_annotations' method raises a TypeError if strand is not '+' or '-' - """ + """Tests that 'fill_annotations' method raises a TypeError if strand is not '+' or '-'""" with pytest.raises(ValueError): - feature.fill_annotations(1, 10, '4', 'gene_type', 'name', 'product', 'local_id') + feature.fill_annotations( + 1, 10, "4", "gene_type", "name", "product", "local_id" + ) def test_fill_parents(self, feature): - """Tests that 'fill_parents' method associates the object with the given organism and contig - """ - organism = Organism('org_id') - contig = Contig(0, 'contig_name') - feature.fill_annotations(1, 10, '+', 'gene_type', 'name', 'product', 'local_id') + """Tests that 'fill_parents' method associates the object with the given organism and contig""" + organism = Organism("org_id") + contig = Contig(0, "contig_name") + feature.fill_annotations(1, 10, "+", "gene_type", "name", "product", "local_id") feature.fill_parents(organism, contig) assert feature.organism == organism assert feature.contig == contig def test_fill_parents_with_organism_or_contig_only(self, feature): - """Tests that Gene can be filled with only an organism or a contig - """ - organism = Organism('org') + """Tests that Gene can be filled with only an organism or a contig""" + organism = Organism("org") contig = Contig(0, "ctg") - feature.fill_annotations(1, 10, '+', 'gene_type', 'name', 'product', 'local_id') + feature.fill_annotations(1, 10, "+", "gene_type", "name", "product", "local_id") feature.fill_parents(organism=organism) assert feature.organism == organism feature.fill_parents(contig=contig) assert feature.contig == contig def test_fill_parents_with_nothing(self, feature): - """Tests that Gene cannot be filled with neither an organism and a contig - """ + """Tests that Gene cannot be filled with neither an organism and a contig""" with pytest.raises(AssertionError): feature.fill_parents() def test_set_organism(self, feature): - """Tests that organism setter sets organism with the valid type - """ - organism = Organism('organism') + """Tests that organism setter sets organism with the valid type""" + organism = Organism("organism") feature.organism = organism assert feature.organism == organism def test_set_organism_not_isinstance_organism(self, feature): - """Tests that organism setter return TypeError if sets organism with the invalid type - """ + """Tests that organism setter return TypeError if sets organism with the invalid type""" with pytest.raises(TypeError): feature.organism = 4 def test_set_contig(self, feature): - """Tests that contig setter sets contig with the valid type - """ - contig = Contig(0, 'contig') + """Tests that contig setter sets contig with the valid type""" + contig = Contig(0, "contig") feature.contig = contig assert feature.contig == contig def test_set_contig_not_isinstance_contig(self, feature): - """Tests that contig setter return TypeError if sets contig with the invalid type - """ + """Tests that contig setter return TypeError if sets contig with the invalid type""" with pytest.raises(TypeError): feature.contig = 4 def test_add_dna(self, feature): - """Tests that 'add_dna' method adds the DNA sequence to the object successfully - """ - feature.add_sequence('ATCG') - assert feature.dna == 'ATCG' + """Tests that 'add_dna' method adds the DNA sequence to the object successfully""" + feature.add_sequence("ATCG") + assert feature.dna == "ATCG" def test_add_dna_type_error(self, feature): - """Tests that 'add_dna' method raises a TypeError if the DNA sequence is not a string - """ + """Tests that 'add_dna' method raises a TypeError if the DNA sequence is not a string""" with pytest.raises(AssertionError): feature.add_sequence(123) def test_length(self, feature): - """Tests len method - """ - feature.fill_annotations(1, 10, '+', 'gene_type', 'name', 'product', 'local_id') + """Tests len method""" + feature.fill_annotations(1, 10, "+", "gene_type", "name", "product", "local_id") assert isinstance(len(feature), int) assert len(feature) == 10 def test_length_start_or_stop_are_not_known(self): - """Tests that len raises ValueError when start is not known - """ + """Tests that len raises ValueError when start is not known""" with pytest.raises(ValueError): - feature = Feature('test') + feature = Feature("test") feature.stop = 10 len(feature) with pytest.raises(ValueError): - feature = Feature('test') + feature = Feature("test") feature.start = 1 len(feature) - @pytest.mark.parametrize("coordinates, expected_overlaps_contig_edge_flag", [ - ([(1, 4), (3, 10)], False), - ([(2, 4), (1, 1)], True), - ([(1, 4), (1, 10)], False), - ([(1, 4), (6, 10), (1, 2)], True), - ([(5, 10), (9, 10), (1, 4)], True), - - ]) - def test_overlaps_contig_edge(self, coordinates, expected_overlaps_contig_edge_flag): - feature = Feature('ID') - feature.fill_annotations(start=1, stop=10, strand='+', coordinates=coordinates) + @pytest.mark.parametrize( + "coordinates, expected_overlaps_contig_edge_flag", + [ + ([(1, 4), (3, 10)], False), + ([(2, 4), (1, 1)], True), + ([(1, 4), (1, 10)], False), + ([(1, 4), (6, 10), (1, 2)], True), + ([(5, 10), (9, 10), (1, 4)], True), + ], + ) + def test_overlaps_contig_edge( + self, coordinates, expected_overlaps_contig_edge_flag + ): + feature = Feature("ID") + feature.fill_annotations(start=1, stop=10, strand="+", coordinates=coordinates) assert feature.overlaps_contig_edge == expected_overlaps_contig_edge_flag class TestRNA: - """Tests RNA Class - """ + """Tests RNA Class""" @pytest.fixture def rna(self) -> Generator[RNA, None, None]: - """Generate a basic gene for tests - """ - yield RNA('rna') + """Generate a basic gene for tests""" + yield RNA("rna") def test_create_gene_object(self, rna): - """Tests that a Gene object can be created with a valid gene_id - """ - assert rna.ID == 'rna' + """Tests that a Gene object can be created with a valid gene_id""" + assert rna.ID == "rna" class TestGene: - """Tests Gene class - """ + """Tests Gene class""" @pytest.fixture def gene(self) -> Generator[Gene, None, None]: - """Generate a basic gene for tests - """ - yield Gene('gene') + """Generate a basic gene for tests""" + yield Gene("gene") def test_create_gene_object(self, gene): - """Tests that a Gene object can be created with a valid gene_id - """ - assert gene.ID == 'gene' + """Tests that a Gene object can be created with a valid gene_id""" + assert gene.ID == "gene" assert gene.position is None assert gene._family is None assert gene._RGP is None @@ -226,155 +212,151 @@ def test_create_gene_object(self, gene): assert gene._frame is None def test_fill_annotations(self, gene): - """Tests that Gene annotations can be filled with valid parameters - """ - gene.fill_annotations(start=1, stop=10, strand='+', position=10, genetic_code=4) + """Tests that Gene annotations can be filled with valid parameters""" + gene.fill_annotations(start=1, stop=10, strand="+", position=10, genetic_code=4) assert gene.position == 10 assert gene.genetic_code == 4 def test_fill_annotations_type_error(self, gene): - """Tests that Gene annotations cannot be filled with invalid parameters - """ + """Tests that Gene annotations cannot be filled with invalid parameters""" with pytest.raises(TypeError): - gene.fill_annotations(start=1, stop=10, strand='+', position='10', genetic_code=4) + gene.fill_annotations( + start=1, stop=10, strand="+", position="10", genetic_code=4 + ) with pytest.raises(TypeError): - gene.fill_annotations(start=1, stop=10, strand='+', position=10, genetic_code="4") + gene.fill_annotations( + start=1, stop=10, strand="+", position=10, genetic_code="4" + ) @pytest.mark.parametrize("frame", [0, 1, 2]) def test_set_frame(self, frame): - """Tests that frame can be set - """ - gene = Gene('gene') + """Tests that frame can be set""" + gene = Gene("gene") gene.frame = frame assert gene._frame == frame @pytest.mark.parametrize("frame", [0, 1, 2]) def test_get_frame(self, frame): - """Tests that frame can be getting - """ - gene = Gene('gene') + """Tests that frame can be getting""" + gene = Gene("gene") gene.frame = frame assert gene.frame == frame def test_raise_assertion_error_if_frame_not_set(self): - """Tests that frame cannot be return if it has not been set - """ - gene = Gene('gene') + """Tests that frame cannot be return if it has not been set""" + gene = Gene("gene") with pytest.raises(AssertionError): _ = gene.frame def test_raise_assertion_error_if_frame_already_set(self): - """Tests that frame cannot be set if it has already been set - """ - gene = Gene('gene') + """Tests that frame cannot be set if it has already been set""" + gene = Gene("gene") gene.frame = 1 with pytest.raises(AssertionError): gene.frame = 2 @pytest.mark.parametrize("frame", [3, "1", 1.5]) def test_raise_value_error_if_frame_not_0_1_or_2(self, frame): - """Tests that frame cannot be set with value different from 0, 1 or 2 - """ - gene = Gene('gene') + """Tests that frame cannot be set with value different from 0, 1 or 2""" + gene = Gene("gene") with pytest.raises(ValueError): gene.frame = frame @pytest.mark.parametrize("frame", [0, 1, 2]) def test_fill_partial_gene(self, frame): - """Tests that Gene annotations can be filled with partial genes - """ - gene = Gene('gene') - gene.fill_annotations(start=1, stop=10, strand='+', is_partial=True, frame=frame) + """Tests that Gene annotations can be filled with partial genes""" + gene = Gene("gene") + gene.fill_annotations( + start=1, stop=10, strand="+", is_partial=True, frame=frame + ) assert gene.is_partial is True assert gene.frame == frame def test_add_protein(self, gene): - """Tests that a protein sequence can be added to a Gene object - """ - gene.add_protein('MVKLAVLALALAVLALALALAVLALALAVLALALAVLALALAVLALALAVLALALAVLALALAVLALALA') - assert gene.protein == 'MVKLAVLALALAVLALALALAVLALALAVLALALAVLALALAVLALALAVLALALAVLALALAVLALALA' + """Tests that a protein sequence can be added to a Gene object""" + gene.add_protein( + "MVKLAVLALALAVLALALALAVLALALAVLALALAVLALALAVLALALAVLALALAVLALALAVLALALA" + ) + assert ( + gene.protein + == "MVKLAVLALALAVLALALALAVLALALAVLALALAVLALALAVLALALAVLALALAVLALALAVLALALA" + ) def test_add_protein_non_string(self, gene): - """Tests that a non-string protein sequence cannot be added to a Gene object - """ + """Tests that a non-string protein sequence cannot be added to a Gene object""" with pytest.raises(TypeError): gene.add_protein(123) def test_set_family(self, gene): - """Tests that family setter sets family with the valid type - """ - family = GeneFamily(0, 'family') + """Tests that family setter sets family with the valid type""" + family = GeneFamily(0, "family") gene.family = family assert gene.family == family def test_set_family_not_instance_gene_family(self, gene): - """Tests that family setter return TypeError if sets family is not instance GeneFamily - """ + """Tests that family setter return TypeError if sets family is not instance GeneFamily""" with pytest.raises(TypeError): gene.family = 4 def test_set_rgp(self, gene): - """Tests that RGP setter sets family with the valid type - """ + """Tests that RGP setter sets family with the valid type""" region = Region(0) gene.RGP = region assert gene.RGP == region def test_set_rgp_not_instance_region(self, gene): - """Tests that family setter return TypeError if sets rgp is not instance Region - """ + """Tests that family setter return TypeError if sets rgp is not instance Region""" with pytest.raises(TypeError): gene.RGP = 4 class TestContig: - """Tests Contig class - """ + """Tests Contig class""" @pytest.fixture def contig(self) -> Generator[Contig, None, None]: - """Generate basic contig for tests - """ + """Generate basic contig for tests""" yield Contig(0, "contig") @pytest.fixture def gene(self) -> Generator[Gene, None, None]: - """Generate basic gene for tests - """ - gene = Gene('test_gene') - gene.fill_annotations(start=1, stop=10, strand='+', position=0, genetic_code=4) + """Generate basic gene for tests""" + gene = Gene("test_gene") + gene.fill_annotations(start=1, stop=10, strand="+", position=0, genetic_code=4) yield gene @pytest.fixture def genes(self) -> Generator[Tuple[Gene, Gene, Gene], None, None]: - """Generate three basic genes for tests - """ - gene1 = Gene('test_gene1') - gene1.fill_annotations(start=1, stop=10, strand='+', position=0, genetic_code=4) - gene2 = Gene('test_gene2') - gene2.fill_annotations(start=11, stop=20, strand='+', position=1, genetic_code=4) - gene3 = Gene('test_gene3') - gene3.fill_annotations(start=21, stop=30, strand='+', position=2, genetic_code=4) + """Generate three basic genes for tests""" + gene1 = Gene("test_gene1") + gene1.fill_annotations(start=1, stop=10, strand="+", position=0, genetic_code=4) + gene2 = Gene("test_gene2") + gene2.fill_annotations( + start=11, stop=20, strand="+", position=1, genetic_code=4 + ) + gene3 = Gene("test_gene3") + gene3.fill_annotations( + start=21, stop=30, strand="+", position=2, genetic_code=4 + ) yield gene1, gene2, gene3 def test_create_contig(self, contig): - """Tests that a contig is correctly created - """ + """Tests that a contig is correctly created""" assert contig.name == "contig" assert not contig.is_circular - assert contig._rna_getter == set() # Saving the rna annotations. We're not using them in the vast majority of cases. + assert ( + contig._rna_getter == set() + ) # Saving the rna annotations. We're not using them in the vast majority of cases. assert contig._genes_getter == {} assert contig._genes_position == [] assert contig._organism is None def tests_write_contig(self, contig): - """Tests that write contig return contig name as string - """ + """Tests that write contig return contig name as string""" assert str(contig) == "contig" def test_add_gene(self, gene, contig): - """Tests that a gene can be added to the contig - """ + """Tests that a gene can be added to the contig""" contig.add(gene) assert len(contig._genes_getter) == 1 assert len(contig._genes_position) == 1 @@ -382,44 +364,45 @@ def test_add_gene(self, gene, contig): assert contig._genes_position[0] == gene def test_add_gene_at_far_position(self, gene, contig): - """Tests that a gene can be added at each position and between position are fill with None - """ + """Tests that a gene can be added at each position and between position are fill with None""" contig.add(gene) new_gene = Gene("Gene2") - new_gene.fill_annotations(start=50, stop=72, strand='+', position=6, genetic_code=4) + new_gene.fill_annotations( + start=50, stop=72, strand="+", position=6, genetic_code=4 + ) contig.add(new_gene) assert len(contig._genes_position) == 7 assert contig._genes_position[1:6] == [None] * 5 def test_add_gene_not_instance_gene(self, contig): - """Tests that the contig cannot be fill with a non-gene object - """ + """Tests that the contig cannot be fill with a non-gene object""" with pytest.raises(TypeError): contig.add(1) with pytest.raises(TypeError): - contig[1] = '4' + contig[1] = "4" def test_add_gene_with_start_already_taken(self, contig): - """Tests that the contig cannot be fill with a non-gene object - """ - initial_gene = Gene('test_gene') - initial_gene.fill_annotations(start=1, stop=12, strand='+', position=4, genetic_code=4) + """Tests that the contig cannot be fill with a non-gene object""" + initial_gene = Gene("test_gene") + initial_gene.fill_annotations( + start=1, stop=12, strand="+", position=4, genetic_code=4 + ) contig.add(initial_gene) with pytest.raises(ValueError): - new_identical_gene = Gene('test_gene') - new_identical_gene.fill_annotations(start=1, stop=12, strand='+', position=2, genetic_code=4) + new_identical_gene = Gene("test_gene") + new_identical_gene.fill_annotations( + start=1, stop=12, strand="+", position=2, genetic_code=4 + ) contig.add(new_identical_gene) def test_add_gene_without_position(self, contig): - """Test that adding a gene not fill with position raise an AttributeError - """ + """Test that adding a gene not fill with position raise an AttributeError""" with pytest.raises(AttributeError): - gene = Gene('test_gene') + gene = Gene("test_gene") contig.add(gene) def test_number_of_genes(self, genes, contig): - """Tests len method - """ + """Tests len method""" gene1, gene2, gene3 = genes contig.add(gene1) contig.add(gene2) @@ -428,14 +411,12 @@ def test_number_of_genes(self, genes, contig): assert contig.number_of_genes == 3 def test_get_gene(self, gene, contig): - """Tests that a gene can be retrieved by its position - """ + """Tests that a gene can be retrieved by its position""" contig.add(gene) assert contig[0] == gene def test_get_genes(self, genes, contig): - """Tests that a list of genes within a range can be retrieved - """ + """Tests that a list of genes within a range can be retrieved""" gene1, gene2, gene3 = genes contig.add(gene1) contig.add(gene2) @@ -443,28 +424,25 @@ def test_get_genes(self, genes, contig): assert set(contig.get_genes(0, 2)) == set(genes) def test_get_gene_with_non_integer_index(self, contig): - """Tests that a gene cannot be retrieved with an index that is not an integer - """ + """Tests that a gene cannot be retrieved with an index that is not an integer""" with pytest.raises(TypeError): - _ = contig['a'] + _ = contig["a"] def test_get_genes_with_non_integer_begin_and_end_positions(self, genes, contig): - """Tests that genes cannot be retrieved with non-integer begin and end positions - """ + """Tests that genes cannot be retrieved with non-integer begin and end positions""" gene1, gene2, gene3 = genes contig.add(gene1) contig.add(gene2) contig.add(gene3) with pytest.raises(TypeError): - contig.get_genes('a', 2) + contig.get_genes("a", 2) with pytest.raises(TypeError): - contig.get_genes(5, 'b') + contig.get_genes(5, "b") with pytest.raises(TypeError): - contig.get_genes('a', 'b') + contig.get_genes("a", "b") def test_get_genes_with_end_position_lower_than_begin_position(self, genes, contig): - """Tests that genes cannot be retrieved with end position lower than begin position - """ + """Tests that genes cannot be retrieved with end position lower than begin position""" gene1, gene2, gene3 = genes contig.add(gene1) contig.add(gene2) @@ -472,9 +450,10 @@ def test_get_genes_with_end_position_lower_than_begin_position(self, genes, cont with pytest.raises(ValueError): contig.get_genes(2, 0) - def test_get_genes_with_end_position_greater_than_last_position(self, genes, contig): - """Tests that genes cannot be retrieved with given end position greater than last gene position in the contig - """ + def test_get_genes_with_end_position_greater_than_last_position( + self, genes, contig + ): + """Tests that genes cannot be retrieved with given end position greater than last gene position in the contig""" gene1, gene2, gene3 = genes contig.add(gene1) contig.add(gene2) @@ -482,7 +461,9 @@ def test_get_genes_with_end_position_greater_than_last_position(self, genes, con with pytest.raises(IndexError): contig.get_genes(0, 3) - def test_get_genes_with_end_position_greater_than_last_position_with_outrange_ok(self, genes, contig): + def test_get_genes_with_end_position_greater_than_last_position_with_outrange_ok( + self, genes, contig + ): gene1, gene2, gene3 = genes contig.add(gene1) contig.add(gene2) @@ -490,134 +471,116 @@ def test_get_genes_with_end_position_greater_than_last_position_with_outrange_ok assert set(contig.get_genes(0, 5, outrange_ok=True)) == set(genes) def test_iterate_over_genes(self, genes, contig): - """Tests that all genes in the contig can be iterated over - """ + """Tests that all genes in the contig can be iterated over""" gene1, gene2, gene3 = genes contig.add(gene1) contig.add(gene2) contig.add(gene3) - assert list(contig.genes) == sorted([gene1, gene2, gene3], key=lambda x: x.position) + assert list(contig.genes) == sorted( + [gene1, gene2, gene3], key=lambda x: x.position + ) def test_add_rna(self, contig): - """Tests that an RNA can be added to the contig - """ - rna = RNA('test_rna') + """Tests that an RNA can be added to the contig""" + rna = RNA("test_rna") contig.add_rna(rna) assert list(contig.RNAs) == [rna] def test_set_organism(self, contig): - """Tests that an organism can be set to the contig - """ + """Tests that an organism can be set to the contig""" organism = Organism("organism") contig.organism = organism assert contig.organism == organism def test_set_organism_with_not_instance_organism(self, contig): - """Tests that the contig cannot be fill with a non-organism object - """ + """Tests that the contig cannot be fill with a non-organism object""" with pytest.raises(TypeError): contig.organism = 4 class TestOrganism: - """Tests Contig class - """ + """Tests Contig class""" @pytest.fixture def organism(self) -> Generator[Organism, None, None]: - """Generate a basic organism for test - """ - yield Organism('organism') + """Generate a basic organism for test""" + yield Organism("organism") @pytest.fixture def contig(self) -> Generator[Contig, None, None]: - """Generate a basic contig for test - """ + """Generate a basic contig for test""" yield Contig(0, "contig") @pytest.fixture def gene(self) -> Generator[Gene, None, None]: - """Generate a basic gene for test - """ - gene = Gene('test_gene') - gene.fill_annotations(start=1, stop=10, strand='+', position=0, genetic_code=4) + """Generate a basic gene for test""" + gene = Gene("test_gene") + gene.fill_annotations(start=1, stop=10, strand="+", position=0, genetic_code=4) yield gene def test_create_organism(self, organism): - """Tests that an Organism instance can be created with a valid name - """ - assert organism.name == 'organism' + """Tests that an Organism instance can be created with a valid name""" + assert organism.name == "organism" assert organism._contigs_getter == {} assert organism._families is None assert organism.bitarray is None def test_create_organism_empty_name(self): - """Tests that an Organism instance cannot be created with an empty name - """ + """Tests that an Organism instance cannot be created with an empty name""" with pytest.raises(AssertionError): - Organism('') + Organism("") def test_create_organism_with_name_not_string(self): - """Tests that an Organism instance cannot be created with a name not instance string - """ + """Tests that an Organism instance cannot be created with a name not instance string""" with pytest.raises(AssertionError): Organism(4) def tests_write_organism(self, organism): - """Tests that write organism return organism name as string - """ + """Tests that write organism return organism name as string""" assert str(organism) == "organism" def test_add_contig(self, organism, contig): - """Tests that a contig can be added to an Organism instance - """ + """Tests that a contig can be added to an Organism instance""" organism.add(contig) - assert organism._contigs_getter['contig'] == contig + assert organism._contigs_getter["contig"] == contig def test_add_contig_not_instance_contig(self, organism): - """Tests that a non Contig object cannot be added to an Organism instance - """ + """Tests that a non Contig object cannot be added to an Organism instance""" with pytest.raises(AssertionError): organism.add(4) def test_add_contig_existing_name(self, organism, contig): - """Tests that a contig with an existing name cannot be added to an Organism instance - """ + """Tests that a contig with an existing name cannot be added to an Organism instance""" organism.add(contig) with pytest.raises(KeyError): - organism.add(Contig(0, 'contig')) + organism.add(Contig(0, "contig")) def test_get_contig(self, organism, contig): - """Tests that a contig can be retrieved from an Organism instance - """ + """Tests that a contig can be retrieved from an Organism instance""" organism.add(contig) - assert organism.get('contig') == contig + assert organism.get("contig") == contig def test_get_contig_not_instance_string(self, organism): - """Tests that a non Contig object cannot be added to an Organism instance - """ + """Tests that a non Contig object cannot be added to an Organism instance""" with pytest.raises(TypeError): organism.get(4) def test_get_nonexistent_contig(self, organism): - """Tests that a non-existent contig cannot be retrieved from an Organism instance - """ + """Tests that a non-existent contig cannot be retrieved from an Organism instance""" with pytest.raises(KeyError): - organism.get('contig1') + organism.get("contig1") def test_number_of_contigs(self, organism): - """Tests that the number of contigs in an organism instance can be retrieved - """ - organism.add(Contig(1, 'contig1')) - organism.add(Contig(2, 'contig2')) + """Tests that the number of contigs in an organism instance can be retrieved""" + organism.add(Contig(1, "contig1")) + organism.add(Contig(2, "contig2")) assert organism.number_of_contigs == 2 assert isinstance(len(organism), int) assert len(organism) == 2 def test_get_families(self, organism, contig, gene): - """Tests that gene families in an organism can be retrieved - """ + """Tests that gene families in an organism can be retrieved""" family = GeneFamily(0, "fam") family.add(gene) gene.fill_parents(organism, contig) @@ -626,8 +589,7 @@ def test_get_families(self, organism, contig, gene): assert set(organism.families) == {family} def test_number_of_families(self, organism, contig, gene): - """Tests that the number of gene families in an organism instance can be retrieved - """ + """Tests that the number of gene families in an organism instance can be retrieved""" family = GeneFamily(0, "fam") family.add(gene) gene.fill_parents(organism, contig) @@ -636,30 +598,29 @@ def test_number_of_families(self, organism, contig, gene): assert organism.number_of_families() == 1 def tests_get_genes(self, organism, contig, gene): - """Tests that genes in an organism can be retrieved - """ + """Tests that genes in an organism can be retrieved""" gene.fill_parents(organism, contig) organism.add(contig) contig.add(gene) assert set(organism.genes) == {gene} def test_number_of_genes(self, organism, contig, gene): - """Tests that the number of genes in an organism instance can be retrieved - """ + """Tests that the number of genes in an organism instance can be retrieved""" gene.fill_parents(organism, contig) organism.add(contig) contig.add(gene) assert organism.number_of_genes() == 1 def test_mk_bitarray(self, organism, contig): - """Tests that a bitarray can be created for an Organism instance - """ - fam1 = GeneFamily(1, 'fam1') - fam2 = GeneFamily(2, 'fam2') - gene1 = Gene('gene1') - gene2 = Gene('gene2') - gene1.fill_annotations(start=1, stop=10, strand='+', position=0, genetic_code=4) - gene2.fill_annotations(start=11, stop=19, strand='+', position=1, genetic_code=4) + """Tests that a bitarray can be created for an Organism instance""" + fam1 = GeneFamily(1, "fam1") + fam2 = GeneFamily(2, "fam2") + gene1 = Gene("gene1") + gene2 = Gene("gene2") + gene1.fill_annotations(start=1, stop=10, strand="+", position=0, genetic_code=4) + gene2.fill_annotations( + start=11, stop=19, strand="+", position=1, genetic_code=4 + ) fam1.add(gene1) fam2.add(gene2) contig[gene1.start] = gene1 diff --git a/tests/test_metadata.py b/tests/test_metadata.py index dff4ad05..9a823402 100644 --- a/tests/test_metadata.py +++ b/tests/test_metadata.py @@ -10,54 +10,45 @@ class TestMetadata: @pytest.fixture def metadata(self) -> Generator[Metadata, None, None]: - """Create a simple metadata - """ + """Create a simple metadata""" yield Metadata("source", attribute1="value1", attribute2=["value2", "value3"]) def test_constructor(self, metadata): - """Tests that the Metadata object is created successfully with a valid source and attributes - """ + """Tests that the Metadata object is created successfully with a valid source and attributes""" assert metadata.source == "source" assert metadata.attribute1 == "value1" assert metadata.attribute2 == "value2,value3" def test_constructor_with_empty_source_name(self): - """Tests that a ValueError is raised when creating a Metadata object with an empty source name - """ + """Tests that a ValueError is raised when creating a Metadata object with an empty source name""" with pytest.raises(ValueError): Metadata("", attribute="value") def test_constructor_with_non_string_source_name(self): - """Tests that a TypeError is raised when creating a Metadata object with a non-string source name - """ + """Tests that a TypeError is raised when creating a Metadata object with a non-string source name""" with pytest.raises(TypeError): Metadata(123, attribute="value") def test_constructor_with_no_attributes(self): - """Tests that an Exception is raised when creating a Metadata object with no attributes - """ + """Tests that an Exception is raised when creating a Metadata object with no attributes""" with pytest.raises(Exception): Metadata("source") def test_get_existing_attribute_value(self, metadata): - """Tests that the value of an existing attribute is returned correctly - """ + """Tests that the value of an existing attribute is returned correctly""" assert metadata.attribute1 == "value1" def test_get_non_existing_attribute_value(self, metadata): - """Tests that an AttributeError is raised when getting the value of a non-existing attribute - """ + """Tests that an AttributeError is raised when getting the value of a non-existing attribute""" with pytest.raises(AttributeError): _ = metadata.non_existing_attribute def test_attribute_fields(self, metadata): - """Tests that the 'fields' method returns a list of all the attributes in the Metadata object - """ + """Tests that the 'fields' method returns a list of all the attributes in the Metadata object""" assert metadata.fields == ["attribute1", "attribute2"] def test_length(self, metadata): - """Tests that the number_of_attribute method returns the correct number of attributes in the Metadata object - """ + """Tests that the number_of_attribute method returns the correct number of attributes in the Metadata object""" assert isinstance(len(metadata), int) assert len(metadata) == 2 @@ -71,7 +62,11 @@ def metadata(self) -> Generator[Set[Metadata], None, None]: """ metadata = set() for i in range(randint(5, 10)): - metadata.add(Metadata(f"source_{i}", **{f"attr_{j}": j for j in range(randint(1, 5))})) + metadata.add( + Metadata( + f"source_{i}", **{f"attr_{j}": j for j in range(randint(1, 5))} + ) + ) yield metadata @pytest.fixture @@ -86,41 +81,45 @@ def metafeatures(self, metadata) -> Generator[MetaFeatures, None, None]: yield metafeatures def test_add_metadata(self, metafeatures, metadata): - """Tests that metadata can be added to the metadata getter - """ - assert all(list(metafeatures._metadata_getter[meta.source].values()) == [meta] for meta in metadata) + """Tests that metadata can be added to the metadata getter""" + assert all( + list(metafeatures._metadata_getter[meta.source].values()) == [meta] + for meta in metadata + ) def test_get_metadata_feature_corresponding_to_source(self, metafeatures, metadata): - """Tests that all the metadata features corresponding to a source can be retrieved - """ - assert all(list(metafeatures.get_metadata_by_source(meta.source).values()) == [meta] for meta in metadata) + """Tests that all the metadata features corresponding to a source can be retrieved""" + assert all( + list(metafeatures.get_metadata_by_source(meta.source).values()) == [meta] + for meta in metadata + ) def test_remove_source_from_feature(self, metafeatures): - """Tests that a source can be removed from the feature - """ + """Tests that a source can be removed from the feature""" metadata = Metadata("source_del", attribute1="value") metafeatures.add_metadata(metadata) metafeatures.del_metadata_by_source("source_del") assert metafeatures.get_metadata_by_source("source_del") is None def test_generate_all_metadata_sources(self, metafeatures, metadata): - """Tests that all metadata sources can be generated - """ + """Tests that all metadata sources can be generated""" assert list(metafeatures.sources) == [meta.source for meta in metadata] def test_get_metadata_by_attribute_values(self, metafeatures): - """Tests that metadata can be retrieved based on attribute values - """ + """Tests that metadata can be retrieved based on attribute values""" meta = Metadata("source_test", attribute1="value_to_retrieve") # meta_list = Metadata("source_list", attribute1=["val_1", "val_2"]) metafeatures.add_metadata(meta) # metafeatures[meta_list.source] = meta_list - assert list(metafeatures.get_metadata_by_attribute(attribute1="value_to_retrieve")) == [meta] + assert list( + metafeatures.get_metadata_by_attribute(attribute1="value_to_retrieve") + ) == [meta] # assert list(metafeatures.get_metadata(attribute1="val_1")) == [meta_list] - def test_get_maximum_number_of_metadata_for_one_source(self, metafeatures, metadata): - """Tests that the maximum number of metadata for one source can be retrieved - """ + def test_get_maximum_number_of_metadata_for_one_source( + self, metafeatures, metadata + ): + """Tests that the maximum number of metadata for one source can be retrieved""" metadata1 = Metadata("source_max", attribute1="value1") metadata2 = Metadata("source_max", attribute2="value2") metafeatures.add_metadata(metadata1) @@ -128,7 +127,6 @@ def test_get_maximum_number_of_metadata_for_one_source(self, metafeatures, metad assert metafeatures.max_metadata_by_source() == ("source_max", 2) def test_metadata_is_not_with_type_metadata(self, metafeatures): - """Tests that an AssertionError is raised when metadata is not with type Metadata - """ + """Tests that an AssertionError is raised when metadata is not with type Metadata""" with pytest.raises(AssertionError): metafeatures.add_metadata("not_metadata") diff --git a/tests/test_pangenome.py b/tests/test_pangenome.py index 3a7f958a..0f4e27a9 100644 --- a/tests/test_pangenome.py +++ b/tests/test_pangenome.py @@ -48,30 +48,23 @@ def test_cstr(self, pangenome): "_spot_getter": dict, "_module_getter": dict, "status": dict, - "parameters": dict + "parameters": dict, } status_keys = [ - 'genomesAnnotated', - 'geneSequences', - 'genesClustered', - 'defragmented', - 'geneFamilySequences', - 'neighborsGraph', - 'partitioned', - 'predictedRGP', - 'spots', - 'modules', - "metadata", - "metasources" - ] - metadata_keys = [ - "families", - "genes", - "genomes", - "RGPs", + "genomesAnnotated", + "geneSequences", + "genesClustered", + "defragmented", + "geneFamilySequences", + "neighborsGraph", + "partitioned", + "predictedRGP", "spots", - "modules" + "modules", + "metadata", + "metasources", ] + metadata_keys = ["families", "genes", "genomes", "RGPs", "spots", "modules"] for attr, attr_type in pangenome_attr_type.items(): assert hasattr(pangenome, attr) assert isinstance(pangenome.__getattribute__(attr), attr_type) @@ -113,13 +106,11 @@ def test_add_file_is_not_path(self, pangenome): class TestPangenomeOrganism(TestPangenome): - """This class tests methods in pangenome class associated to organisms. - """ + """This class tests methods in pangenome class associated to organisms.""" @pytest.fixture def organism(self) -> Generator[Organism, None, None]: - """Create a basic organism - """ + """Create a basic organism""" yield Organism(name="organism") def test_add_organism(self, pangenome, organism): @@ -166,7 +157,7 @@ def test_get_organism_not_in_pangenome(self, pangenome): :param pangenome: Pangenome object to test method """ with pytest.raises(KeyError): - pangenome.get_organism('org') + pangenome.get_organism("org") def test_get_organism_with_name_not_instance_string(self, pangenome): """Ensure that it raises an AssertionError when a non-string name is passed as organism name. @@ -210,8 +201,7 @@ def test_number_of_organisms(self, add_organisms, pangenome, organisms): class TestPangenomeGeneFamilies(TestPangenome): - """This class tests methods in pangenome class associated to gene families. - """ + """This class tests methods in pangenome class associated to gene families.""" @pytest.fixture def family(self) -> Generator[GeneFamily, None, None]: @@ -285,7 +275,7 @@ def families(self) -> Generator[Set[GeneFamily], None, None]: """ families = set() for i in range(randint(5, 20)): - family = GeneFamily(family_id=i, name=f'family{i}') + family = GeneFamily(family_id=i, name=f"family{i}") families.add(family) yield families @@ -311,8 +301,7 @@ def test_number_of_gene_families_empty(self, add_families, pangenome, families): class TestPangenomeGene(TestPangenome): - """This class tests methods in pangenome class associated to Gene. - """ + """This class tests methods in pangenome class associated to Gene.""" @pytest.fixture def genes(self) -> Generator[Set[Gene], None, None]: @@ -441,8 +430,7 @@ def test_get_multigenic(self, pangenome): class TestPangenomeEdge(TestPangenome): - """This class tests methods in pangenome class associated to Edge. - """ + """This class tests methods in pangenome class associated to Edge.""" @staticmethod def make_gene_pair(gene_id_1: int = 1, gene_id_2: int = 2) -> Tuple[Gene, Gene]: @@ -512,8 +500,7 @@ def test_number_of_edges(self, pangenome, gene_pair): class TestPangenomeBinary(TestPangenomeOrganism, TestPangenomeGeneFamilies): - """This class tests methods in pangenome class associated to binary methods. - """ + """This class tests methods in pangenome class associated to binary methods.""" # TODO Better test for this part def test_get_org_index(self, add_organisms, pangenome): @@ -531,7 +518,9 @@ def test_get_org_index(self, add_organisms, pangenome): assert index not in index_know index_know.add(index) - def test_compute_family_bitarrays_with_index_already_computed(self, add_organisms, add_families, pangenome): + def test_compute_family_bitarrays_with_index_already_computed( + self, add_organisms, add_families, pangenome + ): """Tests the compute_family_bitarrays function in Pangenome class :param add_families: Add families to the pangenome object @@ -540,7 +529,9 @@ def test_compute_family_bitarrays_with_index_already_computed(self, add_organism org_idx = pangenome.get_org_index() assert pangenome.compute_family_bitarrays() == org_idx - def test_compute_family_bitarrays_without_index_already_computed(self, add_organisms, add_families, pangenome): + def test_compute_family_bitarrays_without_index_already_computed( + self, add_organisms, add_families, pangenome + ): """Tests the compute_family_bitarrays function of the Pangenome class. :param add_families: Add families to the pangenome @@ -565,7 +556,9 @@ def test_get_fam_index(self, add_families, pangenome): assert index not in index_know index_know.add(index) - def test_compute_org_bitarrays_with_index_already_computed(self, add_organisms, add_families, pangenome): + def test_compute_org_bitarrays_with_index_already_computed( + self, add_organisms, add_families, pangenome + ): """Tests the compute_family_bitarrays function in Pangenome class :param add_families: Add families to the pangenome object @@ -574,7 +567,9 @@ def test_compute_org_bitarrays_with_index_already_computed(self, add_organisms, fams_index = pangenome.get_fam_index() assert pangenome.compute_org_bitarrays() == fams_index - def test_compute_org_bitarrays_without_index_already_computed(self, add_organisms, add_families, pangenome): + def test_compute_org_bitarrays_without_index_already_computed( + self, add_organisms, add_families, pangenome + ): """Tests the compute_family_bitarrays function of the Pangenome class. :param add_families: Add families to the pangenome @@ -586,8 +581,7 @@ def test_compute_org_bitarrays_without_index_already_computed(self, add_organism class TestPangenomeRGP(TestPangenome): - """This class tests methods in pangenome class associated to Region - """ + """This class tests methods in pangenome class associated to Region""" def test_add_region(self, pangenome): """Tests the add_region method in the Pangenome class. @@ -654,8 +648,7 @@ def test_number_of_rgp(self, pangenome): class TestPangenomeSpot(TestPangenome): - """This class tests methods in pangenome class associated to Spot. - """ + """This class tests methods in pangenome class associated to Spot.""" def test_add_spot(self, pangenome): """Tests the add_spot method in the Pangenome class. @@ -723,8 +716,7 @@ def test_number_of_spots(self, pangenome): class TestPangenomeModule(TestPangenome): - """This class tests methods in pangenome class associated to Modules. - """ + """This class tests methods in pangenome class associated to Modules.""" def test_add_module(self, pangenome): """Tests the add_module method in the Pangenome class. @@ -792,8 +784,7 @@ def test_number_of_modules(self, pangenome): class TestPangenomeMetadata(TestPangenome): - """This class tests methods in pangenome class associated to Metadata. - """ + """This class tests methods in pangenome class associated to Metadata.""" @pytest.fixture def add_element_to_pangenome(self, pangenome): @@ -810,7 +801,7 @@ def add_element_to_pangenome(self, pangenome): ctg = Contig(0, "Ctg") org.add(ctg) gene = Gene("Gene") - gene.fill_annotations(start=1, stop=100, position=0, strand='+') + gene.fill_annotations(start=1, stop=100, position=0, strand="+") gene.add_metadata(metadata=metadata) ctg.add(gene) pangenome.add_organism(org) @@ -830,12 +821,25 @@ def test_select_elem(self, add_element_to_pangenome, pangenome): :param add_element_to_pangenome: Add elements to the pangenome :param pangenome: Access the pangenome object """ - assert all(isinstance(elem, GeneFamily) for elem in set(pangenome.select_elem("families"))) - assert all(isinstance(elem, Organism) for elem in set(pangenome.select_elem("genomes"))) - assert all(isinstance(elem, Gene) for elem in set(pangenome.select_elem("genes"))) - assert all(isinstance(elem, Region) for elem in set(pangenome.select_elem("RGPs"))) - assert all(isinstance(elem, Spot) for elem in set(pangenome.select_elem("spots"))) - assert all(isinstance(elem, Module) for elem in set(pangenome.select_elem("modules"))) + assert all( + isinstance(elem, GeneFamily) + for elem in set(pangenome.select_elem("families")) + ) + assert all( + isinstance(elem, Organism) for elem in set(pangenome.select_elem("genomes")) + ) + assert all( + isinstance(elem, Gene) for elem in set(pangenome.select_elem("genes")) + ) + assert all( + isinstance(elem, Region) for elem in set(pangenome.select_elem("RGPs")) + ) + assert all( + isinstance(elem, Spot) for elem in set(pangenome.select_elem("spots")) + ) + assert all( + isinstance(elem, Module) for elem in set(pangenome.select_elem("modules")) + ) with pytest.raises(KeyError): pangenome.select_elem("error") @@ -847,7 +851,7 @@ def test_metadata_sources(self, add_element_to_pangenome, pangenome): """ for metatype in ["families", "genomes", "genes", "RGPs", "spots", "modules"]: assert isinstance(pangenome.metadata_sources(metatype), set) - assert pangenome.metadata_sources(metatype) == {'source'} + assert pangenome.metadata_sources(metatype) == {"source"} def test_metadata(self, add_element_to_pangenome, pangenome): """Tests the metadata generator of the Pangenome class. @@ -859,7 +863,7 @@ def test_metadata(self, add_element_to_pangenome, pangenome): for metadata_gen in pangenome.metadata(metatype): for metadata in metadata_gen: assert isinstance(metadata, Metadata) - assert metadata.source == 'source' + assert metadata.source == "source" def test_get_elem_by_metadata(self, add_element_to_pangenome, pangenome): """Tests the metadata generator filtered by metadata attribute of the Pangenome class. @@ -867,13 +871,19 @@ def test_get_elem_by_metadata(self, add_element_to_pangenome, pangenome): :param add_element_to_pangenome: Add elements to the pangenome :param pangenome: Access the pangenome object """ - for metatype, expected_type in {"families": GeneFamily, "genomes": Organism, "genes": Gene, "RGPs": Region, - "spots": Spot, "modules": Module}.items(): + for metatype, expected_type in { + "families": GeneFamily, + "genomes": Organism, + "genes": Gene, + "RGPs": Region, + "spots": Spot, + "modules": Module, + }.items(): for elem in pangenome.get_elem_by_metadata(metatype, attribute="attr"): assert isinstance(elem, expected_type) for metadata in elem.metadata: assert isinstance(metadata, Metadata) - assert metadata.source == 'source' + assert metadata.source == "source" def test_get_elem_by_source(self, add_element_to_pangenome, pangenome): """Tests the metadata generator filtered by source of the Pangenome class. @@ -881,10 +891,18 @@ def test_get_elem_by_source(self, add_element_to_pangenome, pangenome): :param add_element_to_pangenome: Add elements to the pangenome :param pangenome: Access the pangenome object """ - for metatype, expected_type in {"families": GeneFamily, "genomes": Organism, "genes": Gene, "RGPs": Region, - "spots": Spot, "modules": Module}.items(): - for elem in pangenome.get_elem_by_source(source='source', metatype=metatype): + for metatype, expected_type in { + "families": GeneFamily, + "genomes": Organism, + "genes": Gene, + "RGPs": Region, + "spots": Spot, + "modules": Module, + }.items(): + for elem in pangenome.get_elem_by_source( + source="source", metatype=metatype + ): assert isinstance(elem, expected_type) for metadata in elem.metadata: assert isinstance(metadata, Metadata) - assert metadata.source == 'source' + assert metadata.source == "source" diff --git a/tests/test_region.py b/tests/test_region.py index dbc35bf9..b74c23e0 100644 --- a/tests/test_region.py +++ b/tests/test_region.py @@ -8,29 +8,33 @@ from ppanggolin.geneFamily import GeneFamily from ppanggolin.genome import Gene, Contig, Organism + @pytest.fixture def contig() -> Contig: - contig = Contig(0, 'contig_name') + contig = Contig(0, "contig_name") contig.length = 200 return contig + @pytest.fixture def genes(contig) -> Generator[Set[Gene], None, None]: - """Create a set of genes to fill gene families - """ + """Create a set of genes to fill gene families""" genes = [] for i in range(0, 11): gene = Gene(f"gene_{str(i)}") - gene.fill_annotations(start=10 * i + 1, stop=10 * (i + 1), strand='+', position=i, genetic_code=4) + gene.fill_annotations( + start=10 * i + 1, stop=10 * (i + 1), strand="+", position=i, genetic_code=4 + ) gene.contig = contig genes.append(gene) return genes + @pytest.fixture def gene(contig) -> Gene: - gene = Gene('gene') - gene.fill_annotations(start=1, stop=10, strand='+', position=0) - contig = Contig(0, 'contig_name') + gene = Gene("gene") + gene.fill_annotations(start=1, stop=10, strand="+", position=0) + contig = Contig(0, "contig_name") contig.length = 10 gene.contig = contig return gene @@ -38,8 +42,7 @@ def gene(contig) -> Gene: @pytest.fixture def families(genes) -> Generator[Set[GeneFamily], None, None]: - """Create a set of gene families fill with genes to test edges - """ + """Create a set of gene families fill with genes to test edges""" families = set() genes = list(genes) nb_families = randint(2, 10) @@ -99,27 +102,24 @@ def organisms(genes) -> Generator[Set[Organism], None, None]: class TestRegion: - """Tests for region class - """ - attr_val = {'score': 0, 'starter': None, 'stopper': None} + """Tests for region class""" + + attr_val = {"score": 0, "starter": None, "stopper": None} @pytest.fixture def region(self) -> Generator[Region, None, None]: - """Generate a region object to test class - """ + """Generate a region object to test class""" yield Region("RGP") def test_cstr(self, region: Region): - """Tests that region is constructed as expected - """ + """Tests that region is constructed as expected""" assert isinstance(region, Region) assert region.name == "RGP" assert isinstance(region._genes_getter, dict) def test_add_gene(self, region, gene): - """Tests that genes can be aadded to a region - """ - + """Tests that genes can be aadded to a region""" + region.add(gene) assert len(region._genes_getter) == 1 @@ -129,49 +129,44 @@ def test_add_gene(self, region, gene): assert gene.RGP == region def test_add_gene_not_is_instance_gene(self, region): - """Test that adding object with instance not Gene return a TypeError - """ + """Test that adding object with instance not Gene return a TypeError""" with pytest.raises(TypeError): region.add(0) def test_add_gene_not_fill_with_position(self, region): - """Test that adding gene not fill with position return an AttributeError - """ + """Test that adding gene not fill with position return an AttributeError""" with pytest.raises(AttributeError): - region.add(Gene('gene')) + region.add(Gene("gene")) def test_add_genes_at_position_already_taken(self, region, contig): - """Test that adding genes with same position return a ValueError - """ - gene = Gene('gene') - gene.fill_annotations(start=1, stop=10, strand='+', position=0) + """Test that adding genes with same position return a ValueError""" + gene = Gene("gene") + gene.fill_annotations(start=1, stop=10, strand="+", position=0) gene.contig = contig region.add(gene) with pytest.raises(KeyError): - another_gene = Gene('gene') - another_gene.fill_annotations(start=4, stop=12, strand='-', position=0) + another_gene = Gene("gene") + another_gene.fill_annotations(start=4, stop=12, strand="-", position=0) another_gene.contig = contig region.add(another_gene) def test_add_genes_from_different_contigs(self, region): - """Test that adding genes from different contigs return an Exception - """ - gene1, gene2 = Gene('gene_1'), Gene('gene_2') - gene1.fill_annotations(start=1, stop=10, strand='+', position=0) - gene2.fill_annotations(start=11, stop=20, strand='+', position=1) - gene1.fill_parents(None, Contig(1, 'contig_1')) + """Test that adding genes from different contigs return an Exception""" + gene1, gene2 = Gene("gene_1"), Gene("gene_2") + gene1.fill_annotations(start=1, stop=10, strand="+", position=0) + gene2.fill_annotations(start=11, stop=20, strand="+", position=1) + gene1.fill_parents(None, Contig(1, "contig_1")) region.add(gene1) - gene2.fill_parents(None, Contig(2, 'contig_2')) + gene2.fill_parents(None, Contig(2, "contig_2")) with pytest.raises(Exception): region.add(gene2) def test_add_genes_from_different_organisms(self, region): - """Test that adding genes from different organisms return an Exception - """ - gene1, gene2 = Gene('gene_1'), Gene('gene_2') - gene1.fill_annotations(start=1, stop=10, strand='+', position=0) - gene2.fill_annotations(start=11, stop=20, strand='+', position=1) + """Test that adding genes from different organisms return an Exception""" + gene1, gene2 = Gene("gene_1"), Gene("gene_2") + gene1.fill_annotations(start=1, stop=10, strand="+", position=0) + gene2.fill_annotations(start=11, stop=20, strand="+", position=1) gene1.fill_parents(Organism("org_1")) region.add(gene1) gene2.fill_parents(Organism("org_2")) @@ -179,48 +174,42 @@ def test_add_genes_from_different_organisms(self, region): region.add(gene2) def test_get_genes(self, region): - """Tests that genes can be retrieved from the region - """ - gene = Gene('gene') - gene.fill_annotations(start=1, stop=10, strand='+', position=0) + """Tests that genes can be retrieved from the region""" + gene = Gene("gene") + gene.fill_annotations(start=1, stop=10, strand="+", position=0) region.add(gene) assert region.get(0) == gene def test_get_genes_with_position_not_integer(self, region): - """Tests that getting a gene with wrong type for position raise a TypeError - """ + """Tests that getting a gene with wrong type for position raise a TypeError""" with pytest.raises(TypeError): region.get("0") def test_get_genes_with_position_not_in_region(self, region): - """Tests that getting a gene at position not belonging in the region return a KeyError - """ + """Tests that getting a gene at position not belonging in the region return a KeyError""" with pytest.raises(KeyError): region.get(randint(0, 20)) def test_del_gene(self, region): - """Tests that genes can be deleted from the region - """ - gene = Gene('gene') - gene.fill_annotations(start=1, stop=10, strand='+', position=0) + """Tests that genes can be deleted from the region""" + gene = Gene("gene") + gene.fill_annotations(start=1, stop=10, strand="+", position=0) region.add(gene) assert region.get(0) == gene region.remove(0) assert 0 not in region._genes_getter def test_del_genes_with_position_not_integer(self, region): - """Tests that removing a gene with wrong type for position raise a TypeError - """ + """Tests that removing a gene with wrong type for position raise a TypeError""" with pytest.raises(TypeError): region.remove("0") def test_get_length(self, region, contig): - """Tests that the length of the region can be retrieved - """ - gene1, gene2 = Gene('gene_1'), Gene('gene_2') - gene1.fill_annotations(start=1, stop=10, strand='+', position=0) + """Tests that the length of the region can be retrieved""" + gene1, gene2 = Gene("gene_1"), Gene("gene_2") + gene1.fill_annotations(start=1, stop=10, strand="+", position=0) gene1.contig = contig - gene2.fill_annotations(start=11, stop=20, strand='+', position=1) + gene2.fill_annotations(start=11, stop=20, strand="+", position=1) gene2.contig = contig region.add(gene1) @@ -228,29 +217,26 @@ def test_get_length(self, region, contig): assert region.length == 20 def test_get_organism(self, region, contig): - """Tests that the organism linked to the region can be retrieved - """ - gene = Gene('gene') - gene.fill_annotations(start=1, stop=10, strand='+', position=0) + """Tests that the organism linked to the region can be retrieved""" + gene = Gene("gene") + gene.fill_annotations(start=1, stop=10, strand="+", position=0) gene.fill_parents(Organism("org"), contig) region.add(gene) - assert region.organism.name == 'org' + assert region.organism.name == "org" def test_get_contig(self, region): - """Tests that the contig linked to the region can be retrieved - """ - gene = Gene('gene') - gene.fill_annotations(start=1, stop=10, strand='+', position=0) + """Tests that the contig linked to the region can be retrieved""" + gene = Gene("gene") + gene.fill_annotations(start=1, stop=10, strand="+", position=0) gene.fill_parents(contig=Contig(0, "contig")) region.add(gene) - assert region.contig.name == 'contig' + assert region.contig.name == "contig" def test_is_whole_contig_true(self, region): - """Tests that the property is_whole_contig return True if the region has the same length as contig - """ - starter, stopper = Gene('starter'), Gene('stopper') - starter.fill_annotations(start=1, stop=10, strand='+', position=0) - stopper.fill_annotations(start=11, stop=20, strand='+', position=1) + """Tests that the property is_whole_contig return True if the region has the same length as contig""" + starter, stopper = Gene("starter"), Gene("stopper") + starter.fill_annotations(start=1, stop=10, strand="+", position=0) + stopper.fill_annotations(start=11, stop=20, strand="+", position=1) contig = Contig(0, "contig") contig[starter.start], contig[stopper.start] = starter, stopper starter.fill_parents(None, contig), stopper.fill_parents(None, contig) @@ -258,13 +244,17 @@ def test_is_whole_contig_true(self, region): assert region.is_whole_contig is True def test_is_whole_contig_false(self, region): - """Tests that the property is_whole_contig return False if the region has not the same length as contig - """ - before, starter, stopper, after = Gene('before'), Gene('starter'), Gene('stopper'), Gene('after') - before.fill_annotations(start=1, stop=10, strand='+', position=0) - starter.fill_annotations(start=11, stop=20, strand='+', position=1) - stopper.fill_annotations(start=21, stop=30, strand='+', position=2) - after.fill_annotations(start=31, stop=40, strand='+', position=3) + """Tests that the property is_whole_contig return False if the region has not the same length as contig""" + before, starter, stopper, after = ( + Gene("before"), + Gene("starter"), + Gene("stopper"), + Gene("after"), + ) + before.fill_annotations(start=1, stop=10, strand="+", position=0) + starter.fill_annotations(start=11, stop=20, strand="+", position=1) + stopper.fill_annotations(start=21, stop=30, strand="+", position=2) + after.fill_annotations(start=31, stop=40, strand="+", position=3) contig = Contig(0, "contig") contig[before.start], contig[after.start] = before, after contig[starter.start], contig[stopper.start] = starter, stopper @@ -274,18 +264,26 @@ def test_is_whole_contig_false(self, region): assert region.is_whole_contig is False def test_is_contig_border_true(self, region): - """Test that property is_contig_border return true if the region is bordering the contig - """ - before, starter, stopper, after = Gene('before'), Gene('starter'), Gene('stopper'), Gene('after') - before.fill_annotations(start=1, stop=10, strand='+', position=0) - starter.fill_annotations(start=11, stop=20, strand='+', position=1) - stopper.fill_annotations(start=21, stop=30, strand='+', position=2) - after.fill_annotations(start=31, stop=40, strand='+', position=3) + """Test that property is_contig_border return true if the region is bordering the contig""" + before, starter, stopper, after = ( + Gene("before"), + Gene("starter"), + Gene("stopper"), + Gene("after"), + ) + before.fill_annotations(start=1, stop=10, strand="+", position=0) + starter.fill_annotations(start=11, stop=20, strand="+", position=1) + stopper.fill_annotations(start=21, stop=30, strand="+", position=2) + after.fill_annotations(start=31, stop=40, strand="+", position=3) contig = Contig(0, "contig") before.fill_parents(None, contig), after.fill_parents(None, contig) starter.fill_parents(None, contig), stopper.fill_parents(None, contig) # Test bordering right - contig[before.start], contig[starter.start], contig[stopper.start] = before, starter, stopper + contig[before.start], contig[starter.start], contig[stopper.start] = ( + before, + starter, + stopper, + ) region.add(starter), region.add(stopper) assert region.is_contig_border is True # Test bordering left @@ -295,13 +293,17 @@ def test_is_contig_border_true(self, region): assert region.is_contig_border is True def test_is_contig_border_false(self, region): - """Tests that the property is_contig_border return False if the region is not bordering the contig - """ - before, starter, stopper, after = Gene('before'), Gene('starter'), Gene('stopper'), Gene('after') - before.fill_annotations(start=1, stop=10, strand='+', position=0) - starter.fill_annotations(start=11, stop=20, strand='+', position=1) - stopper.fill_annotations(start=21, stop=30, strand='+', position=2) - after.fill_annotations(start=31, stop=40, strand='+', position=3) + """Tests that the property is_contig_border return False if the region is not bordering the contig""" + before, starter, stopper, after = ( + Gene("before"), + Gene("starter"), + Gene("stopper"), + Gene("after"), + ) + before.fill_annotations(start=1, stop=10, strand="+", position=0) + starter.fill_annotations(start=11, stop=20, strand="+", position=1) + stopper.fill_annotations(start=21, stop=30, strand="+", position=2) + after.fill_annotations(start=31, stop=40, strand="+", position=3) contig = Contig(0, "contig") contig[before.start], contig[after.start] = before, after contig[starter.start], contig[stopper.start] = starter, stopper @@ -311,22 +313,19 @@ def test_is_contig_border_false(self, region): assert region.is_contig_border is False def test_is_contig_border_assertion_error_if_no_gene(self, region): - """Tests that an AssertionError is returned if there is no gene in the region - """ + """Tests that an AssertionError is returned if there is no gene in the region""" with pytest.raises(AssertionError): _ = region.is_contig_border def test_len(self, region, genes): - """Tests that the expected number of genes is retrieved in the region - """ + """Tests that the expected number of genes is retrieved in the region""" for gene in genes: region.add(gene) assert isinstance(len(region), int) assert len(region) == len(genes) def test_equality(self, genes): - """Test equality between two regions - """ + """Test equality between two regions""" region_1, region_2 = Region("RGP_1"), Region("RGP_2") for gene in genes: region_1.add(gene) @@ -339,31 +338,26 @@ def test_wrong_position(self, gene): with pytest.raises(ValueError): region[42] = gene - def test_not_equal(self, region, genes): - """Test difference between two regions - """ + """Test difference between two regions""" for gene in genes: region.add(gene) assert region != Region("other_RGP") def test_equality_with_not_instance_region(self, region): - """Test comparison between a region and another object raise a TypeError - """ + """Test comparison between a region and another object raise a TypeError""" with pytest.raises(TypeError): assert region == 4 def test_get_gene_families(self, region, genes, families): - """Tests that gene families can be retrieved from the region - """ + """Tests that gene families can be retrieved from the region""" for gene in genes: region.add(gene) assert all(isinstance(family, GeneFamily) for family in region.families) assert set(region.families) == families def test_get_number_of_gene_families(self, region, genes, families): - """Tests that gene families can be retrieved from the region - """ + """Tests that gene families can be retrieved from the region""" for gene in genes: region.add(gene) assert isinstance(region.number_of_families, int) @@ -375,55 +369,68 @@ def test_starter_stopper_simpler(self, region): check that the starter and stopper genes are correct. as well as the coordinates of the region """ - contig = Contig(0, 'contig_name') + contig = Contig(0, "contig_name") contig.length = 200 genes = [] for i in range(0, 10): gene = Gene(f"gene_{str(i)}") - gene.fill_annotations(start=10 * i + 1, stop=10 * (i + 1), strand='+', position=i, genetic_code=4) + gene.fill_annotations( + start=10 * i + 1, + stop=10 * (i + 1), + strand="+", + position=i, + genetic_code=4, + ) gene.fill_parents(contig=contig) contig.add(gene) genes.append(gene) - + region.add(genes[2]) assert region.starter == genes[2] assert region.stopper == genes[2] assert region.coordinates == genes[2].coordinates assert region.coordinates == [(genes[2].start, genes[2].stop)] - + region.add(genes[3]) region.add(genes[4]) assert region.starter == genes[2] assert region.stopper == genes[4] - assert region.coordinates == [(genes[2].start, genes[4].stop)] - + assert region.coordinates == [(genes[2].start, genes[4].stop)] def test_starter_stopper_with_contig_overlap(self, region): """ check that when region overlaps the contig, the starter and stopper gene are correct. as well as the coordinates of the region """ - contig = Contig(0, 'contig_name', is_circular=True) + contig = Contig(0, "contig_name", is_circular=True) contig.length = 400 genes = [] for i in range(0, 10): gene = Gene(f"gene_{str(i)}") - gene.fill_annotations(start=10 * i + 1, stop=10 * (i + 1), strand='+', position=i, genetic_code=4) + gene.fill_annotations( + start=10 * i + 1, + stop=10 * (i + 1), + strand="+", + position=i, + genetic_code=4, + ) gene.fill_parents(contig=contig) contig.add(gene) genes.append(gene) - + region.add(genes[9]) region.add(genes[0]) - assert region.starter == genes[9] assert region.stopper == genes[0] - assert region.coordinates == [(genes[9].start, contig.length), (1, genes[0].stop)] + assert region.coordinates == [ + (genes[9].start, contig.length), + (1, genes[0].stop), + ] def test_starter_stopper_with_contig_overlap_of_gene(self, region): """ @@ -431,32 +438,38 @@ def test_starter_stopper_with_contig_overlap_of_gene(self, region): """ - contig = Contig(0, 'contig_name', is_circular=True) + contig = Contig(0, "contig_name", is_circular=True) contig.length = 400 genes = [] for i in range(0, 10): gene = Gene(f"gene_{str(i)}") - gene.fill_annotations(start=10 * i + 5, stop=10 * (i + 1), strand='+', position=i) + gene.fill_annotations( + start=10 * i + 5, stop=10 * (i + 1), strand="+", position=i + ) gene.fill_parents(contig=contig) contig.add(gene) genes.append(gene) - + # add a gene that overlap the contig edge gene_that_overlap = Gene(f"gene_{str(10)}") - gene_that_overlap.fill_annotations(start=300, stop=5, strand='+', position=10, coordinates=[(300, 400), (1, 5)]) + gene_that_overlap.fill_annotations( + start=300, stop=5, strand="+", position=10, coordinates=[(300, 400), (1, 5)] + ) gene_that_overlap.fill_parents(contig=contig) contig.add(gene_that_overlap) genes.append(gene_that_overlap) - region.add(gene_that_overlap) assert region.starter == gene_that_overlap assert region.stopper == gene_that_overlap - assert region.coordinates == gene_that_overlap.coordinates - assert region.coordinates == [(gene_that_overlap.start, contig.length), (1, gene_that_overlap.stop)] - + assert region.coordinates == gene_that_overlap.coordinates + assert region.coordinates == [ + (gene_that_overlap.start, contig.length), + (1, gene_that_overlap.stop), + ] + # if we add more genes around the one that overlap region.add(genes[9]) @@ -465,17 +478,18 @@ def test_starter_stopper_with_contig_overlap_of_gene(self, region): region.add(genes[0]) assert region.starter == genes[7] assert region.stopper == genes[0] - assert region.coordinates == [(genes[7].start, contig.length), (1, genes[0].stop)] - - + assert region.coordinates == [ + (genes[7].start, contig.length), + (1, genes[0].stop), + ] - def test_get_bordering_genes(self,region): + def test_get_bordering_genes(self, region): """ Test simple border. for a contig with 10 genes. Add gene from 1 to 8 into the region. Gene at the border are 0 and 9 """ - contig = Contig(0, 'contig_name') + contig = Contig(0, "contig_name") contig.length = 200 family = GeneFamily(1, "test") @@ -484,28 +498,33 @@ def test_get_bordering_genes(self,region): genes = [] for i in range(0, 10): gene = Gene(f"gene_{str(i)}") - gene.fill_annotations(start=10 * i + 1, stop=10 * (i + 1), strand='+', position=i, genetic_code=4) + gene.fill_annotations( + start=10 * i + 1, + stop=10 * (i + 1), + strand="+", + position=i, + genetic_code=4, + ) gene.fill_parents(contig=contig) gene.family = family contig.add(gene) genes.append(gene) - + for gene in genes[1:-1]: region.add(gene) borders = region.get_bordering_genes(1, {}) assert borders == [[genes[0]], [genes[-1]]] - def test_get_bordering_genes_overlap_contigs(self, region): """ - Test border of a region that overlap contig edge. + Test border of a region that overlap contig edge. for a contig with 10 genes. Add gene from 0,1 and 9. left border is 8 and right is 2 """ - contig = Contig(0, 'contig_name', is_circular=True) + contig = Contig(0, "contig_name", is_circular=True) contig.length = 200 family = GeneFamily(1, "test") @@ -514,13 +533,19 @@ def test_get_bordering_genes_overlap_contigs(self, region): genes = [] for i in range(0, 10): gene = Gene(f"gene_{str(i)}") - gene.fill_annotations(start=10 * i + 1, stop=10 * (i + 1), strand='+', position=i, genetic_code=4) + gene.fill_annotations( + start=10 * i + 1, + stop=10 * (i + 1), + strand="+", + position=i, + genetic_code=4, + ) gene.fill_parents(contig=contig) gene.family = family contig.add(gene) genes.append(gene) - + region.add(genes[0]) region.add(genes[1]) region.add(genes[9]) @@ -533,7 +558,7 @@ def test_get_bordering_genes_whole_contig(self, region): Test border of a region that cover all the contig. Expect no border """ - contig = Contig(0, 'contig_name', is_circular=True) + contig = Contig(0, "contig_name", is_circular=True) contig.length = 200 family = GeneFamily(1, "test") @@ -542,7 +567,13 @@ def test_get_bordering_genes_whole_contig(self, region): genes = [] for i in range(0, 10): gene = Gene(f"gene_{str(i)}") - gene.fill_annotations(start=10 * i + 1, stop=10 * (i + 1), strand='+', position=i, genetic_code=4) + gene.fill_annotations( + start=10 * i + 1, + stop=10 * (i + 1), + strand="+", + position=i, + genetic_code=4, + ) gene.fill_parents(contig=contig) gene.family = family contig.add(gene) @@ -553,18 +584,17 @@ def test_get_bordering_genes_whole_contig(self, region): borders = region.get_bordering_genes(1, {}) - assert borders == [[], []] # no border - + assert borders == [[], []] # no border def test_get_bordering_genes_with_multigenic(self, region): """ - Test border with multigenic for a non circular contig with 10 genes. + Test border with multigenic for a non circular contig with 10 genes. Add gene from 3 to 7 into the region. gene 2 and 8 are mulitgenic Gene at the border are 1 on the left and 9 """ - contig = Contig(0, 'contig_name') + contig = Contig(0, "contig_name") contig.length = 200 family = GeneFamily(1, "test") @@ -576,7 +606,13 @@ def test_get_bordering_genes_with_multigenic(self, region): genes = [] for i in range(0, 10): gene = Gene(f"gene_{str(i)}") - gene.fill_annotations(start=10 * i + 1, stop=10 * (i + 1), strand='+', position=i, genetic_code=4) + gene.fill_annotations( + start=10 * i + 1, + stop=10 * (i + 1), + strand="+", + position=i, + genetic_code=4, + ) gene.fill_parents(contig=contig) if i == 2 or i == 8: gene.family = multigenic_family @@ -585,15 +621,13 @@ def test_get_bordering_genes_with_multigenic(self, region): contig.add(gene) genes.append(gene) - + for gene in genes[3:8]: region.add(gene) - borders = region.get_bordering_genes(1, {multigenic_family}) assert borders == [[genes[1]], [genes[9]]] - def test_get_bordering_genes_with_all_multigenic(self, region): """ @@ -601,7 +635,7 @@ def test_get_bordering_genes_with_all_multigenic(self, region): for a contig with 10 genes. Add gene from 1 to 8 into the region. no border as families are multigenic """ - contig = Contig(0, 'contig_name') + contig = Contig(0, "contig_name") contig.length = 200 family = GeneFamily(1, "test") @@ -610,76 +644,74 @@ def test_get_bordering_genes_with_all_multigenic(self, region): genes = [] for i in range(0, 10): gene = Gene(f"gene_{str(i)}") - gene.fill_annotations(start=10 * i + 1, stop=10 * (i + 1), strand='+', position=i, genetic_code=4) + gene.fill_annotations( + start=10 * i + 1, + stop=10 * (i + 1), + strand="+", + position=i, + genetic_code=4, + ) gene.fill_parents(contig=contig) gene.family = family contig.add(gene) genes.append(gene) - + for gene in genes[1:-1]: region.add(gene) borders = region.get_bordering_genes(1, {family}) - assert borders == [[], []] # no border + assert borders == [[], []] # no border + class TestSpot: @pytest.fixture def spot(self) -> Generator[Spot, None, None]: - """Generate a spot for test - """ + """Generate a spot for test""" yield Spot(0) def test_cstr(self, spot): - """Tests that spot is constructed as expected - """ + """Tests that spot is constructed as expected""" assert spot.ID == 0 assert isinstance(spot._region_getter, dict) and len(spot._region_getter) == 0 assert isinstance(spot._uniqOrderedSet, dict) and len(spot._uniqOrderedSet) == 0 assert isinstance(spot._uniqContent, dict) and len(spot._uniqContent) == 0 def test_cstr_type_error(self): - """Tests that TypeError is returned if identifier is not an integer - """ + """Tests that TypeError is returned if identifier is not an integer""" with pytest.raises(TypeError): Spot("spot_0") def test_repr(self, spot): - """Test that the canonical string representing a spot does not change - """ + """Test that the canonical string representing a spot does not change""" assert repr(spot) == "Spot 0 - #RGP: 0" def test_str(self, spot): - """Test that the writing spot method does not change - """ + """Test that the writing spot method does not change""" assert str(spot) == "spot_0" @pytest.fixture def region(self) -> Generator[Region, None, None]: - """Create a region for test - """ + """Create a region for test""" yield Region("RGP_0") def test_add_region(self, spot, region): - """Tests that adding a Region object to the Spot object works as expected - """ + """Tests that adding a Region object to the Spot object works as expected""" spot.add(region) assert region == spot._region_getter[region.name] def test_add_not_instance_region(self, spot): - """Tests that a TypeError is returned if a non-region type is trying to be added - """ + """Tests that a TypeError is returned if a non-region type is trying to be added""" with pytest.raises(TypeError): spot.add("region") def test_add_different_region_with_same_name(self, spot): - """Test that adding a new Region same name than another in the spot return a KeyError - """ + """Test that adding a new Region same name than another in the spot return a KeyError""" region_1, region_2 = Region("RGP"), Region("RGP") gene_1, gene_2 = Gene("gene_1"), Gene("gene_2") - gene_1.fill_annotations(start=1, stop=10, strand='+', position=0) - gene_2.fill_annotations(start=1, stop=10, strand='+', position=0) + gene_1.fill_annotations(start=1, stop=10, strand="+", position=0) + gene_2.fill_annotations(start=1, stop=10, strand="+", position=0) gene_1.family, gene_2.family = GeneFamily(0, "Fam_0"), GeneFamily(1, "Fam_1") region_1[0], region_2[0] = gene_1, gene_2 spot[region_1.name] = region_1 @@ -687,10 +719,9 @@ def test_add_different_region_with_same_name(self, spot): spot[region_2.name] = region_2 def test_add_two_time_the_same_region(self, spot, region): - """Test that adding a two time the same region is working as expected - """ + """Test that adding a two time the same region is working as expected""" gene = Gene("gene") - gene.fill_annotations(start=1, stop=10, strand='+', position=0) + gene.fill_annotations(start=1, stop=10, strand="+", position=0) gene.family = GeneFamily(0, "Fam") region[0] = gene spot[region.name] = region @@ -699,27 +730,23 @@ def test_add_two_time_the_same_region(self, spot, region): assert region in spot._region_getter.values() def test_get_region(self, spot, region): - """Tests that getting the region in the Spot object works as expected - """ + """Tests that getting the region in the Spot object works as expected""" spot.add(region) assert spot.get(region.name) == region def test_get_region_not_in_spot(self, spot): - """Tests that a KeyError is raised when the name of the region does not exist in the spot - """ + """Tests that a KeyError is raised when the name of the region does not exist in the spot""" with pytest.raises(KeyError): _ = spot["rgp"] def test_delete_region_in_spot(self, spot, region): - """Tests that remove a region from the spot work as expected - """ + """Tests that remove a region from the spot work as expected""" spot[region.name] = region del spot[region.name] assert region.name not in spot._region_getter def test_len(self, spot, region): - """Tests that getting the number of regions work as expected - """ + """Tests that getting the number of regions work as expected""" assert isinstance(len(spot), int) assert len(spot) == 0 spot[region.name] = region @@ -727,8 +754,7 @@ def test_len(self, spot, region): @pytest.fixture def regions(self, genes): - """Create a random number of regions fill with genes - """ + """Create a random number of regions fill with genes""" regions = set() genes = sorted(list(genes), key=lambda x: x.position) nb_regions = randint(2, len(genes)) @@ -754,8 +780,7 @@ def regions(self, genes): yield regions def test_get_all_regions(self, spot, regions): - """Tests that getting all the region in the spot works as expected - """ + """Tests that getting all the region in the spot works as expected""" for region in regions: spot[region.name] = region assert len(spot) == len(regions) @@ -763,23 +788,20 @@ def test_get_all_regions(self, spot, regions): assert regions == set(spot.regions) def test_get_families(self, spot, regions, families): - """Tests that getting the gene families in the Spot object works as expected - """ + """Tests that getting the gene families in the Spot object works as expected""" for region in regions: spot[region.name] = region assert set(spot.families) == families def test_number_of_families(self, spot, regions, families): - """Tests that getting the number of families in the spot works as expected - """ + """Tests that getting the number of families in the spot works as expected""" for region in regions: spot[region.name] = region assert isinstance(spot.number_of_families, int) assert spot.number_of_families == len(families) def test_add_spot_to_families(self, spot, regions, families): - """Tests that adding spot to families works as expected - """ + """Tests that adding spot to families works as expected""" for region in regions: spot[region.name] = region spot.spot_2_families() @@ -787,8 +809,7 @@ def test_add_spot_to_families(self, spot, regions, families): @pytest.fixture def srgps(self, regions): - """Create a random number of same rgp for all regions - """ + """Create a random number of same rgp for all regions""" srgps = set() for region in regions: nb_sim_rgp = randint(1, 3) @@ -800,28 +821,33 @@ def srgps(self, regions): yield srgps def test_get_uniq_rgp_set(self, spot, regions, families, srgps): - """Tests that getting identical rgp in the Spot object works as expected - """ - for region in list(regions) + list(srgps): # With lists provide sRGP to be key RGP in dict + """Tests that getting identical rgp in the Spot object works as expected""" + for region in list(regions) + list( + srgps + ): # With lists provide sRGP to be key RGP in dict spot[region.name] = region assert len(spot) == len(regions) + len(srgps) uniq2rgp = spot.get_uniq_to_rgp() for region, sim_rgps in uniq2rgp.items(): assert region in regions - assert set(region.families) == set.union(*[set(srgp.families) for srgp in sim_rgps]) + assert set(region.families) == set.union( + *[set(srgp.families) for srgp in sim_rgps] + ) def test_get_uniq_ordered_set(self, spot, regions, families, srgps): - """Tests that getting the unique synteny in the Spot object works as expected - """ - for region in list(regions) + list(srgps): # With lists provide sRGP to be key RGP in dict + """Tests that getting the unique synteny in the Spot object works as expected""" + for region in list(regions) + list( + srgps + ): # With lists provide sRGP to be key RGP in dict spot[region.name] = region assert len(spot) == len(regions) + len(srgps) assert spot.get_uniq_ordered_set().issubset(regions) def test_get_uniq_content(self, spot, regions, families, srgps): - """Tests that getting the unique RGP in the Spot object works as expected - """ - for region in list(regions) + list(srgps): # With lists provide sRGP to be key RGP in dict + """Tests that getting the unique RGP in the Spot object works as expected""" + for region in list(regions) + list( + srgps + ): # With lists provide sRGP to be key RGP in dict spot[region.name] = region assert len(spot) == len(regions) + len(srgps) assert spot.get_uniq_ordered_set().issubset(regions) @@ -830,47 +856,41 @@ def test_get_uniq_content(self, spot, regions, families, srgps): class TestModule: @pytest.fixture def module(self): - """Create a basic module - """ + """Create a basic module""" yield Module(0) def test_cstr(self, module): - """Test that a module is construct as expected - """ + """Test that a module is construct as expected""" assert module.ID == 0 - assert isinstance(module._families_getter, dict) and module._families_getter == {} + assert ( + isinstance(module._families_getter, dict) and module._families_getter == {} + ) def test_cstr_type_error(self): - """Test that if the identifier is not an integer it raises a TypeError - """ + """Test that if the identifier is not an integer it raises a TypeError""" with pytest.raises(TypeError): Spot("mod_0") def test_repr(self, module): - """Test that the canonical string representing a module does not change - """ + """Test that the canonical string representing a module does not change""" assert repr(module) == "Module 0 - #Families: 0" def test_str(self, module): - """Test that the writing spot method does not change - """ + """Test that the writing spot method does not change""" assert str(module) == "module_0" def test_hash(self, module): - """Test that len method work as expected - """ + """Test that len method work as expected""" assert isinstance(hash(module), int) def test_len(self, module): - """Test that len method work as expected - """ - module._families_getter["fam"] = GeneFamily(randint(1,5), "fam") + """Test that len method work as expected""" + module._families_getter["fam"] = GeneFamily(randint(1, 5), "fam") assert isinstance(len(module), int) assert len(module) == 1 def test_eq(self, families): - """Test equality between modules - """ + """Test equality between modules""" module1, module2, module3 = Module(1), Module(2), Module(3) for family in families: module1[family.name] = family @@ -879,45 +899,39 @@ def test_eq(self, families): assert module1 != module3 def test_eq_with_is_not_instance_module(self, module): - """Test comparison between a module and another object raise a TypeError - """ + """Test comparison between a module and another object raise a TypeError""" with pytest.raises(TypeError): assert module == 4 @pytest.fixture def family(self) -> Generator[GeneFamily, None, None]: - """Create a basic gene family for test - """ - yield GeneFamily(0, 'family') + """Create a basic gene family for test""" + yield GeneFamily(0, "family") def test_add_family(self, module, family): - """Tests that a gene family can be added to the module - """ + """Tests that a gene family can be added to the module""" module[family.name] = family assert len(module._families_getter) == 1 - assert module._families_getter['family'] == family + assert module._families_getter["family"] == family def test_add_different_families_with_same_name(self, module): - """Test that adding a new family with the same name as another in the module return a KeyError - """ - family_1, family_2 = GeneFamily(1, 'family_1'), GeneFamily(1, 'family_1') + """Test that adding a new family with the same name as another in the module return a KeyError""" + family_1, family_2 = GeneFamily(1, "family_1"), GeneFamily(1, "family_1") module[family_1.name] = family_1 with pytest.raises(KeyError): module[family_2.name] = family_2 def test_add_two_time_the_same_family(self, module, family): - """Test that adding a two time the same family is working as expected - """ + """Test that adding a two time the same family is working as expected""" module[family.name] = family assert family in module._families_getter.values() module[family.name] = family assert family in module._families_getter.values() def test_get_family(self, module, family): - """Tests that a gene family can be retrieved from the module - """ + """Tests that a gene family can be retrieved from the module""" module[family.name] = family - assert module['family'] == family + assert module["family"] == family def test_get_family_which_does_not_exist(self, module): """Tests that if a gene family does not exist it raises a KeyError""" @@ -926,15 +940,13 @@ def test_get_family_which_does_not_exist(self, module): _ = module[fam.name] def test_delete_family(self, module, family): - """Tests that a gene family can be deleted from the module - """ + """Tests that a gene family can be deleted from the module""" module[family.name] = family del module[family.name] assert len(module) == 0 def test_delete_family_which_does_not_exist(self, module): - """Tests that if a gene family does not exist it raises a KeyError - """ + """Tests that if a gene family does not exist it raises a KeyError""" fam = GeneFamily(randint(1, 20), f"fam{randint(1, 20)}") with pytest.raises(KeyError): del module[fam.name] @@ -943,47 +955,42 @@ def test_delete_family_which_does_not_exist(self, module): class TestGeneContext: @pytest.fixture def context(self): - """Generate a basic context - """ + """Generate a basic context""" yield GeneContext(0) def test_cstr(self, context): - """Test that a gene context is construct as expected - """ + """Test that a gene context is construct as expected""" assert context.ID == 0 - assert isinstance(context._families_getter, dict) and context._families_getter == {} + assert ( + isinstance(context._families_getter, dict) + and context._families_getter == {} + ) def test_cstr_type_error(self): - """Test that if the identifier is not an integer it raises a TypeError - """ + """Test that if the identifier is not an integer it raises a TypeError""" with pytest.raises(TypeError): Spot("gc_0") def test_repr(self, context): - """Test that the canonical string representing a context does not change - """ + """Test that the canonical string representing a context does not change""" assert repr(context) == "Context 0 - #Families: 0" def test_str(self, context): - """Test that the writing spot method does not change - """ + """Test that the writing spot method does not change""" assert str(context) == "GC_0" def test_hash(self, context): - """Test that len method work as expected - """ + """Test that len method work as expected""" assert isinstance(hash(context), int) def test_len(self, context): - """Test that len method work as expected - """ + """Test that len method work as expected""" context._families_getter["fam"] = GeneFamily(randint(1, 5), "fam") assert isinstance(len(context), int) assert len(context) == 1 def test_eq(self, families): - """Test equality between two contexts - """ + """Test equality between two contexts""" context1, context2, context3 = GeneContext(1), GeneContext(2), GeneContext(3) for family in families: context1[family.name] = family @@ -992,45 +999,39 @@ def test_eq(self, families): assert context1 != context3 def test_eq_with_is_not_instance_context(self, context): - """Test comparison between a context and another object raise a TypeError - """ + """Test comparison between a context and another object raise a TypeError""" with pytest.raises(TypeError): assert context == 4 @pytest.fixture def family(self) -> Generator[GeneFamily, None, None]: - """Create a basic gene family for test - """ - yield GeneFamily(0, 'family') + """Create a basic gene family for test""" + yield GeneFamily(0, "family") def test_add_family(self, context, family): - """Tests that a gene family can be added to the context - """ + """Tests that a gene family can be added to the context""" context[family.name] = family assert len(context._families_getter) == 1 - assert context._families_getter['family'] == family + assert context._families_getter["family"] == family def test_add_different_families_with_same_name(self, context): - """Test that adding a new family with the same name as another in the context return a KeyError - """ - family_1, family_2 = GeneFamily(1, 'family_1'), GeneFamily(1, 'family_1') + """Test that adding a new family with the same name as another in the context return a KeyError""" + family_1, family_2 = GeneFamily(1, "family_1"), GeneFamily(1, "family_1") context[family_1.name] = family_1 with pytest.raises(KeyError): context[family_2.name] = family_2 def test_add_two_time_the_same_family(self, context, family): - """Test that adding a two time the same family is working as expected - """ + """Test that adding a two time the same family is working as expected""" context[family.name] = family assert family in context._families_getter.values() context[family.name] = family assert family in context._families_getter.values() def test_get_family(self, context, family): - """Tests that a gene family can be retrieved from the context - """ + """Tests that a gene family can be retrieved from the context""" context[family.name] = family - assert context['family'] == family + assert context["family"] == family def test_get_family_which_does_not_exist(self, context): """Tests that if a gene family does not exist it raises a KeyError""" @@ -1039,15 +1040,13 @@ def test_get_family_which_does_not_exist(self, context): _ = context[fam.name] def test_delete_family(self, context, family): - """Tests that a gene family can be deleted from the context - """ + """Tests that a gene family can be deleted from the context""" context[family.name] = family - del context['family'] + del context["family"] assert len(context) == 0 def test_delete_family_which_does_not_exist(self, context): - """Tests that if a gene family does not exist it raises a KeyError - """ + """Tests that if a gene family does not exist it raises a KeyError""" fam = GeneFamily(randint(1, 20), f"fam{randint(1, 20)}") with pytest.raises(KeyError): del context[fam.name] diff --git a/tests/utils/test_utilities.py b/tests/utils/test_utilities.py index edb48d55..68ce840a 100644 --- a/tests/utils/test_utilities.py +++ b/tests/utils/test_utilities.py @@ -7,7 +7,14 @@ import zipfile from typing import Generator -from ppanggolin.utils import is_compressed, read_compressed_or_not, write_compressed_or_not, has_non_ascii, replace_non_ascii +from ppanggolin.utils import ( + is_compressed, + read_compressed_or_not, + write_compressed_or_not, + has_non_ascii, + replace_non_ascii, +) + class TestCompressed: """ @@ -20,7 +27,7 @@ def plain_file(self, tmp_path: Path) -> Generator[Path, None, None]: Creates a temporary plain text file for testing. """ file_path = tmp_path / "test.txt" - with open(file_path, 'wb') as f: + with open(file_path, "wb") as f: f.write(b"Test data") yield file_path @@ -30,7 +37,7 @@ def gzip_file(self, tmp_path: Path) -> Generator[Path, None, None]: Creates a temporary gzip file for testing. """ file_path = tmp_path / "test.gz" - with gzip.open(file_path, 'wb') as f: + with gzip.open(file_path, "wb") as f: f.write(b"Test data") yield file_path @@ -40,7 +47,7 @@ def bz2_file(self, tmp_path: Path) -> Generator[Path, None, None]: Creates a temporary bz2 file for testing. """ file_path = tmp_path / "test.bz2" - with bz2.open(file_path, 'wb') as f: + with bz2.open(file_path, "wb") as f: f.write(b"Test data") yield file_path @@ -50,15 +57,14 @@ def zip_file(self, tmp_path: Path) -> Generator[Path, None, None]: Creates a temporary zip file for testing. """ file_path = tmp_path / "test.zip" - with zipfile.ZipFile(file_path, 'w') as z: + with zipfile.ZipFile(file_path, "w") as z: z.writestr("test.txt", "Test data") yield file_path class TestIsCompressed(TestCompressed): def test_is_compressed_with_plain_file(self, plain_file: Path) -> None: - """Test is_compressed function with a plain text file. - """ + """Test is_compressed function with a plain text file.""" assert is_compressed(plain_file) == (False, None) def test_is_compressed_with_gzip_file(self, gzip_file: Path) -> None: @@ -91,6 +97,7 @@ class TestReadCompressedOrNot(TestCompressed): """ Test cases for the read_compressed_or_not function. """ + def test_read_compressed_gzip(self, gzip_file: Path) -> None: """ Test read_compressed_or_not function with a gzip file. @@ -145,7 +152,7 @@ def test_write_compressed(self, plain_file_path: Path) -> None: """ with write_compressed_or_not(plain_file_path, compress=True) as f: f.write("Test data") - with gzip.open(plain_file_path.with_suffix('.txt.gz'), 'rt') as f: + with gzip.open(plain_file_path.with_suffix(".txt.gz"), "rt") as f: assert f.read() == "Test data" def test_write_uncompressed(self, plain_file_path: Path) -> None: @@ -154,29 +161,39 @@ def test_write_uncompressed(self, plain_file_path: Path) -> None: """ with write_compressed_or_not(plain_file_path, compress=False) as f: f.write("Test data") - with open(plain_file_path, 'r') as f: + with open(plain_file_path, "r") as f: assert f.read() == "Test data" # Test cases for has_non_ascii -@pytest.mark.parametrize("input_string, expected", [ - ("Escherichia_coli", False), # All ASCII characters - ("Escherichia_colí", True), # Contains non-ASCII character 'í' - ("simple_string", False), # Simple ASCII string - ("Ωmega", True), # Contains non-ASCII character 'Ω' - ("", False), # Empty string should return False -]) +@pytest.mark.parametrize( + "input_string, expected", + [ + ("Escherichia_coli", False), # All ASCII characters + ("Escherichia_colí", True), # Contains non-ASCII character 'í' + ("simple_string", False), # Simple ASCII string + ("Ωmega", True), # Contains non-ASCII character 'Ω' + ("", False), # Empty string should return False + ], +) def test_has_non_ascii(input_string, expected): assert has_non_ascii(input_string) == expected + # Test cases for replace_non_ascii -@pytest.mark.parametrize("input_string, replacement, expected", [ - ("Escherichia_coli", "_", "Escherichia_coli"), # All ASCII characters, no replacement needed - ("Escherichia_colí", "_", "Escherichia_col_"), # Replace 'í' with '_' - ("Ωmega", "-", "-mega"), # Replace 'Ω' with '-' - ("Escherichia_Ωcoli", "X", "Escherichia_Xcoli"),# Replace 'Ω' with 'X' - ("", "_", ""), # Empty string, no replacement -]) +@pytest.mark.parametrize( + "input_string, replacement, expected", + [ + ( + "Escherichia_coli", + "_", + "Escherichia_coli", + ), # All ASCII characters, no replacement needed + ("Escherichia_colí", "_", "Escherichia_col_"), # Replace 'í' with '_' + ("Ωmega", "-", "-mega"), # Replace 'Ω' with '-' + ("Escherichia_Ωcoli", "X", "Escherichia_Xcoli"), # Replace 'Ω' with 'X' + ("", "_", ""), # Empty string, no replacement + ], +) def test_replace_non_ascii(input_string, replacement, expected): assert replace_non_ascii(input_string, replacement) == expected - From 73dd3df25dfb5391190736048a95994c5b617057 Mon Sep 17 00:00:00 2001 From: JeanMainguy Date: Tue, 29 Oct 2024 12:17:17 +0100 Subject: [PATCH 43/52] add black to test deps in toml --- pyproject.toml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 3707014e..26ccf96e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -48,7 +48,8 @@ doc = [ "sphinxcontrib.mermaid==0.9.2", ] test = [ - "pytest==7" + "pytest==7", + "black=24.*" ] python_deps = [ "tqdm==4.*", From 5d8305a56cafd4838ec417c27829593958ad2e4e Mon Sep 17 00:00:00 2001 From: JeanMainguy Date: Tue, 29 Oct 2024 12:19:55 +0100 Subject: [PATCH 44/52] add CI lint --- .github/workflows/black_lint.yml | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 .github/workflows/black_lint.yml diff --git a/.github/workflows/black_lint.yml b/.github/workflows/black_lint.yml new file mode 100644 index 00000000..b2cd244f --- /dev/null +++ b/.github/workflows/black_lint.yml @@ -0,0 +1,10 @@ +name: Lint + +on: [push, pull_request] + +jobs: + lint: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: psf/black@stable \ No newline at end of file From 348a7afa7f90a14f0d9e28f7fcb5153038bb35e5 Mon Sep 17 00:00:00 2001 From: JeanMainguy Date: Tue, 29 Oct 2024 12:22:46 +0100 Subject: [PATCH 45/52] fix synthax error in toml --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 26ccf96e..8c8e101e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -49,7 +49,7 @@ doc = [ ] test = [ "pytest==7", - "black=24.*" + "black==24.*" ] python_deps = [ "tqdm==4.*", From de471316429255efa55768df3c1df676c2c06307 Mon Sep 17 00:00:00 2001 From: JeanMainguy Date: Tue, 29 Oct 2024 12:26:14 +0100 Subject: [PATCH 46/52] test black --- ppanggolin/metrics/metrics.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ppanggolin/metrics/metrics.py b/ppanggolin/metrics/metrics.py index 6dce8c5f..838e9d63 100644 --- a/ppanggolin/metrics/metrics.py +++ b/ppanggolin/metrics/metrics.py @@ -35,7 +35,7 @@ def check_already_computed_metric( "Genome fluidity has been already computed. " "Use --force if you want to compute it again" ) - if print_metric and not recompute: + if print_metric and not recompute: print_computed_metric(info_group._v_attrs["genomes_fluidity"]) return True return False From 99249edd6dd14d53cf005f972ec949954805257b Mon Sep 17 00:00:00 2001 From: JeanMainguy Date: Tue, 29 Oct 2024 12:33:10 +0100 Subject: [PATCH 47/52] test black revert --- ppanggolin/metrics/metrics.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ppanggolin/metrics/metrics.py b/ppanggolin/metrics/metrics.py index 838e9d63..6dce8c5f 100644 --- a/ppanggolin/metrics/metrics.py +++ b/ppanggolin/metrics/metrics.py @@ -35,7 +35,7 @@ def check_already_computed_metric( "Genome fluidity has been already computed. " "Use --force if you want to compute it again" ) - if print_metric and not recompute: + if print_metric and not recompute: print_computed_metric(info_group._v_attrs["genomes_fluidity"]) return True return False From 798f850482e2e63e3f1650f076e81b61cf052058 Mon Sep 17 00:00:00 2001 From: JeanMainguy Date: Tue, 29 Oct 2024 12:33:25 +0100 Subject: [PATCH 48/52] update doc with black --- docs/dev/contribute.md | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/docs/dev/contribute.md b/docs/dev/contribute.md index a54c6e48..b5414e2b 100644 --- a/docs/dev/contribute.md +++ b/docs/dev/contribute.md @@ -8,6 +8,7 @@ If you have ideas for new features or improvements, initiating a discussion in a For minor changes like fixing typos or making small edits, feel free to create a new Pull Request (PR) directly with your proposed changes. + ## Setting Up the Development Environment 1. **Fork the Repository:** Start by forking the repository to your GitHub account. 🍴 @@ -18,7 +19,7 @@ For minor changes like fixing typos or making small edits, feel free to create a 4. **Branch from 'dev':** Begin your changes from the 'dev' branch, where we incorporate changes for the upcoming release. -5. **Install in Editable Mode:** To enable seamless code editing and testing of new functionality, install PPanGGOLiN in editable mode using the following command: +5. **Install in Editable Mode:** To enable code editing and testing of new functionality, you can install PPanGGOLiN in editable mode using the following command: ```bash pip install -e . @@ -26,17 +27,21 @@ For minor changes like fixing typos or making small edits, feel free to create a This allows you to modify the code and experiment with new features directly. - ```{note} - Note: Currently, we are not utilizing any auto formatters (like autopep8 or black). Kindly refrain from using them, as it could introduce extensive changes across the project, making code review challenging for us. +6. **Apply Code Formatting with Black:** We have integrated Black as our code formatter to maintain consistent styling. Code changes are automatically checked via a GitHub Action in our CI, so ensure your code is formatted with Black before committing. + + + ```{tip} + Integrate Black with your IDE to automatically format your changes and avoid formatting-related CI failures. ``` + ## Making Your Changes -We encourage consistency in code formatting; when adding new code, try to follow the existing code structure as closely as possible. Functions should include descriptive docstrings explaining their purpose and detailing the parameters. Ensure that argument types are specified in the function definitions. +Keep it consistent! Match the existing code style, add docstrings to describe functions, and specify argument types. ## Update Documentation -It's essential to update the documentation to reflect your changes. Provide clear descriptions and, if necessary, examples of commands and their respective outputs. +Update docs to reflect changes—clear descriptions and examples are always helpful! ## Tests From 4e2b9dfd1717379f778b6cbb8ccee63d21402bc6 Mon Sep 17 00:00:00 2001 From: JeanMainguy Date: Tue, 29 Oct 2024 14:23:48 +0100 Subject: [PATCH 49/52] add black github link in doc --- docs/dev/contribute.md | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/docs/dev/contribute.md b/docs/dev/contribute.md index b5414e2b..f883c621 100644 --- a/docs/dev/contribute.md +++ b/docs/dev/contribute.md @@ -11,15 +11,21 @@ For minor changes like fixing typos or making small edits, feel free to create a ## Setting Up the Development Environment -1. **Fork the Repository:** Start by forking the repository to your GitHub account. 🍴 +1. **Fork the Repository:** + Start by forking the repository to your GitHub account. 🍴 -2. **Clone the Forked Repository:** Clone your forked repository to your local machine. +2. **Clone the Forked Repository:** + Clone your forked repository to your local machine. 3. **Get an Environment:** Create an environment with all PPanGGOLiN prerequisites installed. For that, you can follow installation instructions [here](../user/install.md#installing-from-source-code-github). -4. **Branch from 'dev':** Begin your changes from the 'dev' branch, where we incorporate changes for the upcoming release. +4. **Branch from 'dev':** + Begin your changes from the 'dev' branch, where we incorporate changes for the upcoming release. -5. **Install in Editable Mode:** To enable code editing and testing of new functionality, you can install PPanGGOLiN in editable mode using the following command: + +5. **Install in Editable Mode:** + + To enable code editing and testing of new functionality, you can install PPanGGOLiN in editable mode using the following command: ```bash pip install -e . @@ -27,7 +33,8 @@ For minor changes like fixing typos or making small edits, feel free to create a This allows you to modify the code and experiment with new features directly. -6. **Apply Code Formatting with Black:** We have integrated Black as our code formatter to maintain consistent styling. Code changes are automatically checked via a GitHub Action in our CI, so ensure your code is formatted with Black before committing. +6. **Apply Code Formatting with Black:** + We have integrated [Black](https://github.com/psf/black) as our code formatter to maintain consistent styling. Code changes are automatically checked via a GitHub Action in our CI, so **ensure your code is formatted with Black before committing**. ```{tip} From ac13ec729f5dc0feb7cb5120692022a5f0631cd1 Mon Sep 17 00:00:00 2001 From: JeanMainguy Date: Tue, 29 Oct 2024 11:49:19 +0100 Subject: [PATCH 50/52] add missing disable bar flag in fast projection --- ppanggolin/projection/projection.py | 1 + 1 file changed, 1 insertion(+) diff --git a/ppanggolin/projection/projection.py b/ppanggolin/projection/projection.py index e7021319..d577e840 100644 --- a/ppanggolin/projection/projection.py +++ b/ppanggolin/projection/projection.py @@ -795,6 +795,7 @@ def annotate_input_genes_with_pangenome_families( identity=identity, coverage=coverage, translation_table=translation_table, + disable_bar=disable_bar, ) else: _, seqid_to_gene_family = get_input_seq_to_family_with_all( From af0c6750eb9dc3972b3fb6d1e7dd075efa64a233 Mon Sep 17 00:00:00 2001 From: JeanMainguy Date: Tue, 29 Oct 2024 12:01:38 +0100 Subject: [PATCH 51/52] use debug to inform on missing translation table in input files --- ppanggolin/annotate/annotate.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ppanggolin/annotate/annotate.py b/ppanggolin/annotate/annotate.py index c20cbd86..f99c1f46 100644 --- a/ppanggolin/annotate/annotate.py +++ b/ppanggolin/annotate/annotate.py @@ -823,7 +823,7 @@ def read_org_gbff( contig.add_metadata(Metadata(source="annotation_file", **metadata_dict)) if used_transl_table_arg: - logging.getLogger("PPanGGOLiN").info( + logging.getLogger("PPanGGOLiN").debug( f"transl_table tag was not found for {used_transl_table_arg} CDS " f"in {gbff_file_path}. Provided translation_table argument value was used instead: {translation_table}." ) From e3713ca610eb683d4679ba1bdd0d30514675be95 Mon Sep 17 00:00:00 2001 From: JeanMainguy Date: Tue, 29 Oct 2024 15:53:47 +0100 Subject: [PATCH 52/52] Bump to version 2.2.0 --- VERSION | 2 +- testingDataset/expected_info_files/myannopang_info.yaml | 2 +- testingDataset/expected_info_files/mybasicpangenome_info.yaml | 2 +- testingDataset/expected_info_files/stepbystep_info.yaml | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/VERSION b/VERSION index eca07e4c..ccbccc3d 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2.1.2 +2.2.0 diff --git a/testingDataset/expected_info_files/myannopang_info.yaml b/testingDataset/expected_info_files/myannopang_info.yaml index 045c6205..3b7c1b5b 100644 --- a/testingDataset/expected_info_files/myannopang_info.yaml +++ b/testingDataset/expected_info_files/myannopang_info.yaml @@ -8,7 +8,7 @@ Status: RGP_Predicted: false Spots_Predicted: false Modules_Predicted: false - PPanGGOLiN_Version: 2.1.2 + PPanGGOLiN_Version: 2.2.0 Content: Genes: 47986 diff --git a/testingDataset/expected_info_files/mybasicpangenome_info.yaml b/testingDataset/expected_info_files/mybasicpangenome_info.yaml index 466ddb63..b0bedf6f 100644 --- a/testingDataset/expected_info_files/mybasicpangenome_info.yaml +++ b/testingDataset/expected_info_files/mybasicpangenome_info.yaml @@ -8,7 +8,7 @@ Status: RGP_Predicted: true Spots_Predicted: true Modules_Predicted: true - PPanGGOLiN_Version: 2.1.2 + PPanGGOLiN_Version: 2.2.0 Content: Genes: 45429 diff --git a/testingDataset/expected_info_files/stepbystep_info.yaml b/testingDataset/expected_info_files/stepbystep_info.yaml index ecebca05..ef4525fc 100644 --- a/testingDataset/expected_info_files/stepbystep_info.yaml +++ b/testingDataset/expected_info_files/stepbystep_info.yaml @@ -8,7 +8,7 @@ Status: RGP_Predicted: true Spots_Predicted: true Modules_Predicted: true - PPanGGOLiN_Version: 2.1.2 + PPanGGOLiN_Version: 2.2.0 Content: Genes: 45429