def iter_otus(nexson, nexson_version=None): """generator over all otus in all otus group elements. yields a tuple of 3 items: otus group ID, otu ID, the otu obj """ if nexson_version is None: nexson_version = detect_nexson_version(nexson) if not _is_by_id_hbf(nexson_version): convert_nexson_format( nexson, BY_ID_HONEY_BADGERFISH) # TODO shouldn't modify... nex = get_nexml_el(nexson) otus_group_by_id = nex['otusById'] group_order = nex.get('^ot:otusElementOrder', []) if len(group_order) < len(otus_group_by_id): group_order = list(otus_group_by_id.keys()) group_order.sort() for otus_group_id in group_order: otus_group = otus_group_by_id[otus_group_id] otu_by_id = otus_group['otuById'] ti_order = list(otu_by_id.keys()) for otu_id in ti_order: otu = otu_by_id[otu_id] yield otus_group_id, otu_id, otu
def iter_trees(nexson, nexson_version=None): '''generator over all trees in all trees elements. yields a tuple of 3 items: trees element ID, tree ID, the tree obj ''' if nexson_version is None: nexson_version = detect_nexson_version(nexson) nex = get_nexml_el(nexson) if _is_by_id_hbf(nexson_version): trees_group_by_id = nex['treesById'] group_order = nex.get('^ot:treesElementOrder', []) if len(group_order) < len(trees_group_by_id): group_order = list(trees_group_by_id.keys()) group_order.sort() for trees_group_id in group_order: trees_group = trees_group_by_id[trees_group_id] tree_by_id = trees_group['treeById'] ti_order = trees_group.get('^ot:treeElementOrder', []) if len(ti_order) < len(tree_by_id): ti_order = list(tree_by_id.keys()) ti_order.sort() for tree_id in ti_order: tree = tree_by_id[tree_id] yield trees_group_id, tree_id, tree else: for trees_group in nex.get('trees', []): trees_group_id = trees_group['@id'] for tree in trees_group.get('tree', []): tree_id = tree['@id'] yield trees_group_id, tree_id, tree
def count_num_trees(nexson, nexson_version=None): if nexson_version is None: nexson_version = detect_nexson_version(nexson) nex = get_nexml_el(nexson) num_trees_by_group = [] if _is_by_id_hbf(nexson_version): for tree_group in nex.get('treesById', {}).values(): nt = len(tree_group.get('treeById', {})) num_trees_by_group.append(nt) else: trees_group = nex.get('trees', []) if isinstance(trees_group, dict): trees_group = [trees_group] for tree_group in trees_group: t = tree_group.get('tree') if isinstance(t, list): nt = len(t) else: nt = 1 num_trees_by_group.append(nt) return sum(num_trees_by_group)
def gen_otu_dict(nex_obj, nexson_version=None): """Takes a NexSON object and returns a dict of otu_id -> otu_obj """ if nexson_version is None: nexson_version = detect_nexson_version(nex_obj) if _is_by_id_hbf(nexson_version): otus = nex_obj["nexml"]["otusById"] if len(otus) > 1: d = {} for v in otus.values(): d.update(v["otuById"]) return d else: return otus.values()[0]["otuById"] o_dict = {} for ob in nex_obj.get("otus", []): for o in ob.get("otu", []): oid = o["@id"] o_dict[oid] = o return o_dict
def gen_otu_dict(nex_obj, nexson_version=None): '''Takes a NexSON object and returns a dict of otu_id -> otu_obj ''' if nexson_version is None: nexson_version = detect_nexson_version(nex_obj) if _is_by_id_hbf(nexson_version): otus = nex_obj['nexml']['otusById'] if len(otus) > 1: d = {} for v in otus.values(): d.update(v['otuById']) return d else: return otus.value()[0]['otuById'] o_dict = {} for ob in nex_obj.get('otus', []): for o in ob.get('otu', []): oid = o['@id'] o_dict[oid] = o return o_dict
def count_num_trees(nexson, nexson_version=None): '''Returns the number of trees summed across all tree groups. ''' if nexson_version is None: nexson_version = detect_nexson_version(nexson) nex = get_nexml_el(nexson) num_trees_by_group = [] if _is_by_id_hbf(nexson_version): for tree_group in nex.get('treesById', {}).values(): nt = len(tree_group.get('treeById', {})) num_trees_by_group.append(nt) else: trees_group = nex.get('trees', []) if isinstance(trees_group, dict): trees_group = [trees_group] for tree_group in trees_group: t = tree_group.get('tree') if isinstance(t, list): nt = len(t) else: nt = 1 num_trees_by_group.append(nt) return sum(num_trees_by_group)
def iter_otus(nexson, nexson_version=None): '''generator over all otus in all otus group elements. yields a tuple of 3 items: otus group ID, otu ID, the otu obj ''' if nexson_version is None: nexson_version = detect_nexson_version(nexson) nex = get_nexml_el(nexson) if not _is_by_id_hbf(nexson_version): convert_nexson_format(nexson_blob, BY_ID_HONEY_BADGERFISH) #TODO shouldn't modify... otus_group_by_id = nex['otusById'] group_order = nex.get('^ot:otusElementOrder', []) if len(group_order) < len(otus_group_by_id): group_order = list(otus_group_by_id.keys()) group_order.sort() for otus_group_id in group_order: otus_group = otus_group_by_id[otus_group_id] otu_by_id = otus_group['otuById'] ti_order = list(otu_by_id.keys()) for otu_id in ti_order: otu = otu_by_id[otu_id] yield otus_group_id, otu_id, otu