Source code for opentree.util

#!/usr/bin/env python3
"""Miscellaneous light-weight functions for common operations when working with Open Tree data"""
import logging
import sys

_TAXONOMY_WIKI_URL = "https://github.com/OpenTreeOfLife/reference-taxonomy/wiki"
_TAXON_FLAGS_WIKI_URL = "{}/Taxon-flags".format(_TAXONOMY_WIKI_URL)
_SUPPRESSED_TAXON_FLAGS_WIKI_URL = _TAXON_FLAGS_WIKI_URL + '#flags-leading-to-taxa-being-unavailable-for-tnrs'


[docs]def get_suppressed_taxon_flag_expl_url(): """Returns the current URL describing taxon flags that lead to suppression""" return _SUPPRESSED_TAXON_FLAGS_WIKI_URL
[docs]def ott_str_as_int(o): """Returns the OTT Id `o` as an integer if `o` is an integer or a string starting with ott (case-insensitive). Raises a ValueError if the string does not match ^(OTT)?[0-9]+$ """ if isinstance(o, int): return o if o.startswith('ott'): return int(o[3:]) try: return int(o) except: if o.lower().startswith('ott'): return int(o[3:]) raise
def _create_link_from_node_info_conf_key_value_pair(key, value): """Takes the key value pairs contained in the ToL/node_info call and returns a URL for the node""" if key.lower().startswith('ott'): value = ott_str_as_int(value) return "https://tree.opentreeoflife.org/taxonomy/browse?id={}".format(value) study_id, tree_id = key.split('@') node_id = str(value) if node_id.startswith('ott'): ##todo Check if link is possible logging.debug("node highlighting will not work for ({}, {}, {})\n".format(study_id, tree_id, node_id)) # # This node does not occur in the input tree, it is a result of exemplification... # # link to its parent node in the input study # inp_tree_nexson = OT.get_tree(study_id=study_id, tree_id=tree_id) # tax_lineage = OT.taxon_info(ott_id=ott_str_as_int(node_id), include_lineage=True) # anc_ids = [i.ott_id for i in tax_lineage.tree.postorder_node_iter()] # matches = [] # for leaf in inp_tree_nexson.tree.leaf_node_iter(): # if leaf.otu.ott_id and leaf.otu.ott_id in anc_ids: # matches.append((anc_ids.index, id(leaf), leaf)) # matches.sort() # if not matches: # logging.warning("Could not find input node for ({}, {}, {})\n".format(study_id, tree_id, node_id)) # else: # node_id = matches[0][-1].node_id # tmp = "https://tree.opentreeoflife.org/curator/study/view/{s}?tab=trees&tree={t}&node={n}" return tmp.format(s=study_id, t=tree_id, n=node_id) def _format_link_to_input_tree(link_dict): """Returns a list of lines with node links. `link_dict` that is from a ToL/node_info response's support fields""" lines = [] keys = list(link_dict.keys()) keys.sort() for key in keys: url = _create_link_from_node_info_conf_key_value_pair(key, link_dict[key]) if key.lower().startswith('ott'): line = "The Open Tree taxonomy ({}): {}".format(key, url) else: line = "input phylogeny at {}".format(url) lines.append(line) return lines