From 8c9c0baf6d1952d72b0e11142a88dbf1cdd7a662 Mon Sep 17 00:00:00 2001 From: Qiyun Zhu Date: Wed, 21 Dec 2022 13:52:10 -0700 Subject: [PATCH 1/7] added suffix collapse --- woltka/biom.py | 56 +- woltka/cli.py | 13 +- woltka/ordinal.py | 4 +- woltka/table.py | 77 +- woltka/tests/data/output/bowtie2.orf.tsv | 4186 ++++++++++++++++++++++ woltka/tests/test_biom.py | 59 +- woltka/tests/test_table.py | 70 +- woltka/tests/test_tools.py | 30 +- woltka/tools.py | 57 +- woltka/workflow.py | 4 +- 10 files changed, 4507 insertions(+), 49 deletions(-) create mode 100644 woltka/tests/data/output/bowtie2.orf.tsv diff --git a/woltka/biom.py b/woltka/biom.py index 562ec3b..d86d411 100644 --- a/woltka/biom.py +++ b/woltka/biom.py @@ -194,7 +194,46 @@ def biom_add_metacol(table: biom.Table, dic, name, missing=''): table.add_metadata(metadata, axis='observation') -def collapse_biom(table: biom.Table, mapping: dict, divide=False, field=None): +def clip_biom(table: biom.Table, sep='_'): + """Remove suffix from feature names in a BIOM table. + + Parameters + ---------- + table : biom.Table + Table to collapse. + sep : str, optional + Separator (after last of which is suffix). + + Returns + ------- + biom.Table + Clipped BIOM table. + + Raises + ------ + ValueError + A feature ID does not have a suffix. + + Notes + ----- + Metadata will not be retained in the collapsed table. + + See Also + -------- + .table.clip_table + """ + def f(id_, _): + left, _, _ = id_.rpartition(sep) + if not left: + raise ValueError(f'Feature "{id_}" does not have a suffix.') + return left + + return table.collapse(f, norm=False, axis='observation', + include_collapsed_metadata=False) + + +def collapse_biom(table: biom.Table, mapping: dict, divide=False, suffix=False, + field=None): """Collapse a BIOM table in many-to-many mode. Parameters @@ -205,6 +244,8 @@ def collapse_biom(table: biom.Table, mapping: dict, divide=False, field=None): Source-to-target(s) mapping. divide : bool, optional Whether divide per-target counts by number of targets per source. + suffix : bool, optional + Whether feature names should be treated as with suffixes. field : int, optional Index of field to be collapsed in a stratified table. @@ -216,7 +257,7 @@ def collapse_biom(table: biom.Table, mapping: dict, divide=False, field=None): Raises ------ ValueError - Field index is not present in a feature ID. + A feature ID does not have a suffix or a field. Notes ----- @@ -230,7 +271,16 @@ def collapse_biom(table: biom.Table, mapping: dict, divide=False, field=None): metadata = {} for id_ in table.ids('observation'): feature = id_ - if field is not None: + if suffix: + left, _, _ = feature.rpartition('_') + if not left: + raise ValueError( + f'Feature "{feature}" does not have a suffix.') + if field is not None: + fields = [left, feature] + if not field: + feature = left + elif field is not None: fields = feature.split('|') try: feature = fields[field] diff --git a/woltka/cli.py b/woltka/cli.py index e75c9d4..e7a959f 100644 --- a/woltka/cli.py +++ b/woltka/cli.py @@ -260,19 +260,22 @@ def merge_cmd(ctx, **kwargs): '--input', '-i', 'input_fp', required=True, type=click.Path(exists=True, dir_okay=False), help='Path to input profile.') -@click.option( - '--map', '-m', 'map_fp', required=True, - type=click.Path(exists=True, dir_okay=False), - help=('Mapping of source features to target features. (supports ' - 'many-to-many relationships).')) @click.option( '--output', '-o', 'output_fp', required=True, type=click.Path(writable=True, dir_okay=False), help='Path to output profile.') +@click.option( + '--map', '-m', 'map_fp', + type=click.Path(exists=True, dir_okay=False), + help=('Mapping of source features to target features. Supports ' + 'many-to-many relationships. Required unless with "-s"')) @click.option( '--divide', '-d', is_flag=True, help=('Count each target feature as 1/k (k is the number of targets ' 'mapped to a source). Otherwise, count as one.')) +@click.option( + '--suffix', '-s', is_flag=True, + help='Treat features as with suffixes') @click.option( '--field', '-f', type=click.INT, help='Index of field to be collapsed in a stratified profile.') diff --git a/woltka/ordinal.py b/woltka/ordinal.py index e1ed7c6..f70cc0c 100644 --- a/woltka/ordinal.py +++ b/woltka/ordinal.py @@ -628,8 +628,8 @@ def match_read_gene_quart(geneque, readque): # when gene ends, check overlap and remove it from cache # gene end must be <= read end - # if gene not found in cache (meaning gene started before read - # region), use read start, otherwise use gene start + # if gene not found in cache (gene started before read region), + # use read start, otherwise use gene start elif (code >> 48) - within_pop(code & (1 << 30) - 1, beg) >= L: yield rid, code & (1 << 30) - 1 diff --git a/woltka/table.py b/woltka/table.py index 16b6939..b776c4e 100644 --- a/woltka/table.py +++ b/woltka/table.py @@ -21,7 +21,8 @@ from .file import openzip from .biom import ( table_to_biom, biom_to_table, write_biom, biom_max_f, divide_biom, - scale_biom, filter_biom, round_biom, biom_add_metacol, collapse_biom) + scale_biom, filter_biom, round_biom, biom_add_metacol, clip_biom, + collapse_biom) def prep_table(profile, samples=None, tree=None, rankdic=None, namedic=None, @@ -234,8 +235,7 @@ def read_tsv(fh): width = len(header) for line in fh: row = line.rstrip('\r\n').split('\t') - feature = row[0] - features.append(feature) + features.append(row[0]) data.append([int(x) if x.isdigit() else float(x) for x in row[1:width]]) # data.append(list(map(int, row[1:width]))) @@ -560,7 +560,45 @@ def add_metacol(table, dic, name, missing=''): metadatum[name] = dic.get(feature, missing) -def collapse_table(table, mapping, divide=False, field=None): +def clip_table(table, sep='_'): + """Remove suffix from feature names in a table. + + Parameters + ---------- + table : biom.Table or tuple + Table to collapse. + sep : str, optional + Separator (after last of which is suffix). + + Returns + ------- + biom.Table or tuple + Clipped table. + + Raises + ------ + ValueError + A feature ID does not have a suffix. + """ + # redirect to BIOM module + if isinstance(table, Table): + return clip_biom(table, sep) + + # remove suffix from feature names + samples = table[2] + width = len(samples) + res = defaultdict(lambda: [0] * width) + for datum, feature in zip(*table[:2]): + left, _, _ = feature.rpartition(sep) + if not left: + raise ValueError(f'Feature "{feature}" does not have a suffix.') + res[left] = list(map(add, res[left], datum)) + + # reformat table + return list(res.values()), list(res.keys()), samples, [dict() for _ in res] + + +def collapse_table(table, mapping, divide=False, suffix=False, field=None): """Collapse a table by many-to-many mapping. Parameters @@ -571,6 +609,8 @@ def collapse_table(table, mapping, divide=False, field=None): Source-to-target(s) mapping. divide : bool, optional Whether divide per-target counts by number of targets per source. + suffix : bool, optional + Whether feature names should be treated as with suffixes. field : int, optional Index of field to be collapsed in a stratified table. @@ -582,7 +622,7 @@ def collapse_table(table, mapping, divide=False, field=None): Raises ------ ValueError - Field index is not present in a feature ID. + A feature ID does not have a suffix or a field. Notes ----- @@ -590,26 +630,49 @@ def collapse_table(table, mapping, divide=False, field=None): """ # redirect to BIOM module if isinstance(table, Table): - return collapse_biom(table, mapping, divide, field) + return collapse_biom(table, mapping, divide, suffix, field) # collapse table samples = table[2] width = len(samples) res = defaultdict(lambda: [0] * width) for datum, feature in zip(*table[:2]): - if field is not None: + + # suffixed feature + if suffix: + left, _, _ = feature.rpartition('_') + if not left: + raise ValueError( + f'Feature "{feature}" does not have a suffix.') + + # get fields + if field is not None: + fields = [left, feature] + + # collapse field to parent + if not field: + feature = left + + # stratified feature + elif field is not None: fields = feature.split('|') try: feature = fields[field] except IndexError: raise ValueError( f'Feature "{feature}" has less than {field + 1} fields.') + + # map features to targets if feature not in mapping: continue targets = mapping[feature] + + # divide feature count by target number if divide: k = 1 / len(targets) datum = [x * k for x in datum] + + # add results to same target for target in targets: if field is not None: fields[field] = target diff --git a/woltka/tests/data/output/bowtie2.orf.tsv b/woltka/tests/data/output/bowtie2.orf.tsv new file mode 100644 index 0000000..f680e72 --- /dev/null +++ b/woltka/tests/data/output/bowtie2.orf.tsv @@ -0,0 +1,4186 @@ +#FeatureID S01 S02 S03 S04 S05 +G000006845_1051 0 0 2 0 0 +G000006845_551 0 0 2 0 0 +G000006845_559 0 0 2 0 0 +G000006845_872 0 0 2 0 0 +G000006925_1330 0 0 2 0 0 +G000006925_1565 0 0 1 0 0 +G000006925_1700 0 0 2 0 0 +G000006925_1786 0 0 2 0 0 +G000006925_1972 0 0 2 0 0 +G000006925_2392 0 0 2 0 0 +G000006925_2901 0 0 1 0 0 +G000006925_2967 0 0 2 0 0 +G000006925_3201 0 2 0 0 0 +G000006925_3295 0 0 2 0 0 +G000006925_3302 0 0 2 0 0 +G000006925_3308 0 0 2 0 0 +G000006925_3350 0 0 2 0 0 +G000006925_3460 0 0 2 0 0 +G000006925_352 0 0 2 0 0 +G000006925_3956 0 2 0 0 0 +G000006925_399 0 2 0 0 0 +G000006925_4286 0 0 2 0 0 +G000006925_4576 0 0 2 0 0 +G000006925_513 0 0 2 0 0 +G000006925_52 0 0 2 0 0 +G000006925_568 0 0 1 0 0 +G000007145_1081 0 0 0 0 2 +G000007145_1113 0 0 0 0 2 +G000007145_1156 0 0 0 0 2 +G000007145_1199 0 0 0 0 2 +G000007145_1313 0 0 0 0 2 +G000007145_1322 0 0 0 0 1 +G000007145_1349 0 0 0 0 2 +G000007145_1464 0 0 0 0 1 +G000007145_1513 0 0 0 0 2 +G000007145_1615 0 0 0 0 2 +G000007145_1818 0 0 0 0 1 +G000007145_1819 0 0 0 0 1 +G000007145_1920 0 0 0 0 2 +G000007145_1934 0 0 0 0 1 +G000007145_2010 0 0 0 0 2 +G000007145_2037 0 0 0 0 2 +G000007145_2097 0 0 0 0 2 +G000007145_2205 0 0 0 0 2 +G000007145_2337 0 0 0 0 2 +G000007145_2375 0 0 0 0 2 +G000007145_2688 0 0 0 0 2 +G000007145_2707 0 0 0 0 1 +G000007145_2779 0 0 0 0 2 +G000007145_3010 0 0 0 0 1 +G000007145_328 0 0 0 0 2 +G000007145_3365 0 0 0 0 1 +G000007145_3390 0 0 0 0 2 +G000007145_3446 0 0 0 0 2 +G000007145_3703 0 0 0 0 2 +G000007145_373 0 0 0 0 2 +G000007145_3758 0 0 0 0 2 +G000007145_3940 0 0 0 0 1 +G000007145_4073 0 0 0 0 2 +G000007145_4194 0 0 0 0 2 +G000007145_482 0 0 0 0 2 +G000007145_873 0 0 0 0 2 +G000007145_895 0 0 0 0 2 +G000007145_924 0 0 0 0 2 +G000007145_947 0 0 0 0 1 +G000007265_1053 0 0 0 2 0 +G000007265_1067 0 0 0 2 0 +G000007265_1684 0 0 0 2 0 +G000007265_2043 0 0 0 2 0 +G000007265_2094 0 0 0 2 0 +G000007265_246 0 0 0 1 0 +G000007265_52 0 0 0 2 0 +G000007265_703 0 0 0 2 0 +G000007265_857 0 0 0 2 0 +G000007265_918 0 0 0 2 0 +G000007265_962 0 0 0 2 0 +G000007325_1052 0 0 0 0 1 +G000007325_107 0 0 0 0 3 +G000007325_1078 0 0 0 0 1 +G000007325_1086 0 2 0 0 0 +G000007325_1087 0 0 0 0 2 +G000007325_1099 0 0 0 0 1 +G000007325_1106 0 0 0 0 1 +G000007325_1123 0 0 0 0 2 +G000007325_1128 0 0 0 0 1 +G000007325_1129 0 0 0 0 1 +G000007325_1134 0 0 0 0 2 +G000007325_1135 0 0 0 0 2 +G000007325_1148 0 0 0 0 1 +G000007325_1154 0 0 0 0 5 +G000007325_1155 0 2 0 0 0 +G000007325_1166 0 0 0 0 2 +G000007325_1187 0 0 0 0 2 +G000007325_1237 0 0 0 0 2 +G000007325_1253 0 0 0 0 1 +G000007325_1256 0 0 0 0 2 +G000007325_1296 0 0 0 0 2 +G000007325_1301 0 0 0 0 1 +G000007325_1313 0 2 0 0 0 +G000007325_136 0 0 0 0 2 +G000007325_1388 0 0 0 0 1 +G000007325_1404 0 0 0 0 2 +G000007325_1413 0 0 0 0 2 +G000007325_1423 0 2 0 0 0 +G000007325_1424 0 0 0 0 1 +G000007325_1429 0 0 0 0 2 +G000007325_145 0 0 0 0 1 +G000007325_1483 0 0 0 0 1 +G000007325_1506 0 0 0 0 2 +G000007325_1513 0 0 0 0 2 +G000007325_153 0 1 0 0 0 +G000007325_1530 0 0 0 0 2 +G000007325_1532 0 0 0 0 2 +G000007325_1538 0 0 0 0 2 +G000007325_1542 0 0 0 0 2 +G000007325_1543 0 0 0 0 4 +G000007325_1551 0 0 0 0 2 +G000007325_1577 0 1 0 0 0 +G000007325_158 0 0 0 0 2 +G000007325_1580 0 0 0 0 2 +G000007325_1641 0 0 0 0 2 +G000007325_1669 0 2 0 0 0 +G000007325_1704 0 1 0 0 0 +G000007325_1708 0 0 0 0 2 +G000007325_1726 0 0 0 0 2 +G000007325_1730 0 0 0 0 2 +G000007325_1762 0 0 0 0 2 +G000007325_1769 0 0 0 0 1 +G000007325_179 0 0 0 0 2 +G000007325_180 0 0 0 0 2 +G000007325_1811 0 0 0 0 2 +G000007325_1812 0 0 0 0 2 +G000007325_1829 0 0 0 0 2 +G000007325_183 0 0 0 0 1 +G000007325_1835 0 0 0 0 3 +G000007325_1838 0 0 0 0 2 +G000007325_1844 0 0 0 0 2 +G000007325_1858 0 0 0 0 2 +G000007325_1867 0 0 0 0 2 +G000007325_188 0 0 0 0 2 +G000007325_189 0 0 0 0 2 +G000007325_1913 0 0 0 0 2 +G000007325_1918 0 0 0 0 2 +G000007325_1930 0 2 0 0 4 +G000007325_1949 0 0 0 0 2 +G000007325_1951 0 0 0 0 2 +G000007325_1956 0 0 0 0 1 +G000007325_1973 0 0 0 0 2 +G000007325_212 0 0 0 0 1 +G000007325_213 0 0 0 0 3 +G000007325_216 0 0 0 0 2 +G000007325_242 0 0 0 0 2 +G000007325_293 0 0 0 0 2 +G000007325_333 0 0 0 0 2 +G000007325_334 0 0 0 0 2 +G000007325_371 0 0 0 0 2 +G000007325_373 0 0 0 0 1 +G000007325_381 0 0 0 0 2 +G000007325_405 0 2 0 0 0 +G000007325_420 0 0 0 0 1 +G000007325_43 0 0 0 0 2 +G000007325_433 0 0 0 0 4 +G000007325_442 0 0 0 0 1 +G000007325_464 0 0 0 0 1 +G000007325_531 0 0 0 0 4 +G000007325_57 0 0 0 0 2 +G000007325_596 0 0 0 0 4 +G000007325_630 0 0 0 0 4 +G000007325_637 0 0 0 0 2 +G000007325_652 0 0 0 0 2 +G000007325_678 0 0 0 0 1 +G000007325_689 0 0 0 0 2 +G000007325_707 0 0 0 0 1 +G000007325_709 0 0 0 0 2 +G000007325_719 0 2 0 0 0 +G000007325_764 0 0 0 0 2 +G000007325_786 0 0 0 0 1 +G000007325_835 0 0 0 0 2 +G000007325_851 0 2 0 0 0 +G000007325_891 0 0 0 0 1 +G000007325_911 0 0 0 0 2 +G000007325_921 0 0 0 0 2 +G000007325_949 0 0 0 0 2 +G000007325_954 0 0 0 0 2 +G000007325_989 0 0 0 0 2 +G000007465_1601 0 2 0 0 0 +G000007465_164 0 2 0 0 0 +G000007465_71 0 2 0 0 0 +G000007525_1418 0 0 0 1 0 +G000007785_160 2 0 0 0 0 +G000007785_1625 2 0 0 0 0 +G000007785_1748 2 0 0 0 0 +G000007785_327 2 0 0 0 0 +G000007785_344 1 0 0 0 0 +G000007845_2998 0 0 2 0 0 +G000007845_3219 0 0 2 0 0 +G000007845_4897 0 0 1 0 0 +G000007985_109 0 0 0 0 2 +G000007985_1110 0 0 0 0 1 +G000007985_1162 0 0 0 0 2 +G000007985_1211 0 0 0 0 1 +G000007985_1308 0 0 0 0 2 +G000007985_1325 0 0 0 0 2 +G000007985_1328 0 0 0 0 2 +G000007985_1360 0 0 0 0 1 +G000007985_1614 0 0 0 0 2 +G000007985_1772 0 0 0 0 2 +G000007985_1907 0 0 0 0 2 +G000007985_1933 0 0 0 0 2 +G000007985_1979 0 0 0 0 2 +G000007985_2122 0 0 0 0 1 +G000007985_2141 0 0 0 0 2 +G000007985_2191 0 0 0 0 2 +G000007985_2197 0 0 0 0 2 +G000007985_2256 0 0 0 0 1 +G000007985_2293 0 0 0 0 2 +G000007985_2419 0 0 0 0 2 +G000007985_2443 0 0 0 0 2 +G000007985_2617 0 0 0 0 2 +G000007985_2628 0 0 0 0 2 +G000007985_2644 0 0 0 0 2 +G000007985_2722 0 0 0 0 1 +G000007985_2787 0 0 0 0 1 +G000007985_2803 0 0 0 0 1 +G000007985_2813 0 0 0 0 1 +G000007985_2817 0 0 0 0 1 +G000007985_2839 0 0 0 0 1 +G000007985_2983 0 0 0 0 2 +G000007985_3084 0 0 0 0 2 +G000007985_3094 0 0 0 0 2 +G000007985_3132 0 0 0 0 1 +G000007985_3163 0 0 0 0 2 +G000007985_319 0 0 0 0 2 +G000007985_3293 0 0 0 0 2 +G000007985_3297 0 0 0 0 2 +G000007985_3344 0 0 0 0 2 +G000007985_3398 0 0 0 0 1 +G000007985_3413 0 0 0 0 2 +G000007985_36 0 0 0 0 1 +G000007985_379 0 0 0 0 2 +G000007985_398 0 0 0 0 2 +G000007985_436 0 0 0 0 1 +G000007985_466 0 0 0 0 2 +G000007985_497 0 0 0 0 1 +G000007985_503 0 0 0 0 2 +G000007985_535 0 0 0 0 2 +G000007985_577 0 0 0 0 1 +G000007985_636 0 0 0 0 1 +G000007985_738 0 0 0 0 2 +G000007985_760 0 0 0 0 2 +G000007985_819 0 0 0 0 2 +G000007985_842 0 0 0 0 2 +G000007985_854 0 0 0 0 2 +G000007985_927 0 0 0 0 2 +G000007985_985 0 0 0 0 2 +G000008165_1309 0 0 2 0 0 +G000008165_2500 0 0 1 0 0 +G000008165_4079 0 0 1 0 0 +G000008165_4540 0 0 2 0 0 +G000008165_4864 0 0 2 0 0 +G000008165_4915 0 0 2 0 0 +G000008505_1671 0 0 0 2 0 +G000008625_1008 0 0 2 0 0 +G000008625_1098 0 0 2 0 0 +G000008625_1131 0 0 2 0 0 +G000008625_1292 0 0 2 0 0 +G000008625_1319 0 0 1 0 0 +G000008625_1325 0 0 2 0 0 +G000008625_1384 0 0 1 0 0 +G000008625_1491 0 0 1 0 0 +G000008625_174 0 0 2 0 0 +G000008625_1771 0 0 1 0 0 +G000008625_186 0 0 2 0 0 +G000008625_201 0 0 1 0 0 +G000008625_22 0 0 2 0 0 +G000008625_227 0 0 1 0 0 +G000008625_317 0 0 2 0 0 +G000008625_328 0 0 1 0 0 +G000008625_329 0 0 1 0 0 +G000008625_366 0 0 3 0 0 +G000008625_618 0 0 2 0 0 +G000008625_792 0 0 2 0 0 +G000008625_826 0 0 1 0 0 +G000008625_872 0 0 2 0 0 +G000008625_926 0 0 2 0 0 +G000008625_993 0 0 2 0 0 +G000008865_1210 0 0 2 0 0 +G000008865_1659 0 0 2 0 0 +G000008865_2853 0 0 1 0 0 +G000008865_3622 0 0 2 0 0 +G000008865_5185 0 0 2 0 0 +G000008865_761 0 0 1 0 0 +G000008865_81 0 0 2 0 0 +G000009065_1900 0 0 2 0 0 +G000009065_1903 0 0 2 0 0 +G000009065_1904 0 2 0 0 0 +G000009345_1008 0 0 6 0 0 +G000009345_1013 0 0 2 0 0 +G000009345_1016 0 0 0 0 2 +G000009345_1028 0 0 2 0 0 +G000009345_1039 0 0 2 0 0 +G000009345_1040 0 0 2 0 0 +G000009345_105 0 0 1 0 0 +G000009345_1055 0 0 2 0 0 +G000009345_1093 0 0 2 0 0 +G000009345_1103 0 0 2 0 0 +G000009345_1125 0 0 2 0 0 +G000009345_1127 0 0 2 0 0 +G000009345_113 0 0 2 0 0 +G000009345_1175 0 0 2 0 0 +G000009345_1187 0 0 2 0 0 +G000009345_1194 0 0 2 0 0 +G000009345_1220 0 0 1 0 0 +G000009345_1254 0 0 2 0 0 +G000009345_1288 0 0 2 0 0 +G000009345_129 0 0 2 0 0 +G000009345_1308 0 0 2 0 0 +G000009345_1329 0 0 2 0 0 +G000009345_1343 0 0 2 0 0 +G000009345_1346 0 0 1 0 0 +G000009345_1347 0 0 2 0 0 +G000009345_136 0 0 2 0 0 +G000009345_1362 0 0 1 0 0 +G000009345_1364 0 0 2 0 0 +G000009345_1365 0 0 1 0 0 +G000009345_1373 0 0 2 0 0 +G000009345_1400 0 0 2 0 0 +G000009345_1402 0 0 2 0 0 +G000009345_141 0 0 2 0 0 +G000009345_1423 0 0 2 0 0 +G000009345_1452 0 0 1 0 0 +G000009345_1471 0 0 2 0 0 +G000009345_1476 0 0 2 0 0 +G000009345_1478 0 0 2 0 0 +G000009345_1484 0 0 1 0 0 +G000009345_1489 0 0 2 0 0 +G000009345_1512 0 0 1 0 0 +G000009345_1519 0 0 2 0 0 +G000009345_1523 0 0 1 0 0 +G000009345_1525 0 0 2 0 0 +G000009345_1529 0 0 1 0 0 +G000009345_153 0 0 2 0 0 +G000009345_1532 0 0 1 0 0 +G000009345_1565 0 0 2 0 0 +G000009345_1597 0 0 2 0 0 +G000009345_1651 0 0 2 0 0 +G000009345_1669 0 0 1 0 0 +G000009345_1682 0 0 2 0 0 +G000009345_169 0 0 1 0 0 +G000009345_1692 0 0 1 0 0 +G000009345_1701 0 0 3 0 0 +G000009345_1720 0 0 2 0 0 +G000009345_1737 0 0 1 0 0 +G000009345_174 0 0 2 0 0 +G000009345_1745 0 0 2 0 0 +G000009345_177 0 0 1 0 0 +G000009345_1806 0 0 2 0 0 +G000009345_1807 0 0 0 0 2 +G000009345_181 0 0 2 0 0 +G000009345_183 0 0 0 0 2 +G000009345_1831 0 0 2 0 0 +G000009345_1853 0 0 2 0 0 +G000009345_1898 0 0 1 0 0 +G000009345_190 0 0 2 0 0 +G000009345_1901 0 0 1 0 0 +G000009345_1936 0 0 2 0 0 +G000009345_1950 0 0 2 0 0 +G000009345_1967 0 0 2 0 0 +G000009345_1979 0 0 2 0 0 +G000009345_2004 0 0 2 0 0 +G000009345_2012 0 0 2 0 0 +G000009345_2030 0 0 2 0 0 +G000009345_2049 0 0 1 0 0 +G000009345_2069 0 0 1 0 0 +G000009345_2079 0 0 2 0 0 +G000009345_2115 0 0 2 0 0 +G000009345_2151 0 0 1 0 0 +G000009345_2169 0 0 1 0 0 +G000009345_2196 0 0 2 0 0 +G000009345_2202 0 0 2 0 0 +G000009345_2215 0 0 4 0 0 +G000009345_2226 0 0 2 0 0 +G000009345_2230 0 0 2 0 0 +G000009345_2237 0 0 2 0 0 +G000009345_2264 0 0 2 0 0 +G000009345_2269 0 0 1 0 0 +G000009345_227 0 0 1 0 0 +G000009345_2324 0 0 1 0 0 +G000009345_2325 0 0 1 0 0 +G000009345_235 0 0 2 0 0 +G000009345_2376 0 0 2 0 0 +G000009345_238 0 0 2 0 0 +G000009345_2424 0 0 2 0 0 +G000009345_2426 0 0 2 0 0 +G000009345_2431 0 0 2 0 0 +G000009345_2447 0 0 2 0 0 +G000009345_2481 0 0 4 0 0 +G000009345_2484 0 0 2 0 0 +G000009345_2489 0 0 2 0 0 +G000009345_2495 0 0 2 0 0 +G000009345_2514 0 0 1 0 0 +G000009345_2516 0 0 2 0 0 +G000009345_2536 0 0 4 0 0 +G000009345_2544 0 0 2 0 0 +G000009345_255 0 0 2 0 0 +G000009345_2558 0 0 1 0 0 +G000009345_2560 0 0 2 0 0 +G000009345_2561 0 0 2 0 0 +G000009345_2563 0 0 2 0 0 +G000009345_2564 0 0 2 0 0 +G000009345_2565 0 0 6 0 0 +G000009345_2591 0 0 2 0 0 +G000009345_2603 0 0 2 0 0 +G000009345_2606 0 0 1 0 0 +G000009345_2608 0 0 2 0 0 +G000009345_2631 0 0 2 0 0 +G000009345_2646 0 0 2 0 0 +G000009345_2647 0 0 1 0 0 +G000009345_2674 0 0 2 0 0 +G000009345_2675 0 0 2 0 0 +G000009345_2686 0 0 2 0 0 +G000009345_2699 0 0 2 0 0 +G000009345_2701 0 0 2 0 0 +G000009345_2731 0 0 2 0 0 +G000009345_2756 0 0 2 0 0 +G000009345_2759 0 0 2 0 0 +G000009345_2762 0 0 2 0 0 +G000009345_2777 0 0 2 0 0 +G000009345_2837 0 0 2 0 0 +G000009345_286 0 0 2 0 0 +G000009345_2924 0 0 1 0 0 +G000009345_293 0 0 2 0 0 +G000009345_2939 0 0 2 0 0 +G000009345_2940 0 0 1 0 0 +G000009345_2997 0 0 1 0 0 +G000009345_3005 0 0 2 0 0 +G000009345_3008 0 0 2 0 0 +G000009345_3014 0 0 2 0 0 +G000009345_3024 0 0 2 0 0 +G000009345_3048 0 0 1 0 0 +G000009345_3057 0 0 2 0 0 +G000009345_3094 0 0 2 0 0 +G000009345_311 0 0 2 0 0 +G000009345_3115 0 0 1 0 0 +G000009345_313 0 0 2 0 0 +G000009345_3134 0 0 2 0 0 +G000009345_3178 0 0 2 0 0 +G000009345_3180 0 0 2 0 0 +G000009345_319 0 0 2 0 0 +G000009345_3197 0 0 2 0 0 +G000009345_3237 0 0 2 0 0 +G000009345_3243 0 0 2 0 0 +G000009345_3262 0 0 2 0 0 +G000009345_3276 0 0 2 0 0 +G000009345_3309 0 0 2 0 0 +G000009345_3311 0 0 2 0 0 +G000009345_332 0 0 4 0 0 +G000009345_3321 0 0 2 0 0 +G000009345_3333 0 0 2 0 0 +G000009345_3336 0 0 1 0 0 +G000009345_3337 0 0 2 0 0 +G000009345_3354 0 0 2 0 0 +G000009345_3357 0 0 2 0 0 +G000009345_3393 0 0 2 0 0 +G000009345_3433 0 0 2 0 0 +G000009345_3437 0 0 2 0 0 +G000009345_3445 0 0 2 0 0 +G000009345_3448 0 0 2 0 0 +G000009345_3506 0 0 1 0 0 +G000009345_3539 0 0 2 0 0 +G000009345_3543 0 0 4 0 0 +G000009345_3555 0 0 2 0 0 +G000009345_3563 0 0 2 0 0 +G000009345_3618 0 0 2 0 0 +G000009345_3625 0 0 2 0 0 +G000009345_3665 0 0 2 0 0 +G000009345_3685 0 0 1 0 0 +G000009345_3703 0 0 2 0 0 +G000009345_372 0 0 1 0 0 +G000009345_3725 0 0 2 0 0 +G000009345_3728 0 0 2 0 0 +G000009345_3750 0 0 2 0 0 +G000009345_3751 0 0 2 0 0 +G000009345_3752 0 0 2 0 0 +G000009345_376 0 0 1 0 0 +G000009345_3760 0 0 2 0 0 +G000009345_3764 0 0 2 0 0 +G000009345_3780 0 0 2 0 0 +G000009345_3813 0 0 2 0 0 +G000009345_3829 0 0 3 0 0 +G000009345_3836 0 0 1 0 0 +G000009345_3840 0 0 2 0 0 +G000009345_3861 0 0 2 0 0 +G000009345_3902 0 0 1 0 0 +G000009345_3904 0 0 1 0 0 +G000009345_3924 0 0 2 0 0 +G000009345_3937 0 0 2 0 0 +G000009345_3956 0 0 1 0 0 +G000009345_3964 0 0 2 0 0 +G000009345_3987 0 0 2 0 0 +G000009345_3992 0 0 2 0 0 +G000009345_4005 0 0 3 0 0 +G000009345_4019 0 0 1 0 0 +G000009345_4021 0 0 2 0 0 +G000009345_4024 0 0 2 0 0 +G000009345_4030 0 0 1 0 0 +G000009345_4034 0 0 1 0 0 +G000009345_4076 0 0 2 0 0 +G000009345_4086 0 0 2 0 0 +G000009345_4087 0 0 2 0 0 +G000009345_410 0 0 2 0 0 +G000009345_4111 0 0 2 0 0 +G000009345_4113 0 0 2 0 0 +G000009345_4136 0 0 2 0 0 +G000009345_4138 0 0 2 0 0 +G000009345_4143 0 0 2 0 0 +G000009345_4187 0 0 2 0 0 +G000009345_4198 0 0 2 0 0 +G000009345_4241 0 0 1 0 0 +G000009345_433 0 0 2 0 0 +G000009345_452 0 0 1 0 0 +G000009345_460 0 0 2 0 0 +G000009345_461 0 0 2 0 0 +G000009345_467 0 0 2 0 0 +G000009345_49 0 0 2 0 0 +G000009345_507 0 0 2 0 0 +G000009345_518 0 0 2 0 0 +G000009345_528 0 0 2 0 0 +G000009345_555 0 0 2 0 0 +G000009345_562 0 0 1 0 0 +G000009345_569 0 0 2 0 0 +G000009345_573 0 0 1 0 0 +G000009345_586 0 0 2 0 0 +G000009345_599 0 0 1 0 0 +G000009345_6 0 0 2 0 0 +G000009345_646 0 0 2 0 0 +G000009345_670 0 0 2 0 0 +G000009345_676 0 0 2 0 0 +G000009345_678 0 0 2 0 0 +G000009345_683 0 0 2 0 0 +G000009345_697 0 0 2 0 0 +G000009345_714 0 0 2 0 0 +G000009345_760 0 0 2 0 0 +G000009345_764 0 0 2 0 0 +G000009345_788 0 0 2 0 0 +G000009345_798 0 0 2 0 0 +G000009345_806 0 0 2 0 0 +G000009345_810 0 0 2 0 0 +G000009345_838 0 0 2 0 0 +G000009345_848 0 0 2 0 0 +G000009345_889 0 0 1 0 0 +G000009345_921 0 0 2 0 0 +G000009345_991 0 0 2 0 0 +G000009925_1025 0 1 0 0 0 +G000009925_1090 0 2 0 0 0 +G000009925_1110 0 1 0 0 0 +G000009925_1131 0 2 0 0 0 +G000009925_1173 0 2 0 0 0 +G000009925_1180 0 2 0 0 0 +G000009925_1184 0 2 0 0 0 +G000009925_1190 0 2 0 0 0 +G000009925_1224 0 2 0 0 0 +G000009925_129 0 2 0 0 0 +G000009925_1407 0 1 0 0 0 +G000009925_1419 0 2 0 0 0 +G000009925_1445 0 3 0 0 0 +G000009925_1478 0 2 0 0 0 +G000009925_1480 0 2 0 0 0 +G000009925_1515 0 2 0 0 0 +G000009925_1550 0 2 0 0 0 +G000009925_1551 0 1 0 0 0 +G000009925_1570 0 2 0 0 0 +G000009925_1572 0 2 0 0 0 +G000009925_1635 0 2 0 0 0 +G000009925_1652 0 2 0 0 0 +G000009925_1657 0 2 0 0 0 +G000009925_1667 0 1 0 0 0 +G000009925_1684 0 2 0 0 0 +G000009925_1718 0 1 0 0 0 +G000009925_1766 0 2 0 0 0 +G000009925_1775 0 2 0 0 0 +G000009925_1792 0 2 0 0 0 +G000009925_1800 0 2 0 0 0 +G000009925_1807 0 2 0 0 0 +G000009925_1840 0 2 0 0 0 +G000009925_1900 0 2 0 0 0 +G000009925_1918 0 2 0 0 0 +G000009925_1944 0 1 0 0 0 +G000009925_1958 0 1 0 0 0 +G000009925_1985 0 2 0 0 0 +G000009925_2018 0 1 0 0 0 +G000009925_204 0 2 0 0 0 +G000009925_2097 0 2 0 0 0 +G000009925_2140 0 2 0 0 0 +G000009925_2166 0 2 0 0 0 +G000009925_217 0 2 0 0 0 +G000009925_2195 0 1 0 0 0 +G000009925_2214 0 1 0 0 0 +G000009925_2284 0 2 0 0 0 +G000009925_2339 0 2 0 0 0 +G000009925_2506 0 2 0 0 0 +G000009925_2526 0 2 0 0 0 +G000009925_2594 0 2 0 0 0 +G000009925_2688 0 1 0 0 0 +G000009925_2750 0 1 0 0 0 +G000009925_2767 0 2 0 0 0 +G000009925_281 0 2 0 0 0 +G000009925_283 0 1 0 0 0 +G000009925_2928 0 1 0 0 0 +G000009925_2934 0 2 0 0 0 +G000009925_2944 0 2 0 0 0 +G000009925_3007 0 2 0 0 0 +G000009925_3026 0 2 0 0 0 +G000009925_318 0 2 0 0 0 +G000009925_3197 0 2 0 0 0 +G000009925_3224 0 2 0 0 0 +G000009925_3264 0 2 0 0 0 +G000009925_3296 0 2 0 0 0 +G000009925_3300 0 2 0 0 0 +G000009925_3333 0 1 0 0 0 +G000009925_3364 0 2 0 0 0 +G000009925_3389 0 1 0 0 0 +G000009925_3469 0 1 0 0 0 +G000009925_3475 0 2 0 0 0 +G000009925_3523 0 1 0 0 0 +G000009925_3530 0 2 0 0 0 +G000009925_3562 0 1 0 0 0 +G000009925_3649 0 1 0 0 0 +G000009925_3656 0 2 0 0 0 +G000009925_3667 0 2 0 0 0 +G000009925_3677 0 2 0 0 0 +G000009925_3712 0 2 0 0 0 +G000009925_3727 0 2 0 0 0 +G000009925_3731 0 2 0 0 0 +G000009925_3771 0 2 0 0 0 +G000009925_3809 0 2 0 0 0 +G000009925_3847 0 4 0 0 0 +G000009925_3862 0 2 0 0 0 +G000009925_3875 0 1 0 0 0 +G000009925_3926 0 2 0 0 0 +G000009925_411 0 2 0 0 0 +G000009925_4137 0 2 0 0 0 +G000009925_4141 0 2 0 0 0 +G000009925_4142 0 1 0 0 0 +G000009925_415 0 1 0 0 0 +G000009925_4207 0 4 0 0 0 +G000009925_4218 0 2 0 0 0 +G000009925_4240 0 1 0 0 0 +G000009925_4318 0 4 0 0 0 +G000009925_4322 0 2 0 0 0 +G000009925_4367 0 2 0 0 0 +G000009925_508 0 2 0 0 0 +G000009925_520 0 2 0 0 0 +G000009925_546 0 1 0 0 0 +G000009925_580 0 2 0 0 0 +G000009925_615 0 2 0 0 0 +G000009925_637 0 2 0 0 0 +G000009925_678 0 2 0 0 0 +G000009925_695 0 2 0 0 0 +G000009925_703 0 2 0 0 0 +G000009925_705 0 2 0 0 0 +G000009925_714 0 2 0 0 0 +G000009925_724 0 2 0 0 0 +G000009925_753 0 1 0 0 0 +G000009925_788 0 1 0 0 0 +G000009925_831 0 2 0 0 0 +G000009925_843 0 2 0 0 0 +G000009925_880 0 2 0 0 0 +G000009925_883 0 2 0 0 0 +G000009925_884 0 1 0 0 0 +G000009925_909 0 1 0 0 0 +G000009925_919 0 2 0 0 0 +G000011545_1054 2 0 0 0 0 +G000011545_1106 1 0 0 0 0 +G000011545_1122 2 0 0 0 0 +G000011545_1223 2 0 0 0 0 +G000011545_1228 2 0 0 0 0 +G000011545_1492 2 0 0 0 0 +G000011545_1546 2 0 0 0 0 +G000011545_1928 2 0 0 0 0 +G000011545_2043 2 0 0 0 0 +G000011545_2326 2 0 0 0 0 +G000011545_2687 2 0 0 0 0 +G000011545_2784 0 0 1 0 0 +G000011545_2854 0 0 2 0 0 +G000011545_2982 1 0 0 0 0 +G000011545_3045 2 0 0 0 0 +G000011545_3269 0 0 1 0 0 +G000011545_3654 2 0 0 0 0 +G000011545_3681 2 0 0 0 0 +G000011545_3818 1 0 0 0 0 +G000011545_4151 1 0 0 0 0 +G000011545_4335 2 0 0 0 0 +G000011545_4775 2 0 0 0 0 +G000011545_480 0 0 2 0 0 +G000011545_4984 0 0 2 0 0 +G000011545_5057 2 0 0 0 0 +G000011545_5545 2 0 0 0 0 +G000011545_5547 2 0 0 0 0 +G000011545_5879 2 0 0 0 0 +G000011705_1031 0 0 2 0 0 +G000011705_1079 1 0 0 0 0 +G000011705_1125 2 0 0 0 0 +G000011705_135 0 0 2 0 0 +G000011705_1414 2 0 0 0 0 +G000011705_1426 1 0 0 0 0 +G000011705_1450 2 0 0 0 0 +G000011705_1457 2 0 0 0 0 +G000011705_1523 0 0 2 0 0 +G000011705_1558 1 0 0 0 0 +G000011705_1595 0 0 2 0 0 +G000011705_1599 2 0 0 0 0 +G000011705_1614 0 0 2 0 0 +G000011705_1622 1 0 0 0 0 +G000011705_1683 2 0 0 0 0 +G000011705_1705 2 0 0 0 0 +G000011705_1711 1 0 0 0 0 +G000011705_1847 0 0 2 0 0 +G000011705_198 0 0 2 0 0 +G000011705_1984 0 0 2 0 0 +G000011705_2210 2 0 0 0 0 +G000011705_2244 2 0 0 0 0 +G000011705_25 0 0 2 0 0 +G000011705_2540 2 0 0 0 0 +G000011705_2566 2 0 0 0 0 +G000011705_2594 2 0 0 0 0 +G000011705_2628 0 0 2 0 0 +G000011705_2668 0 0 1 0 0 +G000011705_2692 2 0 0 0 0 +G000011705_2896 2 0 0 0 0 +G000011705_2916 2 0 0 0 0 +G000011705_2919 2 0 0 0 0 +G000011705_3030 1 0 0 0 0 +G000011705_314 2 0 0 0 0 +G000011705_3223 2 0 0 0 0 +G000011705_3274 2 0 0 0 0 +G000011705_3279 2 0 0 0 0 +G000011705_3284 2 0 0 0 0 +G000011705_3351 2 0 0 0 0 +G000011705_3443 0 0 2 0 0 +G000011705_3460 2 0 0 0 0 +G000011705_3522 2 0 0 0 0 +G000011705_3570 2 0 0 0 0 +G000011705_3719 0 0 2 0 0 +G000011705_3855 2 0 0 0 0 +G000011705_389 2 0 0 0 0 +G000011705_3969 2 0 0 0 0 +G000011705_3973 1 0 0 0 0 +G000011705_4020 2 0 0 0 0 +G000011705_4030 1 0 0 0 0 +G000011705_407 2 0 0 0 0 +G000011705_4086 2 0 0 0 0 +G000011705_4099 2 0 0 0 0 +G000011705_4126 2 0 0 0 0 +G000011705_4199 1 0 0 0 0 +G000011705_4644 2 0 0 0 0 +G000011705_4652 1 0 0 0 0 +G000011705_4689 0 0 2 0 0 +G000011705_4697 4 0 0 0 0 +G000011705_4789 1 0 0 0 0 +G000011705_4818 2 0 0 0 0 +G000011705_4833 2 0 0 0 0 +G000011705_4922 2 0 0 0 0 +G000011705_4977 0 0 2 0 0 +G000011705_498 2 0 0 0 0 +G000011705_532 2 0 0 0 0 +G000011705_593 2 0 0 0 0 +G000011705_782 2 0 0 0 0 +G000011705_828 2 0 0 0 0 +G000011705_844 2 0 0 0 0 +G000011705_853 2 0 0 0 0 +G000011705_922 1 0 0 0 0 +G000011985_1084 0 0 1 0 0 +G000011985_1193 0 0 1 0 0 +G000011985_1195 0 0 1 0 0 +G000011985_1391 0 0 2 0 0 +G000011985_1395 0 0 2 0 0 +G000011985_1407 0 0 1 0 0 +G000011985_212 0 0 2 0 0 +G000011985_443 0 0 2 0 0 +G000011985_531 0 0 1 0 0 +G000011985_629 0 0 2 0 0 +G000012005_188 0 0 1 0 0 +G000012005_205 0 0 2 0 0 +G000012005_2575 0 0 1 0 0 +G000012005_3009 0 0 2 0 0 +G000012005_3350 0 0 1 0 0 +G000012005_409 0 0 2 0 0 +G000012005_4326 0 0 2 0 0 +G000012005_4705 0 0 2 0 0 +G000012005_4708 0 0 2 0 0 +G000014205_119 0 2 0 0 0 +G000014205_1456 0 2 0 0 0 +G000014205_330 0 2 0 0 0 +G000014525_1009 0 0 0 0 2 +G000014525_172 0 0 0 0 1 +G000014525_2120 0 0 0 0 2 +G000014525_2480 0 0 0 0 1 +G000014525_2530 0 0 0 0 2 +G000014525_2600 0 0 0 0 2 +G000014525_530 0 0 0 0 1 +G000014805_1008 0 0 0 0 1 +G000014805_1014 0 0 0 0 2 +G000014805_1016 0 0 0 0 2 +G000014805_1022 0 0 0 0 1 +G000014805_1023 0 0 0 0 2 +G000014805_1025 0 0 0 0 4 +G000014805_1033 0 0 0 0 2 +G000014805_1036 0 0 0 0 2 +G000014805_1046 0 0 0 0 2 +G000014805_1055 0 0 0 0 2 +G000014805_1060 0 0 0 0 2 +G000014805_107 0 0 0 0 2 +G000014805_1074 0 0 0 0 2 +G000014805_1082 0 0 0 0 2 +G000014805_1116 0 0 0 0 2 +G000014805_1145 0 0 0 0 1 +G000014805_1159 0 0 0 0 2 +G000014805_1162 0 0 0 0 1 +G000014805_1175 0 0 0 0 2 +G000014805_1182 0 0 0 0 1 +G000014805_1184 0 0 0 0 2 +G000014805_1186 0 0 0 0 2 +G000014805_1197 0 0 0 0 2 +G000014805_1207 0 0 0 0 3 +G000014805_1213 0 0 0 0 2 +G000014805_1223 0 0 0 0 1 +G000014805_1224 0 0 0 0 1 +G000014805_1259 0 0 0 0 1 +G000014805_1260 0 0 0 0 1 +G000014805_1268 0 0 0 0 4 +G000014805_1270 0 0 0 0 3 +G000014805_1272 0 0 0 0 2 +G000014805_1313 0 0 0 0 2 +G000014805_1337 0 0 0 0 1 +G000014805_1338 0 0 0 0 2 +G000014805_1342 0 0 0 0 1 +G000014805_1345 0 0 0 0 2 +G000014805_1347 0 0 0 0 2 +G000014805_1349 0 0 0 0 2 +G000014805_1357 0 0 0 0 2 +G000014805_1362 0 0 0 0 3 +G000014805_1370 0 0 0 0 2 +G000014805_1388 0 0 0 0 2 +G000014805_139 0 0 0 0 2 +G000014805_1410 0 0 0 0 2 +G000014805_1412 0 0 0 0 2 +G000014805_1419 0 0 0 0 2 +G000014805_1424 0 0 0 0 2 +G000014805_1466 0 0 0 0 1 +G000014805_1477 0 0 0 0 2 +G000014805_1481 0 0 0 0 2 +G000014805_1492 0 0 0 0 1 +G000014805_1507 0 0 0 0 2 +G000014805_1508 0 0 0 0 2 +G000014805_1509 0 0 0 0 2 +G000014805_1514 0 0 0 0 2 +G000014805_1519 0 0 0 0 1 +G000014805_1535 0 0 0 0 2 +G000014805_1549 0 0 0 0 5 +G000014805_1557 0 0 0 0 2 +G000014805_1570 0 0 0 0 2 +G000014805_1577 0 0 0 0 1 +G000014805_1593 0 0 0 0 2 +G000014805_1601 0 0 0 0 2 +G000014805_1613 0 0 0 0 2 +G000014805_1627 0 0 0 0 1 +G000014805_1639 0 0 0 0 2 +G000014805_1651 0 0 0 0 2 +G000014805_1677 0 0 0 0 2 +G000014805_1711 0 0 0 0 2 +G000014805_1712 0 0 0 0 2 +G000014805_173 0 0 0 0 2 +G000014805_1753 0 0 0 0 2 +G000014805_1767 0 0 0 0 2 +G000014805_177 0 0 0 0 1 +G000014805_1771 0 0 0 0 2 +G000014805_179 0 0 0 0 2 +G000014805_1796 0 0 0 0 2 +G000014805_180 0 0 0 0 1 +G000014805_1808 0 0 0 0 2 +G000014805_1809 0 0 0 0 1 +G000014805_181 0 0 0 0 2 +G000014805_1813 0 0 0 0 2 +G000014805_1825 0 0 0 0 2 +G000014805_1828 0 0 0 0 2 +G000014805_185 0 0 0 0 4 +G000014805_1858 0 0 0 0 2 +G000014805_188 0 0 0 0 2 +G000014805_1884 0 0 0 0 2 +G000014805_1886 0 0 0 0 1 +G000014805_1887 0 0 0 0 1 +G000014805_1888 0 0 0 0 1 +G000014805_19 0 0 0 0 2 +G000014805_1919 0 0 0 0 2 +G000014805_1925 0 0 0 0 2 +G000014805_1940 0 0 0 0 2 +G000014805_1947 0 0 0 0 2 +G000014805_1949 0 0 0 0 2 +G000014805_1953 0 0 0 0 4 +G000014805_1967 0 0 0 0 2 +G000014805_1975 0 0 0 0 1 +G000014805_1985 0 0 0 0 2 +G000014805_2030 0 0 0 0 2 +G000014805_2031 0 0 0 0 2 +G000014805_2037 0 0 0 0 2 +G000014805_2044 0 0 0 0 1 +G000014805_2063 0 0 0 0 2 +G000014805_2065 0 0 0 0 2 +G000014805_2070 0 0 0 0 2 +G000014805_2072 0 0 0 0 2 +G000014805_2077 0 0 0 0 2 +G000014805_2081 0 0 0 0 2 +G000014805_2086 0 0 0 0 4 +G000014805_2095 0 0 0 0 1 +G000014805_2098 0 0 0 0 2 +G000014805_2109 0 0 0 0 2 +G000014805_2115 0 0 0 0 2 +G000014805_2128 0 0 0 0 2 +G000014805_2130 0 0 0 0 2 +G000014805_2133 0 0 0 0 2 +G000014805_2137 0 0 0 0 2 +G000014805_2142 0 0 0 0 2 +G000014805_2160 0 0 0 0 2 +G000014805_2170 0 0 0 0 2 +G000014805_2174 0 0 0 0 2 +G000014805_2188 0 0 0 0 2 +G000014805_219 0 0 0 0 2 +G000014805_2191 0 0 0 0 2 +G000014805_2196 0 0 0 0 1 +G000014805_2199 0 0 0 0 2 +G000014805_22 0 0 0 0 2 +G000014805_220 0 0 0 0 2 +G000014805_2204 0 0 0 0 2 +G000014805_2213 0 0 0 0 2 +G000014805_2239 0 0 0 0 4 +G000014805_225 0 0 0 0 2 +G000014805_2256 0 0 0 0 2 +G000014805_2259 0 0 0 0 2 +G000014805_2262 0 0 0 0 1 +G000014805_227 0 0 0 0 2 +G000014805_2274 0 0 0 0 1 +G000014805_2285 0 0 0 0 1 +G000014805_230 0 0 0 0 2 +G000014805_2312 0 0 0 0 2 +G000014805_2385 0 0 0 0 4 +G000014805_2393 0 0 0 0 2 +G000014805_240 0 0 0 0 2 +G000014805_2400 0 0 0 0 1 +G000014805_2411 0 0 0 0 4 +G000014805_2422 0 0 0 0 2 +G000014805_2426 0 0 0 0 2 +G000014805_2437 0 0 0 0 2 +G000014805_2439 0 0 0 0 2 +G000014805_2446 0 0 0 0 2 +G000014805_2453 0 0 0 0 2 +G000014805_2455 0 0 0 0 2 +G000014805_2457 0 0 0 0 4 +G000014805_2476 0 0 0 0 1 +G000014805_2479 0 0 0 0 2 +G000014805_2497 0 0 0 0 2 +G000014805_252 0 0 0 0 2 +G000014805_2547 0 0 0 0 2 +G000014805_2572 0 0 0 0 1 +G000014805_2582 0 0 0 0 2 +G000014805_2585 0 0 0 0 2 +G000014805_2587 0 0 0 0 4 +G000014805_2590 0 0 0 0 2 +G000014805_2601 0 0 0 0 4 +G000014805_2603 0 0 0 0 2 +G000014805_2606 0 0 0 0 2 +G000014805_2609 0 0 0 0 2 +G000014805_2611 0 0 0 0 2 +G000014805_2612 0 0 0 0 1 +G000014805_2622 0 0 0 0 2 +G000014805_2624 0 0 0 0 3 +G000014805_2629 0 0 0 0 1 +G000014805_2645 0 0 0 0 2 +G000014805_2647 0 0 0 0 2 +G000014805_2653 0 0 0 0 1 +G000014805_2669 0 0 0 0 6 +G000014805_267 0 0 0 0 2 +G000014805_2676 0 0 0 0 2 +G000014805_2679 0 0 0 0 1 +G000014805_2694 0 0 0 0 2 +G000014805_2695 0 0 0 0 2 +G000014805_2730 0 0 0 0 2 +G000014805_2733 0 0 0 0 2 +G000014805_274 0 0 0 0 1 +G000014805_2757 0 0 0 0 2 +G000014805_277 0 0 0 0 2 +G000014805_2772 0 0 0 0 2 +G000014805_2777 0 0 0 0 2 +G000014805_2782 0 0 0 0 1 +G000014805_2783 0 0 0 0 1 +G000014805_2786 0 0 0 0 1 +G000014805_2787 0 0 0 0 2 +G000014805_2790 0 0 0 0 1 +G000014805_2803 0 0 0 0 2 +G000014805_2809 0 0 0 0 2 +G000014805_2818 0 0 0 0 2 +G000014805_2822 0 0 0 0 2 +G000014805_283 0 0 0 0 1 +G000014805_2841 0 0 0 0 2 +G000014805_2847 0 0 0 0 2 +G000014805_2868 0 0 0 0 1 +G000014805_2872 0 0 0 0 2 +G000014805_2916 0 0 0 0 4 +G000014805_2927 0 0 0 0 2 +G000014805_2930 0 0 0 0 1 +G000014805_2932 0 0 0 0 1 +G000014805_2937 0 0 0 0 2 +G000014805_2947 0 0 0 0 2 +G000014805_2958 0 0 0 0 2 +G000014805_2971 0 0 0 0 1 +G000014805_2974 0 0 0 0 2 +G000014805_2985 0 0 0 0 1 +G000014805_2986 0 0 0 0 2 +G000014805_2988 0 0 0 0 2 +G000014805_2999 0 0 0 0 2 +G000014805_3004 0 0 0 0 2 +G000014805_3010 0 0 0 0 2 +G000014805_3021 0 0 0 0 1 +G000014805_3026 0 0 0 0 2 +G000014805_3035 0 0 0 0 2 +G000014805_3037 0 0 0 0 2 +G000014805_305 0 0 0 0 1 +G000014805_3053 0 0 0 0 2 +G000014805_3054 0 0 0 0 1 +G000014805_306 0 0 0 0 1 +G000014805_3067 0 0 0 0 2 +G000014805_3074 0 0 0 0 2 +G000014805_3077 0 0 0 0 1 +G000014805_3079 0 0 0 0 2 +G000014805_3091 0 0 0 0 2 +G000014805_3102 0 0 0 0 2 +G000014805_3119 0 0 0 0 2 +G000014805_3127 0 0 0 0 2 +G000014805_3130 0 0 0 0 2 +G000014805_3137 0 0 0 0 1 +G000014805_3148 0 0 0 0 1 +G000014805_3165 0 0 0 0 2 +G000014805_3168 0 0 0 0 1 +G000014805_3169 0 0 0 0 2 +G000014805_3176 0 0 0 0 2 +G000014805_3183 0 0 0 0 2 +G000014805_3190 0 0 0 0 2 +G000014805_3203 0 0 0 0 2 +G000014805_3224 0 0 0 0 3 +G000014805_3229 0 0 0 0 1 +G000014805_3240 0 0 0 0 2 +G000014805_3258 0 0 0 0 2 +G000014805_3260 0 0 0 0 2 +G000014805_3265 0 0 0 0 2 +G000014805_3267 0 0 0 0 2 +G000014805_327 0 0 0 0 1 +G000014805_3276 0 0 0 0 1 +G000014805_3277 0 0 0 0 2 +G000014805_3288 0 0 0 0 2 +G000014805_330 0 0 0 0 1 +G000014805_3334 0 0 0 0 2 +G000014805_3351 0 0 0 0 2 +G000014805_3369 0 0 0 0 2 +G000014805_3372 0 0 0 0 2 +G000014805_3377 0 0 0 0 2 +G000014805_3379 0 0 0 0 1 +G000014805_3382 0 0 0 0 3 +G000014805_3384 0 0 0 0 1 +G000014805_3393 0 0 0 0 2 +G000014805_3395 0 0 0 0 2 +G000014805_3408 0 0 0 0 2 +G000014805_3435 0 0 0 0 1 +G000014805_3441 0 0 0 0 4 +G000014805_3444 0 0 0 0 2 +G000014805_3458 0 0 0 0 2 +G000014805_3459 0 0 0 0 2 +G000014805_3470 0 0 0 0 2 +G000014805_3475 0 0 0 0 2 +G000014805_3476 0 0 0 0 2 +G000014805_3484 0 0 0 0 2 +G000014805_3498 0 0 0 0 1 +G000014805_3501 0 0 0 0 2 +G000014805_3510 0 0 0 0 2 +G000014805_3511 0 0 0 0 2 +G000014805_3520 0 0 0 0 2 +G000014805_3527 0 0 0 0 2 +G000014805_3537 0 0 0 0 2 +G000014805_3543 0 0 0 0 2 +G000014805_3545 0 0 0 0 2 +G000014805_355 0 0 0 0 2 +G000014805_3556 0 0 0 0 2 +G000014805_3570 0 0 0 0 2 +G000014805_362 0 0 0 0 2 +G000014805_3632 0 0 0 0 2 +G000014805_364 0 0 0 0 2 +G000014805_3642 0 0 0 0 2 +G000014805_3676 0 0 0 0 1 +G000014805_369 0 0 0 0 2 +G000014805_3692 0 0 0 0 2 +G000014805_3695 0 0 0 0 2 +G000014805_37 0 0 0 0 2 +G000014805_3704 0 0 0 0 1 +G000014805_3706 0 0 0 0 1 +G000014805_3728 0 0 0 0 4 +G000014805_3736 0 0 0 0 2 +G000014805_3745 0 0 0 0 2 +G000014805_3747 0 0 0 0 2 +G000014805_3767 0 0 0 0 2 +G000014805_3777 0 0 0 0 2 +G000014805_3789 0 0 0 0 2 +G000014805_3801 0 0 0 0 2 +G000014805_3802 0 0 0 0 2 +G000014805_3807 0 0 0 0 2 +G000014805_3826 0 0 0 0 1 +G000014805_3827 0 0 0 0 2 +G000014805_3839 0 0 0 0 1 +G000014805_3859 0 0 0 0 2 +G000014805_3892 0 0 0 0 2 +G000014805_3905 0 0 0 0 2 +G000014805_3906 0 0 0 0 2 +G000014805_3915 0 0 0 0 2 +G000014805_3918 0 0 0 0 2 +G000014805_392 0 0 0 0 2 +G000014805_3939 0 0 0 0 4 +G000014805_3960 0 0 0 0 2 +G000014805_3968 0 0 0 0 3 +G000014805_3985 0 0 0 0 2 +G000014805_4027 0 0 0 0 1 +G000014805_4049 0 0 0 0 2 +G000014805_4054 0 0 0 0 1 +G000014805_4058 0 0 0 0 2 +G000014805_4063 0 0 0 0 2 +G000014805_4067 0 0 0 0 2 +G000014805_4091 0 0 0 0 2 +G000014805_4107 0 0 0 0 1 +G000014805_4120 0 0 0 0 2 +G000014805_4121 0 0 0 0 1 +G000014805_4122 0 0 0 0 1 +G000014805_4128 0 0 0 0 2 +G000014805_4148 0 0 0 0 2 +G000014805_4153 0 0 0 0 2 +G000014805_422 0 0 0 0 1 +G000014805_451 0 0 0 0 2 +G000014805_453 0 0 0 0 2 +G000014805_471 0 0 0 0 1 +G000014805_475 0 0 0 0 2 +G000014805_477 0 0 0 0 2 +G000014805_493 0 0 0 0 2 +G000014805_496 0 0 0 0 2 +G000014805_520 0 0 0 0 2 +G000014805_522 0 0 0 0 2 +G000014805_54 0 0 0 0 2 +G000014805_541 0 0 0 0 2 +G000014805_550 0 0 0 0 2 +G000014805_560 0 0 0 0 2 +G000014805_574 0 0 0 0 2 +G000014805_583 0 0 0 0 2 +G000014805_59 0 0 0 0 2 +G000014805_61 0 0 0 0 2 +G000014805_612 0 0 0 0 2 +G000014805_628 0 0 0 0 1 +G000014805_63 0 0 0 0 1 +G000014805_642 0 0 0 0 1 +G000014805_652 0 0 0 0 2 +G000014805_657 0 0 0 0 1 +G000014805_674 0 0 0 0 2 +G000014805_682 0 0 0 0 2 +G000014805_688 0 0 0 0 2 +G000014805_714 0 0 0 0 2 +G000014805_720 0 0 0 0 2 +G000014805_730 0 0 0 0 2 +G000014805_737 0 0 0 0 1 +G000014805_74 0 0 0 0 2 +G000014805_742 0 0 0 0 2 +G000014805_745 0 0 0 0 2 +G000014805_750 0 0 0 0 2 +G000014805_751 0 0 0 0 2 +G000014805_752 0 0 0 0 2 +G000014805_770 0 0 0 0 2 +G000014805_805 0 0 0 0 3 +G000014805_823 0 0 0 0 2 +G000014805_825 0 0 0 0 2 +G000014805_842 0 0 0 0 2 +G000014805_844 0 0 0 0 2 +G000014805_845 0 0 0 0 1 +G000014805_85 0 0 0 0 1 +G000014805_861 0 0 0 0 1 +G000014805_864 0 0 0 0 2 +G000014805_867 0 0 0 0 2 +G000014805_875 0 0 0 0 2 +G000014805_888 0 0 0 0 1 +G000014805_893 0 0 0 0 2 +G000014805_899 0 0 0 0 1 +G000014805_901 0 0 0 0 2 +G000014805_905 0 0 0 0 2 +G000014805_907 0 0 0 0 2 +G000014805_911 0 0 0 0 2 +G000014805_923 0 0 0 0 2 +G000014805_948 0 0 0 0 1 +G000014805_950 0 0 0 0 1 +G000014805_963 0 0 0 0 1 +G000014805_968 0 0 0 0 2 +G000014805_977 0 0 0 0 2 +G000015005_1110 1 0 0 0 0 +G000015005_12 2 0 0 0 0 +G000015005_120 2 0 0 0 0 +G000015005_1256 2 0 0 0 0 +G000015005_1406 2 0 0 0 0 +G000015005_1447 2 0 0 0 0 +G000015005_1478 2 0 0 0 0 +G000015005_1494 2 0 0 0 0 +G000015005_1549 1 0 0 0 0 +G000015005_1638 1 0 0 0 0 +G000015005_1839 2 0 0 0 0 +G000015005_1844 2 0 0 0 0 +G000015005_1848 2 0 0 0 0 +G000015005_2066 2 0 0 0 0 +G000015005_2118 2 0 0 0 0 +G000015005_2216 1 0 0 0 0 +G000015005_2316 2 0 0 0 0 +G000015005_2328 2 0 0 0 0 +G000015005_2396 2 0 0 0 0 +G000015005_2534 2 0 0 0 0 +G000015005_2579 2 0 0 0 0 +G000015005_2609 2 0 0 0 0 +G000015005_2762 2 0 0 0 0 +G000015005_2812 1 0 0 0 0 +G000015005_2846 2 0 0 0 0 +G000015005_2967 2 0 0 0 0 +G000015005_3015 1 0 0 0 0 +G000015005_3016 1 0 0 0 0 +G000015005_3037 1 0 0 0 0 +G000015005_3038 1 0 0 0 0 +G000015005_327 2 0 0 0 0 +G000015005_338 1 0 0 0 0 +G000015005_3408 2 0 0 0 0 +G000015005_3505 2 0 0 0 0 +G000015005_3525 2 0 0 0 0 +G000015005_3576 2 0 0 0 0 +G000015005_3657 1 0 0 0 0 +G000015005_3712 2 0 0 0 0 +G000015005_3733 2 0 0 0 0 +G000015005_3775 2 0 0 0 0 +G000015005_3829 2 0 0 0 0 +G000015005_3836 1 0 0 0 0 +G000015005_396 2 0 0 0 0 +G000015005_4000 2 0 0 0 0 +G000015005_4011 1 0 0 0 0 +G000015005_4012 1 0 0 0 0 +G000015005_4041 2 0 0 0 0 +G000015005_4074 1 0 0 0 0 +G000015005_4082 2 0 0 0 0 +G000015005_436 2 0 0 0 0 +G000015005_4461 2 0 0 0 0 +G000015005_4593 2 0 0 0 0 +G000015005_461 2 0 0 0 0 +G000015005_4703 2 0 0 0 0 +G000015005_4836 2 0 0 0 0 +G000015005_4915 1 0 0 0 0 +G000015005_4981 2 0 0 0 0 +G000015005_5077 2 0 0 0 0 +G000015005_5235 2 0 0 0 0 +G000015005_5245 2 0 0 0 0 +G000015005_5265 2 0 0 0 0 +G000015005_535 2 0 0 0 0 +G000015005_5405 2 0 0 0 0 +G000015005_5445 2 0 0 0 0 +G000015005_5463 1 0 0 0 0 +G000015005_5662 2 0 0 0 0 +G000015005_5690 2 0 0 0 0 +G000015005_5708 2 0 0 0 0 +G000015005_5721 2 0 0 0 0 +G000015005_5771 2 0 0 0 0 +G000015005_5857 2 0 0 0 0 +G000015005_5877 2 0 0 0 0 +G000015005_5920 2 0 0 0 0 +G000015005_5938 2 0 0 0 0 +G000015005_6021 2 0 0 0 0 +G000015005_6095 2 0 0 0 0 +G000015005_6178 2 0 0 0 0 +G000015005_6203 1 0 0 0 0 +G000015005_6231 2 0 0 0 0 +G000015005_6396 2 0 0 0 0 +G000015005_6407 2 0 0 0 0 +G000015005_645 2 0 0 0 0 +G000015005_6541 2 0 0 0 0 +G000015005_677 2 0 0 0 0 +G000015005_685 1 0 0 0 0 +G000015005_916 2 0 0 0 0 +G000015005_926 2 0 0 0 0 +G000017045_1041 0 2 0 0 0 +G000017045_1106 0 1 0 0 0 +G000017045_1271 0 2 0 0 0 +G000017045_1368 0 2 0 0 0 +G000017045_1683 0 2 0 0 0 +G000017045_2004 0 2 0 0 0 +G000017045_2112 0 1 0 0 0 +G000017045_2149 0 2 0 0 0 +G000017045_2365 0 2 0 0 0 +G000017045_2629 0 1 0 0 0 +G000017045_2643 0 2 0 0 0 +G000017045_2819 0 2 0 0 0 +G000017045_2890 0 2 0 0 0 +G000017045_2897 0 2 0 0 0 +G000017045_293 0 2 0 0 0 +G000017045_2963 0 2 0 0 0 +G000017045_3101 0 2 0 0 0 +G000017045_3169 0 2 0 0 0 +G000017045_3391 0 2 0 0 0 +G000017045_391 0 2 0 0 0 +G000017045_427 0 2 0 0 0 +G000017045_431 0 2 0 0 0 +G000017045_89 0 1 0 0 0 +G000017045_997 0 2 0 0 0 +G000017145_1033 0 2 0 0 0 +G000017145_104 0 2 0 0 0 +G000017145_1168 0 2 0 0 0 +G000017145_1225 0 2 0 0 0 +G000017145_1255 0 2 0 0 0 +G000017145_1438 0 2 0 0 0 +G000017145_1480 0 2 0 0 0 +G000017145_1618 0 2 0 0 0 +G000017145_1913 0 2 0 0 0 +G000017145_1915 0 2 0 0 0 +G000017145_2031 0 2 0 0 0 +G000017145_2247 0 2 0 0 0 +G000017145_2508 0 2 0 0 0 +G000017145_2612 0 2 0 0 0 +G000017145_272 0 2 0 0 0 +G000017145_2752 0 1 0 0 0 +G000017145_2821 0 1 0 0 0 +G000017145_2980 0 2 0 0 0 +G000017145_3106 0 2 0 0 0 +G000017145_3311 0 1 0 0 0 +G000017145_3327 0 1 0 0 0 +G000017145_3328 0 1 0 0 0 +G000017145_3344 0 2 0 0 0 +G000017145_3376 0 2 0 0 0 +G000017145_3493 0 2 0 0 0 +G000017145_3573 0 2 0 0 0 +G000017145_3778 0 1 0 0 0 +G000017145_3808 0 2 0 0 0 +G000017145_3901 0 1 0 0 0 +G000017145_3902 0 1 0 0 0 +G000017145_4441 0 2 0 0 0 +G000017145_4798 0 2 0 0 0 +G000017145_523 0 2 0 0 0 +G000017145_550 0 2 0 0 0 +G000017145_5531 0 2 0 0 0 +G000017145_5570 0 1 0 0 0 +G000017145_5584 0 1 0 0 0 +G000017145_5698 0 2 0 0 0 +G000017145_63 0 2 0 0 0 +G000017145_6447 0 2 0 0 0 +G000017145_965 0 2 0 0 0 +G000018865_1329 2 0 0 0 0 +G000018865_1340 1 0 0 0 0 +G000018865_1969 2 0 0 0 0 +G000018865_2167 2 0 0 0 0 +G000018865_2742 2 0 0 0 0 +G000024905_1119 0 0 0 0 1 +G000024905_113 0 0 0 0 2 +G000024905_1171 0 0 0 0 1 +G000024905_128 0 0 0 0 2 +G000024905_129 0 0 0 0 2 +G000024905_131 0 0 0 0 2 +G000024905_1356 0 0 0 0 2 +G000024905_1493 0 0 0 0 2 +G000024905_1509 0 0 0 0 2 +G000024905_1595 0 0 0 0 2 +G000024905_1736 0 0 0 0 2 +G000024905_204 0 0 0 0 2 +G000024905_21 0 0 0 0 2 +G000024905_257 0 0 0 0 2 +G000024905_260 0 0 0 0 2 +G000024905_294 0 0 0 0 2 +G000024905_317 0 0 0 0 2 +G000024905_32 0 0 0 0 2 +G000024905_510 0 0 0 0 2 +G000024905_579 0 0 0 0 2 +G000024905_606 0 0 0 0 1 +G000024905_663 0 0 0 0 1 +G000024905_767 0 0 0 0 2 +G000024905_8 0 0 0 0 1 +G000024905_822 0 0 0 0 2 +G000024905_83 0 0 0 0 2 +G000024905_869 0 0 0 0 2 +G000024905_936 0 0 0 0 2 +G000026325_1056 0 0 2 0 0 +G000026325_1550 0 0 1 0 0 +G000026325_2136 0 0 1 0 0 +G000026325_2545 0 0 1 0 0 +G000026325_2807 0 0 1 0 0 +G000026325_2927 0 0 2 0 0 +G000026325_3621 0 0 2 0 0 +G000026325_370 0 0 1 0 0 +G000026325_4787 0 0 1 0 0 +G000026325_738 0 0 2 0 0 +G000026345_2952 0 0 2 0 0 +G000026345_4140 0 0 1 0 0 +G000027165_1035 0 0 2 0 0 +G000027165_1038 0 0 2 0 0 +G000027165_1068 0 0 1 0 0 +G000027165_111 0 0 4 0 0 +G000027165_1150 0 0 2 0 0 +G000027165_1212 0 0 2 0 0 +G000027165_1221 0 0 1 0 0 +G000027165_1245 0 0 2 0 0 +G000027165_1252 0 0 1 0 0 +G000027165_1253 0 0 1 0 0 +G000027165_1259 0 0 2 0 0 +G000027165_1294 0 0 2 0 0 +G000027165_1312 0 0 2 0 0 +G000027165_1338 0 0 2 0 0 +G000027165_134 0 0 1 0 0 +G000027165_1367 0 0 1 0 0 +G000027165_1374 0 0 2 0 0 +G000027165_1412 0 0 2 0 0 +G000027165_143 0 0 2 0 0 +G000027165_1431 0 0 4 0 0 +G000027165_1440 0 0 2 0 0 +G000027165_1448 0 0 2 0 0 +G000027165_1476 0 0 2 0 0 +G000027165_1499 0 0 2 0 0 +G000027165_1504 0 0 1 0 0 +G000027165_1614 0 0 2 0 0 +G000027165_1652 0 0 2 0 0 +G000027165_1672 0 0 1 0 0 +G000027165_1681 0 0 2 0 0 +G000027165_1700 0 0 2 0 0 +G000027165_1702 0 0 2 0 0 +G000027165_1730 0 0 2 0 0 +G000027165_1823 0 0 1 0 0 +G000027165_1836 0 0 1 0 0 +G000027165_1898 0 0 2 0 0 +G000027165_1902 0 0 1 0 0 +G000027165_1988 0 0 2 0 0 +G000027165_2007 0 0 1 0 0 +G000027165_2035 0 0 2 0 0 +G000027165_2036 0 0 2 0 0 +G000027165_204 0 0 1 0 0 +G000027165_2042 0 0 2 0 0 +G000027165_236 0 0 2 0 0 +G000027165_260 0 0 1 0 0 +G000027165_263 0 0 1 0 0 +G000027165_282 0 0 1 0 0 +G000027165_284 0 0 2 0 0 +G000027165_303 0 0 2 0 0 +G000027165_304 0 0 1 0 0 +G000027165_318 0 0 2 0 0 +G000027165_335 0 0 2 0 0 +G000027165_40 0 0 2 0 0 +G000027165_440 0 0 2 0 0 +G000027165_465 0 0 2 0 0 +G000027165_486 0 0 1 0 0 +G000027165_534 0 0 2 0 0 +G000027165_541 0 0 2 0 0 +G000027165_546 0 0 2 0 0 +G000027165_559 0 0 2 0 0 +G000027165_569 0 0 2 0 0 +G000027165_599 0 0 2 0 0 +G000027165_61 0 0 2 0 0 +G000027165_661 0 0 2 0 0 +G000027165_724 0 0 1 0 0 +G000027165_753 0 0 2 0 0 +G000027165_807 0 0 2 0 0 +G000027165_818 0 0 2 0 0 +G000027165_827 0 0 2 0 0 +G000027165_906 0 0 2 0 0 +G000027165_913 0 0 2 0 0 +G000027165_92 0 0 2 0 0 +G000027165_937 0 0 2 0 0 +G000027165_983 0 0 1 0 0 +G000063585_1019 0 2 0 0 0 +G000063585_1041 0 2 0 0 0 +G000063585_107 0 2 0 0 0 +G000063585_1247 0 2 0 0 0 +G000063585_1301 0 2 0 0 0 +G000063585_1656 0 2 0 0 0 +G000063585_1771 0 2 0 0 0 +G000063585_1976 0 2 0 0 0 +G000063585_204 0 2 0 0 0 +G000063585_2126 0 2 0 0 0 +G000063585_2132 0 2 0 0 0 +G000063585_2232 0 1 0 0 0 +G000063585_2269 0 2 0 0 0 +G000063585_2369 0 2 0 0 0 +G000063585_242 0 2 0 0 0 +G000063585_2451 0 3 0 0 0 +G000063585_2463 0 2 0 0 0 +G000063585_2518 0 1 0 0 0 +G000063585_2542 0 2 0 0 0 +G000063585_2757 0 2 0 0 0 +G000063585_2772 0 1 0 0 0 +G000063585_2773 0 2 0 0 0 +G000063585_2839 0 2 0 0 0 +G000063585_3213 0 2 0 0 0 +G000063585_3235 0 4 0 0 0 +G000063585_400 0 1 0 0 0 +G000063585_411 0 2 0 0 0 +G000063585_416 0 2 0 0 0 +G000063585_465 0 2 0 0 0 +G000063585_545 0 2 0 0 0 +G000063585_553 0 2 0 0 0 +G000063585_747 0 2 0 0 0 +G000063585_770 0 2 0 0 0 +G000063585_916 0 2 0 0 0 +G000091545_1 2 0 0 0 0 +G000091545_1000 2 0 0 0 0 +G000091545_1002 1 0 0 0 0 +G000091545_1008 3 0 0 0 0 +G000091545_1009 1 0 0 0 0 +G000091545_1012 2 0 0 0 0 +G000091545_102 2 0 0 0 0 +G000091545_1024 2 0 0 0 0 +G000091545_1026 2 0 0 0 0 +G000091545_1030 4 0 0 0 0 +G000091545_1031 2 0 0 0 0 +G000091545_1032 4 0 0 0 0 +G000091545_1041 6 0 0 0 0 +G000091545_1056 2 0 0 0 0 +G000091545_1058 1 0 0 0 0 +G000091545_1059 2 0 0 0 0 +G000091545_1060 2 0 0 0 0 +G000091545_1063 2 0 0 0 0 +G000091545_1065 1 0 0 0 0 +G000091545_1069 2 0 0 0 0 +G000091545_107 4 0 0 0 0 +G000091545_1070 3 0 0 0 0 +G000091545_1072 2 0 0 0 0 +G000091545_108 5 0 0 0 0 +G000091545_1082 2 0 0 0 0 +G000091545_1083 1 0 0 0 0 +G000091545_1089 3 0 0 0 0 +G000091545_1091 2 0 0 0 0 +G000091545_1093 1 0 0 0 0 +G000091545_1094 1 0 0 0 0 +G000091545_1096 2 0 0 0 0 +G000091545_1100 1 0 0 0 0 +G000091545_1102 2 0 0 0 0 +G000091545_1103 2 0 0 0 0 +G000091545_1104 4 0 0 0 0 +G000091545_1108 1 0 0 0 0 +G000091545_1109 2 0 0 0 0 +G000091545_1113 4 0 0 0 0 +G000091545_1114 2 0 0 0 0 +G000091545_1115 4 0 0 0 0 +G000091545_1124 2 0 0 0 0 +G000091545_113 2 0 0 0 0 +G000091545_1131 2 0 0 0 0 +G000091545_1134 4 0 0 0 0 +G000091545_1138 1 0 0 0 0 +G000091545_114 2 0 0 0 0 +G000091545_1149 2 0 0 0 0 +G000091545_115 1 0 0 0 0 +G000091545_1150 2 0 0 0 0 +G000091545_1160 2 0 0 0 0 +G000091545_1161 2 0 0 0 0 +G000091545_1162 2 0 0 0 0 +G000091545_1164 2 0 0 0 0 +G000091545_1171 2 0 0 0 0 +G000091545_1174 2 0 0 0 0 +G000091545_1178 1 0 0 0 0 +G000091545_1180 2 0 0 0 0 +G000091545_1183 3 0 0 0 0 +G000091545_1184 3 0 0 0 0 +G000091545_1185 5 0 0 0 0 +G000091545_1189 2 0 0 0 0 +G000091545_119 1 0 0 0 0 +G000091545_1194 2 0 0 0 0 +G000091545_1197 2 0 0 0 0 +G000091545_1203 1 0 0 0 0 +G000091545_1204 2 0 0 0 0 +G000091545_1208 4 0 0 0 0 +G000091545_1212 2 0 0 0 0 +G000091545_1213 1 0 0 0 0 +G000091545_1220 2 0 0 0 0 +G000091545_1223 4 0 0 0 0 +G000091545_1225 2 0 0 0 0 +G000091545_1227 2 0 0 0 0 +G000091545_1231 3 0 0 0 0 +G000091545_1232 2 0 0 0 0 +G000091545_1233 2 0 0 0 0 +G000091545_1234 4 0 0 0 0 +G000091545_1236 4 0 0 0 0 +G000091545_1238 2 0 0 0 0 +G000091545_1239 2 0 0 0 0 +G000091545_1240 2 0 0 0 0 +G000091545_1243 2 0 0 0 0 +G000091545_1244 2 0 0 0 0 +G000091545_1246 2 0 0 0 0 +G000091545_125 1 0 0 0 0 +G000091545_1250 1 0 0 0 0 +G000091545_1252 2 0 0 0 0 +G000091545_1262 3 0 0 0 0 +G000091545_1269 2 0 0 0 0 +G000091545_1270 2 0 0 0 0 +G000091545_1271 2 0 0 0 0 +G000091545_1273 1 0 0 0 0 +G000091545_1277 2 0 0 0 0 +G000091545_1279 2 0 0 0 0 +G000091545_1281 3 0 0 0 0 +G000091545_1285 2 0 0 0 0 +G000091545_1287 2 0 0 0 0 +G000091545_1288 1 0 0 0 0 +G000091545_129 1 0 0 0 0 +G000091545_1294 1 0 0 0 0 +G000091545_1298 2 0 0 0 0 +G000091545_1299 2 0 0 0 0 +G000091545_1302 2 0 0 0 0 +G000091545_1304 3 0 0 0 0 +G000091545_1305 2 0 0 0 0 +G000091545_1306 2 0 0 0 0 +G000091545_1313 2 0 0 0 0 +G000091545_1314 2 0 0 0 0 +G000091545_1315 4 0 0 0 0 +G000091545_1319 2 0 0 0 0 +G000091545_132 2 0 0 0 0 +G000091545_1320 2 0 0 0 0 +G000091545_1324 1 0 0 0 0 +G000091545_1328 2 0 0 0 0 +G000091545_1329 1 0 0 0 0 +G000091545_1336 4 0 0 0 0 +G000091545_1340 4 0 0 0 0 +G000091545_1341 2 0 0 0 0 +G000091545_1343 2 0 0 0 0 +G000091545_1349 2 0 0 0 0 +G000091545_1356 2 0 0 0 0 +G000091545_1359 2 0 0 0 0 +G000091545_136 2 0 0 0 0 +G000091545_1372 4 0 0 0 0 +G000091545_1373 2 0 0 0 0 +G000091545_1376 2 0 0 0 0 +G000091545_1377 2 0 0 0 0 +G000091545_138 2 0 0 0 0 +G000091545_1385 1 0 0 0 0 +G000091545_139 1 0 0 0 0 +G000091545_1391 2 0 0 0 0 +G000091545_1392 2 0 0 0 0 +G000091545_1394 2 0 0 0 0 +G000091545_1399 2 0 0 0 0 +G000091545_14 2 0 0 0 0 +G000091545_140 2 0 0 0 0 +G000091545_1401 2 0 0 0 0 +G000091545_1402 2 0 0 0 0 +G000091545_1403 2 0 0 0 0 +G000091545_1405 2 0 0 0 0 +G000091545_1408 4 0 0 0 0 +G000091545_1414 2 0 0 0 0 +G000091545_1415 2 0 0 0 0 +G000091545_142 2 0 0 0 0 +G000091545_1427 1 0 0 0 0 +G000091545_1431 2 0 0 0 0 +G000091545_1433 2 0 0 0 0 +G000091545_1437 1 0 0 0 0 +G000091545_1439 4 0 0 0 0 +G000091545_1441 2 0 0 0 0 +G000091545_1444 5 0 0 0 0 +G000091545_1448 2 0 0 0 0 +G000091545_1450 1 0 0 0 0 +G000091545_1454 2 0 0 0 0 +G000091545_1457 2 0 0 0 0 +G000091545_1458 2 0 0 0 0 +G000091545_1459 2 0 0 0 0 +G000091545_1460 3 0 0 0 0 +G000091545_1461 4 0 0 0 0 +G000091545_1464 4 0 0 0 0 +G000091545_1466 3 0 0 0 0 +G000091545_1468 2 0 0 0 0 +G000091545_1472 5 0 0 0 0 +G000091545_1476 2 0 0 0 0 +G000091545_148 2 0 0 0 0 +G000091545_1480 1 0 0 0 0 +G000091545_1482 1 0 0 0 0 +G000091545_1487 2 0 0 0 0 +G000091545_1488 2 0 0 0 0 +G000091545_149 2 0 0 0 0 +G000091545_1491 2 0 0 0 0 +G000091545_1492 2 0 0 0 0 +G000091545_1493 2 0 0 0 0 +G000091545_1495 4 0 0 0 0 +G000091545_1499 1 0 0 0 0 +G000091545_1506 2 0 0 0 0 +G000091545_1508 4 0 0 0 0 +G000091545_1509 2 0 0 0 0 +G000091545_1513 2 0 0 0 0 +G000091545_1520 4 0 0 0 0 +G000091545_1537 2 0 0 0 0 +G000091545_1540 2 0 0 0 0 +G000091545_1550 2 0 0 0 0 +G000091545_1552 2 0 0 0 0 +G000091545_1554 2 0 0 0 0 +G000091545_1558 2 0 0 0 0 +G000091545_1565 6 0 0 0 0 +G000091545_1579 1 0 0 0 0 +G000091545_158 2 0 0 0 0 +G000091545_159 1 0 0 0 0 +G000091545_1595 1 0 0 0 0 +G000091545_1599 1 0 0 0 0 +G000091545_160 1 0 0 0 0 +G000091545_1601 2 0 0 0 0 +G000091545_1602 2 0 0 0 0 +G000091545_1608 4 0 0 0 0 +G000091545_161 8 0 0 0 0 +G000091545_1615 2 0 0 0 0 +G000091545_1617 2 0 0 0 0 +G000091545_162 2 0 0 0 0 +G000091545_1624 2 0 0 0 0 +G000091545_163 2 0 0 0 0 +G000091545_1641 1 0 0 0 0 +G000091545_1644 2 0 0 0 0 +G000091545_1647 2 0 0 0 0 +G000091545_1649 2 0 0 0 0 +G000091545_165 2 0 0 0 0 +G000091545_1659 2 0 0 0 0 +G000091545_1665 2 0 0 0 0 +G000091545_1668 2 0 0 0 0 +G000091545_1669 2 0 0 0 0 +G000091545_167 1 0 0 0 0 +G000091545_1675 2 0 0 0 0 +G000091545_1677 2 0 0 0 0 +G000091545_1680 2 0 0 0 0 +G000091545_1684 4 0 0 0 0 +G000091545_1695 1 0 0 0 0 +G000091545_1696 2 0 0 0 0 +G000091545_1697 2 0 0 0 0 +G000091545_17 2 0 0 0 0 +G000091545_1700 1 0 0 0 0 +G000091545_1701 2 0 0 0 0 +G000091545_1703 1 0 0 0 0 +G000091545_1709 2 0 0 0 0 +G000091545_1714 2 0 0 0 0 +G000091545_1717 2 0 0 0 0 +G000091545_1718 1 0 0 0 0 +G000091545_1720 1 0 0 0 0 +G000091545_1721 2 0 0 0 0 +G000091545_1726 2 0 0 0 0 +G000091545_1729 2 0 0 0 0 +G000091545_1735 2 0 0 0 0 +G000091545_1739 1 0 0 0 0 +G000091545_1740 2 0 0 0 0 +G000091545_1741 3 0 0 0 0 +G000091545_1742 5 0 0 0 0 +G000091545_1743 1 0 0 0 0 +G000091545_1744 2 0 0 0 0 +G000091545_1754 2 0 0 0 0 +G000091545_1756 2 0 0 0 0 +G000091545_1772 1 0 0 0 0 +G000091545_1774 1 0 0 0 0 +G000091545_1778 1 0 0 0 0 +G000091545_1781 2 0 0 0 0 +G000091545_1783 2 0 0 0 0 +G000091545_1786 2 0 0 0 0 +G000091545_1787 2 0 0 0 0 +G000091545_1792 1 0 0 0 0 +G000091545_1793 1 0 0 0 0 +G000091545_1795 2 0 0 0 0 +G000091545_1796 4 0 0 0 0 +G000091545_180 11 0 0 0 0 +G000091545_1801 2 0 0 0 0 +G000091545_1804 2 0 0 0 0 +G000091545_1805 2 0 0 0 0 +G000091545_1806 1 0 0 0 0 +G000091545_1809 2 0 0 0 0 +G000091545_1813 2 0 0 0 0 +G000091545_1816 1 0 0 0 0 +G000091545_1817 2 0 0 0 0 +G000091545_1818 2 0 0 0 0 +G000091545_1820 2 0 0 0 0 +G000091545_1821 4 0 0 0 0 +G000091545_1828 2 0 0 0 0 +G000091545_1830 2 0 0 0 0 +G000091545_1837 4 0 0 0 0 +G000091545_1840 2 0 0 0 0 +G000091545_1841 4 0 0 0 0 +G000091545_1844 2 0 0 0 0 +G000091545_1845 2 0 0 0 0 +G000091545_1846 1 0 0 0 0 +G000091545_1847 4 0 0 0 0 +G000091545_1848 2 0 0 0 0 +G000091545_1851 2 0 0 0 0 +G000091545_1853 1 0 0 0 0 +G000091545_1855 1 0 0 0 0 +G000091545_1856 1 0 0 0 0 +G000091545_1860 2 0 0 0 0 +G000091545_1861 6 0 0 0 0 +G000091545_1864 2 0 0 0 0 +G000091545_1865 3 0 0 0 0 +G000091545_1869 2 0 0 0 0 +G000091545_187 2 0 0 0 0 +G000091545_1886 4 0 0 0 0 +G000091545_1889 2 0 0 0 0 +G000091545_1894 2 0 0 0 0 +G000091545_1896 2 0 0 0 0 +G000091545_19 2 0 0 0 0 +G000091545_1902 4 0 0 0 0 +G000091545_1908 2 0 0 0 0 +G000091545_1909 2 0 0 0 0 +G000091545_1918 4 0 0 0 0 +G000091545_1920 4 0 0 0 0 +G000091545_1924 1 0 0 0 0 +G000091545_1928 2 0 0 0 0 +G000091545_193 3 0 0 0 0 +G000091545_1931 2 0 0 0 0 +G000091545_1933 2 0 0 0 0 +G000091545_1934 4 0 0 0 0 +G000091545_1938 1 0 0 0 0 +G000091545_1943 2 0 0 0 0 +G000091545_1944 4 0 0 0 0 +G000091545_1947 2 0 0 0 0 +G000091545_195 2 0 0 0 0 +G000091545_1955 2 0 0 0 0 +G000091545_1957 1 0 0 0 0 +G000091545_1958 1 0 0 0 0 +G000091545_1959 4 0 0 0 0 +G000091545_1966 2 0 0 0 0 +G000091545_1967 2 0 0 0 0 +G000091545_1976 2 0 0 0 0 +G000091545_1979 2 0 0 0 0 +G000091545_1982 2 0 0 0 0 +G000091545_1985 8 0 0 0 0 +G000091545_1986 2 0 0 0 0 +G000091545_1987 2 0 0 0 0 +G000091545_1988 2 0 0 0 0 +G000091545_1993 1 0 0 0 0 +G000091545_1997 1 0 0 0 0 +G000091545_2003 2 0 0 0 0 +G000091545_201 2 0 0 0 0 +G000091545_2010 2 0 0 0 0 +G000091545_2011 2 0 0 0 0 +G000091545_2015 1 0 0 0 0 +G000091545_2017 2 0 0 0 0 +G000091545_202 2 0 0 0 0 +G000091545_2025 2 0 0 0 0 +G000091545_2027 1 0 0 0 0 +G000091545_2028 1 0 0 0 0 +G000091545_2031 1 0 0 0 0 +G000091545_2032 3 0 0 0 0 +G000091545_2034 2 0 0 0 0 +G000091545_2036 2 0 0 0 0 +G000091545_2043 1 0 0 0 0 +G000091545_2046 2 0 0 0 0 +G000091545_2047 1 0 0 0 0 +G000091545_2048 1 0 0 0 0 +G000091545_2049 2 0 0 0 0 +G000091545_2053 1 0 0 0 0 +G000091545_2055 1 0 0 0 0 +G000091545_206 2 0 0 0 0 +G000091545_2060 4 0 0 0 0 +G000091545_2062 2 0 0 0 0 +G000091545_2066 2 0 0 0 0 +G000091545_2067 1 0 0 0 0 +G000091545_2068 1 0 0 0 0 +G000091545_2073 1 0 0 0 0 +G000091545_2074 2 0 0 0 0 +G000091545_2077 1 0 0 0 0 +G000091545_208 2 0 0 0 0 +G000091545_2086 1 0 0 0 0 +G000091545_2090 3 0 0 0 0 +G000091545_2091 1 0 0 0 0 +G000091545_2095 2 0 0 0 0 +G000091545_2096 2 0 0 0 0 +G000091545_2102 1 0 0 0 0 +G000091545_2103 4 0 0 0 0 +G000091545_2107 1 0 0 0 0 +G000091545_2111 2 0 0 0 0 +G000091545_2115 5 0 0 0 0 +G000091545_2118 1 0 0 0 0 +G000091545_2122 2 0 0 0 0 +G000091545_2124 4 0 0 0 0 +G000091545_2125 2 0 0 0 0 +G000091545_2130 2 0 0 0 0 +G000091545_2134 4 0 0 0 0 +G000091545_2135 4 0 0 0 0 +G000091545_2136 2 0 0 0 0 +G000091545_2137 2 0 0 0 0 +G000091545_2142 2 0 0 0 0 +G000091545_2144 3 0 0 0 0 +G000091545_2149 2 0 0 0 0 +G000091545_2152 3 0 0 0 0 +G000091545_2155 1 0 0 0 0 +G000091545_2156 1 0 0 0 0 +G000091545_2159 2 0 0 0 0 +G000091545_217 2 0 0 0 0 +G000091545_2170 1 0 0 0 0 +G000091545_2175 1 0 0 0 0 +G000091545_2185 2 0 0 0 0 +G000091545_2190 1 0 0 0 0 +G000091545_2192 2 0 0 0 0 +G000091545_2195 2 0 0 0 0 +G000091545_2196 2 0 0 0 0 +G000091545_2197 2 0 0 0 0 +G000091545_2202 4 0 0 0 0 +G000091545_2203 2 0 0 0 0 +G000091545_2206 4 0 0 0 0 +G000091545_2207 1 0 0 0 0 +G000091545_222 2 0 0 0 0 +G000091545_23 4 0 0 0 0 +G000091545_230 2 0 0 0 0 +G000091545_232 2 0 0 0 0 +G000091545_237 2 0 0 0 0 +G000091545_243 2 0 0 0 0 +G000091545_256 1 0 0 0 0 +G000091545_258 2 0 0 0 0 +G000091545_259 2 0 0 0 0 +G000091545_263 2 0 0 0 0 +G000091545_264 2 0 0 0 0 +G000091545_265 4 0 0 0 0 +G000091545_269 2 0 0 0 0 +G000091545_27 2 0 0 0 0 +G000091545_271 4 0 0 0 0 +G000091545_272 2 0 0 0 0 +G000091545_28 2 0 0 0 0 +G000091545_280 4 0 0 0 0 +G000091545_281 1 0 0 0 0 +G000091545_285 2 0 0 0 0 +G000091545_286 2 0 0 0 0 +G000091545_289 2 0 0 0 0 +G000091545_297 1 0 0 0 0 +G000091545_30 2 0 0 0 0 +G000091545_306 2 0 0 0 0 +G000091545_307 2 0 0 0 0 +G000091545_310 2 0 0 0 0 +G000091545_313 3 0 0 0 0 +G000091545_314 2 0 0 0 0 +G000091545_319 2 0 0 0 0 +G000091545_323 2 0 0 0 0 +G000091545_324 2 0 0 0 0 +G000091545_325 2 0 0 0 0 +G000091545_327 2 0 0 0 0 +G000091545_33 3 0 0 0 0 +G000091545_332 2 0 0 0 0 +G000091545_333 2 0 0 0 0 +G000091545_346 3 0 0 0 0 +G000091545_35 2 0 0 0 0 +G000091545_350 2 0 0 0 0 +G000091545_353 4 0 0 0 0 +G000091545_354 2 0 0 0 0 +G000091545_355 2 0 0 0 0 +G000091545_363 2 0 0 0 0 +G000091545_365 2 0 0 0 0 +G000091545_366 4 0 0 0 0 +G000091545_367 2 0 0 0 0 +G000091545_38 3 0 0 0 0 +G000091545_380 2 0 0 0 0 +G000091545_385 2 0 0 0 0 +G000091545_388 2 0 0 0 0 +G000091545_39 2 0 0 0 0 +G000091545_394 2 0 0 0 0 +G000091545_395 3 0 0 0 0 +G000091545_396 4 0 0 0 0 +G000091545_4 2 0 0 0 0 +G000091545_401 1 0 0 0 0 +G000091545_403 2 0 0 0 0 +G000091545_405 2 0 0 0 0 +G000091545_407 2 0 0 0 0 +G000091545_408 2 0 0 0 0 +G000091545_412 2 0 0 0 0 +G000091545_413 1 0 0 0 0 +G000091545_424 3 0 0 0 0 +G000091545_43 2 0 0 0 0 +G000091545_433 1 0 0 0 0 +G000091545_434 2 0 0 0 0 +G000091545_437 1 0 0 0 0 +G000091545_439 2 0 0 0 0 +G000091545_440 1 0 0 0 0 +G000091545_441 1 0 0 0 0 +G000091545_446 2 0 0 0 0 +G000091545_448 2 0 0 0 0 +G000091545_45 2 0 0 0 0 +G000091545_456 2 0 0 0 0 +G000091545_463 2 0 0 0 0 +G000091545_464 3 0 0 0 0 +G000091545_466 2 0 0 0 0 +G000091545_470 2 0 0 0 0 +G000091545_472 2 0 0 0 0 +G000091545_475 4 0 0 0 0 +G000091545_478 2 0 0 0 0 +G000091545_483 2 0 0 0 0 +G000091545_485 2 0 0 0 0 +G000091545_49 1 0 0 0 0 +G000091545_492 2 0 0 0 0 +G000091545_496 1 0 0 0 0 +G000091545_50 1 0 0 0 0 +G000091545_506 2 0 0 0 0 +G000091545_51 1 0 0 0 0 +G000091545_511 2 0 0 0 0 +G000091545_512 4 0 0 0 0 +G000091545_517 2 0 0 0 0 +G000091545_522 3 0 0 0 0 +G000091545_523 2 0 0 0 0 +G000091545_533 2 0 0 0 0 +G000091545_536 2 0 0 0 0 +G000091545_537 2 0 0 0 0 +G000091545_54 2 0 0 0 0 +G000091545_55 3 0 0 0 0 +G000091545_552 2 0 0 0 0 +G000091545_553 1 0 0 0 0 +G000091545_556 2 0 0 0 0 +G000091545_557 1 0 0 0 0 +G000091545_558 2 0 0 0 0 +G000091545_565 2 0 0 0 0 +G000091545_57 2 0 0 0 0 +G000091545_571 2 0 0 0 0 +G000091545_573 2 0 0 0 0 +G000091545_574 1 0 0 0 0 +G000091545_576 1 0 0 0 0 +G000091545_578 2 0 0 0 0 +G000091545_582 4 0 0 0 0 +G000091545_592 4 0 0 0 0 +G000091545_594 2 0 0 0 0 +G000091545_596 2 0 0 0 0 +G000091545_608 2 0 0 0 0 +G000091545_610 6 0 0 0 0 +G000091545_612 2 0 0 0 0 +G000091545_615 2 0 0 0 0 +G000091545_621 2 0 0 0 0 +G000091545_622 2 0 0 0 0 +G000091545_626 3 0 0 0 0 +G000091545_627 3 0 0 0 0 +G000091545_630 3 0 0 0 0 +G000091545_631 1 0 0 0 0 +G000091545_636 2 0 0 0 0 +G000091545_64 3 0 0 0 0 +G000091545_641 2 0 0 0 0 +G000091545_642 3 0 0 0 0 +G000091545_644 3 0 0 0 0 +G000091545_647 1 0 0 0 0 +G000091545_657 2 0 0 0 0 +G000091545_659 2 0 0 0 0 +G000091545_660 2 0 0 0 0 +G000091545_664 1 0 0 0 0 +G000091545_670 2 0 0 0 0 +G000091545_671 2 0 0 0 0 +G000091545_672 2 0 0 0 0 +G000091545_676 4 0 0 0 0 +G000091545_679 2 0 0 0 0 +G000091545_682 2 0 0 0 0 +G000091545_683 4 0 0 0 0 +G000091545_685 2 0 0 0 0 +G000091545_687 3 0 0 0 0 +G000091545_691 6 0 0 0 0 +G000091545_697 2 0 0 0 0 +G000091545_700 2 0 0 0 0 +G000091545_701 2 0 0 0 0 +G000091545_702 2 0 0 0 0 +G000091545_704 2 0 0 0 0 +G000091545_71 1 0 0 0 0 +G000091545_712 1 0 0 0 0 +G000091545_716 6 0 0 0 0 +G000091545_720 2 0 0 0 0 +G000091545_722 2 0 0 0 0 +G000091545_723 4 0 0 0 0 +G000091545_729 2 0 0 0 0 +G000091545_73 7 0 0 0 0 +G000091545_734 2 0 0 0 0 +G000091545_739 4 0 0 0 0 +G000091545_74 6 0 0 0 0 +G000091545_740 2 0 0 0 0 +G000091545_743 2 0 0 0 0 +G000091545_749 2 0 0 0 0 +G000091545_756 4 0 0 0 0 +G000091545_758 1 0 0 0 0 +G000091545_759 2 0 0 0 0 +G000091545_762 4 0 0 0 0 +G000091545_763 2 0 0 0 0 +G000091545_77 2 0 0 0 0 +G000091545_770 1 0 0 0 0 +G000091545_771 3 0 0 0 0 +G000091545_775 4 0 0 0 0 +G000091545_776 1 0 0 0 0 +G000091545_782 2 0 0 0 0 +G000091545_788 2 0 0 0 0 +G000091545_791 2 0 0 0 0 +G000091545_793 4 0 0 0 0 +G000091545_796 2 0 0 0 0 +G000091545_800 1 0 0 0 0 +G000091545_807 4 0 0 0 0 +G000091545_809 2 0 0 0 0 +G000091545_811 2 0 0 0 0 +G000091545_815 2 0 0 0 0 +G000091545_818 2 0 0 0 0 +G000091545_820 4 0 0 0 0 +G000091545_821 2 0 0 0 0 +G000091545_822 2 0 0 0 0 +G000091545_825 2 0 0 0 0 +G000091545_83 1 0 0 0 0 +G000091545_830 2 0 0 0 0 +G000091545_846 1 0 0 0 0 +G000091545_85 2 0 0 0 0 +G000091545_850 2 0 0 0 0 +G000091545_851 2 0 0 0 0 +G000091545_859 2 0 0 0 0 +G000091545_866 4 0 0 0 0 +G000091545_867 2 0 0 0 0 +G000091545_872 2 0 0 0 0 +G000091545_875 2 0 0 0 0 +G000091545_880 2 0 0 0 0 +G000091545_884 1 0 0 0 0 +G000091545_885 1 0 0 0 0 +G000091545_886 1 0 0 0 0 +G000091545_892 2 0 0 0 0 +G000091545_903 2 0 0 0 0 +G000091545_905 2 0 0 0 0 +G000091545_906 2 0 0 0 0 +G000091545_908 2 0 0 0 0 +G000091545_91 2 0 0 0 0 +G000091545_912 4 0 0 0 0 +G000091545_917 4 0 0 0 0 +G000091545_925 2 0 0 0 0 +G000091545_929 2 0 0 0 0 +G000091545_931 2 0 0 0 0 +G000091545_938 2 0 0 0 0 +G000091545_939 2 0 0 0 0 +G000091545_941 1 0 0 0 0 +G000091545_946 2 0 0 0 0 +G000091545_951 2 0 0 0 0 +G000091545_954 2 0 0 0 0 +G000091545_96 1 0 0 0 0 +G000091545_960 2 0 0 0 0 +G000091545_961 4 0 0 0 0 +G000091545_963 2 0 0 0 0 +G000091545_965 3 0 0 0 0 +G000091545_966 1 0 0 0 0 +G000091545_967 2 0 0 0 0 +G000091545_97 1 0 0 0 0 +G000091545_972 1 0 0 0 0 +G000091545_973 5 0 0 0 0 +G000091545_976 4 0 0 0 0 +G000091545_983 3 0 0 0 0 +G000091545_985 2 0 0 0 0 +G000091545_987 2 0 0 0 0 +G000091545_991 4 0 0 0 0 +G000091545_993 2 0 0 0 0 +G000092025_1283 0 0 2 0 0 +G000092025_2067 0 0 1 0 0 +G000092025_2127 0 0 1 0 0 +G000092025_2626 0 0 2 0 0 +G000092025_3207 0 0 2 0 0 +G000092025_339 0 0 2 0 0 +G000092025_3630 0 0 2 0 0 +G000092025_3930 0 0 1 0 0 +G000092025_4148 0 0 1 0 0 +G000092025_4158 0 0 1 0 0 +G000146165_10 0 3 0 0 0 +G000146165_1005 0 2 0 0 0 +G000146165_1052 0 2 0 0 0 +G000146165_1070 0 2 0 0 0 +G000146165_1071 0 2 0 0 0 +G000146165_1089 0 2 0 0 0 +G000146165_1117 0 1 0 0 0 +G000146165_1125 0 2 0 0 0 +G000146165_115 0 2 0 0 0 +G000146165_1173 0 2 0 0 0 +G000146165_1192 0 2 0 0 0 +G000146165_1197 0 2 0 0 0 +G000146165_1199 0 4 0 0 0 +G000146165_1206 0 1 0 0 0 +G000146165_1209 0 1 0 0 0 +G000146165_1225 0 2 0 0 0 +G000146165_1232 0 2 0 0 0 +G000146165_1244 0 2 0 0 0 +G000146165_1247 0 1 0 0 0 +G000146165_1260 0 2 0 0 0 +G000146165_1265 0 1 0 0 0 +G000146165_1273 0 1 0 0 0 +G000146165_1298 0 1 0 0 0 +G000146165_1324 0 2 0 0 0 +G000146165_133 0 2 0 0 0 +G000146165_1350 0 1 0 0 0 +G000146165_1355 0 2 0 0 0 +G000146165_1361 0 2 0 0 0 +G000146165_1375 0 2 0 0 0 +G000146165_1380 0 1 0 0 0 +G000146165_142 0 1 0 0 0 +G000146165_1437 0 2 0 0 0 +G000146165_1454 0 2 0 0 0 +G000146165_1495 0 2 0 0 0 +G000146165_1524 0 2 0 0 0 +G000146165_1525 0 2 0 0 0 +G000146165_1529 0 1 0 0 0 +G000146165_1566 0 2 0 0 0 +G000146165_1585 0 2 0 0 0 +G000146165_1594 0 1 0 0 0 +G000146165_1595 0 1 0 0 0 +G000146165_1610 0 3 0 0 0 +G000146165_1633 0 3 0 0 0 +G000146165_1646 0 2 0 0 0 +G000146165_1654 0 2 0 0 0 +G000146165_1660 0 2 0 0 0 +G000146165_1693 0 1 0 0 0 +G000146165_1694 0 1 0 0 0 +G000146165_1695 0 2 0 0 0 +G000146165_1725 0 2 0 0 0 +G000146165_1728 0 2 0 0 0 +G000146165_1731 0 2 0 0 0 +G000146165_174 0 1 0 0 0 +G000146165_1743 0 4 0 0 0 +G000146165_1784 0 2 0 0 0 +G000146165_1786 0 2 0 0 0 +G000146165_1790 0 1 0 0 0 +G000146165_1817 0 1 0 0 0 +G000146165_1826 0 2 0 0 0 +G000146165_1833 0 2 0 0 0 +G000146165_1850 0 2 0 0 0 +G000146165_1854 0 2 0 0 0 +G000146165_1862 0 4 0 0 0 +G000146165_187 0 2 0 0 0 +G000146165_1876 0 4 0 0 0 +G000146165_1879 0 2 0 0 0 +G000146165_1890 0 2 0 0 0 +G000146165_1894 0 2 0 0 0 +G000146165_1903 0 1 0 0 0 +G000146165_1915 0 2 0 0 0 +G000146165_1920 0 2 0 0 0 +G000146165_1923 0 1 0 0 0 +G000146165_1965 0 2 0 0 0 +G000146165_1971 0 2 0 0 0 +G000146165_1973 0 2 0 0 0 +G000146165_1992 0 2 0 0 0 +G000146165_1999 0 2 0 0 0 +G000146165_2053 0 2 0 0 0 +G000146165_2072 0 2 0 0 0 +G000146165_2080 0 2 0 0 0 +G000146165_209 0 2 0 0 0 +G000146165_2116 0 2 0 0 0 +G000146165_2125 0 1 0 0 0 +G000146165_2152 0 2 0 0 0 +G000146165_2169 0 2 0 0 0 +G000146165_2172 0 2 0 0 0 +G000146165_2173 0 2 0 0 0 +G000146165_2176 0 1 0 0 0 +G000146165_2186 0 2 0 0 0 +G000146165_2207 0 1 0 0 0 +G000146165_2211 0 2 0 0 0 +G000146165_2216 0 2 0 0 0 +G000146165_2219 0 2 0 0 0 +G000146165_2243 0 2 0 0 0 +G000146165_2247 0 1 0 0 0 +G000146165_2250 0 2 0 0 0 +G000146165_2251 0 2 0 0 0 +G000146165_2272 0 2 0 0 0 +G000146165_2280 0 1 0 0 0 +G000146165_2312 0 2 0 0 0 +G000146165_2319 0 2 0 0 0 +G000146165_2327 0 1 0 0 0 +G000146165_233 0 1 0 0 0 +G000146165_2330 0 1 0 0 0 +G000146165_2339 0 2 0 0 0 +G000146165_2346 0 1 0 0 0 +G000146165_2353 0 1 0 0 0 +G000146165_2356 0 1 0 0 0 +G000146165_2365 0 1 0 0 0 +G000146165_237 0 2 0 0 0 +G000146165_2383 0 2 0 0 0 +G000146165_2385 0 2 0 0 0 +G000146165_2415 0 2 0 0 0 +G000146165_2444 0 2 0 0 0 +G000146165_2476 0 2 0 0 0 +G000146165_2491 0 2 0 0 0 +G000146165_2520 0 1 0 0 0 +G000146165_2538 0 2 0 0 0 +G000146165_2546 0 2 0 0 0 +G000146165_2593 0 1 0 0 0 +G000146165_262 0 2 0 0 0 +G000146165_2636 0 1 0 0 0 +G000146165_2637 0 2 0 0 0 +G000146165_2645 0 2 0 0 0 +G000146165_2646 0 3 0 0 0 +G000146165_2650 0 1 0 0 0 +G000146165_268 0 2 0 0 0 +G000146165_2704 0 2 0 0 0 +G000146165_2705 0 2 0 0 0 +G000146165_2723 0 2 0 0 0 +G000146165_2731 0 2 0 0 0 +G000146165_2759 0 1 0 0 0 +G000146165_2764 0 2 0 0 0 +G000146165_2771 0 1 0 0 0 +G000146165_2823 0 2 0 0 0 +G000146165_2827 0 2 0 0 0 +G000146165_2836 0 2 0 0 0 +G000146165_2870 0 4 0 0 0 +G000146165_291 0 2 0 0 0 +G000146165_2934 0 2 0 0 0 +G000146165_2943 0 1 0 0 0 +G000146165_2953 0 2 0 0 0 +G000146165_2956 0 1 0 0 0 +G000146165_2970 0 1 0 0 0 +G000146165_2973 0 2 0 0 0 +G000146165_3008 0 1 0 0 0 +G000146165_3028 0 2 0 0 0 +G000146165_3029 0 2 0 0 0 +G000146165_3039 0 2 0 0 0 +G000146165_3072 0 4 0 0 0 +G000146165_3081 0 2 0 0 0 +G000146165_3085 0 2 0 0 0 +G000146165_3089 0 2 0 0 0 +G000146165_3097 0 2 0 0 0 +G000146165_3103 0 1 0 0 0 +G000146165_3119 0 2 0 0 0 +G000146165_3128 0 2 0 0 0 +G000146165_3133 0 2 0 0 0 +G000146165_3134 0 1 0 0 0 +G000146165_3166 0 2 0 0 0 +G000146165_3172 0 2 0 0 0 +G000146165_3194 0 2 0 0 0 +G000146165_3225 0 2 0 0 0 +G000146165_3227 0 1 0 0 0 +G000146165_3264 0 2 0 0 0 +G000146165_3269 0 2 0 0 0 +G000146165_327 0 2 0 0 0 +G000146165_3277 0 3 0 0 0 +G000146165_3290 0 2 0 0 0 +G000146165_3293 0 2 0 0 0 +G000146165_3320 0 2 0 0 0 +G000146165_3335 0 1 0 0 0 +G000146165_3340 0 2 0 0 0 +G000146165_3372 0 2 0 0 0 +G000146165_3395 0 2 0 0 0 +G000146165_3400 0 2 0 0 0 +G000146165_3401 0 1 0 0 0 +G000146165_3402 0 1 0 0 0 +G000146165_3405 0 2 0 0 0 +G000146165_343 0 2 0 0 0 +G000146165_3434 0 1 0 0 0 +G000146165_3487 0 4 0 0 0 +G000146165_3506 0 2 0 0 0 +G000146165_3509 0 2 0 0 0 +G000146165_351 0 1 0 0 0 +G000146165_3517 0 2 0 0 0 +G000146165_3548 0 2 0 0 0 +G000146165_3567 0 2 0 0 0 +G000146165_3575 0 2 0 0 0 +G000146165_3578 0 1 0 0 0 +G000146165_3592 0 1 0 0 0 +G000146165_3613 0 2 0 0 0 +G000146165_3646 0 2 0 0 0 +G000146165_3663 0 2 0 0 0 +G000146165_3670 0 2 0 0 0 +G000146165_3695 0 2 0 0 0 +G000146165_3706 0 2 0 0 0 +G000146165_3720 0 2 0 0 0 +G000146165_3733 0 2 0 0 0 +G000146165_3734 0 2 0 0 0 +G000146165_3741 0 2 0 0 0 +G000146165_375 0 1 0 0 0 +G000146165_3777 0 2 0 0 0 +G000146165_3794 0 2 0 0 0 +G000146165_3810 0 2 0 0 0 +G000146165_3818 0 2 0 0 0 +G000146165_382 0 2 0 0 0 +G000146165_3838 0 2 0 0 0 +G000146165_3854 0 2 0 0 0 +G000146165_3868 0 2 0 0 0 +G000146165_3884 0 2 0 0 0 +G000146165_3889 0 2 0 0 0 +G000146165_3905 0 2 0 0 0 +G000146165_3916 0 2 0 0 0 +G000146165_392 0 2 0 0 0 +G000146165_3922 0 2 0 0 0 +G000146165_3930 0 2 0 0 0 +G000146165_396 0 2 0 0 0 +G000146165_3976 0 1 0 0 0 +G000146165_3990 0 2 0 0 0 +G000146165_3998 0 2 0 0 0 +G000146165_401 0 3 0 0 0 +G000146165_402 0 2 0 0 0 +G000146165_4032 0 2 0 0 0 +G000146165_4049 0 2 0 0 0 +G000146165_4061 0 2 0 0 0 +G000146165_4118 0 1 0 0 0 +G000146165_4125 0 2 0 0 0 +G000146165_4126 0 1 0 0 0 +G000146165_4136 0 2 0 0 0 +G000146165_4160 0 2 0 0 0 +G000146165_4165 0 2 0 0 0 +G000146165_4189 0 2 0 0 0 +G000146165_4213 0 6 0 0 0 +G000146165_4215 0 2 0 0 0 +G000146165_4226 0 2 0 0 0 +G000146165_4228 0 2 0 0 0 +G000146165_4270 0 1 0 0 0 +G000146165_4278 0 2 0 0 0 +G000146165_4292 0 2 0 0 0 +G000146165_4303 0 1 0 0 0 +G000146165_4325 0 2 0 0 0 +G000146165_4331 0 2 0 0 0 +G000146165_4357 0 2 0 0 0 +G000146165_4375 0 2 0 0 0 +G000146165_4409 0 2 0 0 0 +G000146165_4430 0 1 0 0 0 +G000146165_4454 0 2 0 0 0 +G000146165_4484 0 1 0 0 0 +G000146165_4494 0 2 0 0 0 +G000146165_4496 0 1 0 0 0 +G000146165_450 0 2 0 0 0 +G000146165_4514 0 2 0 0 0 +G000146165_4535 0 2 0 0 0 +G000146165_4536 0 2 0 0 0 +G000146165_454 0 1 0 0 0 +G000146165_455 0 2 0 0 0 +G000146165_4559 0 2 0 0 0 +G000146165_4580 0 1 0 0 0 +G000146165_511 0 2 0 0 0 +G000146165_517 0 2 0 0 0 +G000146165_53 0 2 0 0 0 +G000146165_557 0 1 0 0 0 +G000146165_562 0 2 0 0 0 +G000146165_582 0 2 0 0 0 +G000146165_63 0 2 0 0 0 +G000146165_641 0 2 0 0 0 +G000146165_73 0 1 0 0 0 +G000146165_767 0 2 0 0 0 +G000146165_788 0 2 0 0 0 +G000146165_795 0 2 0 0 0 +G000146165_829 0 1 0 0 0 +G000146165_833 0 2 0 0 0 +G000146165_836 0 2 0 0 0 +G000146165_865 0 2 0 0 0 +G000146165_878 0 2 0 0 0 +G000146165_887 0 1 0 0 0 +G000146165_906 0 1 0 0 0 +G000146165_959 0 1 0 0 0 +G000146165_960 0 1 0 0 0 +G000174395_1207 0 0 0 2 0 +G000174395_1248 0 0 0 1 0 +G000174395_1270 0 0 0 2 0 +G000174395_1384 0 0 0 1 0 +G000174395_1451 0 0 0 1 0 +G000174395_1803 0 0 0 2 0 +G000174395_1861 0 0 0 2 0 +G000174395_1911 0 0 0 2 0 +G000174395_1969 0 0 0 2 0 +G000174395_2010 0 0 0 2 0 +G000174395_2147 0 0 0 2 0 +G000174395_2262 0 0 0 1 0 +G000174395_2492 0 0 0 2 0 +G000174395_2545 0 0 0 2 0 +G000174395_2551 0 0 0 2 0 +G000174395_276 0 0 0 2 0 +G000174395_306 0 0 0 2 0 +G000174395_334 0 0 0 1 0 +G000174395_544 0 0 0 1 0 +G000174395_620 0 0 0 2 0 +G000174395_678 0 0 0 2 0 +G000174395_728 0 0 0 2 0 +G000174395_732 0 0 0 2 0 +G000174395_746 0 0 0 1 0 +G000174395_80 0 0 0 2 0 +G000174395_859 0 0 0 1 0 +G000183345_3105 0 0 1 0 0 +G000183345_4426 0 0 2 0 0 +G000185905_2483 0 0 0 2 0 +G000185905_3151 0 0 0 2 0 +G000185905_6098 2 0 0 0 0 +G000185905_6195 0 0 0 2 0 +G000185905_719 1 0 0 0 0 +G000191145_1960 0 0 0 0 2 +G000191145_2583 0 0 0 0 2 +G000191145_3186 0 0 0 0 2 +G000191145_3531 0 0 0 0 2 +G000195715_1033 0 0 0 2 0 +G000195715_1396 0 0 0 1 0 +G000195715_1771 0 0 0 2 0 +G000195715_2051 0 0 0 1 0 +G000195715_2295 0 0 0 2 0 +G000195715_2452 0 0 0 2 0 +G000195715_2736 0 0 0 2 0 +G000195715_367 0 0 0 1 0 +G000195715_591 0 0 0 2 0 +G000195735_11 0 0 2 0 0 +G000195735_122 0 0 2 0 0 +G000195735_138 0 0 2 0 0 +G000195735_238 0 0 2 0 0 +G000195735_278 0 0 2 0 0 +G000195735_292 0 0 2 0 0 +G000195735_331 0 0 2 0 0 +G000195735_338 0 0 2 0 0 +G000195735_346 0 0 2 0 0 +G000195735_379 0 0 2 0 0 +G000195735_400 0 0 2 0 0 +G000195735_422 0 0 2 0 0 +G000195735_430 0 0 2 0 0 +G000195735_527 0 0 2 0 0 +G000195735_529 0 0 2 0 0 +G000195735_530 0 0 2 0 0 +G000195735_536 0 0 2 0 0 +G000195735_617 0 0 2 0 0 +G000195735_736 0 0 1 0 0 +G000195735_747 0 0 1 0 0 +G000195735_748 0 0 1 0 0 +G000195735_810 0 0 2 0 0 +G000195735_812 0 0 2 0 0 +G000195735_879 0 0 2 0 0 +G000195735_896 0 0 2 0 0 +G000195855_1048 0 0 0 0 1 +G000195855_1147 0 0 0 0 2 +G000195855_1329 0 0 0 0 2 +G000195855_1364 0 0 0 0 1 +G000195855_1387 0 0 0 0 2 +G000195855_1805 0 0 0 0 2 +G000195855_210 0 0 0 0 1 +G000195855_2122 0 0 0 0 2 +G000195855_2142 0 0 0 0 2 +G000195855_2247 0 0 0 0 2 +G000195855_2357 0 0 0 0 1 +G000195855_2519 0 0 0 0 2 +G000195855_2536 0 0 0 0 2 +G000195855_2546 0 0 0 0 2 +G000195855_2646 0 0 0 0 2 +G000195855_2715 0 0 0 0 2 +G000195855_2803 0 0 0 0 2 +G000195855_3128 0 0 0 0 1 +G000195855_3184 0 0 0 0 1 +G000195855_3434 0 0 0 0 1 +G000195855_3646 0 0 0 0 1 +G000195855_378 0 0 0 0 2 +G000195855_414 0 0 0 0 2 +G000195855_532 0 0 0 0 2 +G000195855_560 0 0 0 0 2 +G000195995_1002 0 0 0 0 2 +G000195995_1014 0 0 0 0 2 +G000195995_1022 0 0 0 0 2 +G000195995_106 0 0 0 0 2 +G000195995_1112 0 0 0 0 2 +G000195995_1131 0 0 0 0 2 +G000195995_1156 0 0 0 0 2 +G000195995_1159 0 0 0 0 2 +G000195995_1181 0 0 0 0 2 +G000195995_1192 0 0 0 0 2 +G000195995_1215 0 0 0 0 2 +G000195995_1223 0 0 0 0 2 +G000195995_1297 0 0 0 0 2 +G000195995_1301 0 0 0 0 2 +G000195995_133 0 0 0 0 2 +G000195995_1344 0 0 0 0 2 +G000195995_1386 0 0 0 0 2 +G000195995_1401 0 0 0 0 1 +G000195995_1403 0 0 0 0 2 +G000195995_1416 0 0 0 0 1 +G000195995_1434 0 0 0 0 1 +G000195995_1465 0 0 0 0 2 +G000195995_1469 0 0 0 0 2 +G000195995_1480 0 0 0 0 1 +G000195995_1541 0 0 0 0 2 +G000195995_1549 0 0 0 0 4 +G000195995_1552 0 0 0 0 2 +G000195995_1623 0 0 0 0 2 +G000195995_1630 0 0 0 0 2 +G000195995_1658 0 0 0 0 4 +G000195995_1693 0 0 0 0 2 +G000195995_1720 0 0 0 0 1 +G000195995_1781 0 0 0 0 1 +G000195995_1795 0 0 0 0 2 +G000195995_1818 0 0 0 0 1 +G000195995_1829 0 0 0 0 2 +G000195995_1904 0 0 0 0 1 +G000195995_1925 0 0 0 0 2 +G000195995_1960 0 0 0 0 2 +G000195995_2037 0 0 0 0 2 +G000195995_204 0 0 0 0 2 +G000195995_2041 0 0 0 0 2 +G000195995_2118 0 0 0 0 2 +G000195995_2121 0 0 0 0 2 +G000195995_2132 0 0 0 0 2 +G000195995_2164 0 0 0 0 2 +G000195995_2165 0 0 0 0 2 +G000195995_2190 0 0 0 0 2 +G000195995_2194 0 0 0 0 1 +G000195995_2216 0 0 0 0 2 +G000195995_2256 0 0 0 0 1 +G000195995_2273 0 0 0 0 1 +G000195995_2294 0 0 0 0 2 +G000195995_2302 0 0 0 0 2 +G000195995_2326 0 0 0 0 2 +G000195995_2342 0 0 0 0 1 +G000195995_2364 0 0 0 0 2 +G000195995_2419 0 0 0 0 2 +G000195995_2436 0 0 0 0 1 +G000195995_2437 0 0 0 0 1 +G000195995_2455 0 0 0 0 2 +G000195995_252 0 0 0 0 2 +G000195995_2529 0 0 0 0 2 +G000195995_2537 0 0 0 0 1 +G000195995_2563 0 0 0 0 2 +G000195995_2567 0 0 0 0 2 +G000195995_2570 0 0 0 0 2 +G000195995_2575 0 0 0 0 2 +G000195995_259 0 0 0 0 2 +G000195995_2618 0 0 0 0 2 +G000195995_2644 0 0 0 0 2 +G000195995_2668 0 0 0 0 2 +G000195995_269 0 0 0 0 2 +G000195995_2704 0 0 0 0 2 +G000195995_2715 0 0 0 0 2 +G000195995_273 0 0 0 0 2 +G000195995_2731 0 0 0 0 2 +G000195995_2762 0 0 0 0 4 +G000195995_2765 0 0 0 0 2 +G000195995_2768 0 0 0 0 2 +G000195995_2772 0 0 0 0 2 +G000195995_278 0 0 0 0 2 +G000195995_2790 0 0 0 0 2 +G000195995_2838 0 0 0 0 2 +G000195995_285 0 0 0 0 2 +G000195995_2854 0 0 0 0 2 +G000195995_2871 0 0 0 0 2 +G000195995_2879 0 0 0 0 2 +G000195995_2883 0 0 0 0 2 +G000195995_2893 0 0 0 0 2 +G000195995_2929 0 0 0 0 2 +G000195995_2937 0 0 0 0 2 +G000195995_2949 0 0 0 0 2 +G000195995_298 0 0 0 0 2 +G000195995_3048 0 0 0 0 2 +G000195995_3049 0 0 0 0 2 +G000195995_3052 0 0 0 0 2 +G000195995_3065 0 0 0 0 1 +G000195995_309 0 0 0 0 2 +G000195995_317 0 0 0 0 2 +G000195995_3183 0 0 0 0 2 +G000195995_3192 0 0 0 0 1 +G000195995_3207 0 0 0 0 2 +G000195995_3214 0 0 0 0 1 +G000195995_3237 0 0 0 0 2 +G000195995_3241 0 0 0 0 1 +G000195995_3309 0 0 0 0 2 +G000195995_3333 0 0 0 0 2 +G000195995_3340 0 0 0 0 2 +G000195995_3351 0 0 0 0 3 +G000195995_3365 0 0 0 0 2 +G000195995_3373 0 0 0 0 1 +G000195995_3422 0 0 0 0 1 +G000195995_3423 0 0 0 0 2 +G000195995_3429 0 0 0 0 1 +G000195995_3474 0 0 0 0 2 +G000195995_3497 0 0 0 0 2 +G000195995_3562 0 0 0 0 1 +G000195995_3603 0 0 0 0 2 +G000195995_3609 0 0 0 0 2 +G000195995_3623 0 0 0 0 2 +G000195995_3675 0 0 0 0 2 +G000195995_3710 0 0 0 0 2 +G000195995_3857 0 0 0 0 4 +G000195995_3864 0 0 0 0 2 +G000195995_3914 0 0 0 0 2 +G000195995_393 0 0 0 0 2 +G000195995_3931 0 0 0 0 2 +G000195995_400 0 0 0 0 2 +G000195995_4000 0 0 0 0 2 +G000195995_4019 0 0 0 0 2 +G000195995_4057 0 0 0 0 2 +G000195995_4060 0 0 0 0 2 +G000195995_4124 0 0 0 0 2 +G000195995_4198 0 0 0 0 2 +G000195995_4201 0 0 0 0 2 +G000195995_4204 0 0 0 0 2 +G000195995_4225 0 0 0 0 2 +G000195995_4235 0 0 0 0 2 +G000195995_4242 0 0 0 0 2 +G000195995_4312 0 0 0 0 2 +G000195995_4325 0 0 0 0 2 +G000195995_4333 0 0 0 0 1 +G000195995_4366 0 0 0 0 2 +G000195995_4407 0 0 0 0 2 +G000195995_4481 0 0 0 0 2 +G000195995_4489 0 0 0 0 1 +G000195995_4522 0 0 0 0 2 +G000195995_455 0 0 0 0 2 +G000195995_4560 0 0 0 0 2 +G000195995_4588 0 0 0 0 2 +G000195995_4603 0 0 0 0 2 +G000195995_4620 0 0 0 0 2 +G000195995_4656 0 0 0 0 1 +G000195995_4662 0 0 0 0 2 +G000195995_471 0 0 0 0 2 +G000195995_4723 0 0 0 0 2 +G000195995_4764 0 0 0 0 2 +G000195995_4773 0 0 0 0 3 +G000195995_4803 0 0 0 0 1 +G000195995_4806 0 0 0 0 2 +G000195995_482 0 0 0 0 2 +G000195995_4894 0 0 0 0 4 +G000195995_4986 0 0 0 0 2 +G000195995_4991 0 0 0 0 2 +G000195995_4992 0 0 0 0 2 +G000195995_5000 0 0 0 0 2 +G000195995_5018 0 0 0 0 2 +G000195995_5063 0 0 0 0 2 +G000195995_522 0 0 0 0 2 +G000195995_558 0 0 0 0 2 +G000195995_584 0 0 0 0 2 +G000195995_598 0 0 0 0 4 +G000195995_6 0 0 0 0 2 +G000195995_600 0 0 0 0 2 +G000195995_652 0 0 0 0 1 +G000195995_7 0 0 0 0 2 +G000195995_723 0 0 0 0 1 +G000195995_724 0 0 0 0 3 +G000195995_729 0 0 0 0 2 +G000195995_737 0 0 0 0 1 +G000195995_739 0 0 0 0 1 +G000195995_75 0 0 0 0 2 +G000195995_765 0 0 0 0 2 +G000195995_766 0 0 0 0 2 +G000195995_772 0 0 0 0 2 +G000195995_885 0 0 0 0 2 +G000195995_889 0 0 0 0 2 +G000195995_900 0 0 0 0 2 +G000195995_92 0 0 0 0 1 +G000195995_923 0 0 0 0 1 +G000195995_928 0 0 0 0 2 +G000195995_933 0 0 0 0 2 +G000195995_95 0 0 0 0 2 +G000215745_1002 0 0 0 2 0 +G000215745_1004 0 0 0 2 0 +G000215745_1011 0 0 0 2 0 +G000215745_1017 0 0 0 2 0 +G000215745_1023 0 0 0 2 0 +G000215745_1032 0 0 0 1 0 +G000215745_1036 0 0 0 2 0 +G000215745_1049 0 0 0 2 0 +G000215745_1053 0 0 0 1 0 +G000215745_1057 0 0 0 2 0 +G000215745_1060 0 0 0 4 0 +G000215745_1068 0 0 0 2 0 +G000215745_1078 0 0 0 2 0 +G000215745_1097 0 0 0 1 0 +G000215745_1103 0 0 0 1 0 +G000215745_1104 0 0 0 1 0 +G000215745_1105 0 0 0 3 0 +G000215745_1113 0 0 0 2 0 +G000215745_1118 0 0 0 2 0 +G000215745_1121 0 0 0 2 0 +G000215745_1151 0 0 0 2 0 +G000215745_1164 0 0 0 2 0 +G000215745_1165 0 0 0 2 0 +G000215745_1181 0 0 0 1 0 +G000215745_1184 0 0 0 2 0 +G000215745_1193 0 0 0 4 0 +G000215745_1199 0 0 0 2 0 +G000215745_1202 0 0 0 2 0 +G000215745_121 0 0 0 1 0 +G000215745_1210 0 0 0 2 0 +G000215745_1215 0 0 0 1 0 +G000215745_1244 0 0 0 2 0 +G000215745_1250 0 0 0 2 0 +G000215745_1252 0 0 0 4 0 +G000215745_1253 0 0 0 2 0 +G000215745_1265 0 0 0 2 0 +G000215745_1268 0 0 0 2 0 +G000215745_1280 0 0 0 2 0 +G000215745_1281 0 0 0 2 0 +G000215745_1287 0 0 0 1 0 +G000215745_1288 0 0 0 2 0 +G000215745_1291 0 0 0 2 0 +G000215745_1294 0 0 0 2 0 +G000215745_1299 0 0 0 3 0 +G000215745_1304 0 0 0 3 0 +G000215745_1305 0 0 0 2 0 +G000215745_1312 0 0 0 1 0 +G000215745_1313 0 0 0 2 0 +G000215745_1318 0 0 0 1 0 +G000215745_1322 0 0 0 2 0 +G000215745_1329 0 0 0 2 0 +G000215745_1330 0 0 0 2 0 +G000215745_1333 0 0 0 2 0 +G000215745_135 0 0 0 2 0 +G000215745_1354 0 0 0 2 0 +G000215745_1355 0 0 0 4 0 +G000215745_1356 0 0 0 1 0 +G000215745_1374 0 0 0 2 0 +G000215745_1375 0 0 0 1 0 +G000215745_1384 0 0 0 2 0 +G000215745_1388 0 0 0 2 0 +G000215745_1391 0 0 0 2 0 +G000215745_1397 0 0 0 2 0 +G000215745_1402 0 0 0 1 0 +G000215745_1403 0 0 0 2 0 +G000215745_1404 0 0 0 2 0 +G000215745_1410 0 0 0 3 0 +G000215745_1430 0 0 0 2 0 +G000215745_1431 0 0 0 1 0 +G000215745_1432 0 0 0 3 0 +G000215745_1433 0 0 0 1 0 +G000215745_1443 0 0 0 4 0 +G000215745_1449 0 0 0 2 0 +G000215745_145 0 0 0 2 0 +G000215745_1450 0 0 0 2 0 +G000215745_1457 0 0 0 2 0 +G000215745_1462 0 0 0 2 0 +G000215745_1469 0 0 0 3 0 +G000215745_1470 0 0 0 3 0 +G000215745_1471 0 0 0 2 0 +G000215745_1475 0 0 0 2 0 +G000215745_148 0 0 0 1 0 +G000215745_1492 0 0 0 2 0 +G000215745_1494 0 0 0 2 0 +G000215745_1498 0 0 0 2 0 +G000215745_1499 0 0 0 2 0 +G000215745_1508 0 0 0 2 0 +G000215745_1522 0 0 0 2 0 +G000215745_1524 0 0 0 2 0 +G000215745_1530 0 0 0 1 0 +G000215745_1540 0 0 0 3 0 +G000215745_1543 0 0 0 2 0 +G000215745_1551 0 0 0 2 0 +G000215745_1552 0 0 0 2 0 +G000215745_1564 0 0 0 2 0 +G000215745_1571 0 0 0 2 0 +G000215745_1578 0 0 0 2 0 +G000215745_1583 0 0 0 1 0 +G000215745_1591 0 0 0 1 0 +G000215745_1599 0 0 0 1 0 +G000215745_16 0 0 0 2 0 +G000215745_1602 0 0 0 2 0 +G000215745_1612 0 0 0 1 0 +G000215745_1613 0 0 0 2 0 +G000215745_1624 0 0 0 2 0 +G000215745_1630 0 0 0 4 0 +G000215745_1633 0 0 0 2 0 +G000215745_1653 0 0 0 4 0 +G000215745_1667 0 0 0 2 0 +G000215745_1668 0 0 0 3 0 +G000215745_167 0 0 0 2 0 +G000215745_1671 0 0 0 2 0 +G000215745_1690 0 0 0 2 0 +G000215745_1702 0 0 0 2 0 +G000215745_1705 0 0 0 2 0 +G000215745_1716 0 0 0 2 0 +G000215745_1723 0 0 0 1 0 +G000215745_1739 0 0 0 2 0 +G000215745_1748 0 0 0 1 0 +G000215745_1749 0 0 0 1 0 +G000215745_1770 0 0 0 2 0 +G000215745_1773 0 0 0 1 0 +G000215745_1775 0 0 0 2 0 +G000215745_1778 0 0 0 4 0 +G000215745_1793 0 0 0 2 0 +G000215745_1809 0 0 0 2 0 +G000215745_1811 0 0 0 2 0 +G000215745_1820 0 0 0 1 0 +G000215745_1821 0 0 0 2 0 +G000215745_1825 0 0 0 1 0 +G000215745_1831 0 0 0 2 0 +G000215745_1847 0 0 0 4 0 +G000215745_1855 0 0 0 2 0 +G000215745_1863 0 0 0 2 0 +G000215745_1867 0 0 0 2 0 +G000215745_188 0 0 0 1 0 +G000215745_1880 0 0 0 1 0 +G000215745_1883 0 0 0 2 0 +G000215745_1885 0 0 0 2 0 +G000215745_1894 0 0 0 2 0 +G000215745_1906 0 0 0 2 0 +G000215745_1908 0 0 0 2 0 +G000215745_1909 0 0 0 2 0 +G000215745_1910 0 0 0 2 0 +G000215745_1919 0 0 0 3 0 +G000215745_1927 0 0 0 2 0 +G000215745_1932 0 0 0 2 0 +G000215745_1934 0 0 0 2 0 +G000215745_1937 0 0 0 2 0 +G000215745_1943 0 0 0 2 0 +G000215745_1946 0 0 0 2 0 +G000215745_1949 0 0 0 2 0 +G000215745_1951 0 0 0 1 0 +G000215745_1952 0 0 0 2 0 +G000215745_1958 0 0 0 1 0 +G000215745_196 0 0 0 2 0 +G000215745_1963 0 0 0 2 0 +G000215745_1968 0 0 0 2 0 +G000215745_1969 0 0 0 2 0 +G000215745_1982 0 0 0 2 0 +G000215745_1990 0 0 0 4 0 +G000215745_1992 0 0 0 2 0 +G000215745_1995 0 0 0 2 0 +G000215745_2008 0 0 0 2 0 +G000215745_2013 0 0 0 2 0 +G000215745_2018 0 0 0 2 0 +G000215745_2031 0 0 0 2 0 +G000215745_2041 0 0 0 2 0 +G000215745_2044 0 0 0 1 0 +G000215745_2048 0 0 0 2 0 +G000215745_2049 0 0 0 2 0 +G000215745_205 0 0 0 1 0 +G000215745_2054 0 0 0 2 0 +G000215745_2056 0 0 0 2 0 +G000215745_2057 0 0 0 2 0 +G000215745_2079 0 0 0 2 0 +G000215745_2085 0 0 0 2 0 +G000215745_2089 0 0 0 2 0 +G000215745_209 0 0 0 2 0 +G000215745_2093 0 0 0 1 0 +G000215745_210 0 0 0 1 0 +G000215745_2101 0 0 0 2 0 +G000215745_2106 0 0 0 2 0 +G000215745_211 0 0 0 1 0 +G000215745_2111 0 0 0 1 0 +G000215745_2115 0 0 0 2 0 +G000215745_2118 0 0 0 2 0 +G000215745_2130 0 0 0 2 0 +G000215745_2134 0 0 0 1 0 +G000215745_2138 0 0 0 2 0 +G000215745_2144 0 0 0 1 0 +G000215745_2145 0 0 0 2 0 +G000215745_2156 0 0 0 2 0 +G000215745_2158 0 0 0 4 0 +G000215745_2166 0 0 0 2 0 +G000215745_2172 0 0 0 2 0 +G000215745_2175 0 0 0 2 0 +G000215745_2177 0 0 0 2 0 +G000215745_2179 0 0 0 2 0 +G000215745_2191 0 0 0 2 0 +G000215745_2199 0 0 0 4 0 +G000215745_22 0 0 0 1 0 +G000215745_2212 0 0 0 2 0 +G000215745_2214 0 0 0 2 0 +G000215745_2226 0 0 0 2 0 +G000215745_223 0 0 0 2 0 +G000215745_2245 0 0 0 2 0 +G000215745_2254 0 0 0 2 0 +G000215745_2255 0 0 0 1 0 +G000215745_2260 0 0 0 1 0 +G000215745_2261 0 0 0 1 0 +G000215745_2267 0 0 0 2 0 +G000215745_2272 0 0 0 2 0 +G000215745_2278 0 0 0 2 0 +G000215745_2279 0 0 0 2 0 +G000215745_2285 0 0 0 1 0 +G000215745_2289 0 0 0 2 0 +G000215745_229 0 0 0 1 0 +G000215745_2290 0 0 0 2 0 +G000215745_2293 0 0 0 2 0 +G000215745_2294 0 0 0 2 0 +G000215745_2295 0 0 0 1 0 +G000215745_23 0 0 0 1 0 +G000215745_230 0 0 0 1 0 +G000215745_2306 0 0 0 1 0 +G000215745_2316 0 0 0 2 0 +G000215745_2323 0 0 0 2 0 +G000215745_2328 0 0 0 2 0 +G000215745_2332 0 0 0 1 0 +G000215745_2333 0 0 0 2 0 +G000215745_2344 0 0 0 2 0 +G000215745_2345 0 0 0 1 0 +G000215745_2347 0 0 0 2 0 +G000215745_2350 0 0 0 1 0 +G000215745_2353 0 0 0 2 0 +G000215745_236 0 0 0 1 0 +G000215745_2370 0 0 0 2 0 +G000215745_2371 0 0 0 2 0 +G000215745_2380 0 0 0 2 0 +G000215745_2384 0 0 0 2 0 +G000215745_2385 0 0 0 2 0 +G000215745_2386 0 0 0 2 0 +G000215745_239 0 0 0 2 0 +G000215745_2391 0 0 0 2 0 +G000215745_2395 0 0 0 2 0 +G000215745_2396 0 0 0 2 0 +G000215745_2397 0 0 0 4 0 +G000215745_2406 0 0 0 2 0 +G000215745_2411 0 0 0 1 0 +G000215745_2423 0 0 0 1 0 +G000215745_2425 0 0 0 1 0 +G000215745_2444 0 0 0 2 0 +G000215745_2457 0 0 0 1 0 +G000215745_2464 0 0 0 2 0 +G000215745_2466 0 0 0 2 0 +G000215745_2467 0 0 0 1 0 +G000215745_2475 0 0 0 2 0 +G000215745_2476 0 0 0 2 0 +G000215745_2478 0 0 0 2 0 +G000215745_2484 0 0 0 2 0 +G000215745_2487 0 0 0 2 0 +G000215745_2497 0 0 0 2 0 +G000215745_2506 0 0 0 2 0 +G000215745_2507 0 0 0 1 0 +G000215745_2512 0 0 0 2 0 +G000215745_2515 0 0 0 1 0 +G000215745_2520 0 0 0 4 0 +G000215745_2543 0 0 0 2 0 +G000215745_2546 0 0 0 1 0 +G000215745_2564 0 0 0 1 0 +G000215745_2566 0 0 0 2 0 +G000215745_2592 0 0 0 4 0 +G000215745_2597 0 0 0 2 0 +G000215745_2601 0 0 0 2 0 +G000215745_2602 0 0 0 1 0 +G000215745_2604 0 0 0 2 0 +G000215745_2607 0 0 0 1 0 +G000215745_2613 0 0 0 2 0 +G000215745_262 0 0 0 2 0 +G000215745_2625 0 0 0 2 0 +G000215745_2627 0 0 0 2 0 +G000215745_2636 0 0 0 2 0 +G000215745_2638 0 0 0 2 0 +G000215745_2640 0 0 0 2 0 +G000215745_2644 0 0 0 1 0 +G000215745_2645 0 0 0 5 0 +G000215745_2651 0 0 0 1 0 +G000215745_2654 0 0 0 6 0 +G000215745_2655 0 0 0 2 0 +G000215745_2657 0 0 0 2 0 +G000215745_2665 0 0 0 4 0 +G000215745_2666 0 0 0 1 0 +G000215745_2669 0 0 0 2 0 +G000215745_2670 0 0 0 2 0 +G000215745_2672 0 0 0 4 0 +G000215745_2676 0 0 0 2 0 +G000215745_2690 0 0 0 2 0 +G000215745_2692 0 0 0 2 0 +G000215745_2700 0 0 0 1 0 +G000215745_2707 0 0 0 2 0 +G000215745_2711 0 0 0 4 0 +G000215745_2713 0 0 0 2 0 +G000215745_2715 0 0 0 2 0 +G000215745_2720 0 0 0 2 0 +G000215745_2733 0 0 0 2 0 +G000215745_2741 0 0 0 1 0 +G000215745_2746 0 0 0 2 0 +G000215745_2750 0 0 0 1 0 +G000215745_2766 0 0 0 3 0 +G000215745_2773 0 0 0 2 0 +G000215745_2781 0 0 0 2 0 +G000215745_2782 0 0 0 2 0 +G000215745_2787 0 0 0 2 0 +G000215745_2799 0 0 0 2 0 +G000215745_2810 0 0 0 1 0 +G000215745_2818 0 0 0 2 0 +G000215745_2822 0 0 0 1 0 +G000215745_2833 0 0 0 3 0 +G000215745_2834 0 0 0 2 0 +G000215745_2837 0 0 0 2 0 +G000215745_2839 0 0 0 1 0 +G000215745_2857 0 0 0 2 0 +G000215745_2863 0 0 0 1 0 +G000215745_2878 0 0 0 2 0 +G000215745_288 0 0 0 1 0 +G000215745_2884 0 0 0 2 0 +G000215745_2885 0 0 0 3 0 +G000215745_2893 0 0 0 2 0 +G000215745_290 0 0 0 2 0 +G000215745_2900 0 0 0 2 0 +G000215745_2908 0 0 0 2 0 +G000215745_2913 0 0 0 2 0 +G000215745_2920 0 0 0 2 0 +G000215745_2921 0 0 0 2 0 +G000215745_2925 0 0 0 2 0 +G000215745_2934 0 0 0 2 0 +G000215745_2959 0 0 0 4 0 +G000215745_2961 0 0 0 2 0 +G000215745_2967 0 0 0 2 0 +G000215745_2968 0 0 0 2 0 +G000215745_297 0 0 0 2 0 +G000215745_2975 0 0 0 2 0 +G000215745_2978 0 0 0 2 0 +G000215745_2980 0 0 0 2 0 +G000215745_2988 0 0 0 2 0 +G000215745_2989 0 0 0 2 0 +G000215745_299 0 0 0 2 0 +G000215745_2990 0 0 0 2 0 +G000215745_2993 0 0 0 2 0 +G000215745_2994 0 0 0 2 0 +G000215745_2997 0 0 0 2 0 +G000215745_3009 0 0 0 2 0 +G000215745_3023 0 0 0 2 0 +G000215745_3025 0 0 0 4 0 +G000215745_3028 0 0 0 4 0 +G000215745_3029 0 0 0 2 0 +G000215745_3033 0 0 0 1 0 +G000215745_3041 0 0 0 2 0 +G000215745_3042 0 0 0 2 0 +G000215745_3046 0 0 0 2 0 +G000215745_305 0 0 0 1 0 +G000215745_3053 0 0 0 2 0 +G000215745_3054 0 0 0 1 0 +G000215745_3072 0 0 0 2 0 +G000215745_3082 0 0 0 2 0 +G000215745_3083 0 0 0 1 0 +G000215745_31 0 0 0 1 0 +G000215745_3104 0 0 0 2 0 +G000215745_3109 0 0 0 2 0 +G000215745_3111 0 0 0 1 0 +G000215745_3115 0 0 0 2 0 +G000215745_3116 0 0 0 1 0 +G000215745_3121 0 0 0 1 0 +G000215745_3123 0 0 0 2 0 +G000215745_3128 0 0 0 2 0 +G000215745_3137 0 0 0 2 0 +G000215745_3143 0 0 0 2 0 +G000215745_3144 0 0 0 2 0 +G000215745_3148 0 0 0 1 0 +G000215745_3158 0 0 0 2 0 +G000215745_3159 0 0 0 2 0 +G000215745_3178 0 0 0 2 0 +G000215745_3185 0 0 0 2 0 +G000215745_3187 0 0 0 1 0 +G000215745_3188 0 0 0 3 0 +G000215745_3194 0 0 0 2 0 +G000215745_320 0 0 0 1 0 +G000215745_3210 0 0 0 2 0 +G000215745_3211 0 0 0 2 0 +G000215745_3214 0 0 0 4 0 +G000215745_3215 0 0 0 1 0 +G000215745_3216 0 0 0 2 0 +G000215745_3219 0 0 0 2 0 +G000215745_323 0 0 0 2 0 +G000215745_3230 0 0 0 2 0 +G000215745_3233 0 0 0 2 0 +G000215745_324 0 0 0 2 0 +G000215745_3241 0 0 0 1 0 +G000215745_3242 0 0 0 2 0 +G000215745_3243 0 0 0 6 0 +G000215745_3244 0 0 0 2 0 +G000215745_3246 0 0 0 2 0 +G000215745_325 0 0 0 1 0 +G000215745_3269 0 0 0 2 0 +G000215745_3272 0 0 0 2 0 +G000215745_3276 0 0 0 1 0 +G000215745_3287 0 0 0 2 0 +G000215745_3289 0 0 0 2 0 +G000215745_3302 0 0 0 1 0 +G000215745_3305 0 0 0 2 0 +G000215745_3311 0 0 0 1 0 +G000215745_3312 0 0 0 1 0 +G000215745_3319 0 0 0 1 0 +G000215745_3320 0 0 0 1 0 +G000215745_333 0 0 0 2 0 +G000215745_3332 0 0 0 2 0 +G000215745_3352 0 0 0 2 0 +G000215745_3361 0 0 0 2 0 +G000215745_3362 0 0 0 2 0 +G000215745_3363 0 0 0 4 0 +G000215745_3388 0 0 0 2 0 +G000215745_3389 0 0 0 2 0 +G000215745_3393 0 0 0 1 0 +G000215745_3396 0 0 0 1 0 +G000215745_3397 0 0 0 1 0 +G000215745_3406 0 0 0 2 0 +G000215745_3408 0 0 0 2 0 +G000215745_341 0 0 0 2 0 +G000215745_3433 0 0 0 2 0 +G000215745_3439 0 0 0 2 0 +G000215745_3448 0 0 0 2 0 +G000215745_345 0 0 0 2 0 +G000215745_3454 0 0 0 4 0 +G000215745_3461 0 0 0 2 0 +G000215745_3463 0 0 0 4 0 +G000215745_3465 0 0 0 2 0 +G000215745_3470 0 0 0 1 0 +G000215745_3471 0 0 0 1 0 +G000215745_3473 0 0 0 6 0 +G000215745_3478 0 0 0 2 0 +G000215745_3480 0 0 0 2 0 +G000215745_3485 0 0 0 2 0 +G000215745_349 0 0 0 2 0 +G000215745_3504 0 0 0 1 0 +G000215745_3526 0 0 0 2 0 +G000215745_3529 0 0 0 2 0 +G000215745_353 0 0 0 2 0 +G000215745_3538 0 0 0 1 0 +G000215745_3539 0 0 0 1 0 +G000215745_3548 0 0 0 4 0 +G000215745_3552 0 0 0 1 0 +G000215745_3553 0 0 0 2 0 +G000215745_3562 0 0 0 2 0 +G000215745_3565 0 0 0 2 0 +G000215745_3574 0 0 0 2 0 +G000215745_3584 0 0 0 2 0 +G000215745_3587 0 0 0 2 0 +G000215745_3598 0 0 0 2 0 +G000215745_3607 0 0 0 4 0 +G000215745_3627 0 0 0 2 0 +G000215745_3629 0 0 0 2 0 +G000215745_363 0 0 0 2 0 +G000215745_3633 0 0 0 4 0 +G000215745_3641 0 0 0 1 0 +G000215745_3654 0 0 0 2 0 +G000215745_3663 0 0 0 1 0 +G000215745_3666 0 0 0 2 0 +G000215745_3682 0 0 0 2 0 +G000215745_3686 0 0 0 2 0 +G000215745_3689 0 0 0 2 0 +G000215745_3695 0 0 0 1 0 +G000215745_3697 0 0 0 2 0 +G000215745_3698 0 0 0 1 0 +G000215745_37 0 0 0 1 0 +G000215745_3714 0 0 0 2 0 +G000215745_3723 0 0 0 1 0 +G000215745_3724 0 0 0 1 0 +G000215745_3726 0 0 0 2 0 +G000215745_3735 0 0 0 2 0 +G000215745_3739 0 0 0 2 0 +G000215745_3742 0 0 0 2 0 +G000215745_3743 0 0 0 2 0 +G000215745_3747 0 0 0 1 0 +G000215745_375 0 0 0 1 0 +G000215745_3754 0 0 0 2 0 +G000215745_377 0 0 0 5 0 +G000215745_3782 0 0 0 2 0 +G000215745_3809 0 0 0 2 0 +G000215745_3814 0 0 0 2 0 +G000215745_3820 0 0 0 2 0 +G000215745_3822 0 0 0 2 0 +G000215745_3823 0 0 0 2 0 +G000215745_3824 0 0 0 1 0 +G000215745_3828 0 0 0 1 0 +G000215745_3839 0 0 0 1 0 +G000215745_3846 0 0 0 1 0 +G000215745_3851 0 0 0 2 0 +G000215745_3858 0 0 0 1 0 +G000215745_3860 0 0 0 4 0 +G000215745_3862 0 0 0 2 0 +G000215745_3866 0 0 0 2 0 +G000215745_3869 0 0 0 2 0 +G000215745_3870 0 0 0 1 0 +G000215745_3875 0 0 0 1 0 +G000215745_3882 0 0 0 2 0 +G000215745_3884 0 0 0 2 0 +G000215745_3885 0 0 0 4 0 +G000215745_3888 0 0 0 2 0 +G000215745_3910 0 0 0 2 0 +G000215745_3912 0 0 0 2 0 +G000215745_3923 0 0 0 2 0 +G000215745_3924 0 0 0 2 0 +G000215745_3925 0 0 0 2 0 +G000215745_3940 0 0 0 1 0 +G000215745_3948 0 0 0 2 0 +G000215745_3952 0 0 0 2 0 +G000215745_3964 0 0 0 2 0 +G000215745_3968 0 0 0 2 0 +G000215745_3969 0 0 0 2 0 +G000215745_3974 0 0 0 1 0 +G000215745_3981 0 0 0 1 0 +G000215745_3982 0 0 0 1 0 +G000215745_3983 0 0 0 2 0 +G000215745_3988 0 0 0 1 0 +G000215745_3991 0 0 0 3 0 +G000215745_40 0 0 0 2 0 +G000215745_4007 0 0 0 2 0 +G000215745_401 0 0 0 2 0 +G000215745_4012 0 0 0 1 0 +G000215745_4020 0 0 0 2 0 +G000215745_4023 0 0 0 2 0 +G000215745_4032 0 0 0 2 0 +G000215745_4042 0 0 0 3 0 +G000215745_4054 0 0 0 2 0 +G000215745_4058 0 0 0 1 0 +G000215745_4059 0 0 0 1 0 +G000215745_4065 0 0 0 2 0 +G000215745_4066 0 0 0 4 0 +G000215745_4070 0 0 0 2 0 +G000215745_4091 0 0 0 2 0 +G000215745_4092 0 0 0 3 0 +G000215745_4094 0 0 0 2 0 +G000215745_410 0 0 0 2 0 +G000215745_4108 0 0 0 2 0 +G000215745_4117 0 0 0 4 0 +G000215745_4127 0 0 0 2 0 +G000215745_4130 0 0 0 2 0 +G000215745_4132 0 0 0 2 0 +G000215745_4135 0 0 0 2 0 +G000215745_414 0 0 0 2 0 +G000215745_4140 0 0 0 1 0 +G000215745_4149 0 0 0 3 0 +G000215745_4150 0 0 0 2 0 +G000215745_4153 0 0 0 2 0 +G000215745_4164 0 0 0 2 0 +G000215745_4169 0 0 0 2 0 +G000215745_4170 0 0 0 2 0 +G000215745_4175 0 0 0 4 0 +G000215745_4180 0 0 0 2 0 +G000215745_4184 0 0 0 4 0 +G000215745_4186 0 0 0 1 0 +G000215745_4207 0 0 0 2 0 +G000215745_4212 0 0 0 2 0 +G000215745_4217 0 0 0 1 0 +G000215745_4219 0 0 0 2 0 +G000215745_422 0 0 0 2 0 +G000215745_4238 0 0 0 2 0 +G000215745_424 0 0 0 1 0 +G000215745_4240 0 0 0 2 0 +G000215745_4250 0 0 0 1 0 +G000215745_4251 0 0 0 2 0 +G000215745_4259 0 0 0 2 0 +G000215745_4267 0 0 0 1 0 +G000215745_427 0 0 0 2 0 +G000215745_4271 0 0 0 2 0 +G000215745_4286 0 0 0 2 0 +G000215745_4288 0 0 0 1 0 +G000215745_4290 0 0 0 2 0 +G000215745_4294 0 0 0 2 0 +G000215745_4298 0 0 0 1 0 +G000215745_4306 0 0 0 4 0 +G000215745_4309 0 0 0 1 0 +G000215745_432 0 0 0 3 0 +G000215745_4328 0 0 0 2 0 +G000215745_4330 0 0 0 2 0 +G000215745_4338 0 0 0 2 0 +G000215745_4340 0 0 0 2 0 +G000215745_4346 0 0 0 2 0 +G000215745_4366 0 0 0 2 0 +G000215745_4367 0 0 0 2 0 +G000215745_4387 0 0 0 2 0 +G000215745_4400 0 0 0 2 0 +G000215745_443 0 0 0 1 0 +G000215745_4430 0 0 0 4 0 +G000215745_4434 0 0 0 2 0 +G000215745_4448 0 0 0 1 0 +G000215745_4450 0 0 0 2 0 +G000215745_4466 0 0 0 2 0 +G000215745_4475 0 0 0 2 0 +G000215745_4487 0 0 0 3 0 +G000215745_4493 0 0 0 2 0 +G000215745_45 0 0 0 2 0 +G000215745_4506 0 0 0 2 0 +G000215745_451 0 0 0 1 0 +G000215745_4511 0 0 0 1 0 +G000215745_4517 0 0 0 2 0 +G000215745_4524 0 0 0 2 0 +G000215745_4525 0 0 0 3 0 +G000215745_4545 0 0 0 2 0 +G000215745_4548 0 0 0 2 0 +G000215745_456 0 0 0 4 0 +G000215745_4563 0 0 0 2 0 +G000215745_4591 0 0 0 2 0 +G000215745_4593 0 0 0 2 0 +G000215745_4604 0 0 0 2 0 +G000215745_4605 0 0 0 2 0 +G000215745_4613 0 0 0 2 0 +G000215745_463 0 0 0 1 0 +G000215745_4631 0 0 0 2 0 +G000215745_4634 0 0 0 2 0 +G000215745_4636 0 0 0 2 0 +G000215745_4637 0 0 0 2 0 +G000215745_464 0 0 0 2 0 +G000215745_4641 0 0 0 2 0 +G000215745_4643 0 0 0 1 0 +G000215745_4645 0 0 0 2 0 +G000215745_4652 0 0 0 2 0 +G000215745_4653 0 0 0 1 0 +G000215745_4654 0 0 0 2 0 +G000215745_4656 0 0 0 2 0 +G000215745_466 0 0 0 2 0 +G000215745_4663 0 0 0 2 0 +G000215745_4673 0 0 0 2 0 +G000215745_4683 0 0 0 2 0 +G000215745_4689 0 0 0 4 0 +G000215745_4693 0 0 0 2 0 +G000215745_47 0 0 0 2 0 +G000215745_4704 0 0 0 1 0 +G000215745_4711 0 0 0 1 0 +G000215745_4712 0 0 0 2 0 +G000215745_4717 0 0 0 1 0 +G000215745_4718 0 0 0 5 0 +G000215745_4720 0 0 0 1 0 +G000215745_4723 0 0 0 2 0 +G000215745_4725 0 0 0 2 0 +G000215745_4729 0 0 0 2 0 +G000215745_4733 0 0 0 4 0 +G000215745_4752 0 0 0 2 0 +G000215745_4763 0 0 0 2 0 +G000215745_4768 0 0 0 4 0 +G000215745_4769 0 0 0 2 0 +G000215745_4770 0 0 0 2 0 +G000215745_4772 0 0 0 2 0 +G000215745_4773 0 0 0 2 0 +G000215745_4780 0 0 0 2 0 +G000215745_4784 0 0 0 2 0 +G000215745_4791 0 0 0 3 0 +G000215745_4797 0 0 0 2 0 +G000215745_4798 0 0 0 2 0 +G000215745_4807 0 0 0 2 0 +G000215745_4821 0 0 0 1 0 +G000215745_4825 0 0 0 1 0 +G000215745_4831 0 0 0 2 0 +G000215745_4835 0 0 0 2 0 +G000215745_4840 0 0 0 2 0 +G000215745_4845 0 0 0 2 0 +G000215745_4847 0 0 0 2 0 +G000215745_4849 0 0 0 2 0 +G000215745_4859 0 0 0 2 0 +G000215745_4866 0 0 0 2 0 +G000215745_496 0 0 0 2 0 +G000215745_497 0 0 0 2 0 +G000215745_498 0 0 0 2 0 +G000215745_503 0 0 0 4 0 +G000215745_505 0 0 0 2 0 +G000215745_506 0 0 0 6 0 +G000215745_512 0 0 0 4 0 +G000215745_518 0 0 0 2 0 +G000215745_522 0 0 0 1 0 +G000215745_53 0 0 0 2 0 +G000215745_539 0 0 0 2 0 +G000215745_542 0 0 0 2 0 +G000215745_544 0 0 0 2 0 +G000215745_552 0 0 0 2 0 +G000215745_557 0 0 0 2 0 +G000215745_566 0 0 0 1 0 +G000215745_567 0 0 0 2 0 +G000215745_577 0 0 0 1 0 +G000215745_582 0 0 0 2 0 +G000215745_584 0 0 0 2 0 +G000215745_585 0 0 0 2 0 +G000215745_592 0 0 0 2 0 +G000215745_597 0 0 0 3 0 +G000215745_598 0 0 0 2 0 +G000215745_603 0 0 0 2 0 +G000215745_608 0 0 0 2 0 +G000215745_61 0 0 0 2 0 +G000215745_610 0 0 0 1 0 +G000215745_616 0 0 0 2 0 +G000215745_626 0 0 0 2 0 +G000215745_638 0 0 0 2 0 +G000215745_639 0 0 0 2 0 +G000215745_646 0 0 0 2 0 +G000215745_649 0 0 0 2 0 +G000215745_652 0 0 0 1 0 +G000215745_664 0 0 0 2 0 +G000215745_668 0 0 0 2 0 +G000215745_683 0 0 0 2 0 +G000215745_689 0 0 0 2 0 +G000215745_691 0 0 0 2 0 +G000215745_701 0 0 0 1 0 +G000215745_704 0 0 0 2 0 +G000215745_706 0 0 0 2 0 +G000215745_708 0 0 0 2 0 +G000215745_711 0 0 0 1 0 +G000215745_712 0 0 0 2 0 +G000215745_713 0 0 0 2 0 +G000215745_717 0 0 0 2 0 +G000215745_720 0 0 0 1 0 +G000215745_723 0 0 0 2 0 +G000215745_747 0 0 0 2 0 +G000215745_75 0 0 0 2 0 +G000215745_754 0 0 0 1 0 +G000215745_755 0 0 0 4 0 +G000215745_758 0 0 0 2 0 +G000215745_763 0 0 0 2 0 +G000215745_764 0 0 0 2 0 +G000215745_769 0 0 0 2 0 +G000215745_774 0 0 0 2 0 +G000215745_777 0 0 0 2 0 +G000215745_78 0 0 0 1 0 +G000215745_784 0 0 0 2 0 +G000215745_798 0 0 0 2 0 +G000215745_807 0 0 0 4 0 +G000215745_808 0 0 0 1 0 +G000215745_813 0 0 0 2 0 +G000215745_816 0 0 0 2 0 +G000215745_817 0 0 0 2 0 +G000215745_818 0 0 0 2 0 +G000215745_830 0 0 0 1 0 +G000215745_832 0 0 0 1 0 +G000215745_835 0 0 0 1 0 +G000215745_849 0 0 0 2 0 +G000215745_874 0 0 0 2 0 +G000215745_883 0 0 0 2 0 +G000215745_889 0 0 0 2 0 +G000215745_891 0 0 0 1 0 +G000215745_898 0 0 0 1 0 +G000215745_906 0 0 0 2 0 +G000215745_909 0 0 0 2 0 +G000215745_91 0 0 0 2 0 +G000215745_911 0 0 0 1 0 +G000215745_920 0 0 0 1 0 +G000215745_94 0 0 0 3 0 +G000215745_958 0 0 0 2 0 +G000215745_962 0 0 0 1 0 +G000215745_981 0 0 0 2 0 +G000215745_987 0 0 0 4 0 +G000215745_993 0 0 0 1 0 +G000240185_1016 0 2 0 0 0 +G000240185_103 0 2 0 0 0 +G000240185_1038 0 2 0 0 0 +G000240185_1040 0 1 0 0 0 +G000240185_1042 0 2 0 0 0 +G000240185_1051 0 2 0 0 0 +G000240185_1063 0 2 0 0 0 +G000240185_1074 0 2 0 0 0 +G000240185_1076 0 1 0 0 0 +G000240185_1077 0 2 0 0 0 +G000240185_108 0 1 0 0 0 +G000240185_1100 0 2 0 0 0 +G000240185_111 0 2 0 0 0 +G000240185_1110 0 2 0 0 0 +G000240185_1114 0 2 0 0 0 +G000240185_1226 0 2 0 0 0 +G000240185_1243 0 1 0 0 0 +G000240185_1247 0 1 0 0 0 +G000240185_1252 0 2 0 0 0 +G000240185_1294 0 2 0 0 0 +G000240185_1319 0 2 0 0 0 +G000240185_1332 0 2 0 0 0 +G000240185_1360 0 2 0 0 0 +G000240185_1376 0 2 0 0 0 +G000240185_140 0 2 0 0 0 +G000240185_1401 0 2 0 0 0 +G000240185_1402 0 2 0 0 0 +G000240185_144 0 2 0 0 0 +G000240185_1442 0 2 0 0 0 +G000240185_146 0 2 0 0 0 +G000240185_1481 0 1 0 0 0 +G000240185_1494 0 2 0 0 0 +G000240185_1521 0 2 0 0 0 +G000240185_1532 0 3 0 0 0 +G000240185_1547 0 2 0 0 0 +G000240185_1588 0 1 0 0 0 +G000240185_160 0 2 0 0 0 +G000240185_1607 0 2 0 0 0 +G000240185_1667 0 1 0 0 0 +G000240185_1671 0 1 0 0 0 +G000240185_1695 0 1 0 0 0 +G000240185_1717 0 2 0 0 0 +G000240185_1718 0 2 0 0 0 +G000240185_1719 0 2 0 0 0 +G000240185_1722 0 1 0 0 0 +G000240185_1733 0 1 0 0 0 +G000240185_1756 0 2 0 0 0 +G000240185_1765 0 2 0 0 0 +G000240185_1828 0 2 0 0 0 +G000240185_1846 0 2 0 0 0 +G000240185_1848 0 2 0 0 0 +G000240185_1876 0 2 0 0 0 +G000240185_1896 0 2 0 0 0 +G000240185_1903 0 2 0 0 0 +G000240185_1972 0 1 0 0 0 +G000240185_1979 0 1 0 0 0 +G000240185_20 0 2 0 0 0 +G000240185_2018 0 2 0 0 0 +G000240185_2048 0 1 0 0 0 +G000240185_2082 0 1 0 0 0 +G000240185_2092 0 2 0 0 0 +G000240185_2107 0 2 0 0 0 +G000240185_2122 0 2 0 0 0 +G000240185_2124 0 2 0 0 0 +G000240185_2129 0 1 0 0 0 +G000240185_2130 0 1 0 0 0 +G000240185_2141 0 2 0 0 0 +G000240185_215 0 2 0 0 0 +G000240185_2183 0 2 0 0 0 +G000240185_2192 0 2 0 0 0 +G000240185_2195 0 1 0 0 0 +G000240185_2199 0 2 0 0 0 +G000240185_2222 0 1 0 0 0 +G000240185_2225 0 1 0 0 0 +G000240185_2230 0 2 0 0 0 +G000240185_2244 0 2 0 0 0 +G000240185_2250 0 4 0 0 0 +G000240185_2260 0 2 0 0 0 +G000240185_2261 0 2 0 0 0 +G000240185_227 0 2 0 0 0 +G000240185_2290 0 2 0 0 0 +G000240185_2299 0 2 0 0 0 +G000240185_2302 0 2 0 0 0 +G000240185_2332 0 2 0 0 0 +G000240185_2346 0 2 0 0 0 +G000240185_2349 0 2 0 0 0 +G000240185_2368 0 2 0 0 0 +G000240185_2391 0 2 0 0 0 +G000240185_2395 0 2 0 0 0 +G000240185_2422 0 2 0 0 0 +G000240185_2429 0 2 0 0 0 +G000240185_2434 0 2 0 0 0 +G000240185_2472 0 1 0 0 0 +G000240185_2503 0 2 0 0 0 +G000240185_2545 0 2 0 0 0 +G000240185_2548 0 2 0 0 0 +G000240185_2555 0 2 0 0 0 +G000240185_2574 0 2 0 0 0 +G000240185_2589 0 4 0 0 0 +G000240185_2605 0 1 0 0 0 +G000240185_2611 0 2 0 0 0 +G000240185_2617 0 2 0 0 0 +G000240185_2632 0 2 0 0 0 +G000240185_2658 0 1 0 0 0 +G000240185_2672 0 1 0 0 0 +G000240185_268 0 2 0 0 0 +G000240185_2684 0 1 0 0 0 +G000240185_2685 0 2 0 0 0 +G000240185_2693 0 2 0 0 0 +G000240185_2705 0 1 0 0 0 +G000240185_2724 0 2 0 0 0 +G000240185_2739 0 2 0 0 0 +G000240185_2802 0 2 0 0 0 +G000240185_2813 0 2 0 0 0 +G000240185_2820 0 2 0 0 0 +G000240185_2845 0 2 0 0 0 +G000240185_2871 0 1 0 0 0 +G000240185_2884 0 1 0 0 0 +G000240185_2897 0 2 0 0 0 +G000240185_2910 0 1 0 0 0 +G000240185_2944 0 2 0 0 0 +G000240185_2951 0 2 0 0 0 +G000240185_2956 0 2 0 0 0 +G000240185_2973 0 1 0 0 0 +G000240185_2981 0 2 0 0 0 +G000240185_30 0 2 0 0 0 +G000240185_3035 0 2 0 0 0 +G000240185_3054 0 2 0 0 0 +G000240185_3055 0 1 0 0 0 +G000240185_3113 0 2 0 0 0 +G000240185_3124 0 2 0 0 0 +G000240185_3131 0 2 0 0 0 +G000240185_3143 0 2 0 0 0 +G000240185_3153 0 2 0 0 0 +G000240185_317 0 2 0 0 0 +G000240185_3182 0 1 0 0 0 +G000240185_3185 0 2 0 0 0 +G000240185_3195 0 2 0 0 0 +G000240185_3199 0 2 0 0 0 +G000240185_3211 0 2 0 0 0 +G000240185_3226 0 2 0 0 0 +G000240185_3301 0 2 0 0 0 +G000240185_3302 0 0 2 0 0 +G000240185_3312 0 1 0 0 0 +G000240185_3313 0 1 0 0 0 +G000240185_3365 0 2 0 0 0 +G000240185_340 0 1 0 0 0 +G000240185_3407 0 2 0 0 0 +G000240185_3410 0 2 0 0 0 +G000240185_3436 0 2 0 0 0 +G000240185_3452 0 1 0 0 0 +G000240185_3467 0 2 0 0 0 +G000240185_347 0 2 0 0 0 +G000240185_3515 0 2 0 0 0 +G000240185_3521 0 2 0 0 0 +G000240185_3523 0 2 0 0 0 +G000240185_3528 0 2 0 0 0 +G000240185_3543 0 2 0 0 0 +G000240185_3550 0 2 0 0 0 +G000240185_3584 0 1 0 0 0 +G000240185_3620 0 2 0 0 0 +G000240185_3637 0 2 0 0 0 +G000240185_3638 0 2 0 0 0 +G000240185_3662 0 2 0 0 0 +G000240185_3713 0 2 0 0 0 +G000240185_3720 0 2 0 0 0 +G000240185_3731 0 2 0 0 0 +G000240185_3746 0 2 0 0 0 +G000240185_3786 0 1 0 0 0 +G000240185_3789 0 1 0 0 0 +G000240185_381 0 2 0 0 0 +G000240185_3824 0 2 0 0 0 +G000240185_3843 0 1 0 0 0 +G000240185_3856 0 2 0 0 0 +G000240185_3866 0 2 0 0 0 +G000240185_3868 0 2 0 0 0 +G000240185_3872 0 1 0 0 0 +G000240185_3873 0 1 0 0 0 +G000240185_3888 0 2 0 0 0 +G000240185_389 0 2 0 0 0 +G000240185_3900 0 2 0 0 0 +G000240185_3912 0 2 0 0 0 +G000240185_392 0 2 0 0 0 +G000240185_3922 0 3 0 0 0 +G000240185_3923 0 1 0 0 0 +G000240185_3942 0 2 0 0 0 +G000240185_3943 0 2 0 0 0 +G000240185_3952 0 2 0 0 0 +G000240185_3967 0 1 0 0 0 +G000240185_3989 0 2 0 0 0 +G000240185_3997 0 2 0 0 0 +G000240185_3998 0 2 0 0 0 +G000240185_4001 0 2 0 0 0 +G000240185_4002 0 2 0 0 0 +G000240185_4026 0 2 0 0 0 +G000240185_4030 0 2 0 0 0 +G000240185_4038 0 2 0 0 0 +G000240185_4048 0 2 0 0 0 +G000240185_4060 0 2 0 0 0 +G000240185_4061 0 1 0 0 0 +G000240185_4063 0 2 0 0 0 +G000240185_4071 0 2 0 0 0 +G000240185_4120 0 2 0 0 0 +G000240185_4136 0 1 0 0 0 +G000240185_4181 0 2 0 0 0 +G000240185_4195 0 2 0 0 0 +G000240185_420 0 1 0 0 0 +G000240185_4221 0 2 0 0 0 +G000240185_4226 0 2 0 0 0 +G000240185_4231 0 2 0 0 0 +G000240185_4240 0 1 0 0 0 +G000240185_4270 0 1 0 0 0 +G000240185_4304 0 1 0 0 0 +G000240185_4337 0 2 0 0 0 +G000240185_4360 0 1 0 0 0 +G000240185_4361 0 2 0 0 0 +G000240185_4369 0 2 0 0 0 +G000240185_4377 0 2 0 0 0 +G000240185_4386 2 0 0 0 0 +G000240185_4390 0 2 0 0 0 +G000240185_4392 0 2 0 0 0 +G000240185_44 0 2 0 0 0 +G000240185_4430 0 1 0 0 0 +G000240185_4439 0 1 0 0 0 +G000240185_444 0 1 0 0 0 +G000240185_447 0 2 0 0 0 +G000240185_4486 0 4 0 0 0 +G000240185_4491 0 1 0 0 0 +G000240185_4525 0 1 0 0 0 +G000240185_4530 0 2 0 0 0 +G000240185_4551 0 2 0 0 0 +G000240185_4556 0 2 0 0 0 +G000240185_4563 0 2 0 0 0 +G000240185_4598 0 4 0 0 0 +G000240185_4616 0 0 0 1 0 +G000240185_4625 0 4 0 0 0 +G000240185_4641 0 1 0 0 0 +G000240185_4647 0 1 0 0 0 +G000240185_4687 0 2 0 0 0 +G000240185_4692 0 2 0 0 0 +G000240185_4697 0 1 0 0 0 +G000240185_4720 0 2 0 0 0 +G000240185_4726 0 2 0 0 0 +G000240185_4728 0 2 0 0 0 +G000240185_473 0 2 0 0 0 +G000240185_4730 0 2 0 0 0 +G000240185_4747 0 2 0 0 0 +G000240185_4763 0 2 0 0 0 +G000240185_4766 0 2 0 0 0 +G000240185_4775 0 1 0 0 0 +G000240185_4779 0 1 0 0 0 +G000240185_4786 0 2 0 0 0 +G000240185_4798 0 2 0 0 0 +G000240185_4813 0 2 0 0 0 +G000240185_4815 0 1 0 0 0 +G000240185_4816 0 1 0 0 0 +G000240185_486 0 2 0 0 0 +G000240185_4892 0 2 0 0 0 +G000240185_4898 0 2 0 0 0 +G000240185_4905 0 1 0 0 0 +G000240185_4916 0 1 0 0 0 +G000240185_4939 0 4 0 0 0 +G000240185_4940 0 2 0 0 0 +G000240185_4945 0 2 0 0 0 +G000240185_4957 0 2 0 0 0 +G000240185_4964 0 2 0 0 0 +G000240185_4966 0 4 0 0 0 +G000240185_4976 0 2 0 0 0 +G000240185_4983 0 2 0 0 0 +G000240185_4984 0 2 0 0 0 +G000240185_4995 0 2 0 0 0 +G000240185_5004 0 2 0 0 0 +G000240185_5017 0 2 0 0 0 +G000240185_5028 0 2 0 0 0 +G000240185_503 0 2 0 0 0 +G000240185_5041 0 4 0 0 0 +G000240185_5073 0 1 0 0 0 +G000240185_5080 0 2 0 0 0 +G000240185_5117 0 2 0 0 0 +G000240185_5123 0 2 0 0 0 +G000240185_5183 0 2 0 0 0 +G000240185_5189 0 2 0 0 0 +G000240185_5190 0 2 0 0 0 +G000240185_5198 0 2 0 0 0 +G000240185_5234 0 2 0 0 0 +G000240185_5240 0 1 0 0 0 +G000240185_5255 0 2 0 0 0 +G000240185_5263 0 2 0 0 0 +G000240185_5362 0 4 0 0 0 +G000240185_5369 0 2 0 0 0 +G000240185_5384 0 1 0 0 0 +G000240185_5387 0 2 0 0 0 +G000240185_539 0 1 0 0 0 +G000240185_5398 0 1 0 0 0 +G000240185_5400 0 1 0 0 0 +G000240185_5401 0 2 0 0 0 +G000240185_5408 0 2 0 0 0 +G000240185_5414 0 2 0 0 0 +G000240185_5417 0 2 0 0 0 +G000240185_5431 0 2 0 0 0 +G000240185_544 0 2 0 0 0 +G000240185_5447 0 2 0 0 0 +G000240185_561 0 2 0 0 0 +G000240185_571 0 2 0 0 0 +G000240185_580 0 1 0 0 0 +G000240185_592 0 2 0 0 0 +G000240185_595 0 2 0 0 0 +G000240185_665 0 2 0 0 0 +G000240185_674 0 2 0 0 0 +G000240185_692 0 2 0 0 0 +G000240185_712 0 1 0 0 0 +G000240185_734 0 2 0 0 0 +G000240185_743 0 2 0 0 0 +G000240185_752 0 2 0 0 0 +G000240185_780 0 2 0 0 0 +G000240185_787 0 1 0 0 0 +G000240185_788 0 2 0 0 0 +G000240185_790 0 2 0 0 0 +G000240185_793 0 1 0 0 0 +G000240185_797 0 2 0 0 0 +G000240185_808 0 2 0 0 0 +G000240185_810 0 2 0 0 0 +G000240185_812 0 2 0 0 0 +G000240185_82 0 2 0 0 0 +G000240185_858 0 1 0 0 0 +G000240185_859 0 2 0 0 0 +G000240185_86 0 2 0 0 0 +G000240185_865 0 1 0 0 0 +G000240185_871 0 2 0 0 0 +G000240185_876 0 2 0 0 0 +G000240185_878 0 2 0 0 0 +G000240185_895 0 2 0 0 0 +G000240185_911 0 1 0 0 0 +G000240185_936 0 2 0 0 0 +G000240185_945 0 2 0 0 0 +G000240185_975 0 2 0 0 0 +G000240185_982 0 1 0 0 0 +G000299455_1009 0 0 1 0 0 +G000299455_1025 0 0 1 0 0 +G000299455_1046 0 0 2 0 0 +G000299455_1066 0 0 2 0 0 +G000299455_1075 0 0 1 0 0 +G000299455_1076 0 0 1 0 0 +G000299455_1096 0 0 2 0 0 +G000299455_1126 0 0 2 0 0 +G000299455_1136 0 0 2 0 0 +G000299455_115 0 0 2 0 0 +G000299455_1151 0 0 1 0 0 +G000299455_1162 0 0 2 0 0 +G000299455_1163 0 0 1 0 0 +G000299455_1171 0 0 2 0 0 +G000299455_1173 0 0 2 0 0 +G000299455_12 0 0 2 0 0 +G000299455_1235 0 0 2 0 0 +G000299455_1240 0 0 1 0 0 +G000299455_1243 0 0 2 0 0 +G000299455_1261 0 0 2 0 0 +G000299455_1263 0 0 1 0 0 +G000299455_1279 0 0 2 0 0 +G000299455_1300 0 0 1 0 0 +G000299455_1303 0 0 4 0 0 +G000299455_1327 0 0 2 0 0 +G000299455_1349 0 0 1 0 0 +G000299455_1360 0 0 2 0 0 +G000299455_1366 0 0 3 0 0 +G000299455_1370 0 0 3 0 0 +G000299455_1375 0 0 2 0 0 +G000299455_1377 0 0 2 0 0 +G000299455_138 0 0 2 0 0 +G000299455_1398 0 0 2 0 0 +G000299455_1400 0 0 2 0 0 +G000299455_1415 0 0 2 0 0 +G000299455_1440 0 0 2 0 0 +G000299455_1448 0 0 1 0 0 +G000299455_1456 0 0 2 0 0 +G000299455_1483 0 0 2 0 0 +G000299455_1486 0 0 2 0 0 +G000299455_1523 0 0 1 0 0 +G000299455_1549 0 0 2 0 0 +G000299455_1555 0 0 2 0 0 +G000299455_1556 0 0 2 0 0 +G000299455_1596 0 0 2 0 0 +G000299455_162 0 0 2 0 0 +G000299455_1628 0 0 1 0 0 +G000299455_1639 0 0 1 0 0 +G000299455_1641 0 0 2 0 0 +G000299455_165 0 0 1 0 0 +G000299455_1667 0 0 2 0 0 +G000299455_1692 0 0 2 0 0 +G000299455_1700 0 0 2 0 0 +G000299455_1707 0 0 2 0 0 +G000299455_1718 0 0 2 0 0 +G000299455_1729 0 0 2 0 0 +G000299455_1739 0 0 2 0 0 +G000299455_1746 0 0 2 0 0 +G000299455_1748 0 0 2 0 0 +G000299455_1757 0 0 2 0 0 +G000299455_1758 0 0 3 0 0 +G000299455_1762 0 0 2 0 0 +G000299455_1770 0 0 1 0 0 +G000299455_1783 0 0 2 0 0 +G000299455_1786 0 0 4 0 0 +G000299455_18 0 0 2 0 0 +G000299455_1803 0 0 2 0 0 +G000299455_1809 0 0 1 0 0 +G000299455_1813 0 0 2 0 0 +G000299455_1829 0 0 2 0 0 +G000299455_1837 0 0 1 0 0 +G000299455_1841 0 0 2 0 0 +G000299455_1844 0 0 2 0 0 +G000299455_185 0 0 1 0 0 +G000299455_186 0 0 1 0 0 +G000299455_1875 0 0 1 0 0 +G000299455_19 0 0 2 0 0 +G000299455_1907 0 0 2 0 0 +G000299455_1908 0 0 2 0 0 +G000299455_1910 0 0 1 0 0 +G000299455_1941 0 0 2 0 0 +G000299455_1965 0 0 2 0 0 +G000299455_1989 0 0 2 0 0 +G000299455_199 0 0 2 0 0 +G000299455_1994 0 0 2 0 0 +G000299455_1998 0 0 2 0 0 +G000299455_2008 0 0 1 0 0 +G000299455_2019 0 0 3 0 0 +G000299455_2020 0 0 1 0 0 +G000299455_2030 0 0 2 0 0 +G000299455_2039 0 0 2 0 0 +G000299455_2046 0 0 2 0 0 +G000299455_2056 0 0 2 0 0 +G000299455_2061 0 0 2 0 0 +G000299455_2074 0 0 2 0 0 +G000299455_2110 0 0 1 0 0 +G000299455_2122 0 0 2 0 0 +G000299455_2140 0 0 1 0 0 +G000299455_2142 0 0 1 0 0 +G000299455_2143 0 0 2 0 0 +G000299455_2203 0 0 2 0 0 +G000299455_2207 0 0 1 0 0 +G000299455_2208 0 0 1 0 0 +G000299455_2215 0 0 2 0 0 +G000299455_2238 0 0 2 0 0 +G000299455_2248 0 0 2 0 0 +G000299455_2291 0 0 1 0 0 +G000299455_2294 0 0 2 0 0 +G000299455_2314 0 0 2 0 0 +G000299455_2339 0 0 2 0 0 +G000299455_238 0 0 2 0 0 +G000299455_2397 0 0 2 0 0 +G000299455_2399 0 0 2 0 0 +G000299455_2400 0 0 2 0 0 +G000299455_2411 0 0 1 0 0 +G000299455_2412 0 0 1 0 0 +G000299455_242 0 0 2 0 0 +G000299455_2424 0 0 1 0 0 +G000299455_2429 0 0 1 0 0 +G000299455_2435 0 0 2 0 0 +G000299455_2458 0 0 2 0 0 +G000299455_2465 0 0 1 0 0 +G000299455_2479 0 0 6 0 0 +G000299455_2488 0 0 2 0 0 +G000299455_2496 0 0 2 0 0 +G000299455_251 0 0 2 0 0 +G000299455_2557 0 0 2 0 0 +G000299455_2562 0 0 2 0 0 +G000299455_258 0 0 4 0 0 +G000299455_2593 0 0 2 0 0 +G000299455_2594 0 0 2 0 0 +G000299455_2599 0 0 2 0 0 +G000299455_2616 0 0 2 0 0 +G000299455_2629 0 0 2 0 0 +G000299455_2642 0 0 4 0 0 +G000299455_2658 0 0 2 0 0 +G000299455_2660 0 0 2 0 0 +G000299455_2667 0 0 2 0 0 +G000299455_2671 0 0 2 0 0 +G000299455_2677 0 0 2 0 0 +G000299455_2684 0 0 2 0 0 +G000299455_2689 0 0 2 0 0 +G000299455_2690 0 0 2 0 0 +G000299455_2711 0 0 1 0 0 +G000299455_2738 0 0 2 0 0 +G000299455_2754 0 0 2 0 0 +G000299455_2763 0 0 2 0 0 +G000299455_2767 0 0 1 0 0 +G000299455_2790 0 0 1 0 0 +G000299455_2797 0 0 2 0 0 +G000299455_2841 0 0 2 0 0 +G000299455_2853 0 0 2 0 0 +G000299455_2855 0 0 2 0 0 +G000299455_2866 0 0 2 0 0 +G000299455_2868 0 0 1 0 0 +G000299455_2877 0 0 2 0 0 +G000299455_2881 0 0 4 0 0 +G000299455_2884 0 0 1 0 0 +G000299455_2890 0 0 2 0 0 +G000299455_2922 0 0 2 0 0 +G000299455_2968 0 0 1 0 0 +G000299455_2980 0 0 2 0 0 +G000299455_2988 0 0 2 0 0 +G000299455_2993 0 0 1 0 0 +G000299455_3005 0 0 1 0 0 +G000299455_3006 0 0 1 0 0 +G000299455_3020 0 0 2 0 0 +G000299455_3021 0 0 2 0 0 +G000299455_3068 0 0 1 0 0 +G000299455_3084 0 0 1 0 0 +G000299455_3112 0 0 2 0 0 +G000299455_3113 0 0 2 0 0 +G000299455_3141 0 0 2 0 0 +G000299455_3154 0 0 1 0 0 +G000299455_3178 0 0 2 0 0 +G000299455_3189 0 0 1 0 0 +G000299455_320 0 0 1 0 0 +G000299455_3228 0 0 1 0 0 +G000299455_3231 0 0 2 0 0 +G000299455_3233 0 0 2 0 0 +G000299455_3238 0 0 1 0 0 +G000299455_3249 0 0 2 0 0 +G000299455_3266 0 0 4 0 0 +G000299455_3282 0 0 2 0 0 +G000299455_3288 0 0 2 0 0 +G000299455_3291 0 0 2 0 0 +G000299455_3301 0 0 2 0 0 +G000299455_3314 0 0 2 0 0 +G000299455_3322 0 0 4 0 0 +G000299455_3326 0 0 2 0 0 +G000299455_3327 0 0 2 0 0 +G000299455_3355 0 0 1 0 0 +G000299455_3360 0 0 1 0 0 +G000299455_3377 0 0 2 0 0 +G000299455_3401 0 0 1 0 0 +G000299455_3415 0 0 1 0 0 +G000299455_3428 0 0 2 0 0 +G000299455_3434 0 0 2 0 0 +G000299455_3439 0 0 2 0 0 +G000299455_3444 0 0 1 0 0 +G000299455_345 0 0 2 0 0 +G000299455_3457 0 0 2 0 0 +G000299455_3463 0 0 2 0 0 +G000299455_3487 0 0 2 0 0 +G000299455_3503 0 0 2 0 0 +G000299455_3539 0 0 1 0 0 +G000299455_354 0 0 2 0 0 +G000299455_3615 0 0 2 0 0 +G000299455_3629 0 0 1 0 0 +G000299455_3634 0 0 2 0 0 +G000299455_3653 0 0 2 0 0 +G000299455_3654 0 0 2 0 0 +G000299455_3658 0 0 1 0 0 +G000299455_367 0 0 2 0 0 +G000299455_3671 0 0 2 0 0 +G000299455_3674 0 0 2 0 0 +G000299455_368 0 0 2 0 0 +G000299455_3688 0 0 3 0 0 +G000299455_3705 0 0 2 0 0 +G000299455_3719 0 0 2 0 0 +G000299455_3735 0 0 2 0 0 +G000299455_3746 0 0 2 0 0 +G000299455_3765 0 0 1 0 0 +G000299455_3774 0 0 2 0 0 +G000299455_3786 0 0 2 0 0 +G000299455_3801 0 0 1 0 0 +G000299455_3803 0 0 1 0 0 +G000299455_381 0 0 2 0 0 +G000299455_3830 0 0 2 0 0 +G000299455_3833 0 0 2 0 0 +G000299455_3836 0 0 2 0 0 +G000299455_3844 0 0 2 0 0 +G000299455_3882 0 0 2 0 0 +G000299455_3888 0 0 2 0 0 +G000299455_390 0 0 2 0 0 +G000299455_3902 0 0 1 0 0 +G000299455_3914 0 0 2 0 0 +G000299455_3916 0 0 1 0 0 +G000299455_3925 0 0 2 0 0 +G000299455_3928 0 0 2 0 0 +G000299455_3930 0 0 2 0 0 +G000299455_3939 0 0 2 0 0 +G000299455_394 0 0 2 0 0 +G000299455_3941 0 0 2 0 0 +G000299455_3961 0 0 2 0 0 +G000299455_3971 0 0 2 0 0 +G000299455_399 0 0 1 0 0 +G000299455_3993 0 0 2 0 0 +G000299455_400 0 0 2 0 0 +G000299455_4005 0 0 2 0 0 +G000299455_4033 0 0 2 0 0 +G000299455_404 0 0 1 0 0 +G000299455_4052 0 0 1 0 0 +G000299455_4083 0 0 2 0 0 +G000299455_4084 0 0 1 0 0 +G000299455_4100 0 0 2 0 0 +G000299455_4104 0 0 1 0 0 +G000299455_4123 0 0 2 0 0 +G000299455_4129 0 0 2 0 0 +G000299455_4131 0 0 2 0 0 +G000299455_4149 0 0 1 0 0 +G000299455_4156 0 0 2 0 0 +G000299455_4174 0 0 1 0 0 +G000299455_4189 0 0 2 0 0 +G000299455_4192 0 0 1 0 0 +G000299455_4207 0 0 2 0 0 +G000299455_4212 0 0 2 0 0 +G000299455_4220 0 0 1 0 0 +G000299455_4222 0 0 2 0 0 +G000299455_4229 0 0 2 0 0 +G000299455_4248 0 0 2 0 0 +G000299455_4256 0 0 2 0 0 +G000299455_4270 0 0 2 0 0 +G000299455_4288 0 0 1 0 0 +G000299455_4318 0 0 2 0 0 +G000299455_432 0 0 2 0 0 +G000299455_4326 0 0 1 0 0 +G000299455_435 0 0 2 0 0 +G000299455_4350 0 0 2 0 0 +G000299455_4374 0 0 1 0 0 +G000299455_4380 0 0 1 0 0 +G000299455_4398 0 0 4 0 0 +G000299455_44 0 0 2 0 0 +G000299455_4411 0 0 2 0 0 +G000299455_4412 0 0 2 0 0 +G000299455_4413 0 0 2 0 0 +G000299455_4414 0 0 2 0 0 +G000299455_4415 0 0 2 0 0 +G000299455_4427 0 0 1 0 0 +G000299455_4432 0 0 2 0 0 +G000299455_4455 0 0 2 0 0 +G000299455_4478 0 0 1 0 0 +G000299455_4495 0 0 2 0 0 +G000299455_450 0 0 2 0 0 +G000299455_4501 0 0 2 0 0 +G000299455_4527 0 0 4 0 0 +G000299455_4566 0 0 2 0 0 +G000299455_4576 0 0 2 0 0 +G000299455_4607 0 0 2 0 0 +G000299455_4629 0 0 2 0 0 +G000299455_4634 0 0 2 0 0 +G000299455_4637 0 0 2 0 0 +G000299455_4682 0 0 4 0 0 +G000299455_4726 0 0 4 0 0 +G000299455_4753 0 0 2 0 0 +G000299455_4761 0 0 2 0 0 +G000299455_4763 0 0 2 0 0 +G000299455_4790 0 0 2 0 0 +G000299455_4803 0 0 2 0 0 +G000299455_4822 0 0 2 0 0 +G000299455_4830 0 0 2 0 0 +G000299455_4832 0 0 2 0 0 +G000299455_4838 0 0 2 0 0 +G000299455_4843 0 0 2 0 0 +G000299455_4850 0 0 1 0 0 +G000299455_4895 0 0 1 0 0 +G000299455_4901 0 0 2 0 0 +G000299455_4908 0 0 2 0 0 +G000299455_4917 0 0 2 0 0 +G000299455_4919 0 0 4 0 0 +G000299455_4935 0 0 1 0 0 +G000299455_4936 0 0 1 0 0 +G000299455_4938 0 0 2 0 0 +G000299455_4951 0 0 1 0 0 +G000299455_4962 0 0 2 0 0 +G000299455_4978 0 0 1 0 0 +G000299455_4995 0 0 2 0 0 +G000299455_5006 0 0 2 0 0 +G000299455_5017 0 0 2 0 0 +G000299455_5022 0 0 2 0 0 +G000299455_5035 0 0 1 0 0 +G000299455_5050 0 0 1 0 0 +G000299455_5051 0 0 2 0 0 +G000299455_5060 0 0 2 0 0 +G000299455_5078 0 0 1 0 0 +G000299455_5082 0 0 1 0 0 +G000299455_5084 0 0 4 0 0 +G000299455_5096 0 0 1 0 0 +G000299455_5102 0 0 1 0 0 +G000299455_5103 0 0 1 0 0 +G000299455_5169 0 0 1 0 0 +G000299455_527 0 0 2 0 0 +G000299455_532 0 0 1 0 0 +G000299455_567 0 0 2 0 0 +G000299455_589 0 0 1 0 0 +G000299455_603 0 0 2 0 0 +G000299455_607 0 0 2 0 0 +G000299455_617 0 0 1 0 0 +G000299455_662 0 0 2 0 0 +G000299455_682 0 0 2 0 0 +G000299455_693 0 0 2 0 0 +G000299455_696 0 0 2 0 0 +G000299455_699 0 0 2 0 0 +G000299455_709 0 0 2 0 0 +G000299455_715 0 0 2 0 0 +G000299455_726 0 0 1 0 0 +G000299455_732 0 0 2 0 0 +G000299455_771 0 0 2 0 0 +G000299455_798 0 0 1 0 0 +G000299455_801 0 0 2 0 0 +G000299455_826 0 0 1 0 0 +G000299455_830 0 0 2 0 0 +G000299455_848 0 0 1 0 0 +G000299455_853 0 0 1 0 0 +G000299455_855 0 0 2 0 0 +G000299455_886 0 0 2 0 0 +G000299455_89 0 2 0 0 0 +G000299455_906 0 0 2 0 0 +G000299455_916 0 0 2 0 0 +G000299455_953 0 0 2 0 0 +G000299455_967 0 0 2 0 0 +G000299455_980 0 0 2 0 0 +G000299455_988 0 0 1 0 0 +G000317935_1770 0 0 0 1 0 +G000318015_3401 0 0 0 1 0 diff --git a/woltka/tests/test_biom.py b/woltka/tests/test_biom.py index dd8dc1f..22d0ff3 100644 --- a/woltka/tests/test_biom.py +++ b/woltka/tests/test_biom.py @@ -22,7 +22,8 @@ from woltka.biom import ( table_to_biom, biom_to_table, write_biom, biom_max_f, divide_biom, - scale_biom, filter_biom, round_biom, biom_add_metacol, collapse_biom) + scale_biom, filter_biom, round_biom, biom_add_metacol, clip_biom, + collapse_biom) from woltka.table import prep_table @@ -215,6 +216,24 @@ def test_biom_add_metacol(self): self.assertListEqual(list(map( dict, obs.metadata(axis='observation'))), exp) + def test_clip_biom(self): + table = Table(*map(np.array, prep_table({ + 'S1': {'G1_1': 4, 'G1_2': 5, 'G1_3': 0, 'G2_1': 0, 'G2_2': 3}, + 'S2': {'G1_1': 1, 'G1_2': 8, 'G1_4': 0, 'G2_1': 3, 'G2_3': 4}, + 'S3': {'G1_1': 0, 'G1_3': 2, 'G1_4': 3, 'G2_2': 5, 'G2_3': 0}}))) + obs = clip_biom(table.copy()) + exp = Table(*map(np.array, prep_table({ + 'S1': {'G1': 9, 'G2': 3}, + 'S2': {'G1': 9, 'G2': 7}, + 'S3': {'G1': 5, 'G2': 5}}))) + self.assertEqual(obs.descriptive_equality(exp), 'Tables appear equal') + + # invalid separator + with self.assertRaises(ValueError) as ctx: + clip_biom(table.copy(), sep='.') + errmsg = 'Feature "G1_1" does not have a suffix.' + self.assertEqual(str(ctx.exception), errmsg) + def test_collapse_biom(self): table = Table(*map(np.array, prep_table({ 'S1': {'G1': 4, 'G2': 5, 'G3': 8, 'G4': 0, 'G5': 3, 'G6': 0}, @@ -313,6 +332,44 @@ def test_collapse_biom(self): errmsg = 'Feature "A|K1" has less than 3 fields.' self.assertEqual(str(ctx.exception), errmsg) + # suffixed table - keep only parents + table = Table(*map(np.array, prep_table({ + 'S1': {'A_1': 3, 'A_2': 6, 'B_1': 7, 'B_2': 0, 'C_2': 3}, + 'S2': {'A_2': 2, 'A_3': 5, 'B_3': 2, 'C_1': 4, 'C_3': 2}}))) + mapping = {'A': ['X'], 'B': ['X'], 'C': ['Y']} + obs = collapse_biom(table.copy(), mapping, suffix=True) + exp = Table(*map(np.array, prep_table({ + 'S1': {'X': 16, 'Y': 3}, + 'S2': {'X': 9, 'Y': 6}}))) + self.assertEqual(obs.descriptive_equality(exp), 'Tables appear equal') + + # collapse parents + table = Table(*map(np.array, prep_table({ + 'S1': {'A_1': 3, 'A_2': 6, 'B_1': 7, 'B_2': 0}, + 'S2': {'A_2': 2, 'B_3': 2, 'C_1': 4, 'C_3': 2}}))) + obs = collapse_biom(table.copy(), mapping, suffix=True, field=0) + exp = Table(*map(np.array, prep_table({ + 'S1': {'X|A_1': 3, 'X|A_2': 6, 'X|B_1': 7, 'Y|B_2': 0}, + 'S2': {'X|A_2': 2, 'X|B_3': 2, 'Y|C_1': 4, 'Y|C_3': 2}}))) + self.assertEqual(obs.descriptive_equality(exp), 'Tables appear equal') + + # collapse children + mapping = {'A_1': ['a'], 'A_2': ['b'], + 'B_1': ['a'], 'B_2': ['b'], + 'C_1': ['a'], 'C_2': ['b']} + obs = collapse_biom(table.copy(), mapping, suffix=True, field=1) + exp = Table(*map(np.array, prep_table({ + 'S1': {'A|a': 3, 'A|b': 6, 'B|a': 7, 'B|b': 0}, + 'S2': {'A|b': 2, 'C|a': 4}}))) + self.assertEqual(obs.descriptive_equality(exp), 'Tables appear equal') + + # no suffix + table = Table(*map(np.array, prep_table({'S1': {'ABC': 123}}))) + with self.assertRaises(ValueError) as ctx: + collapse_biom(table.copy(), {}, suffix=True) + errmsg = 'Feature "ABC" does not have a suffix.' + self.assertEqual(str(ctx.exception), errmsg) + if __name__ == '__main__': main() diff --git a/woltka/tests/test_table.py b/woltka/tests/test_table.py index 4e25718..456a95c 100644 --- a/woltka/tests/test_table.py +++ b/woltka/tests/test_table.py @@ -19,8 +19,8 @@ from woltka.table import ( prep_table, read_table, write_table, read_tsv, write_tsv, strip_metacols, table_shape, table_max_f, frac_table, round_table, divide_table, - scale_table, filter_table, merge_tables, add_metacol, collapse_table, - calc_coverage) + scale_table, filter_table, merge_tables, add_metacol, clip_table, + collapse_table, calc_coverage) from woltka.biom import table_to_biom @@ -647,6 +647,31 @@ def test_add_metacol(self): self.assertListEqual(list(map( dict, ob2.metadata(axis='observation'))), exp) + def test_clip_table(self): + table = prep_table({ + 'S1': {'G1_1': 4, 'G1_2': 5, 'G1_3': 0, 'G2_1': 0, 'G2_2': 3}, + 'S2': {'G1_1': 1, 'G1_2': 8, 'G1_4': 0, 'G2_1': 3, 'G2_3': 4}, + 'S3': {'G1_1': 0, 'G1_3': 2, 'G1_4': 3, 'G2_2': 5, 'G2_3': 0}}) + obs = clip_table(table) + exp = prep_table({ + 'S1': {'G1': 9, 'G2': 3}, + 'S2': {'G1': 9, 'G2': 7}, + 'S3': {'G1': 5, 'G2': 5}}) + for i in range(4): + self.assertListEqual(obs[i], exp[i]) + + # invalid separator + with self.assertRaises(ValueError) as ctx: + clip_table(table, sep='.') + errmsg = 'Feature "G1_1" does not have a suffix.' + self.assertEqual(str(ctx.exception), errmsg) + + # BIOM table + table_ = Table(*map(np.array, table)) + obs = clip_table(table_) + exp = Table(*map(np.array, exp)) + self.assertEqual(obs.descriptive_equality(exp), 'Tables appear equal') + def test_collapse_table(self): table = prep_table({ 'S1': {'G1': 4, 'G2': 5, 'G3': 8, 'G4': 0, 'G5': 3, 'G6': 0}, @@ -751,6 +776,47 @@ def test_collapse_table(self): errmsg = 'Feature "A|K1" has less than 3 fields.' self.assertEqual(str(ctx.exception), errmsg) + # suffixed table - keep only parents + table = prep_table({ + 'S1': {'A_1': 3, 'A_2': 6, 'B_1': 7, 'B_2': 0, 'C_2': 3}, + 'S2': {'A_2': 2, 'A_3': 5, 'B_3': 2, 'C_1': 4, 'C_3': 2}}) + mapping = {'A': ['X'], 'B': ['X'], 'C': ['Y']} + obs = collapse_table(table, mapping, suffix=True) + exp = prep_table({ + 'S1': {'X': 16, 'Y': 3}, + 'S2': {'X': 9, 'Y': 6}}) + for i in range(4): + self.assertListEqual(obs[i], exp[i]) + + # collapse parents + table = prep_table({ + 'S1': {'A_1': 3, 'A_2': 6, 'B_1': 7, 'B_2': 0}, + 'S2': {'A_2': 2, 'B_3': 2, 'C_1': 4, 'C_3': 2}}) + obs = collapse_table(table, mapping, suffix=True, field=0) + exp = prep_table({ + 'S1': {'X|A_1': 3, 'X|A_2': 6, 'X|B_1': 7, 'Y|B_2': 0}, + 'S2': {'X|A_2': 2, 'X|B_3': 2, 'Y|C_1': 4, 'Y|C_3': 2}}) + for i in range(4): + self.assertListEqual(obs[i], exp[i]) + + # collapse children + mapping = {'A_1': ['a'], 'A_2': ['b'], + 'B_1': ['a'], 'B_2': ['b'], + 'C_1': ['a'], 'C_2': ['b']} + obs = collapse_table(table, mapping, suffix=True, field=1) + exp = prep_table({ + 'S1': {'A|a': 3, 'A|b': 6, 'B|a': 7, 'B|b': 0}, + 'S2': {'A|b': 2, 'C|a': 4}}) + for i in range(4): + self.assertListEqual(obs[i], exp[i]) + + # no suffix + table = prep_table({'S1': {'ABC': 123}}) + with self.assertRaises(ValueError) as ctx: + collapse_table(table, {}, suffix=True) + errmsg = 'Feature "ABC" does not have a suffix.' + self.assertEqual(str(ctx.exception), errmsg) + def test_calc_coverage(self): table = prep_table({ 'S1': {'G1': 4, 'G2': 5, 'G3': 8, 'G4': 0, 'G5': 3, 'G6': 0}, diff --git a/woltka/tests/test_tools.py b/woltka/tests/test_tools.py index 08c6730..231b986 100644 --- a/woltka/tests/test_tools.py +++ b/woltka/tests/test_tools.py @@ -157,11 +157,11 @@ def test_merge_wf(self): def test_collapse_wf(self): input_fp = join(self.datdir, 'output', 'truth.gene.tsv') - map_fp = join(self.datdir, 'function', 'nucl', 'uniref.map.xz') output_fp = join(self.tmpdir, 'tmp.tsv') + map_fp = join(self.datdir, 'function', 'nucl', 'uniref.map.xz') # one-to-one - collapse_wf(input_fp, map_fp, output_fp) + collapse_wf(input_fp, output_fp, map_fp) with open(output_fp, 'r') as f: obs = f.read().splitlines() self.assertEqual(len(obs), 2489) @@ -175,7 +175,7 @@ def test_collapse_wf(self): input_fp = join(self.datdir, 'output', 'truth.uniref.tsv') map_fp = join(self.datdir, 'function', 'go', 'goslim.tsv.xz') names_fp = join(self.datdir, 'function', 'go', 'name.txt.xz') - collapse_wf(input_fp, map_fp, output_fp, names_fp=names_fp) + collapse_wf(input_fp, output_fp, map_fp, names_fp=names_fp) with open(output_fp, 'r') as f: obs = f.read().splitlines() self.assertEqual(len(obs), 84) @@ -186,17 +186,23 @@ def test_collapse_wf(self): self.assertEqual(line[11:], '3\t7\t9\t1\t4\tnuclease activity') remove(output_fp) + # no mapping file + with self.assertRaises(SystemExit) as ctx: + collapse_wf(input_fp, output_fp) + errmsg = 'A mapping file must be provided unless "-s" is specified.' + self.assertEqual(str(ctx.exception), errmsg) + # wrong mapping file map_fp = join(self.datdir, 'tree.nwk') with self.assertRaises(SystemExit) as ctx: - collapse_wf(input_fp, map_fp, output_fp, divide=True) - errmsg = 'No source-target relationship is found in tree.nwk.' + collapse_wf(input_fp, output_fp, map_fp, divide=True) + errmsg = 'No source-target mapping is found in tree.nwk.' self.assertEqual(str(ctx.exception), errmsg) # stratified profile input_fp = join(self.datdir, 'output', 'burst.genus.process.tsv') map_fp = join(self.datdir, 'function', 'go', 'go2slim.map.xz') - collapse_wf(input_fp, map_fp, output_fp, field=2) + collapse_wf(input_fp, output_fp, map_fp, field=2) with open(output_fp, 'r') as f: obs = f.read().splitlines() self.assertEqual(len(obs), 279) @@ -207,6 +213,18 @@ def test_collapse_wf(self): self.assertEqual(line[25:], '0\t2\t9\t3\t0') remove(output_fp) + # suffixed profile + input_fp = join(self.datdir, 'output', 'bowtie2.orf.tsv') + collapse_wf(input_fp, output_fp, suffix=True) + with open(output_fp, 'r') as f: + obs = f.read().splitlines() + self.assertEqual(len(obs), 50) + for line in obs: + if line.startswith('G000011705'): + self.assertEqual(line[11:], '104\t0\t29\t0\t0') + if line.startswith('G000240185'): + self.assertEqual(line[11:], '2\t608\t2\t1\t0') + def test_coverage_wf(self): input_fp = join(self.datdir, 'output', 'truth.metacyc.tsv') map_fp = join(self.datdir, 'function', 'metacyc', 'pathway_mbrs.txt') diff --git a/woltka/tools.py b/woltka/tools.py index 7da173c..b67efd2 100644 --- a/woltka/tools.py +++ b/woltka/tools.py @@ -19,7 +19,7 @@ from .table import ( read_table, table_shape, table_max_f, frac_table, divide_table, scale_table, round_table, write_table, filter_table, merge_tables, - add_metacol, collapse_table, calc_coverage) + add_metacol, clip_table, collapse_table, calc_coverage) from .file import readzip, read_map_1st, read_map_many, read_map_all from .util import scale_factor from .tree import read_names @@ -40,7 +40,7 @@ def normalize_wf(input_fp: str, Feature not found in size map. """ # read input profile - table, fmt = read_table(input_fp) + table, _ = read_table(input_fp) # estimate maximum decimal precision if digits is None: @@ -118,7 +118,7 @@ def filter_wf(input_fp: str, th = min_count or min_percent / 100 # read input profile - table, fmt = read_table(input_fp) + table, _ = read_table(input_fp) n = table_shape(table)[0] click.echo(f'Number of features before filtering: {n}.') @@ -155,7 +155,7 @@ def merge_wf(input_fps: list, def _read_profile(fp): try: - table = read_table(fp)[0] + table, _ = read_table(fp) except ValueError: exit(f'Cannot parse {basename(fp)} as a profile.') n, m = table_shape(table) @@ -193,9 +193,10 @@ def _read_profile(fp): def collapse_wf(input_fp: str, - map_fp: str, output_fp: str, + map_fp: str = None, divide: bool = False, + suffix: bool = False, field: int = None, names_fp: str = None): """Workflow for collapsing a profile based on many-to-many mapping. @@ -203,7 +204,8 @@ def collapse_wf(input_fp: str, Raises ------ SystemExit - No relationship is found in mapping file. + No mapping file or "-s" is specified. + No mapping is found in mapping file. See Also -------- @@ -211,29 +213,37 @@ def collapse_wf(input_fp: str, Command-line arguments and help information. """ # read input profile - table, fmt = read_table(input_fp) + table, _ = read_table(input_fp) n = table_shape(table)[0] click.echo(f'Number of features before collapsing: {n}.') - # maximum decimal precision - digits = table_max_f(table) - # read mapping file (many-to-many okay) - with readzip(map_fp, {}) as f: - mapping = read_map_many(f) - if not mapping: - exit(f'No source-target relationship is found in {basename(map_fp)}.') + if map_fp: + with readzip(map_fp, {}) as f: + mapping = read_map_many(f) + if not mapping: + exit(f'No source-target mapping is found in {basename(map_fp)}.') + + # no mapping file (okay when trimming suffix) + elif not suffix: + exit(f'A mapping file must be provided unless "-s" is specified.') - # convert field index + # convert field index from 1-based to 0-based if field: field -= 1 - # collapse profile by mapping click.echo('Collapsing profile...', nl=False) - table = collapse_table(table, mapping, divide, field) - click.echo(' Done.') - n = table_shape(table)[0] - click.echo(f'Number of features after collapsing: {n}.') + + # maximum decimal precision + digits = table_max_f(table) + + # just remove suffix from feature names + if suffix and not map_fp: + table = clip_table(table) + + # collapse profile by mapping + else: + table = collapse_table(table, mapping, divide, suffix, field) # append feature names (optional) if names_fp: @@ -244,6 +254,11 @@ def collapse_wf(input_fp: str, # round table values round_table(table, digits or None) + click.echo(' Done.') + + n = table_shape(table)[0] + click.echo(f'Number of features after collapsing: {n}.') + # write collapsed profile write_table(table, output_fp) click.echo('Collapsed profile written.') @@ -259,7 +274,7 @@ def coverage_wf(input_fp: str, information. """ # read input profile - table, fmt = read_table(input_fp) + table, _ = read_table(input_fp) n = table_shape(table)[0] click.echo(f'Number of features in profile: {n}.') diff --git a/woltka/workflow.py b/woltka/workflow.py index 1f5d22b..472198c 100644 --- a/woltka/workflow.py +++ b/woltka/workflow.py @@ -794,8 +794,8 @@ def strip_suffix(subque: list, Notes ----- - This function will find the last occurrence of separator in a subject Id, - and trim from it to the right end. If not found, the whole subject Id will + This function will find the last occurrence of separator in a subject ID, + and trim from it to the right end. If not found, the whole subject ID will be retained. """ return map(set, map(partial( From 496e4afe00a4c3e306904111da20aad01217e348 Mon Sep 17 00:00:00 2001 From: qiyunzhu Date: Wed, 21 Dec 2022 15:57:27 -0700 Subject: [PATCH 2/7] let param has default --- doc/cli.md | 5 +++-- doc/input.md | 6 +++++- doc/stratify.md | 4 ++-- woltka/biom.py | 10 +++++----- woltka/cli.py | 16 ++++++++++------ woltka/table.py | 8 ++++---- woltka/tests/data/README.md | 4 ++-- woltka/tests/test_biom.py | 12 ++++++------ woltka/tests/test_table.py | 12 ++++++------ woltka/tests/test_tools.py | 4 ++-- woltka/tools.py | 8 ++++---- 11 files changed, 49 insertions(+), 40 deletions(-) diff --git a/doc/cli.md b/doc/cli.md index acd7b1d..613c8c4 100644 --- a/doc/cli.md +++ b/doc/cli.md @@ -24,7 +24,7 @@ Option | Description `--filext`, `-e` | Input filename extension following sample ID. `--samples`, `-s` | List of sample IDs to be included. `--demux/--no-demux` | Demultiplex alignment by first underscore in query identifier. -`--trim-sub` | Trim subject IDs at the last given delimiter. +`--trim-sub` | Trim subject IDs at the last given delimiter. Can accept the default value "_" or enter a custom value. ### Hierarchies @@ -145,7 +145,8 @@ Option | Description `--map`, `-m` (required) | Path to mapping of source features to target features. `--output`, `-o` (required) | Path to output profile. `--divide`, `-d` | Count each target feature as 1 / _k_ (_k_ is the number of targets mapped to a source). Otherwise, count as one. -`--field`, `-f` | Index of field to be collapsed in a stratified profile. For example, use `-f 2` to collapse "gene" in "microbe\|gene". +`--field`, `-f` | Features are stratified (strata delimited by "\|"). For example, if features are like "microbe\|gene", one can use `-f 1` to collapse "microbe" or `-f 2` to collapse "gene". +`--suffix`, `-s` | Features have suffixes that indicate parent-child relationships. For example, "A_1" represents "1" of "A", and the entire feature is equivalent to "A\|A_1". Can accept the default delimiter "_" or enter a custom delimiter. This parameter overrides the "\|"-delimited strata. `--names`, `-n` | Path to mapping of target features to names. The names will be appended to the collapsed profile as a metadata column. ### Coverage diff --git a/doc/input.md b/doc/input.md index 32e60ef..aec4a14 100644 --- a/doc/input.md +++ b/doc/input.md @@ -120,6 +120,10 @@ woltka classify \ ## Subject trimming -The parameter `--trim-sub ` lets Woltka trim subject IDs at the last occurrence of the given delimiter. Examples include trimming off version numbers from NCBI accessions (`--trim-sub .`: `NP_123456.1` => `NP_123456`, trimming off ORF indices from nucleotide sequences (`--trim-sub _`: `Contig_5_20` => `Contig_5`). +The parameter `--trim-sub ` lets Woltka trim subject IDs at the last occurrence of the given delimiter (default: "_"). For examples: + +1. Trim off ORF indices from nucleotide sequences: Add `--trim-sub` (without a value). Effect: "Contig_5_20" becomes "Contig_5". + +2. Trim off version numbers from NCBI accessions: Add `--trim-sub .` (dot). Effect: "NP_123456.1" becomes "NP_123456". This allows flexible adaptation to alternative classification systems without manually editing the alignment files. A use case is the stratified structural/functional classification (see [details](stratify.md)). diff --git a/doc/stratify.md b/doc/stratify.md index 9421524..36e5574 100644 --- a/doc/stratify.md +++ b/doc/stratify.md @@ -66,12 +66,12 @@ Firmicutes\|GO:0000006 | 0 | 0 | 0 | 18 With this method, we start with the alignments of reads against reference **genes** (not genomes). This methods is faster, with a cost in accuracy (since genes only represent a proportion of their host genomes, and are confounded by homology, copy number, boundaries etc.). Therefore, this methods only demonstrates what "_you could_". However, if you already obtained and decided to proceed with gene alignments (for example, you already ran BLAST on UniProt), this method is worth consideration. -The following example is also based on the [sample data](../woltka/tests/data). Here we used the gene alignment results computed by DIAMOND. The gene IDs are Prodigal-annotated ORFs from the reference genomes, in the format of `genome ID index` (e.g., `G000123456_20`). With parameter `--trim-sub _`, Woltka converts them to genome IDs, and everything after is straightforward. +The following example is also based on the [sample data](../woltka/tests/data). Here we used the gene alignment results computed by DIAMOND. The gene IDs are Prodigal-annotated ORFs from the reference genomes, in the format of `genome ID index` (e.g., `G000123456_20`). With flag `--trim-sub`, Woltka converts them to genome IDs, and everything after is straightforward. ```bash woltka classify \ -i align/diamond \ - --trim-sub _ \ + --trim-sub \ --map taxonomy/taxid.map \ --nodes taxonomy/nodes.dmp \ --names taxonomy/names.dmp \ diff --git a/woltka/biom.py b/woltka/biom.py index d86d411..813fe3b 100644 --- a/woltka/biom.py +++ b/woltka/biom.py @@ -232,8 +232,8 @@ def f(id_, _): include_collapsed_metadata=False) -def collapse_biom(table: biom.Table, mapping: dict, divide=False, suffix=False, - field=None): +def collapse_biom(table: biom.Table, mapping: dict, divide=False, field=None, + suffix=None): """Collapse a BIOM table in many-to-many mode. Parameters @@ -244,10 +244,10 @@ def collapse_biom(table: biom.Table, mapping: dict, divide=False, suffix=False, Source-to-target(s) mapping. divide : bool, optional Whether divide per-target counts by number of targets per source. - suffix : bool, optional - Whether feature names should be treated as with suffixes. field : int, optional Index of field to be collapsed in a stratified table. + suffix : str, optional + Feature names have a suffix following this delimiter. Returns ------- @@ -272,7 +272,7 @@ def collapse_biom(table: biom.Table, mapping: dict, divide=False, suffix=False, for id_ in table.ids('observation'): feature = id_ if suffix: - left, _, _ = feature.rpartition('_') + left, _, _ = feature.rpartition(suffix) if not left: raise ValueError( f'Feature "{feature}" does not have a suffix.') diff --git a/woltka/cli.py b/woltka/cli.py index e7a959f..4269e17 100644 --- a/woltka/cli.py +++ b/woltka/cli.py @@ -61,8 +61,9 @@ def cli(): '--demux/--no-demux', default=None, help='Demultiplex alignment by first underscore in query identifier.') @click.option( - '--trim-sub', 'trimsub', - help='Trim subject IDs at the last given delimiter.') + '--trim-sub', 'trimsub', is_flag=False, flag_value='_', + help=('Trim subject IDs at the last given delimiter. Default: "_", or ' + 'enter a custom value.')) # hierarchies @click.option( '--nodes', 'nodes_fps', type=click.Path(exists=True), multiple=True, @@ -273,12 +274,15 @@ def merge_cmd(ctx, **kwargs): '--divide', '-d', is_flag=True, help=('Count each target feature as 1/k (k is the number of targets ' 'mapped to a source). Otherwise, count as one.')) -@click.option( - '--suffix', '-s', is_flag=True, - help='Treat features as with suffixes') @click.option( '--field', '-f', type=click.INT, - help='Index of field to be collapsed in a stratified profile.') + help=('Features are stratified (strata delimited by "|"), and the x-th ' + 'field is to be collapsed, while other fields stay the same.')) +@click.option( + '--suffix', '-s', is_flag=False, flag_value='_', + help=('Features have suffixes that indicate parent-child relationships. ' + 'For example, "A_1" represents "1" of "A". Enter an delimiter if ' + 'not "_". Overrides "|"-delimited strata.')) @click.option( '--names', '-n', 'names_fp', type=click.Path(exists=True), help='Names of target features to append to the output profile.') diff --git a/woltka/table.py b/woltka/table.py index b776c4e..d2ec264 100644 --- a/woltka/table.py +++ b/woltka/table.py @@ -598,7 +598,7 @@ def clip_table(table, sep='_'): return list(res.values()), list(res.keys()), samples, [dict() for _ in res] -def collapse_table(table, mapping, divide=False, suffix=False, field=None): +def collapse_table(table, mapping, divide=False, field=None, suffix=None): """Collapse a table by many-to-many mapping. Parameters @@ -609,10 +609,10 @@ def collapse_table(table, mapping, divide=False, suffix=False, field=None): Source-to-target(s) mapping. divide : bool, optional Whether divide per-target counts by number of targets per source. - suffix : bool, optional - Whether feature names should be treated as with suffixes. field : int, optional Index of field to be collapsed in a stratified table. + suffix : str, optional + Feature names have a suffix following this delimiter. Returns ------- @@ -640,7 +640,7 @@ def collapse_table(table, mapping, divide=False, suffix=False, field=None): # suffixed feature if suffix: - left, _, _ = feature.rpartition('_') + left, _, _ = feature.rpartition(suffix) if not left: raise ValueError( f'Feature "{feature}" does not have a suffix.') diff --git a/woltka/tests/data/README.md b/woltka/tests/data/README.md index 80fc8ee..5231b68 100644 --- a/woltka/tests/data/README.md +++ b/woltka/tests/data/README.md @@ -152,7 +152,7 @@ Same as above, adding: ```bash woltka classify \ --input align/burst/split \ - --trim-sub _ \ + --trim-sub \ --map taxonomy/nucl/nucl2tid.txt \ --nodes taxonomy/nodes.dmp \ --names taxonomy/names.dmp \ @@ -186,7 +186,7 @@ woltka tools merge \ ```bash woltka classify \ --input align/diamond \ - --trim-sub _ \ + --trim-sub \ --map taxonomy/taxid.map \ --nodes taxonomy/nodes.dmp \ --rank free \ diff --git a/woltka/tests/test_biom.py b/woltka/tests/test_biom.py index 22d0ff3..847a323 100644 --- a/woltka/tests/test_biom.py +++ b/woltka/tests/test_biom.py @@ -334,10 +334,10 @@ def test_collapse_biom(self): # suffixed table - keep only parents table = Table(*map(np.array, prep_table({ - 'S1': {'A_1': 3, 'A_2': 6, 'B_1': 7, 'B_2': 0, 'C_2': 3}, - 'S2': {'A_2': 2, 'A_3': 5, 'B_3': 2, 'C_1': 4, 'C_3': 2}}))) + 'S1': {'A.1': 3, 'A.2': 6, 'B.1': 7, 'B.2': 0, 'C.2': 3}, + 'S2': {'A.2': 2, 'A.3': 5, 'B.3': 2, 'C.1': 4, 'C.3': 2}}))) mapping = {'A': ['X'], 'B': ['X'], 'C': ['Y']} - obs = collapse_biom(table.copy(), mapping, suffix=True) + obs = collapse_biom(table.copy(), mapping, suffix='.') exp = Table(*map(np.array, prep_table({ 'S1': {'X': 16, 'Y': 3}, 'S2': {'X': 9, 'Y': 6}}))) @@ -347,7 +347,7 @@ def test_collapse_biom(self): table = Table(*map(np.array, prep_table({ 'S1': {'A_1': 3, 'A_2': 6, 'B_1': 7, 'B_2': 0}, 'S2': {'A_2': 2, 'B_3': 2, 'C_1': 4, 'C_3': 2}}))) - obs = collapse_biom(table.copy(), mapping, suffix=True, field=0) + obs = collapse_biom(table.copy(), mapping, field=0, suffix='_') exp = Table(*map(np.array, prep_table({ 'S1': {'X|A_1': 3, 'X|A_2': 6, 'X|B_1': 7, 'Y|B_2': 0}, 'S2': {'X|A_2': 2, 'X|B_3': 2, 'Y|C_1': 4, 'Y|C_3': 2}}))) @@ -357,7 +357,7 @@ def test_collapse_biom(self): mapping = {'A_1': ['a'], 'A_2': ['b'], 'B_1': ['a'], 'B_2': ['b'], 'C_1': ['a'], 'C_2': ['b']} - obs = collapse_biom(table.copy(), mapping, suffix=True, field=1) + obs = collapse_biom(table.copy(), mapping, field=1, suffix='_') exp = Table(*map(np.array, prep_table({ 'S1': {'A|a': 3, 'A|b': 6, 'B|a': 7, 'B|b': 0}, 'S2': {'A|b': 2, 'C|a': 4}}))) @@ -366,7 +366,7 @@ def test_collapse_biom(self): # no suffix table = Table(*map(np.array, prep_table({'S1': {'ABC': 123}}))) with self.assertRaises(ValueError) as ctx: - collapse_biom(table.copy(), {}, suffix=True) + collapse_biom(table.copy(), {}, suffix='x') errmsg = 'Feature "ABC" does not have a suffix.' self.assertEqual(str(ctx.exception), errmsg) diff --git a/woltka/tests/test_table.py b/woltka/tests/test_table.py index 456a95c..cea45f1 100644 --- a/woltka/tests/test_table.py +++ b/woltka/tests/test_table.py @@ -778,10 +778,10 @@ def test_collapse_table(self): # suffixed table - keep only parents table = prep_table({ - 'S1': {'A_1': 3, 'A_2': 6, 'B_1': 7, 'B_2': 0, 'C_2': 3}, - 'S2': {'A_2': 2, 'A_3': 5, 'B_3': 2, 'C_1': 4, 'C_3': 2}}) + 'S1': {'A.1': 3, 'A.2': 6, 'B.1': 7, 'B.2': 0, 'C.2': 3}, + 'S2': {'A.2': 2, 'A.3': 5, 'B.3': 2, 'C.1': 4, 'C.3': 2}}) mapping = {'A': ['X'], 'B': ['X'], 'C': ['Y']} - obs = collapse_table(table, mapping, suffix=True) + obs = collapse_table(table, mapping, suffix='.') exp = prep_table({ 'S1': {'X': 16, 'Y': 3}, 'S2': {'X': 9, 'Y': 6}}) @@ -792,7 +792,7 @@ def test_collapse_table(self): table = prep_table({ 'S1': {'A_1': 3, 'A_2': 6, 'B_1': 7, 'B_2': 0}, 'S2': {'A_2': 2, 'B_3': 2, 'C_1': 4, 'C_3': 2}}) - obs = collapse_table(table, mapping, suffix=True, field=0) + obs = collapse_table(table, mapping, field=0, suffix='_') exp = prep_table({ 'S1': {'X|A_1': 3, 'X|A_2': 6, 'X|B_1': 7, 'Y|B_2': 0}, 'S2': {'X|A_2': 2, 'X|B_3': 2, 'Y|C_1': 4, 'Y|C_3': 2}}) @@ -803,7 +803,7 @@ def test_collapse_table(self): mapping = {'A_1': ['a'], 'A_2': ['b'], 'B_1': ['a'], 'B_2': ['b'], 'C_1': ['a'], 'C_2': ['b']} - obs = collapse_table(table, mapping, suffix=True, field=1) + obs = collapse_table(table, mapping, field=1, suffix='_') exp = prep_table({ 'S1': {'A|a': 3, 'A|b': 6, 'B|a': 7, 'B|b': 0}, 'S2': {'A|b': 2, 'C|a': 4}}) @@ -813,7 +813,7 @@ def test_collapse_table(self): # no suffix table = prep_table({'S1': {'ABC': 123}}) with self.assertRaises(ValueError) as ctx: - collapse_table(table, {}, suffix=True) + collapse_table(table, {}, suffix='x') errmsg = 'Feature "ABC" does not have a suffix.' self.assertEqual(str(ctx.exception), errmsg) diff --git a/woltka/tests/test_tools.py b/woltka/tests/test_tools.py index 231b986..389485d 100644 --- a/woltka/tests/test_tools.py +++ b/woltka/tests/test_tools.py @@ -189,7 +189,7 @@ def test_collapse_wf(self): # no mapping file with self.assertRaises(SystemExit) as ctx: collapse_wf(input_fp, output_fp) - errmsg = 'A mapping file must be provided unless "-s" is specified.' + errmsg = 'A mapping file is required unless features are suffixed.' self.assertEqual(str(ctx.exception), errmsg) # wrong mapping file @@ -215,7 +215,7 @@ def test_collapse_wf(self): # suffixed profile input_fp = join(self.datdir, 'output', 'bowtie2.orf.tsv') - collapse_wf(input_fp, output_fp, suffix=True) + collapse_wf(input_fp, output_fp, suffix='_') with open(output_fp, 'r') as f: obs = f.read().splitlines() self.assertEqual(len(obs), 50) diff --git a/woltka/tools.py b/woltka/tools.py index b67efd2..7f06266 100644 --- a/woltka/tools.py +++ b/woltka/tools.py @@ -196,8 +196,8 @@ def collapse_wf(input_fp: str, output_fp: str, map_fp: str = None, divide: bool = False, - suffix: bool = False, field: int = None, + suffix: str = None, names_fp: str = None): """Workflow for collapsing a profile based on many-to-many mapping. @@ -226,7 +226,7 @@ def collapse_wf(input_fp: str, # no mapping file (okay when trimming suffix) elif not suffix: - exit(f'A mapping file must be provided unless "-s" is specified.') + exit(f'A mapping file is required unless features are suffixed.') # convert field index from 1-based to 0-based if field: @@ -239,11 +239,11 @@ def collapse_wf(input_fp: str, # just remove suffix from feature names if suffix and not map_fp: - table = clip_table(table) + table = clip_table(table, suffix) # collapse profile by mapping else: - table = collapse_table(table, mapping, divide, suffix, field) + table = collapse_table(table, mapping, divide, field, suffix) # append feature names (optional) if names_fp: From 32a0e312c3a3fc8c4a3ac96a89e51d741066e41f Mon Sep 17 00:00:00 2001 From: qiyunzhu Date: Thu, 22 Dec 2022 14:01:30 -0700 Subject: [PATCH 3/7] updated documentation --- doc/collapse.md | 265 ++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 245 insertions(+), 20 deletions(-) diff --git a/doc/collapse.md b/doc/collapse.md index ab7d7b2..fd6b7ba 100644 --- a/doc/collapse.md +++ b/doc/collapse.md @@ -1,18 +1,33 @@ # Profile collapsing -The **profile collapsing** function is a lightweight and flexible addition to the main classification workflow. It allows the user to convert an _existing_ profile based on a mapping of source features to target features. It highlights the support for **many-to-many mapping**. +The **profile collapsing** function is a lightweight and flexible addition to the main classification workflow. It allows the user to convert an _existing_ profile based on a mapping of source features to target features, and/or internal hierarchies of features. It highlights the support for **many-to-many mapping**. For examples: + +Collapse features based on a mapping file: ```bash woltka tools collapse -i input.biom -m mapping.txt -o output.biom ``` +Collapse nested features to the first level: + +```bash +woltka tools collapse -i input.biom -e -f 1 -o output.biom +``` + ## Contents - [Use cases](#use-cases) -- [Mapping file format](#mapping-file-format) -- [Parameters](#parameters) -- [Considerations](#considerations) +- [Feature mapping](#feature-mapping) + - [Mapping file](#mapping-file) + - [Value division](#value-division) + - [Considerations](#considerations) +- [Stratified features](#stratified-features) + - [Collapse to field](#collapse-to-field) + - [Collapse by mapping](#collapse-field-by-mapping) +- [Nested features](#nested-features) + - [Collapse to level](#collapse-to-level) + - [Collapse by mapping](#collapse-level-by-mapping) ## Use cases @@ -37,9 +52,14 @@ The last usage is an important complement to the main classification workflow, w See [considerations](#considerations) below for a discussion of the potential change of statistical properties of data. -## Mapping file format +## Feature mapping + +The basic usage of the `collapse` command is to translate feature IDs using an external mapping file. + + +### Mapping file -A mapping file is a text file with entries separated by tabs. The number of fields per line is _arbitrary_. The first field is the source feature ID. The second to last fields are target feature ID(s). Duplicates in sources or targets are allowed. For examples: +A mapping file (specified by `--map` or `-m`) is a text file with entries separated by tabs. The number of fields per line is _arbitrary_. The first field is the source feature ID. The second to last fields are target feature ID(s). Duplicates in sources or targets are allowed. For examples: 1. One/many-to-one: ``` @@ -68,32 +88,237 @@ source4 target3 ... ``` -## Parameters +Once a profile is collapsed, the metadata of the source features ("Name", "Rank", and "Lineage") will be discarded. One may choose to supply a target feature name file by `--names` or `-n`, which will instruct the program to append names to the profile as a metadata column ("Name"). -### Division +### Value division By default, if one source feature is simultaneously mapped to _k_ targets, each target will be counted once. With the `--divide` or `-d` flag added to the command, each target will be counted 1 / _k_ times. -Whether to enable division depends on the nature and aim of the analysis. For example, one gene is involved in two metabolic pathways (which isn't uncommon), should each pathway be counted once, or half time? +Whether to enable division depends on the nature and aim of the analysis. For example, one gene is involved in two metabolic pathways (which isn't uncommon), should each pathway be counted once, or half time? The user needs to make a decision. -### Stratification +### Considerations -Woltka supports collapsing a [stratified](stratify.md) profile using one field in the feature IDs. This can be done using the `--field` or `-f` parameter followed by the field index (starting from 1). For example, if the feature IDs are in the format of "Species|Gene", one may collapse genes into pathways while keeping species by adding `-f 2`. +It is important to note that one-to-many mapping may change some of the underlying statistical assumptions of downstream analyses. -### Feature names +In the default mode, because one source may be collapsed into multiple targets, the total feature count per sample may be inflated, and the relative abundance of each feature may no longer correspond to that of the sequences assigned to it. In other words, this breaks the [compositionality](https://en.wikipedia.org/wiki/Compositional_data) of the data. -Once a profile is collapsed, the metadata of the source features ("Name", "Rank", and "Lineage") will be discarded. One may choose to supply a target feature name file by `--names` or `-n`, which will instruct the program to append names to the profile as a metadata column ("Name"). +How significantly this may impact an analysis depends on the relative frequency of multiple mappings found in the data, the biological relevance of the affected features, and the statistical nature of the analysis. +For example, in the `reaction-to-ec.txt` file under [MetaCyc](metacyc.md), 80 out of 3618 (2.2%) reactions have more than one corresponding EC number. Whether such a translation may be considered as unique (and whether the resulting table is still compositional) is a call of the user. -## Considerations +A solution to this is to turn on the [division](#division) flag (`-d`). This guarantees that the sum of feature counts remains the same after collapsing. But one should consider the biological implication before making a decision (see [above](#division)). -It is important to note that one-to-many mapping may change some of the -underlying statistical assumptions of downstream analyses. -In the default mode, because one source may be collapsed into multiple targets, the total feature count per sample may be inflated, and the relative abundance of each feature may no longer correspond to that of the sequences assigned to it. In other words, this breaks the [compositionality](https://en.wikipedia.org/wiki/Compositional_data) of the data. +## Stratified features -How significantly this may impact an analysis depends on the relative frequency of multiple mappings found in the data, the biological relevance of the affected features, and the statistical nature of the analysis. +Woltka supports collapsing a [stratified](stratify.md) profile using one field in the feature IDs. This can be done using the `--field` or `-f` parameter followed by the field index (starting from 1). -For example, in the `reaction-to-ec.txt` file under [MetaCyc](metacyc.md), 80 out of 3618 (2.2%) reactions have more than one corresponding EC number. Whether such a translation may be considered as unique (and whether the resulting table is still compositional) is a call of the user. +For example, in the following profile `species_gene.tsv`, feature IDs has the format of "species|gene", representing particular genes (e.g., _rpoA_) found in particular species (e.g., _E. coli_). -A solution to this is to turn on the [division](#division) flag (`-d`). This guarantees that the sum of feature counts remains the same after collapsing. But one should consider the biological implication before making a decision (see [above](#division)). +Feature ID | Sample 1 | Sample 2 | Sample 3 +--- | --- | --- | --- +`Ecoli\|rpoA` | 4 | 15 | 0 +`Ecoli\|rpoB` | 12 | 7 | 5 +`Sente\|rpoC` | 9 | 0 | 3 +`Cdiff\|ftsZ` | 1 | 6 | 0 + +### Collapse to field + +One can collapse the "species|gene" features into just species (regardless of gene) with: + +```bash +woltka tools collapse -i species_gene.tsv -f 1 -o species.tsv +``` + +The output profile `species.tsv` is like: + +Feature ID | Sample 1 | Sample 2 | Sample 3 +--- | --- | --- | --- +`Ecoli` | 16 | 22 | 5 +`Sente` | 9 | 0 | 3 +`Cdiff` | 1 | 6 | 0 + +### Collapse field by mapping + +With a species-to-phylum mapping file `phylum.map`, one can collapse the first field (species): + +```bash +woltka tools collapse -i species_gene.tsv -f 1 -m phylum.map -o phylum_gene.tsv +``` + +The output profile `phylum_gene.tsv` will be like: + +Feature ID | Sample 1 | Sample 2 | Sample 3 +--- | --- | --- | --- +`Proteo\|rpoA` | 4 | 15 | 0 +`Proteo\|rpoB` | 12 | 7 | 5 +`Proteo\|rpoC` | 9 | 0 | 3 +`Firmic\|ftsZ` | 1 | 6 | 0 + +With a gene-to-biological process mapping file `process.map`, one can collapse the second field (gene): + +```bash +woltka tools collapse -i species_gene.tsv -f 2 -m process.map -o species_process.tsv +``` + +The output profile `species_process.tsv` will be like: + +Feature ID | Sample 1 | Sample 2 | Sample 3 +--- | --- | --- | --- +`Ecoli\|mRNASyn` | 16 | 22 | 5 +`Sente\|mRNASyn` | 9 | 0 | 3 +`Cdiff\|CellDiv` | 1 | 6 | 0 + +One can combine the two operations into one command: + +```bash +cat species_gene.tsv |\ + woltka tools collapse -f 1 -m phylum.map |\ + woltka tools collapse -f 2 -m process.map |\ + > phylum_process.tsv +``` + +The output profile `phylum_process.tsv` will be like: + +Feature ID | Sample 1 | Sample 2 | Sample 3 +--- | --- | --- | --- +`Proteo\|mRNASyn` | 25 | 22 | 8 +`Firmic\|CellDiv` | 1 | 6 | 0 + + +## Nested features + +In some scenarios, a feature ID itself contains hierarchical information. This is similar to a stratified feature (see above) in that it contains multiple fields, but each field is a child of the previous field, and it only makes sense when written after the previous one. We refer to them as **nested features**. + +For example, "G12_34" represents the 34th ORF annotated from genome 12. In other words, this is equivalent to a stratified feature ID "G12_34|G12_34", in which the 1st field represents the genome ([OGU](ogu.md)) and the 2nd represents the gene (ORF). Such profiles can be generated using Woltka's ["coord-match" functional profiling](ordinal.md) function. + +The `--nested` or `-e` flag instructs Woltka to treat feature IDs as nested. The default delimiter for identifying fields is an underscore (`_`) (in contrast to a pipe (`|`) in a stratified feature), but one may append a custom delimiter to it (such as `-e .` for dot). Then, with the `--field` or `-f` parameter (see above), one can specify the level in the nested features on which collapsing will occur. + +### Collapse to level + +For example, with an ORF table `orf.tsv`, one can do: + +```bash +woltka tools collapse -i orf.tsv -e -f 1 -o ogu.tsv +``` + +This will collapse an ORF table into an [OGU table](ogu.md), in which only "G12" but not "_34" is retained. + +- Note howerver, that the resulting OGU table may not be identical to the one produced using the [OGU protocol](ogu.md), which also considers intergenic regions (not just coding genes) in a genome. + +In this example, one can also do `-f 2`, but nothing will change (because there are two levels in total.) + +In the following example `ec4.tsv`, feature IDs are 4-level [EC numbers](https://en.wikipedia.org/wiki/Enzyme_Commission_number): + +Feature ID | Sample 1 | Sample 2 | Sample 3 +--- | --- | --- | --- +`EC:6.4.1.2` | 36 | 8 | 22 +`EC:6.4.1.3` | 9 | 13 | 14 +`EC:6.3.4.14` | 62 | 4 | 20 +`EC:2.3.1.85` | 5 | 16 | 11 + +One can collapse them into 2-level EC numbers with: + +```bash +woltka tools collapse -i ec4.tsv -e . -f 2 -o ec2.tsv +``` + +The output profile `ec2.tsv` is like: + +Feature ID | Sample 1 | Sample 2 | Sample 3 +--- | --- | --- | --- +`EC:6.4` | 45 | 21 | 36 +`EC:6.3` | 62 | 4 | 20 +`EC:2.3` | 5 | 16 | 11 + + +The following example `free.tsv` is a taxonomic profile with arbitrary ranks. It can be generated using Woltka's [free-rank classification](classify.md#target-rank-or-no-rank), or other programs such as QIIME 2 and MetaPhlAn. + +Feature ID | Sample 1 | Sample 2 +--- | --- | --- +`p__Firmicutes; c__Bacilli; o__Lactobacillales; f__Lactobacillaceae; g__Lactobacillus` | 2 | 0 +`p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__Blautia` | 8 | 3 +`p__Firmicutes; c__Clostridia; o__Clostridiales; f__Ruminococcaceae` | 37 | 16 +`p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales; f__Bacteroidaceae; g__Bacteroides; s__fragilis` | 56 | 24 +`p__Proteobacteria; c__Epsilonproteobacteria; o__Campylobacterales` | 0 | 7 +`p__Spirochaetes` | 13 | 9 + +One can collapse them into the class level with: + +```bash +woltka tools collapse -i free.tsv -e "; " -f 2 -o class.tsv +``` + +The output profile `class.tsv` is like: + +Feature ID | Sample 1 | Sample 2 +--- | --- | --- +`p__Firmicutes; c__Bacilli` | 2 | 0 +`p__Firmicutes; c__Clostridia` | 45 | 19 +`p__Bacteroidetes; c__Bacteroidia` | 56 | 24 +`p__Proteobacteria; c__Epsilonproteobacteria` | 0 | 7 + +Note that nested features do not have to have the same number of levels. Those with fewer levels than the specified field index will be dropped. + +### Collapse level by mapping + +One can collapse a certain level in nested features (`-e`) using a mapping file (`-m`). + +For example, in an ORF table `orf.tsv` (see [details](ordinal.md)), feature IDs are like: + +``` +G000007845_1274 +``` + +With a genome-to-genus mapping file `genus.map`, one can collapse the first field (i.e., taxonomic analysis): + +```bash +woltka tools collapse -i orf.biom -e -f 1 -m genus.map -o genus_orf.biom +``` + +The resulting feature IDs are like: + +``` +Bacillus|G000006785_1274 +``` + +With an ORF-to-UniRef mapping file `uniref.map`, one can collapse the second field (i.e., functional analysis): + +```bash +woltka tools collapse -i orf.biom -e -f 2 -m uniref.map -o ogu_uniref.biom +``` + +The resulting feature IDs are like: + +``` +G000006785|J9GI19 +``` + +One can combine the two analyses: + +```bash +cat orf.biom |\ + woltka tools collapse -e -f 1 -m genus.map |\ + woltka tools collapse -f 2 -m uniref.map |\ + > genus_uniref.biom +``` + +Note that feature IDs in the original profile are nested. However, in the collapsed profile, they become stratified by a pipe (`|`) from the collapsed field to the end. This is because the collapsed field has broken the nestedness. + +It is important to avoid confusion when collapsing middle levels in nested features. For example, the original feature IDs are like (4-level EC numbers): + +``` +EC:2.7.2.10 +``` + +One can collapse the 2nd level by using an enzyme-to-substrate mapping file `substrate.map`: + +```bash +woltka tools collapse -i ec4.tsv -e -f 2 -m substrate.map -o output.tsv +``` + +The output feature IDs will be like: + +``` +EC:2|phosphate|EC:2.7.2.10 +``` From 415ebd2773ed56a3666ea8c5a04afceac4276119 Mon Sep 17 00:00:00 2001 From: qiyunzhu Date: Thu, 22 Dec 2022 20:24:41 -0700 Subject: [PATCH 4/7] generalized suffix to nested --- doc/cli.md | 5 +- doc/collapse.md | 12 ++-- woltka/biom.py | 90 +++++++++++++------------- woltka/cli.py | 17 +++-- woltka/table.py | 127 ++++++++++++++++++++++--------------- woltka/tests/test_biom.py | 71 +++++++++++---------- woltka/tests/test_table.py | 75 +++++++++++----------- woltka/tests/test_tools.py | 10 +-- woltka/tools.py | 28 ++++---- 9 files changed, 234 insertions(+), 201 deletions(-) diff --git a/doc/cli.md b/doc/cli.md index 613c8c4..99c7846 100644 --- a/doc/cli.md +++ b/doc/cli.md @@ -145,8 +145,9 @@ Option | Description `--map`, `-m` (required) | Path to mapping of source features to target features. `--output`, `-o` (required) | Path to output profile. `--divide`, `-d` | Count each target feature as 1 / _k_ (_k_ is the number of targets mapped to a source). Otherwise, count as one. -`--field`, `-f` | Features are stratified (strata delimited by "\|"). For example, if features are like "microbe\|gene", one can use `-f 1` to collapse "microbe" or `-f 2` to collapse "gene". -`--suffix`, `-s` | Features have suffixes that indicate parent-child relationships. For example, "A_1" represents "1" of "A", and the entire feature is equivalent to "A\|A_1". Can accept the default delimiter "_" or enter a custom delimiter. This parameter overrides the "\|"-delimited strata. +`--field`, `-f` | Features are stratified (strata delimited by "\|"). For example, if features are like "species\|gene", one can use `-f 1` to collapse "species" or `-f 2` to collapse "gene". +`--nested`, `-e` | Features are nested (each field is a child of the previous field). For example, "A_1" represents "1" of "A", and the entire feature is equivalent to stratified feature "A\|A_1". This parameter overrides the "\|"-delimited strata. +`--sep`, `-s` | Field separator for stratified features (default: "\|") or nested features (default: "_"). `--names`, `-n` | Path to mapping of target features to names. The names will be appended to the collapsed profile as a metadata column. ### Coverage diff --git a/doc/collapse.md b/doc/collapse.md index fd6b7ba..3987fa7 100644 --- a/doc/collapse.md +++ b/doc/collapse.md @@ -111,7 +111,7 @@ A solution to this is to turn on the [division](#division) flag (`-d`). This gua ## Stratified features -Woltka supports collapsing a [stratified](stratify.md) profile using one field in the feature IDs. This can be done using the `--field` or `-f` parameter followed by the field index (starting from 1). +Woltka supports collapsing a [stratified](stratify.md) profile using one field in the feature IDs. This can be done using the `--field` or `-f` parameter followed by the field index (starting from 1). The default field delimiter is a pipe (`|`), but one can customize it using `--sep` or `-s`. For example, in the following profile `species_gene.tsv`, feature IDs has the format of "species|gene", representing particular genes (e.g., _rpoA_) found in particular species (e.g., _E. coli_). @@ -138,6 +138,8 @@ Feature ID | Sample 1 | Sample 2 | Sample 3 `Sente` | 9 | 0 | 3 `Cdiff` | 1 | 6 | 0 +Alternatively, one can use `-f 2` to collapse to genes (regardless of species). + ### Collapse field by mapping With a species-to-phylum mapping file `phylum.map`, one can collapse the first field (species): @@ -192,7 +194,7 @@ In some scenarios, a feature ID itself contains hierarchical information. This i For example, "G12_34" represents the 34th ORF annotated from genome 12. In other words, this is equivalent to a stratified feature ID "G12_34|G12_34", in which the 1st field represents the genome ([OGU](ogu.md)) and the 2nd represents the gene (ORF). Such profiles can be generated using Woltka's ["coord-match" functional profiling](ordinal.md) function. -The `--nested` or `-e` flag instructs Woltka to treat feature IDs as nested. The default delimiter for identifying fields is an underscore (`_`) (in contrast to a pipe (`|`) in a stratified feature), but one may append a custom delimiter to it (such as `-e .` for dot). Then, with the `--field` or `-f` parameter (see above), one can specify the level in the nested features on which collapsing will occur. +The `--nested` or `-e` flag instructs Woltka to treat feature IDs as nested. The default delimiter for identifying fields is an underscore (`_`) (in contrast to a pipe (`|`) in a stratified feature), but one may customize it using `-s` (see above). Then, with the `--field` or `-f` parameter (see above), one can specify the level in the nested features on which collapsing will occur. ### Collapse to level @@ -220,7 +222,7 @@ Feature ID | Sample 1 | Sample 2 | Sample 3 One can collapse them into 2-level EC numbers with: ```bash -woltka tools collapse -i ec4.tsv -e . -f 2 -o ec2.tsv +woltka tools collapse -i ec4.tsv -e -s . -f 2 -o ec2.tsv ``` The output profile `ec2.tsv` is like: @@ -246,7 +248,7 @@ Feature ID | Sample 1 | Sample 2 One can collapse them into the class level with: ```bash -woltka tools collapse -i free.tsv -e "; " -f 2 -o class.tsv +woltka tools collapse -i free.tsv -e -s "; " -f 2 -o class.tsv ``` The output profile `class.tsv` is like: @@ -305,7 +307,7 @@ cat orf.biom |\ Note that feature IDs in the original profile are nested. However, in the collapsed profile, they become stratified by a pipe (`|`) from the collapsed field to the end. This is because the collapsed field has broken the nestedness. -It is important to avoid confusion when collapsing middle levels in nested features. For example, the original feature IDs are like (4-level EC numbers): +It is important to avoid confusion when collapsing a certain level in nested features. For example, the original feature IDs are like (4-level EC numbers): ``` EC:2.7.2.10 diff --git a/woltka/biom.py b/woltka/biom.py index 813fe3b..c960b1a 100644 --- a/woltka/biom.py +++ b/woltka/biom.py @@ -12,6 +12,8 @@ """ from functools import partial +from itertools import accumulate +from operator import itemgetter import numpy as np import biom from .__init__ import __name__, __version__ @@ -194,46 +196,45 @@ def biom_add_metacol(table: biom.Table, dic, name, missing=''): table.add_metadata(metadata, axis='observation') -def clip_biom(table: biom.Table, sep='_'): - """Remove suffix from feature names in a BIOM table. +def clip_biom(table: biom.Table, field, sep): + """Clip stratified or nested feature names to a field. Parameters ---------- table : biom.Table - Table to collapse. - sep : str, optional - Separator (after last of which is suffix). + Table to clip. + field : int + Field index to clip at. + sep : str + Field separator. Returns ------- biom.Table Clipped BIOM table. - Raises - ------ - ValueError - A feature ID does not have a suffix. - Notes ----- - Metadata will not be retained in the collapsed table. + Metadata will not be retained in the clipped table. See Also -------- .table.clip_table """ - def f(id_, _): - left, _, _ = id_.rpartition(sep) - if not left: - raise ValueError(f'Feature "{id_}" does not have a suffix.') - return left + idx = field - 1 - return table.collapse(f, norm=False, axis='observation', - include_collapsed_metadata=False) + def f1(id_, md): + fields = id_.split(sep) + if len(fields) >= field and fields[idx]: + return sep.join(fields[:field]) + + table = table.collapse(f1, norm=False, axis='observation', + include_collapsed_metadata=False) + return table.filter(lambda val, id_, md: bool(id_), axis='observation') def collapse_biom(table: biom.Table, mapping: dict, divide=False, field=None, - suffix=None): + sep=None, nested=None): """Collapse a BIOM table in many-to-many mode. Parameters @@ -246,19 +247,16 @@ def collapse_biom(table: biom.Table, mapping: dict, divide=False, field=None, Whether divide per-target counts by number of targets per source. field : int, optional Index of field to be collapsed in a stratified table. - suffix : str, optional - Feature names have a suffix following this delimiter. + sep : str, optional + Field separator (must be provided if field is set). + nested : bool, optional + Whether features are nested. Returns ------- biom.Table Collapsed BIOM table. - Raises - ------ - ValueError - A feature ID does not have a suffix or a field. - Notes ----- Metadata will not be retained in the collapsed table. @@ -267,33 +265,39 @@ def collapse_biom(table: biom.Table, mapping: dict, divide=False, field=None, -------- .table.collapse_table """ + if nested: + f = ('{}' + sep + '{}').format + if field: + idx = field - 1 + # generate metadata metadata = {} for id_ in table.ids('observation'): feature = id_ - if suffix: - left, _, _ = feature.rpartition(suffix) - if not left: - raise ValueError( - f'Feature "{feature}" does not have a suffix.') - if field is not None: - fields = [left, feature] - if not field: - feature = left - elif field is not None: - fields = feature.split('|') + if field: + fields = feature.split(sep) + n = len(fields) + if nested: + fields = list(accumulate(fields, f)) try: - feature = fields[field] + feature = fields[idx] except IndexError: - raise ValueError( - f'Feature "{feature}" has less than {field + 1} fields.') + continue + if not feature: + continue if feature not in mapping: continue targets = [] for target in mapping[feature]: - if field is not None: - fields[field] = target - target = '|'.join(fields) + if field: + if not nested: + fields[idx] = target + target = '|'.join(fields) + else: + if idx: + target = fields[idx - 1] + '|' + target + if field < n: + target = target + '|' + fields[-1] targets.append(target) metadata[id_] = dict(part=targets) diff --git a/woltka/cli.py b/woltka/cli.py index 4269e17..eb1a8be 100644 --- a/woltka/cli.py +++ b/woltka/cli.py @@ -269,20 +269,23 @@ def merge_cmd(ctx, **kwargs): '--map', '-m', 'map_fp', type=click.Path(exists=True, dir_okay=False), help=('Mapping of source features to target features. Supports ' - 'many-to-many relationships. Required unless with "-s"')) + 'many-to-many relationships.')) @click.option( '--divide', '-d', is_flag=True, help=('Count each target feature as 1/k (k is the number of targets ' 'mapped to a source). Otherwise, count as one.')) @click.option( '--field', '-f', type=click.INT, - help=('Features are stratified (strata delimited by "|"), and the x-th ' - 'field is to be collapsed, while other fields stay the same.')) + help=('Collapse x-th field of stratified features. For example, "A|a" ' + 'has fields 1 ("A") and 2 ("a").')) @click.option( - '--suffix', '-s', is_flag=False, flag_value='_', - help=('Features have suffixes that indicate parent-child relationships. ' - 'For example, "A_1" represents "1" of "A". Enter an delimiter if ' - 'not "_". Overrides "|"-delimited strata.')) + '--nested', '-e', is_flag=False, flag_value='_', + help=('Fields are nested (each field is a child of the previous field). ' + 'For example, "A_1" represents "1" of "A".')) +@click.option( + '--sep', '-s', type=click.STRING, + help=('Field separator for nested features (default: "_") or otherwise ' + '(default: "|").')) @click.option( '--names', '-n', 'names_fp', type=click.Path(exists=True), help='Names of target features to append to the output profile.') diff --git a/woltka/table.py b/woltka/table.py index d2ec264..efaaa97 100644 --- a/woltka/table.py +++ b/woltka/table.py @@ -12,6 +12,7 @@ """ from functools import reduce +from itertools import accumulate from collections import defaultdict from operator import add from biom import Table, load_table @@ -560,45 +561,44 @@ def add_metacol(table, dic, name, missing=''): metadatum[name] = dic.get(feature, missing) -def clip_table(table, sep='_'): - """Remove suffix from feature names in a table. +def clip_table(table, field, sep): + """Clip stratified or nested feature names to a field. Parameters ---------- table : biom.Table or tuple - Table to collapse. - sep : str, optional - Separator (after last of which is suffix). + Table to clip. + field : int + Field index to clip at. + sep : str + Field separator. Returns ------- biom.Table or tuple Clipped table. - - Raises - ------ - ValueError - A feature ID does not have a suffix. """ # redirect to BIOM module if isinstance(table, Table): - return clip_biom(table, sep) + return clip_biom(table, field, sep) - # remove suffix from feature names + # clip feature names to given field samples = table[2] width = len(samples) res = defaultdict(lambda: [0] * width) + idx = field - 1 for datum, feature in zip(*table[:2]): - left, _, _ = feature.rpartition(sep) - if not left: - raise ValueError(f'Feature "{feature}" does not have a suffix.') - res[left] = list(map(add, res[left], datum)) + fields = feature.split(sep) + if len(fields) >= field and fields[idx]: + clipped = sep.join(fields[:field]) + res[clipped] = list(map(add, res[clipped], datum)) # reformat table return list(res.values()), list(res.keys()), samples, [dict() for _ in res] -def collapse_table(table, mapping, divide=False, field=None, suffix=None): +def collapse_table(table, mapping, divide=False, field=None, sep=None, + nested=False): """Collapse a table by many-to-many mapping. Parameters @@ -611,26 +611,31 @@ def collapse_table(table, mapping, divide=False, field=None, suffix=None): Whether divide per-target counts by number of targets per source. field : int, optional Index of field to be collapsed in a stratified table. - suffix : str, optional - Feature names have a suffix following this delimiter. + sep : str, optional + Field separator (must be provided if field is set). + nested : bool, optional + Whether features are nested. Returns ------- biom.Table or tuple Collapsed table. - Raises - ------ - ValueError - A feature ID does not have a suffix or a field. - Notes ----- Metadata will not be retained in the collapsed table. """ # redirect to BIOM module if isinstance(table, Table): - return collapse_biom(table, mapping, divide, suffix, field) + return collapse_biom(table, mapping, divide, field, sep, nested) + + # function for stacking fields in nested feature + if nested: + f = ('{}' + sep + '{}').format + + # get 0-based field index + if field: + idx = field - 1 # collapse table samples = table[2] @@ -638,45 +643,63 @@ def collapse_table(table, mapping, divide=False, field=None, suffix=None): res = defaultdict(lambda: [0] * width) for datum, feature in zip(*table[:2]): - # suffixed feature - if suffix: - left, _, _ = feature.rpartition(suffix) - if not left: - raise ValueError( - f'Feature "{feature}" does not have a suffix.') - - # get fields - if field is not None: - fields = [left, feature] + # split feature into fields + if field: + fields = feature.split(sep) - # collapse field to parent - if not field: - feature = left + # stack fields of nested feature + if nested: + fields = list(accumulate(fields, f)) - # stratified feature - elif field is not None: - fields = feature.split('|') + # identify target field try: - feature = fields[field] + feature = fields[idx] + + # skip if field does not exist except IndexError: - raise ValueError( - f'Feature "{feature}" has less than {field + 1} fields.') + continue + + # skip if feature is empty + if not feature: + continue - # map features to targets + # skip if feature is not mapped if feature not in mapping: continue + + # map source feature to target(s) targets = mapping[feature] - # divide feature count by target number + # divide values by number of targets if divide: - k = 1 / len(targets) - datum = [x * k for x in datum] + k = len(targets) + if k > 1: + k = 1 / k + datum = [x * k for x in datum] + + # cache number of fields + if field: + n = len(fields) - # add results to same target + # process each target for target in targets: - if field is not None: - fields[field] = target - target = '|'.join(fields) + + # collapse given field + if field: + + # rebuild stratified feature (all fields) + if not nested: + fields[idx] = target + target = '|'.join(fields) + + # rebuild nested feature (only previous and last fields) + else: + if idx: + target = fields[idx - 1] + '|' + target + if field < n: + target = target + '|' + fields[-1] + + # add results to same target res[target] = list(map(add, res[target], datum)) # reformat table diff --git a/woltka/tests/test_biom.py b/woltka/tests/test_biom.py index 847a323..f0bba4d 100644 --- a/woltka/tests/test_biom.py +++ b/woltka/tests/test_biom.py @@ -221,18 +221,34 @@ def test_clip_biom(self): 'S1': {'G1_1': 4, 'G1_2': 5, 'G1_3': 0, 'G2_1': 0, 'G2_2': 3}, 'S2': {'G1_1': 1, 'G1_2': 8, 'G1_4': 0, 'G2_1': 3, 'G2_3': 4}, 'S3': {'G1_1': 0, 'G1_3': 2, 'G1_4': 3, 'G2_2': 5, 'G2_3': 0}}))) - obs = clip_biom(table.copy()) + obs = clip_biom(table.copy(), 1, sep='_') exp = Table(*map(np.array, prep_table({ 'S1': {'G1': 9, 'G2': 3}, 'S2': {'G1': 9, 'G2': 7}, 'S3': {'G1': 5, 'G2': 5}}))) self.assertEqual(obs.descriptive_equality(exp), 'Tables appear equal') + # field number the same (no change) + obs = clip_biom(table.copy(), 2, sep='_') + self.assertEqual(obs.descriptive_equality(table), + 'Tables appear equal') + + # field number too large (all dropped) + obs = clip_biom(table.copy(), 3, sep='_') + self.assertTupleEqual(obs.to_dataframe(True).shape, (0, 3)) + # invalid separator - with self.assertRaises(ValueError) as ctx: - clip_biom(table.copy(), sep='.') - errmsg = 'Feature "G1_1" does not have a suffix.' - self.assertEqual(str(ctx.exception), errmsg) + obs = clip_biom(table.copy(), 1, sep='.') + self.assertEqual(obs.descriptive_equality(table), + 'Tables appear equal') + + # empty fields + table = Table(*map(np.array, prep_table({ + 'S1': {'_G1_1': 3, 'G2__3': 5, 'G5_4_': 1, '__G0': 2}}))) + obs = clip_biom(table.copy(), 2, sep='_') + exp = Table(*map(np.array, prep_table({ + 'S1': {'_G1': 3, 'G5_4': 1}}))) + self.assertEqual(obs.descriptive_equality(exp), 'Tables appear equal') def test_collapse_biom(self): table = Table(*map(np.array, prep_table({ @@ -307,18 +323,18 @@ def test_collapse_biom(self): self.assertListEqual(list(obs.ids('sample')), ['S1', 'S2', 'S3']) self.assertListEqual(list(obs.ids('observation')), []) - # stratified table + # stratified features table = Table(*map(np.array, prep_table({ 'S1': {'A|K1': 4, 'A|K2': 5, 'B|K2': 8, 'C|K3': 3, 'C|K4': 0}, 'S2': {'A|K1': 1, 'A|K2': 8, 'B|K2': 0, 'C|K3': 4, 'C|K4': 2}}))) mapping = {'A': ['1'], 'B': ['1']} - obs = collapse_biom(table.copy(), mapping, field=0) + obs = collapse_biom(table.copy(), mapping, field=1, sep='|') exp = Table(*map(np.array, prep_table({ 'S1': {'1|K1': 4, '1|K2': 13}, 'S2': {'1|K1': 1, '1|K2': 8}}))) self.assertEqual(obs.descriptive_equality(exp), 'Tables appear equal') mapping = {'K1': ['H1'], 'K2': ['H2', 'H3'], 'K3': ['H3']} - obs = collapse_biom(table.copy(), mapping, field=1) + obs = collapse_biom(table.copy(), mapping, field=2, sep='|') exp = Table(*map(np.array, prep_table({ 'S1': {'A|H1': 4, 'A|H2': 5, 'A|H3': 5, 'B|H2': 8, 'B|H3': 8, 'C|H3': 3}, @@ -326,50 +342,37 @@ def test_collapse_biom(self): 'C|H3': 4}}))) self.assertEqual(obs.descriptive_equality(exp), 'Tables appear equal') - # invalid field - with self.assertRaises(ValueError) as ctx: - collapse_biom(table, mapping, field=2) - errmsg = 'Feature "A|K1" has less than 3 fields.' - self.assertEqual(str(ctx.exception), errmsg) - - # suffixed table - keep only parents + # invalid or empty field table = Table(*map(np.array, prep_table({ - 'S1': {'A.1': 3, 'A.2': 6, 'B.1': 7, 'B.2': 0, 'C.2': 3}, - 'S2': {'A.2': 2, 'A.3': 5, 'B.3': 2, 'C.1': 4, 'C.3': 2}}))) - mapping = {'A': ['X'], 'B': ['X'], 'C': ['Y']} - obs = collapse_biom(table.copy(), mapping, suffix='.') - exp = Table(*map(np.array, prep_table({ - 'S1': {'X': 16, 'Y': 3}, - 'S2': {'X': 9, 'Y': 6}}))) - self.assertEqual(obs.descriptive_equality(exp), 'Tables appear equal') + 'S1': {'G_1': 6, '||G2': 3}, + 'S2': {'G|1': 1, 'G2|': 7,}}))) + mapping = {'G1': ['H1'], 'G2': ['H2']} + obs = collapse_biom(table.copy(), mapping, field=2, sep='|') + self.assertTupleEqual(obs.to_dataframe(True).shape, (0, 2)) - # collapse parents + # nested features - 1st level table = Table(*map(np.array, prep_table({ 'S1': {'A_1': 3, 'A_2': 6, 'B_1': 7, 'B_2': 0}, 'S2': {'A_2': 2, 'B_3': 2, 'C_1': 4, 'C_3': 2}}))) - obs = collapse_biom(table.copy(), mapping, field=0, suffix='_') + mapping = {'A': ['X'], 'B': ['X'], 'C': ['Y']} + obs = collapse_biom(table.copy(), mapping, field=1, sep='_', + nested=True) exp = Table(*map(np.array, prep_table({ 'S1': {'X|A_1': 3, 'X|A_2': 6, 'X|B_1': 7, 'Y|B_2': 0}, 'S2': {'X|A_2': 2, 'X|B_3': 2, 'Y|C_1': 4, 'Y|C_3': 2}}))) self.assertEqual(obs.descriptive_equality(exp), 'Tables appear equal') - # collapse children + # 2nd level mapping = {'A_1': ['a'], 'A_2': ['b'], 'B_1': ['a'], 'B_2': ['b'], 'C_1': ['a'], 'C_2': ['b']} - obs = collapse_biom(table.copy(), mapping, field=1, suffix='_') + obs = collapse_biom(table.copy(), mapping, field=2, sep='_', + nested=True) exp = Table(*map(np.array, prep_table({ 'S1': {'A|a': 3, 'A|b': 6, 'B|a': 7, 'B|b': 0}, 'S2': {'A|b': 2, 'C|a': 4}}))) self.assertEqual(obs.descriptive_equality(exp), 'Tables appear equal') - # no suffix - table = Table(*map(np.array, prep_table({'S1': {'ABC': 123}}))) - with self.assertRaises(ValueError) as ctx: - collapse_biom(table.copy(), {}, suffix='x') - errmsg = 'Feature "ABC" does not have a suffix.' - self.assertEqual(str(ctx.exception), errmsg) - if __name__ == '__main__': main() diff --git a/woltka/tests/test_table.py b/woltka/tests/test_table.py index cea45f1..dfc8779 100644 --- a/woltka/tests/test_table.py +++ b/woltka/tests/test_table.py @@ -652,7 +652,7 @@ def test_clip_table(self): 'S1': {'G1_1': 4, 'G1_2': 5, 'G1_3': 0, 'G2_1': 0, 'G2_2': 3}, 'S2': {'G1_1': 1, 'G1_2': 8, 'G1_4': 0, 'G2_1': 3, 'G2_3': 4}, 'S3': {'G1_1': 0, 'G1_3': 2, 'G1_4': 3, 'G2_2': 5, 'G2_3': 0}}) - obs = clip_table(table) + obs = clip_table(table, 1, sep='_') exp = prep_table({ 'S1': {'G1': 9, 'G2': 3}, 'S2': {'G1': 9, 'G2': 7}, @@ -660,18 +660,36 @@ def test_clip_table(self): for i in range(4): self.assertListEqual(obs[i], exp[i]) + # field number the same (no change) + obs = clip_table(table, 2, sep='_') + for i in range(4): + self.assertListEqual(obs[i], table[i]) + + # field number too large (all dropped) + obs = clip_table(table, 3, sep='_') + for i in range(2): + self.assertListEqual(obs[i], []) + # invalid separator - with self.assertRaises(ValueError) as ctx: - clip_table(table, sep='.') - errmsg = 'Feature "G1_1" does not have a suffix.' - self.assertEqual(str(ctx.exception), errmsg) + obs = clip_table(table, 1, sep='.') + for i in range(4): + self.assertListEqual(obs[i], table[i]) # BIOM table table_ = Table(*map(np.array, table)) - obs = clip_table(table_) + obs = clip_table(table_, 1, sep='_') exp = Table(*map(np.array, exp)) self.assertEqual(obs.descriptive_equality(exp), 'Tables appear equal') + # empty fields + table = prep_table({ + 'S1': {'_G1_1': 3, 'G2__3': 5, 'G5_4_': 1, '__G0': 2}}) + obs = clip_table(table, 2, sep='_') + exp = prep_table({ + 'S1': {'_G1': 3, 'G5_4': 1}}) + for i in range(4): + self.assertListEqual(obs[i], exp[i]) + def test_collapse_table(self): table = prep_table({ 'S1': {'G1': 4, 'G2': 5, 'G3': 8, 'G4': 0, 'G5': 3, 'G6': 0}, @@ -749,19 +767,19 @@ def test_collapse_table(self): for i in range(4): self.assertListEqual(obs[i], exp[i]) - # stratified table + # stratified features table = prep_table({ 'S1': {'A|K1': 4, 'A|K2': 5, 'B|K2': 8, 'C|K3': 3, 'C|K4': 0}, 'S2': {'A|K1': 1, 'A|K2': 8, 'B|K2': 0, 'C|K3': 4, 'C|K4': 2}}) mapping = {'A': ['1'], 'B': ['1']} - obs = collapse_table(table, mapping, field=0) + obs = collapse_table(table, mapping, field=1, sep='|') exp = prep_table({ 'S1': {'1|K1': 4, '1|K2': 13}, 'S2': {'1|K1': 1, '1|K2': 8}}) for i in range(4): self.assertListEqual(obs[i], exp[i]) mapping = {'K1': ['H1'], 'K2': ['H2', 'H3'], 'K3': ['H3']} - obs = collapse_table(table, mapping, field=1) + obs = collapse_table(table, mapping, field=2, sep='|') exp = prep_table({ 'S1': {'A|H1': 4, 'A|H2': 5, 'A|H3': 5, 'B|H2': 8, 'B|H3': 8, 'C|H3': 3}, @@ -770,53 +788,38 @@ def test_collapse_table(self): for i in range(4): self.assertListEqual(obs[i], exp[i]) - # invalid field - with self.assertRaises(ValueError) as ctx: - collapse_table(table, mapping, field=2) - errmsg = 'Feature "A|K1" has less than 3 fields.' - self.assertEqual(str(ctx.exception), errmsg) - - # suffixed table - keep only parents + # invalid or empty field table = prep_table({ - 'S1': {'A.1': 3, 'A.2': 6, 'B.1': 7, 'B.2': 0, 'C.2': 3}, - 'S2': {'A.2': 2, 'A.3': 5, 'B.3': 2, 'C.1': 4, 'C.3': 2}}) - mapping = {'A': ['X'], 'B': ['X'], 'C': ['Y']} - obs = collapse_table(table, mapping, suffix='.') - exp = prep_table({ - 'S1': {'X': 16, 'Y': 3}, - 'S2': {'X': 9, 'Y': 6}}) - for i in range(4): - self.assertListEqual(obs[i], exp[i]) + 'S1': {'G_1': 6, '||G2': 3}, + 'S2': {'G|1': 1, 'G2|': 7,}}) + mapping = {'G1': ['H1'], 'G2': ['H2']} + obs = collapse_table(table, mapping, field=2, sep='|') + for i in range(2): + self.assertListEqual(obs[i], []) - # collapse parents + # nested features - 1st level table = prep_table({ 'S1': {'A_1': 3, 'A_2': 6, 'B_1': 7, 'B_2': 0}, 'S2': {'A_2': 2, 'B_3': 2, 'C_1': 4, 'C_3': 2}}) - obs = collapse_table(table, mapping, field=0, suffix='_') + mapping = {'A': ['X'], 'B': ['X'], 'C': ['Y']} + obs = collapse_table(table, mapping, field=1, sep='_', nested=True) exp = prep_table({ 'S1': {'X|A_1': 3, 'X|A_2': 6, 'X|B_1': 7, 'Y|B_2': 0}, 'S2': {'X|A_2': 2, 'X|B_3': 2, 'Y|C_1': 4, 'Y|C_3': 2}}) for i in range(4): self.assertListEqual(obs[i], exp[i]) - # collapse children + # 2nd level mapping = {'A_1': ['a'], 'A_2': ['b'], 'B_1': ['a'], 'B_2': ['b'], 'C_1': ['a'], 'C_2': ['b']} - obs = collapse_table(table, mapping, field=1, suffix='_') + obs = collapse_table(table, mapping, field=2, sep='_', nested=True) exp = prep_table({ 'S1': {'A|a': 3, 'A|b': 6, 'B|a': 7, 'B|b': 0}, 'S2': {'A|b': 2, 'C|a': 4}}) for i in range(4): self.assertListEqual(obs[i], exp[i]) - # no suffix - table = prep_table({'S1': {'ABC': 123}}) - with self.assertRaises(ValueError) as ctx: - collapse_table(table, {}, suffix='x') - errmsg = 'Feature "ABC" does not have a suffix.' - self.assertEqual(str(ctx.exception), errmsg) - def test_calc_coverage(self): table = prep_table({ 'S1': {'G1': 4, 'G2': 5, 'G3': 8, 'G4': 0, 'G5': 3, 'G6': 0}, diff --git a/woltka/tests/test_tools.py b/woltka/tests/test_tools.py index 389485d..9ef40b3 100644 --- a/woltka/tests/test_tools.py +++ b/woltka/tests/test_tools.py @@ -186,12 +186,6 @@ def test_collapse_wf(self): self.assertEqual(line[11:], '3\t7\t9\t1\t4\tnuclease activity') remove(output_fp) - # no mapping file - with self.assertRaises(SystemExit) as ctx: - collapse_wf(input_fp, output_fp) - errmsg = 'A mapping file is required unless features are suffixed.' - self.assertEqual(str(ctx.exception), errmsg) - # wrong mapping file map_fp = join(self.datdir, 'tree.nwk') with self.assertRaises(SystemExit) as ctx: @@ -213,9 +207,9 @@ def test_collapse_wf(self): self.assertEqual(line[25:], '0\t2\t9\t3\t0') remove(output_fp) - # suffixed profile + # nested profile input_fp = join(self.datdir, 'output', 'bowtie2.orf.tsv') - collapse_wf(input_fp, output_fp, suffix='_') + collapse_wf(input_fp, output_fp, field=1, sep='_', nested=True) with open(output_fp, 'r') as f: obs = f.read().splitlines() self.assertEqual(len(obs), 50) diff --git a/woltka/tools.py b/woltka/tools.py index 7f06266..9406116 100644 --- a/woltka/tools.py +++ b/woltka/tools.py @@ -197,7 +197,8 @@ def collapse_wf(input_fp: str, map_fp: str = None, divide: bool = False, field: int = None, - suffix: str = None, + nested: bool = False, + sep: str = None, names_fp: str = None): """Workflow for collapsing a profile based on many-to-many mapping. @@ -219,31 +220,30 @@ def collapse_wf(input_fp: str, # read mapping file (many-to-many okay) if map_fp: + fname = basename(map_fp) + click.echo(f'Reading mapping file: {fname}...', nl=False) with readzip(map_fp, {}) as f: mapping = read_map_many(f) + click.echo(' Done.') if not mapping: - exit(f'No source-target mapping is found in {basename(map_fp)}.') - - # no mapping file (okay when trimming suffix) - elif not suffix: - exit(f'A mapping file is required unless features are suffixed.') + exit(f'No source-target mapping is found in {fname}.') - # convert field index from 1-based to 0-based - if field: - field -= 1 + # determine default field separator + if sep is None: + sep = '_' if nested else '|' click.echo('Collapsing profile...', nl=False) # maximum decimal precision digits = table_max_f(table) - # just remove suffix from feature names - if suffix and not map_fp: - table = clip_table(table, suffix) - # collapse profile by mapping + if map_fp: + table = collapse_table(table, mapping, divide, field, sep, nested) + + # just clip feature names else: - table = collapse_table(table, mapping, divide, field, suffix) + table = clip_table(table, field, sep) # append feature names (optional) if names_fp: From 36df8c9a144137051b6161cb795d9e4b350024e2 Mon Sep 17 00:00:00 2001 From: Qiyun Zhu Date: Thu, 22 Dec 2022 23:11:57 -0700 Subject: [PATCH 5/7] fixed clip bug --- woltka/biom.py | 6 ++++-- woltka/table.py | 8 +++++--- woltka/tests/test_biom.py | 24 ++++++++++++++++++++-- woltka/tests/test_table.py | 41 ++++++++++++++++++++++++++++---------- woltka/tools.py | 2 +- 5 files changed, 63 insertions(+), 18 deletions(-) diff --git a/woltka/biom.py b/woltka/biom.py index c960b1a..bfe4816 100644 --- a/woltka/biom.py +++ b/woltka/biom.py @@ -196,7 +196,7 @@ def biom_add_metacol(table: biom.Table, dic, name, missing=''): table.add_metadata(metadata, axis='observation') -def clip_biom(table: biom.Table, field, sep): +def clip_biom(table: biom.Table, field, sep, nested=False): """Clip stratified or nested feature names to a field. Parameters @@ -207,6 +207,8 @@ def clip_biom(table: biom.Table, field, sep): Field index to clip at. sep : str Field separator. + nested : bool, optional + Whether features are nested. Returns ------- @@ -226,7 +228,7 @@ def clip_biom(table: biom.Table, field, sep): def f1(id_, md): fields = id_.split(sep) if len(fields) >= field and fields[idx]: - return sep.join(fields[:field]) + return sep.join(fields[:field]) if nested else fields[idx] table = table.collapse(f1, norm=False, axis='observation', include_collapsed_metadata=False) diff --git a/woltka/table.py b/woltka/table.py index efaaa97..59d487e 100644 --- a/woltka/table.py +++ b/woltka/table.py @@ -561,7 +561,7 @@ def add_metacol(table, dic, name, missing=''): metadatum[name] = dic.get(feature, missing) -def clip_table(table, field, sep): +def clip_table(table, field, sep, nested=False): """Clip stratified or nested feature names to a field. Parameters @@ -572,6 +572,8 @@ def clip_table(table, field, sep): Field index to clip at. sep : str Field separator. + nested : bool, optional + Whether features are nested. Returns ------- @@ -580,7 +582,7 @@ def clip_table(table, field, sep): """ # redirect to BIOM module if isinstance(table, Table): - return clip_biom(table, field, sep) + return clip_biom(table, field, sep, nested) # clip feature names to given field samples = table[2] @@ -590,7 +592,7 @@ def clip_table(table, field, sep): for datum, feature in zip(*table[:2]): fields = feature.split(sep) if len(fields) >= field and fields[idx]: - clipped = sep.join(fields[:field]) + clipped = sep.join(fields[:field]) if nested else fields[idx] res[clipped] = list(map(add, res[clipped], datum)) # reformat table diff --git a/woltka/tests/test_biom.py b/woltka/tests/test_biom.py index f0bba4d..c89626e 100644 --- a/woltka/tests/test_biom.py +++ b/woltka/tests/test_biom.py @@ -221,6 +221,8 @@ def test_clip_biom(self): 'S1': {'G1_1': 4, 'G1_2': 5, 'G1_3': 0, 'G2_1': 0, 'G2_2': 3}, 'S2': {'G1_1': 1, 'G1_2': 8, 'G1_4': 0, 'G2_1': 3, 'G2_3': 4}, 'S3': {'G1_1': 0, 'G1_3': 2, 'G1_4': 3, 'G2_2': 5, 'G2_3': 0}}))) + + # 1st field obs = clip_biom(table.copy(), 1, sep='_') exp = Table(*map(np.array, prep_table({ 'S1': {'G1': 9, 'G2': 3}, @@ -228,8 +230,20 @@ def test_clip_biom(self): 'S3': {'G1': 5, 'G2': 5}}))) self.assertEqual(obs.descriptive_equality(exp), 'Tables appear equal') - # field number the same (no change) + # nested + obs = clip_biom(table.copy(), 1, sep='_', nested=True) + self.assertEqual(obs.descriptive_equality(exp), 'Tables appear equal') + + # 2nd field obs = clip_biom(table.copy(), 2, sep='_') + exp = Table(*map(np.array, prep_table({ + 'S1': {'1': 4, '2': 8, '3': 0, '4': 0}, + 'S2': {'1': 4, '2': 8, '3': 4, '4': 0}, + 'S3': {'1': 0, '2': 5, '3': 2, '4': 3}}))) + self.assertEqual(obs.descriptive_equality(exp), 'Tables appear equal') + + # nested (no change) + obs = clip_biom(table.copy(), 2, sep='_', nested=True) self.assertEqual(obs.descriptive_equality(table), 'Tables appear equal') @@ -246,6 +260,12 @@ def test_clip_biom(self): table = Table(*map(np.array, prep_table({ 'S1': {'_G1_1': 3, 'G2__3': 5, 'G5_4_': 1, '__G0': 2}}))) obs = clip_biom(table.copy(), 2, sep='_') + exp = Table(*map(np.array, prep_table({ + 'S1': {'G1': 3, '4': 1}}))) + self.assertEqual(obs.descriptive_equality(exp), 'Tables appear equal') + + # nested + obs = clip_biom(table.copy(), 2, sep='_', nested=True) exp = Table(*map(np.array, prep_table({ 'S1': {'_G1': 3, 'G5_4': 1}}))) self.assertEqual(obs.descriptive_equality(exp), 'Tables appear equal') @@ -345,7 +365,7 @@ def test_collapse_biom(self): # invalid or empty field table = Table(*map(np.array, prep_table({ 'S1': {'G_1': 6, '||G2': 3}, - 'S2': {'G|1': 1, 'G2|': 7,}}))) + 'S2': {'G|1': 1, 'G2|': 7}}))) mapping = {'G1': ['H1'], 'G2': ['H2']} obs = collapse_biom(table.copy(), mapping, field=2, sep='|') self.assertTupleEqual(obs.to_dataframe(True).shape, (0, 2)) diff --git a/woltka/tests/test_table.py b/woltka/tests/test_table.py index dfc8779..813d9ae 100644 --- a/woltka/tests/test_table.py +++ b/woltka/tests/test_table.py @@ -652,6 +652,8 @@ def test_clip_table(self): 'S1': {'G1_1': 4, 'G1_2': 5, 'G1_3': 0, 'G2_1': 0, 'G2_2': 3}, 'S2': {'G1_1': 1, 'G1_2': 8, 'G1_4': 0, 'G2_1': 3, 'G2_3': 4}, 'S3': {'G1_1': 0, 'G1_3': 2, 'G1_4': 3, 'G2_2': 5, 'G2_3': 0}}) + + # 1st field obs = clip_table(table, 1, sep='_') exp = prep_table({ 'S1': {'G1': 9, 'G2': 3}, @@ -660,8 +662,28 @@ def test_clip_table(self): for i in range(4): self.assertListEqual(obs[i], exp[i]) - # field number the same (no change) + # nested + obs = clip_table(table, 1, sep='_', nested=True) + for i in range(4): + self.assertListEqual(obs[i], exp[i]) + + # BIOM table + table_ = Table(*map(np.array, table)) + obs = clip_table(table_, 1, sep='_') + exp = Table(*map(np.array, exp)) + self.assertEqual(obs.descriptive_equality(exp), 'Tables appear equal') + + # 2nd field obs = clip_table(table, 2, sep='_') + exp = prep_table({ + 'S1': {'1': 4, '2': 8, '3': 0, '4': 0}, + 'S2': {'1': 4, '2': 8, '3': 4, '4': 0}, + 'S3': {'1': 0, '2': 5, '3': 2, '4': 3}}) + for i in range(4): + self.assertListEqual(obs[i], exp[i]) + + # nested (no change) + obs = clip_table(table, 2, sep='_', nested=True) for i in range(4): self.assertListEqual(obs[i], table[i]) @@ -675,18 +697,17 @@ def test_clip_table(self): for i in range(4): self.assertListEqual(obs[i], table[i]) - # BIOM table - table_ = Table(*map(np.array, table)) - obs = clip_table(table_, 1, sep='_') - exp = Table(*map(np.array, exp)) - self.assertEqual(obs.descriptive_equality(exp), 'Tables appear equal') - # empty fields table = prep_table({ 'S1': {'_G1_1': 3, 'G2__3': 5, 'G5_4_': 1, '__G0': 2}}) obs = clip_table(table, 2, sep='_') - exp = prep_table({ - 'S1': {'_G1': 3, 'G5_4': 1}}) + exp = prep_table({'S1': {'G1': 3, '4': 1}}) + for i in range(4): + self.assertListEqual(obs[i], exp[i]) + + # nested + obs = clip_table(table, 2, sep='_', nested=True) + exp = prep_table({'S1': {'_G1': 3, 'G5_4': 1}}) for i in range(4): self.assertListEqual(obs[i], exp[i]) @@ -791,7 +812,7 @@ def test_collapse_table(self): # invalid or empty field table = prep_table({ 'S1': {'G_1': 6, '||G2': 3}, - 'S2': {'G|1': 1, 'G2|': 7,}}) + 'S2': {'G|1': 1, 'G2|': 7}}) mapping = {'G1': ['H1'], 'G2': ['H2']} obs = collapse_table(table, mapping, field=2, sep='|') for i in range(2): diff --git a/woltka/tools.py b/woltka/tools.py index 9406116..5169dc1 100644 --- a/woltka/tools.py +++ b/woltka/tools.py @@ -243,7 +243,7 @@ def collapse_wf(input_fp: str, # just clip feature names else: - table = clip_table(table, field, sep) + table = clip_table(table, field, sep, nested) # append feature names (optional) if names_fp: From 4fdcb6ab7792da672c06d24df5149495cd35a2c0 Mon Sep 17 00:00:00 2001 From: Qiyun Zhu Date: Thu, 22 Dec 2022 23:36:21 -0700 Subject: [PATCH 6/7] simplified table testing --- woltka/tests/test_biom.py | 82 ++++++++++++---------- woltka/tests/test_table.py | 140 ++++++++++++++++--------------------- 2 files changed, 105 insertions(+), 117 deletions(-) diff --git a/woltka/tests/test_biom.py b/woltka/tests/test_biom.py index c89626e..1704e03 100644 --- a/woltka/tests/test_biom.py +++ b/woltka/tests/test_biom.py @@ -35,6 +35,19 @@ def setUp(self): def tearDown(self): rmtree(self.tmpdir) + def assertBIOMEqual(self, a, b): + """Assert two BIOM tables are equal. + """ + self.assertEqual(a.descriptive_equality(b), 'Tables appear equal') + + def assertBIOMEmpty(self, a, samples=None): + """Assert a BIOM table is empty; optionally check sample IDs. + """ + self.assertTrue(a.is_empty()) + self.assertListEqual(list(a.ids('observation')), []) + if samples: + self.assertListEqual(list(a.ids('sample')), samples) + def test_table_to_biom(self): data = [[4, 2, 0], [5, 0, 3], @@ -93,7 +106,7 @@ def test_write_biom(self): fp = join(self.tmpdir, 'tmp.biom') write_biom(exp, fp) obs = load_table(fp) - self.assertEqual(obs.descriptive_equality(exp), 'Tables appear equal') + self.assertBIOMEqual(obs, exp) remove(fp) def test_biom_max_f(self): @@ -114,7 +127,7 @@ def test_divide_biom(self): 'S1': {'G1': 4, 'G2': 6, 'G3': 2}, 'S2': {'G1': 3, 'G2': 4, 'G3': 4}, 'S3': {'G1': 2, 'G2': 3, 'G3': 0}}))) - self.assertEqual(obs.descriptive_equality(exp), 'Tables appear equal') + self.assertBIOMEqual(obs, exp) del sizes['G3'] with self.assertRaises(KeyError): divide_biom(obs, sizes) @@ -127,7 +140,7 @@ def test_scale_biom(self): exp = Table(*map(np.array, prep_table({ 'S1': {'G1': 12, 'G2': 21, 'G3': 0}, 'S2': {'G1': 6, 'G2': 9, 'G3': 3}}))) - self.assertEqual(obs.descriptive_equality(exp), 'Tables appear equal') + self.assertBIOMEqual(obs, exp) def test_filter_biom(self): table = Table(*map(np.array, prep_table({ @@ -139,39 +152,38 @@ def test_filter_biom(self): 'S1': {'G1': 4, 'G2': 5, 'G3': 8}, 'S2': {'G4': 3, 'G5': 7}, 'S3': {'G2': 3, 'G5': 5}}))) - self.assertEqual(obs.descriptive_equality(exp), 'Tables appear equal') + self.assertBIOMEqual(obs, exp) obs = filter_biom(table, th=4) exp = Table(*map(np.array, prep_table({ 'S1': {'G1': 4, 'G2': 5, 'G3': 8}, 'S2': {'G5': 7}, 'S3': {'G5': 5}}))) - self.assertEqual(obs.descriptive_equality(exp), 'Tables appear equal') + self.assertBIOMEqual(obs, exp) obs = filter_biom(table, th=6) exp = Table(*map(np.array, prep_table({ 'S1': {'G3': 8}, 'S2': {'G5': 7}, 'S3': {}}))) - self.assertEqual(obs.descriptive_equality(exp), 'Tables appear equal') + self.assertBIOMEqual(obs, exp) obs = filter_biom(table, th=0.25) exp = Table(*map(np.array, prep_table({ 'S1': {'G2': 5, 'G3': 8}, 'S2': {'G4': 3, 'G5': 7}, 'S3': {'G2': 3, 'G5': 5}}))) - self.assertEqual(obs.descriptive_equality(exp), 'Tables appear equal') + self.assertBIOMEqual(obs, exp) obs = filter_biom(table, th=0.5) exp = Table(*map(np.array, prep_table({ 'S1': {}, 'S2': {'G5': 7}, 'S3': {'G5': 5}}))) - self.assertEqual(obs.descriptive_equality(exp), 'Tables appear equal') + self.assertBIOMEqual(obs, exp) - # empty BIOM table cannot be directly compared obs = filter_biom(table, th=10) - self.assertTupleEqual(obs.to_dataframe(True).shape, (0, 3)) + self.assertBIOMEmpty(obs, ['S1', 'S2', 'S3']) def test_round_biom(self): obs = Table(*map(np.array, prep_table({ @@ -183,7 +195,7 @@ def test_round_biom(self): 'S1': {'G1': 0, 'G3': 2}, 'S2': {'G1': 2, 'G3': 2}, 'S3': {'G1': 2, 'G3': 4}}))) - self.assertEqual(obs.descriptive_equality(exp), 'Tables appear equal') + self.assertBIOMEqual(obs, exp) obs = Table(*map(np.array, prep_table({ 'S1': {'G1': 0.225, 'G2': 0.0, 'G3': 2.375}, 'S2': {'G1': 1.547, 'G2': 0.173, 'G3': 1.499}}))) @@ -191,7 +203,7 @@ def test_round_biom(self): exp = Table(*map(np.array, prep_table({ 'S1': {'G1': 0.23, 'G2': 0.0, 'G3': 2.38}, 'S2': {'G1': 1.55, 'G2': 0.17, 'G3': 1.5}}))) - self.assertEqual(obs.descriptive_equality(exp), 'Tables appear equal') + self.assertBIOMEqual(obs, exp) def test_biom_add_metacol(self): obs = Table(*map(np.array, prep_table({ @@ -228,11 +240,11 @@ def test_clip_biom(self): 'S1': {'G1': 9, 'G2': 3}, 'S2': {'G1': 9, 'G2': 7}, 'S3': {'G1': 5, 'G2': 5}}))) - self.assertEqual(obs.descriptive_equality(exp), 'Tables appear equal') + self.assertBIOMEqual(obs, exp) # nested obs = clip_biom(table.copy(), 1, sep='_', nested=True) - self.assertEqual(obs.descriptive_equality(exp), 'Tables appear equal') + self.assertBIOMEqual(obs, exp) # 2nd field obs = clip_biom(table.copy(), 2, sep='_') @@ -240,21 +252,19 @@ def test_clip_biom(self): 'S1': {'1': 4, '2': 8, '3': 0, '4': 0}, 'S2': {'1': 4, '2': 8, '3': 4, '4': 0}, 'S3': {'1': 0, '2': 5, '3': 2, '4': 3}}))) - self.assertEqual(obs.descriptive_equality(exp), 'Tables appear equal') + self.assertBIOMEqual(obs, exp) # nested (no change) obs = clip_biom(table.copy(), 2, sep='_', nested=True) - self.assertEqual(obs.descriptive_equality(table), - 'Tables appear equal') + self.assertBIOMEqual(obs, table) # field number too large (all dropped) obs = clip_biom(table.copy(), 3, sep='_') - self.assertTupleEqual(obs.to_dataframe(True).shape, (0, 3)) + self.assertBIOMEmpty(obs, ['S1', 'S2', 'S3']) # invalid separator obs = clip_biom(table.copy(), 1, sep='.') - self.assertEqual(obs.descriptive_equality(table), - 'Tables appear equal') + self.assertBIOMEqual(obs, table) # empty fields table = Table(*map(np.array, prep_table({ @@ -262,13 +272,13 @@ def test_clip_biom(self): obs = clip_biom(table.copy(), 2, sep='_') exp = Table(*map(np.array, prep_table({ 'S1': {'G1': 3, '4': 1}}))) - self.assertEqual(obs.descriptive_equality(exp), 'Tables appear equal') + self.assertBIOMEqual(obs, exp) # nested obs = clip_biom(table.copy(), 2, sep='_', nested=True) exp = Table(*map(np.array, prep_table({ 'S1': {'_G1': 3, 'G5_4': 1}}))) - self.assertEqual(obs.descriptive_equality(exp), 'Tables appear equal') + self.assertBIOMEqual(obs, exp) def test_collapse_biom(self): table = Table(*map(np.array, prep_table({ @@ -284,7 +294,7 @@ def test_collapse_biom(self): 'S1': {'H1': 4, 'H2': 5, 'H3': 8, 'H4': 0, 'H5': 3, 'H6': 0}, 'S2': {'H1': 1, 'H2': 8, 'H3': 0, 'H4': 7, 'H5': 4, 'H6': 2}, 'S3': {'H1': 0, 'H2': 2, 'H3': 3, 'H4': 5, 'H5': 0, 'H6': 9}}))) - self.assertEqual(obs.descriptive_equality(exp), 'Tables appear equal') + self.assertBIOMEqual(obs, exp) # some missing, some extra mapping = {'G1': ['H1'], 'G2': ['H2'], 'G3': ['H3'], 'G9': ['H9']} @@ -293,14 +303,12 @@ def test_collapse_biom(self): 'S1': {'H1': 4, 'H2': 5, 'H3': 8}, 'S2': {'H1': 1, 'H2': 8, 'H3': 0}, 'S3': {'H1': 0, 'H2': 2, 'H3': 3}}))) - self.assertEqual(obs.descriptive_equality(exp), 'Tables appear equal') + self.assertBIOMEqual(obs, exp) # wrong mapping (no match) mapping = {'H1': ['I1'], 'H2': ['I2'], 'H3': ['I3']} obs = collapse_biom(table.copy(), mapping) - self.assertTrue(obs.is_empty()) - self.assertListEqual(list(obs.ids('sample')), ['S1', 'S2', 'S3']) - self.assertListEqual(list(obs.ids('observation')), []) + self.assertBIOMEmpty(obs, ['S1', 'S2', 'S3']) # many-to-one mapping (e.g., taxonomic rank up) mapping = {'G1': ['H1'], 'G2': ['H1'], 'G3': ['H2'], @@ -310,7 +318,7 @@ def test_collapse_biom(self): 'S1': {'H1': 9, 'H2': 11, 'H3': 0}, 'S2': {'H1': 9, 'H2': 11, 'H3': 2}, 'S3': {'H1': 2, 'H2': 8, 'H3': 9}}))) - self.assertEqual(obs.descriptive_equality(exp), 'Tables appear equal') + self.assertBIOMEqual(obs, exp) # many-to-many mapping (e.g., genes to pathways) mapping = {'G1': ['H1'], @@ -324,7 +332,7 @@ def test_collapse_biom(self): 'S1': {'H1': 9, 'H2': 13, 'H3': 8, 'H4': 11, 'H5': 0}, 'S2': {'H1': 9, 'H2': 15, 'H3': 2, 'H4': 4, 'H5': 9}, 'S3': {'H1': 2, 'H2': 10, 'H3': 12, 'H4': 3, 'H5': 14}}))) - self.assertEqual(obs.descriptive_equality(exp), 'Tables appear equal') + self.assertBIOMEqual(obs, exp) # many-to-many mapping, with normalization obs = collapse_biom(table.copy(), mapping, divide=True) @@ -332,16 +340,14 @@ def test_collapse_biom(self): 'S1': {'H1': 6, 'H2': 5, 'H3': 3, 'H4': 6, 'H5': 0}, 'S2': {'H1': 5, 'H2': 8, 'H3': 1, 'H4': 4, 'H5': 4}, 'S3': {'H1': 1, 'H2': 4, 'H3': 6, 'H4': 1, 'H5': 7}}))) - self.assertEqual(obs.descriptive_equality(exp), 'Tables appear equal') + self.assertBIOMEqual(obs, exp) # nothing left after normalization table = Table(*map(np.array, prep_table({ 'S1': {'G1': 0}, 'S2': {'G1': 1}, 'S3': {'G1': 2}}))) mapping = {'G1': ['H1', 'H2', 'H3', 'H4']} obs = collapse_biom(table.copy(), mapping, divide=True) - self.assertTrue(obs.is_empty()) - self.assertListEqual(list(obs.ids('sample')), ['S1', 'S2', 'S3']) - self.assertListEqual(list(obs.ids('observation')), []) + self.assertBIOMEmpty(obs, ['S1', 'S2', 'S3']) # stratified features table = Table(*map(np.array, prep_table({ @@ -352,7 +358,7 @@ def test_collapse_biom(self): exp = Table(*map(np.array, prep_table({ 'S1': {'1|K1': 4, '1|K2': 13}, 'S2': {'1|K1': 1, '1|K2': 8}}))) - self.assertEqual(obs.descriptive_equality(exp), 'Tables appear equal') + self.assertBIOMEqual(obs, exp) mapping = {'K1': ['H1'], 'K2': ['H2', 'H3'], 'K3': ['H3']} obs = collapse_biom(table.copy(), mapping, field=2, sep='|') exp = Table(*map(np.array, prep_table({ @@ -360,7 +366,7 @@ def test_collapse_biom(self): 'C|H3': 3}, 'S2': {'A|H1': 1, 'A|H2': 8, 'A|H3': 8, 'B|H2': 0, 'B|H3': 0, 'C|H3': 4}}))) - self.assertEqual(obs.descriptive_equality(exp), 'Tables appear equal') + self.assertBIOMEqual(obs, exp) # invalid or empty field table = Table(*map(np.array, prep_table({ @@ -368,7 +374,7 @@ def test_collapse_biom(self): 'S2': {'G|1': 1, 'G2|': 7}}))) mapping = {'G1': ['H1'], 'G2': ['H2']} obs = collapse_biom(table.copy(), mapping, field=2, sep='|') - self.assertTupleEqual(obs.to_dataframe(True).shape, (0, 2)) + self.assertBIOMEmpty(obs, ['S1', 'S2']) # nested features - 1st level table = Table(*map(np.array, prep_table({ @@ -380,7 +386,7 @@ def test_collapse_biom(self): exp = Table(*map(np.array, prep_table({ 'S1': {'X|A_1': 3, 'X|A_2': 6, 'X|B_1': 7, 'Y|B_2': 0}, 'S2': {'X|A_2': 2, 'X|B_3': 2, 'Y|C_1': 4, 'Y|C_3': 2}}))) - self.assertEqual(obs.descriptive_equality(exp), 'Tables appear equal') + self.assertBIOMEqual(obs, exp) # 2nd level mapping = {'A_1': ['a'], 'A_2': ['b'], @@ -391,7 +397,7 @@ def test_collapse_biom(self): exp = Table(*map(np.array, prep_table({ 'S1': {'A|a': 3, 'A|b': 6, 'B|a': 7, 'B|b': 0}, 'S2': {'A|b': 2, 'C|a': 4}}))) - self.assertEqual(obs.descriptive_equality(exp), 'Tables appear equal') + self.assertBIOMEqual(obs, exp) if __name__ == '__main__': diff --git a/woltka/tests/test_table.py b/woltka/tests/test_table.py index 813d9ae..537a16c 100644 --- a/woltka/tests/test_table.py +++ b/woltka/tests/test_table.py @@ -32,6 +32,25 @@ def setUp(self): def tearDown(self): rmtree(self.tmpdir) + def assertTableEqual(self, a, b): + """Assert two tables are equal. + """ + for i in range(4): + self.assertListEqual(a[i], b[i]) + + def assertTableEmpty(self, a, samples=None): + """Assert a table is empty; optionally check sample IDs. + """ + for i in (0, 1, 3): + self.assertListEqual(a[i], []) + if samples: + self.assertListEqual(a[2], samples) + + def assertBIOMEqual(self, a, b): + """Assert two BIOM tables are equal. + """ + self.assertEqual(a.descriptive_equality(b), 'Tables appear equal') + def test_prep_table(self): # default mode prof = {'S1': {'G1': 4, 'G2': 5, 'G3': 8}, @@ -195,15 +214,11 @@ def test_write_table(self): # BIOM to BIOM fp = join(self.tmpdir, 'output.biom') write_table(biota, fp) - obs = load_table(fp) - self.assertEqual(obs.descriptive_equality(biota), - 'Tables appear equal') + self.assertBIOMEqual(load_table(fp), biota) # tuple to BIOM write_table(table, fp) - obs = load_table(fp) - self.assertEqual(obs.descriptive_equality(biota), - 'Tables appear equal') + self.assertBIOMEqual(load_table(fp), biota) remove(fp) def test_read_tsv(self): @@ -412,13 +427,12 @@ def test_frac_table(self): # regular obs = frac_table(table) - for i in range(4): - self.assertListEqual(obs[i], exp[i]) + self.assertTableEqual(obs, exp) # BIOM obs = frac_table(Table(*map(np.array, table))) exp = Table(*map(np.array, exp)) - self.assertEqual(obs.descriptive_equality(exp), 'Tables appear equal') + self.assertBIOMEqual(obs, exp) # zero column table = prep_table({ @@ -445,13 +459,12 @@ def test_divide_table(self): # regular divide_table(obs, sizes) - for i in range(4): - self.assertListEqual(obs[i], exp[i]) + self.assertTableEqual(obs, exp) # BIOM divide_table(ob2, sizes) ex2 = Table(*map(np.array, exp)) - self.assertEqual(ob2.descriptive_equality(ex2), 'Tables appear equal') + self.assertBIOMEqual(ob2, ex2) # missing size del sizes['G3'] @@ -470,12 +483,11 @@ def test_scale_table(self): # regular scale_table(obs, 3) - for i in range(4): - self.assertListEqual(obs[i], exp[i]) + self.assertTableEqual(obs, exp) # BIOM scale_table(ob2, 3) - self.assertEqual(ob2.descriptive_equality(ex2), 'Tables appear equal') + self.assertBIOMEqual(ob2, ex2) def test_round_table(self): obs = prep_table({ @@ -490,13 +502,12 @@ def test_round_table(self): # regular round_table(obs) - for i in range(4): - self.assertListEqual(obs[i], exp[i]) + self.assertTableEqual(obs, exp) # BIOM round_table(ob2) ex2 = Table(*map(np.array, exp)) - self.assertEqual(ob2.descriptive_equality(ex2), 'Tables appear equal') + self.assertBIOMEqual(ob2, ex2) # 2 digits obs = prep_table({ @@ -506,8 +517,7 @@ def test_round_table(self): exp = prep_table({ 'S1': {'G1': 0.23, 'G2': 0.0, 'G3': 2.38}, 'S2': {'G1': 1.55, 'G2': 0.17, 'G3': 1.5}}) - for i in range(4): - self.assertListEqual(obs[i], exp[i]) + self.assertTableEqual(obs, exp) def test_filter_table(self): table = prep_table({'S1': {'G1': 4, 'G2': 5, 'G3': 8}, @@ -557,7 +567,7 @@ def test_filter_table(self): 'S1': {'G1': 4, 'G2': 5, 'G3': 8}, 'S2': {'G4': 3, 'G5': 7}, 'S3': {'G2': 3, 'G5': 5}}))) - self.assertEqual(obs.descriptive_equality(exp), 'Tables appear equal') + self.assertBIOMEqual(obs, exp) def test_merge_tables(self): # just data @@ -577,8 +587,7 @@ def test_merge_tables(self): 'S4': {'G1': 0, 'G2': 5, 'G3': 3, 'G4': 0, 'G5': 0, 'G6': 9}, 'S5': {'G1': 0, 'G2': 0, 'G3': 0, 'G4': 0, 'G5': 2, 'G6': 4}, 'S6': {'G1': 0, 'G2': 0, 'G3': 1, 'G4': 0, 'G5': 0, 'G6': 6}}) - for i in range(4): - self.assertListEqual(obs[i], exp[i]) + self.assertTableEqual(obs, exp) # with metadata names = {'G1': 'Actinobacteria', @@ -591,19 +600,17 @@ def test_merge_tables(self): t[3].clear() t[3].extend({'Name': names[x]} for x in t[1]) obs = merge_tables([t1, t2, t3]) - for i in range(4): - self.assertListEqual(obs[i], exp[i]) + self.assertTableEqual(obs, exp) # some biom tables obs = merge_tables([t1, table_to_biom(*t2), t3]) - for i in range(4): - self.assertListEqual(obs[i], exp[i]) + self.assertTableEqual(obs, exp) # all biom tables obs = merge_tables([table_to_biom(*x) for x in (t1, t2, t3)]) self.assertTrue(isinstance(obs, Table)) exp = table_to_biom(*exp) - self.assertEqual(obs.descriptive_equality(exp), 'Tables appear equal') + self.assertBIOMEqual(obs, exp) # inconsistent metadata t3[3][1]['Name'] = 'This is not right.' @@ -659,19 +666,17 @@ def test_clip_table(self): 'S1': {'G1': 9, 'G2': 3}, 'S2': {'G1': 9, 'G2': 7}, 'S3': {'G1': 5, 'G2': 5}}) - for i in range(4): - self.assertListEqual(obs[i], exp[i]) + self.assertTableEqual(obs, exp) # nested obs = clip_table(table, 1, sep='_', nested=True) - for i in range(4): - self.assertListEqual(obs[i], exp[i]) + self.assertTableEqual(obs, exp) # BIOM table table_ = Table(*map(np.array, table)) obs = clip_table(table_, 1, sep='_') exp = Table(*map(np.array, exp)) - self.assertEqual(obs.descriptive_equality(exp), 'Tables appear equal') + self.assertBIOMEqual(obs, exp) # 2nd field obs = clip_table(table, 2, sep='_') @@ -679,37 +684,31 @@ def test_clip_table(self): 'S1': {'1': 4, '2': 8, '3': 0, '4': 0}, 'S2': {'1': 4, '2': 8, '3': 4, '4': 0}, 'S3': {'1': 0, '2': 5, '3': 2, '4': 3}}) - for i in range(4): - self.assertListEqual(obs[i], exp[i]) + self.assertTableEqual(obs, exp) # nested (no change) obs = clip_table(table, 2, sep='_', nested=True) - for i in range(4): - self.assertListEqual(obs[i], table[i]) + self.assertTableEqual(obs, table) # field number too large (all dropped) obs = clip_table(table, 3, sep='_') - for i in range(2): - self.assertListEqual(obs[i], []) + self.assertTableEmpty(obs, ['S1', 'S2', 'S3']) # invalid separator obs = clip_table(table, 1, sep='.') - for i in range(4): - self.assertListEqual(obs[i], table[i]) + self.assertTableEqual(obs, table) # empty fields table = prep_table({ 'S1': {'_G1_1': 3, 'G2__3': 5, 'G5_4_': 1, '__G0': 2}}) obs = clip_table(table, 2, sep='_') exp = prep_table({'S1': {'G1': 3, '4': 1}}) - for i in range(4): - self.assertListEqual(obs[i], exp[i]) + self.assertTableEqual(obs, exp) # nested obs = clip_table(table, 2, sep='_', nested=True) exp = prep_table({'S1': {'_G1': 3, 'G5_4': 1}}) - for i in range(4): - self.assertListEqual(obs[i], exp[i]) + self.assertTableEqual(obs, exp) def test_collapse_table(self): table = prep_table({ @@ -725,14 +724,13 @@ def test_collapse_table(self): 'S1': {'H1': 4, 'H2': 5, 'H3': 8, 'H4': 0, 'H5': 3, 'H6': 0}, 'S2': {'H1': 1, 'H2': 8, 'H3': 0, 'H4': 7, 'H5': 4, 'H6': 2}, 'S3': {'H1': 0, 'H2': 2, 'H3': 3, 'H4': 5, 'H5': 0, 'H6': 9}}) - for i in range(4): - self.assertListEqual(obs[i], exp[i]) + self.assertTableEqual(obs, exp) # BIOM table table_ = Table(*map(np.array, table)) obs = collapse_table(table_, mapping) exp = Table(*map(np.array, exp)) - self.assertEqual(obs.descriptive_equality(exp), 'Tables appear equal') + self.assertBIOMEqual(obs, exp) # some missing, some extra mapping = {'G1': ['H1'], 'G2': ['H2'], 'G3': ['H3'], 'G9': ['H9']} @@ -741,15 +739,12 @@ def test_collapse_table(self): 'S1': {'H1': 4, 'H2': 5, 'H3': 8}, 'S2': {'H1': 1, 'H2': 8, 'H3': 0}, 'S3': {'H1': 0, 'H2': 2, 'H3': 3}}) - for i in range(4): - self.assertListEqual(obs[i], exp[i]) + self.assertTableEqual(obs, exp) # wrong mapping (no match) mapping = {'H1': ['I1'], 'H2': ['I2'], 'H3': ['I3']} obs = collapse_table(table, mapping) - for i in (0, 1, 3): - self.assertListEqual(obs[i], []) - self.assertListEqual(obs[2], ['S1', 'S2', 'S3']) + self.assertTableEmpty(obs, ['S1', 'S2', 'S3']) # many-to-one mapping (e.g., taxonomic rank up) mapping = {'G1': ['H1'], 'G2': ['H1'], 'G3': ['H2'], @@ -759,8 +754,7 @@ def test_collapse_table(self): 'S1': {'H1': 9, 'H2': 11, 'H3': 0}, 'S2': {'H1': 9, 'H2': 11, 'H3': 2}, 'S3': {'H1': 2, 'H2': 8, 'H3': 9}}) - for i in range(4): - self.assertListEqual(obs[i], exp[i]) + self.assertTableEqual(obs, exp) # many-to-many mapping (e.g., genes to pathways) mapping = {'G1': ['H1'], @@ -774,8 +768,7 @@ def test_collapse_table(self): 'S1': {'H1': 9, 'H2': 13, 'H3': 8, 'H4': 11, 'H5': 0}, 'S2': {'H1': 9, 'H2': 15, 'H3': 2, 'H4': 4, 'H5': 9}, 'S3': {'H1': 2, 'H2': 10, 'H3': 12, 'H4': 3, 'H5': 14}}) - for i in range(4): - self.assertListEqual(obs[i], exp[i]) + self.assertTableEqual(obs, exp) # many-to-many mapping, with normalization obs = collapse_table(table, mapping, divide=True) @@ -785,8 +778,7 @@ def test_collapse_table(self): 'H5': 0.0}, 'S2': {'H1': 5.0, 'H2': 7.5, 'H3': 1.0, 'H4': 4.0, 'H5': 4.5}, 'S3': {'H1': 1.0, 'H2': 4.5, 'H3': 5.5, 'H4': 1.0, 'H5': 7.0}}) - for i in range(4): - self.assertListEqual(obs[i], exp[i]) + self.assertTableEqual(obs, exp) # stratified features table = prep_table({ @@ -797,8 +789,7 @@ def test_collapse_table(self): exp = prep_table({ 'S1': {'1|K1': 4, '1|K2': 13}, 'S2': {'1|K1': 1, '1|K2': 8}}) - for i in range(4): - self.assertListEqual(obs[i], exp[i]) + self.assertTableEqual(obs, exp) mapping = {'K1': ['H1'], 'K2': ['H2', 'H3'], 'K3': ['H3']} obs = collapse_table(table, mapping, field=2, sep='|') exp = prep_table({ @@ -806,8 +797,7 @@ def test_collapse_table(self): 'C|H3': 3}, 'S2': {'A|H1': 1, 'A|H2': 8, 'A|H3': 8, 'B|H2': 0, 'B|H3': 0, 'C|H3': 4}}) - for i in range(4): - self.assertListEqual(obs[i], exp[i]) + self.assertTableEqual(obs, exp) # invalid or empty field table = prep_table({ @@ -815,8 +805,7 @@ def test_collapse_table(self): 'S2': {'G|1': 1, 'G2|': 7}}) mapping = {'G1': ['H1'], 'G2': ['H2']} obs = collapse_table(table, mapping, field=2, sep='|') - for i in range(2): - self.assertListEqual(obs[i], []) + self.assertTableEmpty(obs, ['S1', 'S2']) # nested features - 1st level table = prep_table({ @@ -827,8 +816,7 @@ def test_collapse_table(self): exp = prep_table({ 'S1': {'X|A_1': 3, 'X|A_2': 6, 'X|B_1': 7, 'Y|B_2': 0}, 'S2': {'X|A_2': 2, 'X|B_3': 2, 'Y|C_1': 4, 'Y|C_3': 2}}) - for i in range(4): - self.assertListEqual(obs[i], exp[i]) + self.assertTableEqual(obs, exp) # 2nd level mapping = {'A_1': ['a'], 'A_2': ['b'], @@ -838,8 +826,7 @@ def test_collapse_table(self): exp = prep_table({ 'S1': {'A|a': 3, 'A|b': 6, 'B|a': 7, 'B|b': 0}, 'S2': {'A|b': 2, 'C|a': 4}}) - for i in range(4): - self.assertListEqual(obs[i], exp[i]) + self.assertTableEqual(obs, exp) def test_calc_coverage(self): table = prep_table({ @@ -858,14 +845,12 @@ def test_calc_coverage(self): 'S1': {'P1': 100.0, 'P2': 100.0, 'P3': 33.333, 'P4': 100.0}, 'S2': {'P1': 100.0, 'P2': 0.0, 'P3': 100.0, 'P4': 50.0}, 'S3': {'P1': 50.0, 'P2': 100.0, 'P3': 100.0, 'P4': 50.0}}) - for i in range(4): - self.assertListEqual(obs[i], exp[i]) + self.assertTableEqual(obs, exp) # BIOM table table_ = Table(*map(np.array, table)) obs = calc_coverage(table_, mapping) - for i in range(2): - self.assertListEqual(obs[i], exp[i]) + self.assertTableEqual(obs, exp) # threshold and boolean result obs = calc_coverage(table, mapping, th=80) @@ -873,8 +858,7 @@ def test_calc_coverage(self): 'S1': {'P1': 1, 'P2': 1, 'P3': 0, 'P4': 1}, 'S2': {'P1': 1, 'P2': 0, 'P3': 1, 'P4': 0}, 'S3': {'P1': 0, 'P2': 1, 'P3': 1, 'P4': 0}}) - for i in range(2): - self.assertListEqual(obs[i], exp[i]) + self.assertTableEqual(obs, exp) # numbers instead of percentages obs = calc_coverage(table, mapping, count=True) @@ -882,13 +866,11 @@ def test_calc_coverage(self): 'S1': {'P1': 2, 'P2': 1, 'P3': 1, 'P4': 2}, 'S2': {'P1': 2, 'P2': 0, 'P3': 3, 'P4': 1}, 'S3': {'P1': 1, 'P2': 1, 'P3': 3, 'P4': 1}}) - for i in range(2): - self.assertListEqual(obs[i], exp[i]) + self.assertTableEqual(obs, exp) # number overrides threshold obs = calc_coverage(table, mapping, th=80, count=True) - for i in range(2): - self.assertListEqual(obs[i], exp[i]) + self.assertTableEqual(obs, exp) if __name__ == '__main__': From d94c881314e29c001bf52135157b687e802ad924 Mon Sep 17 00:00:00 2001 From: Qiyun Zhu Date: Fri, 23 Dec 2022 00:01:54 -0700 Subject: [PATCH 7/7] minor tweaks --- doc/collapse.md | 20 +++++++++----------- woltka/cli.py | 2 +- woltka/tools.py | 1 - 3 files changed, 10 insertions(+), 13 deletions(-) diff --git a/doc/collapse.md b/doc/collapse.md index 3987fa7..fc110e7 100644 --- a/doc/collapse.md +++ b/doc/collapse.md @@ -171,13 +171,11 @@ Feature ID | Sample 1 | Sample 2 | Sample 3 `Sente\|mRNASyn` | 9 | 0 | 3 `Cdiff\|CellDiv` | 1 | 6 | 0 -One can combine the two operations into one command: +One can combine the two operations: ```bash -cat species_gene.tsv |\ - woltka tools collapse -f 1 -m phylum.map |\ - woltka tools collapse -f 2 -m process.map |\ - > phylum_process.tsv +woltka tools collapse -i species_gene.tsv -f 1 -m phylum.map -o phylum_gene.tsv +woltka tools collapse -i phylum_gene.tsv -f 2 -m process.map -o phylum_process.tsv ``` The output profile `phylum_process.tsv` will be like: @@ -222,7 +220,7 @@ Feature ID | Sample 1 | Sample 2 | Sample 3 One can collapse them into 2-level EC numbers with: ```bash -woltka tools collapse -i ec4.tsv -e -s . -f 2 -o ec2.tsv +woltka tools collapse -i ec4.tsv -e -s "." -f 2 -o ec2.tsv ``` The output profile `ec2.tsv` is like: @@ -296,13 +294,13 @@ The resulting feature IDs are like: G000006785|J9GI19 ``` -One can combine the two analyses: +One can execute the `collapse` command multiple times to collapse the first and second fields separately to achieve desired taxonomic and functional resolution. Note that starting from the second command, features are no longer nested. ```bash -cat orf.biom |\ - woltka tools collapse -e -f 1 -m genus.map |\ - woltka tools collapse -f 2 -m uniref.map |\ - > genus_uniref.biom +woltka tools collapse -i orf.biom -e -f 2 -m uniref.map -o ogu_uniref.biom +woltka tools collapse -i ogu_uniref.biom -f 1 -m genus.map -o genus_uniref.biom +woltka tools collapse -i genus_uniref.biom -f 2 -m uniref2go.map -o genus_go.biom +... ``` Note that feature IDs in the original profile are nested. However, in the collapsed profile, they become stratified by a pipe (`|`) from the collapsed field to the end. This is because the collapsed field has broken the nestedness. diff --git a/woltka/cli.py b/woltka/cli.py index eb1a8be..ace3a1e 100644 --- a/woltka/cli.py +++ b/woltka/cli.py @@ -279,7 +279,7 @@ def merge_cmd(ctx, **kwargs): help=('Collapse x-th field of stratified features. For example, "A|a" ' 'has fields 1 ("A") and 2 ("a").')) @click.option( - '--nested', '-e', is_flag=False, flag_value='_', + '--nested', '-e', is_flag=True, help=('Fields are nested (each field is a child of the previous field). ' 'For example, "A_1" represents "1" of "A".')) @click.option( diff --git a/woltka/tools.py b/woltka/tools.py index 5169dc1..f845f36 100644 --- a/woltka/tools.py +++ b/woltka/tools.py @@ -205,7 +205,6 @@ def collapse_wf(input_fp: str, Raises ------ SystemExit - No mapping file or "-s" is specified. No mapping is found in mapping file. See Also