pyobo 0.10.5__tar.gz → 0.10.6__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {pyobo-0.10.5/src/pyobo.egg-info → pyobo-0.10.6}/PKG-INFO +2 -2
- {pyobo-0.10.5 → pyobo-0.10.6}/docs/source/conf.py +1 -1
- {pyobo-0.10.5 → pyobo-0.10.6}/setup.cfg +2 -2
- {pyobo-0.10.5 → pyobo-0.10.6}/src/pyobo/__init__.py +1 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/src/pyobo/api/__init__.py +1 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/src/pyobo/api/names.py +21 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/src/pyobo/gilda_utils.py +54 -47
- {pyobo-0.10.5 → pyobo-0.10.6}/src/pyobo/sources/__init__.py +4 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/src/pyobo/sources/cgnc.py +2 -1
- {pyobo-0.10.5 → pyobo-0.10.6}/src/pyobo/sources/chembl.py +2 -1
- {pyobo-0.10.5 → pyobo-0.10.6}/src/pyobo/sources/depmap.py +2 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/src/pyobo/sources/drugcentral.py +2 -1
- pyobo-0.10.6/src/pyobo/sources/geonames.py +229 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/src/pyobo/sources/hgnc.py +32 -1
- {pyobo-0.10.5 → pyobo-0.10.6}/src/pyobo/sources/mgi.py +3 -1
- {pyobo-0.10.5 → pyobo-0.10.6}/src/pyobo/sources/mirbase.py +2 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/src/pyobo/sources/mirbase_family.py +5 -2
- {pyobo-0.10.5 → pyobo-0.10.6}/src/pyobo/sources/npass.py +1 -1
- {pyobo-0.10.5 → pyobo-0.10.6}/src/pyobo/sources/pombase.py +1 -1
- pyobo-0.10.6/src/pyobo/sources/ror.py +163 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/src/pyobo/sources/sgd.py +2 -5
- {pyobo-0.10.5 → pyobo-0.10.6}/src/pyobo/sources/slm.py +6 -6
- pyobo-0.10.6/src/pyobo/sources/umls/get_synonym_types.py +36 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/src/pyobo/sources/umls/synonym_types.tsv +243 -242
- {pyobo-0.10.5 → pyobo-0.10.6}/src/pyobo/sources/umls/umls.py +3 -7
- {pyobo-0.10.5 → pyobo-0.10.6}/src/pyobo/sources/zfin.py +2 -1
- {pyobo-0.10.5 → pyobo-0.10.6}/src/pyobo/struct/reference.py +12 -1
- {pyobo-0.10.5 → pyobo-0.10.6}/src/pyobo/struct/struct.py +71 -17
- {pyobo-0.10.5 → pyobo-0.10.6}/src/pyobo/struct/typedef.py +21 -6
- {pyobo-0.10.5 → pyobo-0.10.6}/src/pyobo/version.py +1 -1
- {pyobo-0.10.5 → pyobo-0.10.6/src/pyobo.egg-info}/PKG-INFO +2 -2
- {pyobo-0.10.5 → pyobo-0.10.6}/src/pyobo.egg-info/SOURCES.txt +3 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/src/pyobo.egg-info/requires.txt +1 -1
- {pyobo-0.10.5 → pyobo-0.10.6}/.readthedocs.yml +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/LICENSE +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/MANIFEST.in +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/README.rst +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/docs/source/api/pyobo.Canonicalizer.rst +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/docs/source/api/pyobo.Obo.rst +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/docs/source/api/pyobo.OboNormalizer.rst +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/docs/source/api/pyobo.Reference.rst +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/docs/source/api/pyobo.Synonym.rst +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/docs/source/api/pyobo.SynonymTypeDef.rst +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/docs/source/api/pyobo.Term.rst +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/docs/source/api/pyobo.TypeDef.rst +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/docs/source/api/pyobo.ensure_path.rst +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/docs/source/api/pyobo.from_obo_path.rst +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/docs/source/api/pyobo.from_obonet.rst +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/docs/source/api/pyobo.get_alts_to_id.rst +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/docs/source/api/pyobo.get_ancestors.rst +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/docs/source/api/pyobo.get_children.rst +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/docs/source/api/pyobo.get_definition.rst +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/docs/source/api/pyobo.get_descendants.rst +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/docs/source/api/pyobo.get_equivalent.rst +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/docs/source/api/pyobo.get_filtered_properties_df.rst +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/docs/source/api/pyobo.get_filtered_properties_mapping.rst +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/docs/source/api/pyobo.get_filtered_properties_multimapping.rst +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/docs/source/api/pyobo.get_filtered_relations_df.rst +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/docs/source/api/pyobo.get_filtered_xrefs.rst +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/docs/source/api/pyobo.get_graph.rst +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/docs/source/api/pyobo.get_hierarchy.rst +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/docs/source/api/pyobo.get_id_definition_mapping.rst +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/docs/source/api/pyobo.get_id_multirelations_mapping.rst +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/docs/source/api/pyobo.get_id_name_mapping.rst +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/docs/source/api/pyobo.get_id_species_mapping.rst +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/docs/source/api/pyobo.get_id_synonyms_mapping.rst +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/docs/source/api/pyobo.get_id_to_alts.rst +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/docs/source/api/pyobo.get_ids.rst +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/docs/source/api/pyobo.get_name.rst +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/docs/source/api/pyobo.get_name_by_curie.rst +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/docs/source/api/pyobo.get_name_id_mapping.rst +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/docs/source/api/pyobo.get_ontology.rst +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/docs/source/api/pyobo.get_primary_curie.rst +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/docs/source/api/pyobo.get_primary_identifier.rst +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/docs/source/api/pyobo.get_priority_curie.rst +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/docs/source/api/pyobo.get_properties.rst +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/docs/source/api/pyobo.get_properties_df.rst +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/docs/source/api/pyobo.get_property.rst +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/docs/source/api/pyobo.get_relation.rst +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/docs/source/api/pyobo.get_relation_mapping.rst +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/docs/source/api/pyobo.get_relations_df.rst +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/docs/source/api/pyobo.get_species.rst +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/docs/source/api/pyobo.get_sssom_df.rst +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/docs/source/api/pyobo.get_subhierarchy.rst +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/docs/source/api/pyobo.get_synonyms.rst +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/docs/source/api/pyobo.get_typedef_df.rst +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/docs/source/api/pyobo.get_version.rst +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/docs/source/api/pyobo.get_xref.rst +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/docs/source/api/pyobo.get_xrefs.rst +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/docs/source/api/pyobo.get_xrefs_df.rst +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/docs/source/api/pyobo.ground.rst +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/docs/source/api/pyobo.has_ancestor.rst +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/docs/source/api/pyobo.has_nomenclature_plugin.rst +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/docs/source/api/pyobo.has_xref_plugin.rst +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/docs/source/api/pyobo.is_descendent.rst +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/docs/source/api/pyobo.iter_nomenclature_plugins.rst +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/docs/source/api/pyobo.iter_xref_plugins.rst +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/docs/source/api/pyobo.normalize_curie.rst +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/docs/source/api/pyobo.parse_results_from_obo.rst +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/docs/source/api/pyobo.run_nomenclature_plugin.rst +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/docs/source/api/pyobo.run_xref_plugin.rst +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/docs/source/index.rst +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/docs/source/logo.png +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/pyproject.toml +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/src/pyobo/__main__.py +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/src/pyobo/api/alts.py +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/src/pyobo/api/hierarchy.py +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/src/pyobo/api/metadata.py +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/src/pyobo/api/properties.py +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/src/pyobo/api/relations.py +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/src/pyobo/api/species.py +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/src/pyobo/api/typedefs.py +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/src/pyobo/api/utils.py +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/src/pyobo/api/xrefs.py +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/src/pyobo/apps/__init__.py +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/src/pyobo/apps/cli.py +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/src/pyobo/apps/gilda/__init__.py +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/src/pyobo/apps/gilda/__main__.py +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/src/pyobo/apps/gilda/app.py +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/src/pyobo/apps/gilda/cli.py +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/src/pyobo/apps/gilda/templates/base.html +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/src/pyobo/apps/gilda/templates/home.html +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/src/pyobo/apps/gilda/templates/matches.html +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/src/pyobo/apps/mapper/__init__.py +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/src/pyobo/apps/mapper/__main__.py +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/src/pyobo/apps/mapper/cli.py +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/src/pyobo/apps/mapper/mapper.py +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/src/pyobo/apps/mapper/templates/base.html +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/src/pyobo/apps/mapper/templates/mapper_home.html +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/src/pyobo/aws.py +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/src/pyobo/cli/__init__.py +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/src/pyobo/cli/aws.py +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/src/pyobo/cli/cli.py +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/src/pyobo/cli/database.py +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/src/pyobo/cli/lookup.py +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/src/pyobo/cli/utils.py +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/src/pyobo/constants.py +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/src/pyobo/getters.py +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/src/pyobo/identifier_utils.py +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/src/pyobo/mocks.py +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/src/pyobo/normalizer.py +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/src/pyobo/obographs.py +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/src/pyobo/plugins.py +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/src/pyobo/reader.py +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/src/pyobo/registries/__init__.py +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/src/pyobo/registries/metaregistry.json +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/src/pyobo/registries/metaregistry.py +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/src/pyobo/resource_utils.py +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/src/pyobo/resources/__init__.py +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/src/pyobo/resources/ncbitaxon.py +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/src/pyobo/resources/ncbitaxon.tsv.gz +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/src/pyobo/resources/ro.py +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/src/pyobo/resources/ro.tsv +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/src/pyobo/sources/agrovoc.py +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/src/pyobo/sources/antibodyregistry.py +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/src/pyobo/sources/biogrid.py +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/src/pyobo/sources/ccle.py +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/src/pyobo/sources/chebi.py +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/src/pyobo/sources/complexportal.py +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/src/pyobo/sources/conso.py +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/src/pyobo/sources/cpt.py +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/src/pyobo/sources/cvx.py +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/src/pyobo/sources/dictybase_gene.py +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/src/pyobo/sources/drugbank.py +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/src/pyobo/sources/drugbank_salt.py +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/src/pyobo/sources/expasy.py +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/src/pyobo/sources/famplex.py +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/src/pyobo/sources/flybase.py +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/src/pyobo/sources/gmt_utils.py +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/src/pyobo/sources/go.py +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/src/pyobo/sources/gwascentral_phenotype.py +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/src/pyobo/sources/gwascentral_study.py +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/src/pyobo/sources/hgncgenefamily.py +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/src/pyobo/sources/icd10.py +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/src/pyobo/sources/icd11.py +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/src/pyobo/sources/icd_utils.py +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/src/pyobo/sources/interpro.py +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/src/pyobo/sources/itis.py +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/src/pyobo/sources/kegg/__init__.py +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/src/pyobo/sources/kegg/api.py +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/src/pyobo/sources/kegg/genes.py +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/src/pyobo/sources/kegg/genome.py +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/src/pyobo/sources/kegg/pathway.py +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/src/pyobo/sources/mesh.py +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/src/pyobo/sources/mirbase_constants.py +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/src/pyobo/sources/mirbase_mature.py +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/src/pyobo/sources/msigdb.py +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/src/pyobo/sources/ncbigene.py +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/src/pyobo/sources/pathbank.py +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/src/pyobo/sources/pfam.py +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/src/pyobo/sources/pfam_clan.py +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/src/pyobo/sources/pid.py +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/src/pyobo/sources/pubchem.py +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/src/pyobo/sources/reactome.py +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/src/pyobo/sources/rgd.py +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/src/pyobo/sources/rhea.py +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/src/pyobo/sources/selventa/__init__.py +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/src/pyobo/sources/selventa/schem.py +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/src/pyobo/sources/selventa/scomp.py +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/src/pyobo/sources/selventa/sdis.py +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/src/pyobo/sources/selventa/sfam.py +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/src/pyobo/sources/umls/__init__.py +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/src/pyobo/sources/umls/__main__.py +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/src/pyobo/sources/uniprot/__init__.py +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/src/pyobo/sources/uniprot/uniprot.py +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/src/pyobo/sources/uniprot/uniprot_ptm.py +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/src/pyobo/sources/utils.py +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/src/pyobo/sources/wikipathways.py +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/src/pyobo/ssg/__init__.py +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/src/pyobo/ssg/base.html +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/src/pyobo/ssg/index.html +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/src/pyobo/ssg/term.html +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/src/pyobo/ssg/typedef.html +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/src/pyobo/struct/__init__.py +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/src/pyobo/struct/utils.py +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/src/pyobo/utils/__init__.py +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/src/pyobo/utils/cache.py +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/src/pyobo/utils/io.py +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/src/pyobo/utils/iter.py +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/src/pyobo/utils/misc.py +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/src/pyobo/utils/ndex_utils.py +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/src/pyobo/utils/path.py +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/src/pyobo/xrefdb/__init__.py +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/src/pyobo/xrefdb/canonicalizer.py +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/src/pyobo/xrefdb/priority.py +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/src/pyobo/xrefdb/sources/__init__.py +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/src/pyobo/xrefdb/sources/biomappings.py +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/src/pyobo/xrefdb/sources/cbms2019.py +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/src/pyobo/xrefdb/sources/chembl.py +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/src/pyobo/xrefdb/sources/compath.py +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/src/pyobo/xrefdb/sources/famplex.py +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/src/pyobo/xrefdb/sources/gilda.py +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/src/pyobo/xrefdb/sources/intact.py +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/src/pyobo/xrefdb/sources/ncit.py +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/src/pyobo/xrefdb/sources/pubchem.py +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/src/pyobo/xrefdb/sources/wikidata.py +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/src/pyobo/xrefdb/xrefs_pipeline.py +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/src/pyobo.egg-info/dependency_links.txt +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/src/pyobo.egg-info/entry_points.txt +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/src/pyobo.egg-info/not-zip-safe +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/src/pyobo.egg-info/top_level.txt +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/tests/__init__.py +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/tests/constants.py +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/tests/resources/citations.txt +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/tests/resources/test_chebi.obo +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/tests/resources/test_msigdb.gmt +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/tests/resources/test_wikipathways.gmt +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/tests/test_alt_ids.py +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/tests/test_caches.py +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/tests/test_extract.py +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/tests/test_get.py +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/tests/test_get_miriam_url.py +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/tests/test_gmt.py +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/tests/test_ground.py +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/tests/test_mapper.py +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/tests/test_sources/__init__.py +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/tests/test_sources/test_famplex.py +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/tests/test_struct.py +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/tests/test_utils.py +0 -0
- {pyobo-0.10.5 → pyobo-0.10.6}/tox.ini +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: pyobo
|
|
3
|
-
Version: 0.10.
|
|
3
|
+
Version: 0.10.6
|
|
4
4
|
Summary: Handling and writing OBO
|
|
5
5
|
Home-page: https://github.com/pyobo/pyobo
|
|
6
6
|
Download-URL: https://github.com/pyobo/pyobo/releases
|
|
@@ -49,7 +49,7 @@ Requires-Dist: class_resolver
|
|
|
49
49
|
Requires-Dist: psycopg2-binary
|
|
50
50
|
Requires-Dist: drugbank_downloader
|
|
51
51
|
Requires-Dist: chembl_downloader
|
|
52
|
-
Requires-Dist: umls_downloader
|
|
52
|
+
Requires-Dist: umls_downloader>=0.1.2
|
|
53
53
|
Requires-Dist: typing_extensions
|
|
54
54
|
Provides-Extra: tests
|
|
55
55
|
Requires-Dist: coverage; extra == "tests"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[metadata]
|
|
2
2
|
name = pyobo
|
|
3
|
-
version = 0.10.
|
|
3
|
+
version = 0.10.6
|
|
4
4
|
description = Handling and writing OBO
|
|
5
5
|
long_description = file: README.rst
|
|
6
6
|
url = https://github.com/pyobo/pyobo
|
|
@@ -56,7 +56,7 @@ install_requires =
|
|
|
56
56
|
psycopg2-binary
|
|
57
57
|
drugbank_downloader
|
|
58
58
|
chembl_downloader
|
|
59
|
-
umls_downloader
|
|
59
|
+
umls_downloader>=0.1.2
|
|
60
60
|
typing_extensions
|
|
61
61
|
zip_safe = false
|
|
62
62
|
include_package_data = True
|
|
@@ -24,6 +24,7 @@ __all__ = [
|
|
|
24
24
|
"get_id_definition_mapping",
|
|
25
25
|
"get_synonyms",
|
|
26
26
|
"get_id_synonyms_mapping",
|
|
27
|
+
"get_obsolete",
|
|
27
28
|
]
|
|
28
29
|
|
|
29
30
|
logger = logging.getLogger(__name__)
|
|
@@ -184,6 +185,26 @@ def get_id_definition_mapping(
|
|
|
184
185
|
return _get_mapping()
|
|
185
186
|
|
|
186
187
|
|
|
188
|
+
def get_obsolete(
|
|
189
|
+
prefix: str,
|
|
190
|
+
*,
|
|
191
|
+
force: bool = False,
|
|
192
|
+
strict: bool = False,
|
|
193
|
+
version: Optional[str] = None,
|
|
194
|
+
) -> Set[str]:
|
|
195
|
+
"""Get the set of obsolete local unique identifiers."""
|
|
196
|
+
if version is None:
|
|
197
|
+
version = get_version(prefix)
|
|
198
|
+
path = prefix_cache_join(prefix, name="obsolete.tsv", version=version)
|
|
199
|
+
|
|
200
|
+
@cached_collection(path=path, force=force)
|
|
201
|
+
def _get_obsolete() -> Set[str]:
|
|
202
|
+
ontology = get_ontology(prefix, force=force, strict=strict, version=version)
|
|
203
|
+
return ontology.get_obsolete()
|
|
204
|
+
|
|
205
|
+
return set(_get_obsolete())
|
|
206
|
+
|
|
207
|
+
|
|
187
208
|
@wrap_norm_prefix
|
|
188
209
|
def get_synonyms(prefix: str, identifier: str) -> Optional[List[str]]:
|
|
189
210
|
"""Get the synonyms for an entity."""
|
|
@@ -2,7 +2,6 @@
|
|
|
2
2
|
|
|
3
3
|
"""PyOBO's Gilda utilities."""
|
|
4
4
|
|
|
5
|
-
import itertools as itt
|
|
6
5
|
import logging
|
|
7
6
|
from typing import Iterable, List, Optional, Tuple, Type, Union
|
|
8
7
|
|
|
@@ -11,6 +10,7 @@ import gilda.api
|
|
|
11
10
|
import gilda.term
|
|
12
11
|
from gilda.grounder import Grounder
|
|
13
12
|
from gilda.process import normalize
|
|
13
|
+
from gilda.term import filter_out_duplicates
|
|
14
14
|
from tqdm.auto import tqdm
|
|
15
15
|
|
|
16
16
|
from pyobo import (
|
|
@@ -18,6 +18,7 @@ from pyobo import (
|
|
|
18
18
|
get_id_species_mapping,
|
|
19
19
|
get_id_synonyms_mapping,
|
|
20
20
|
get_ids,
|
|
21
|
+
get_obsolete,
|
|
21
22
|
)
|
|
22
23
|
from pyobo.getters import NoBuild
|
|
23
24
|
from pyobo.utils.io import multidict
|
|
@@ -31,32 +32,6 @@ __all__ = [
|
|
|
31
32
|
logger = logging.getLogger(__name__)
|
|
32
33
|
|
|
33
34
|
|
|
34
|
-
_STATUSES = {"curated": 1, "name": 2, "synonym": 3, "former_name": 4}
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
def filter_out_duplicates(terms: List[gilda.term.Term]) -> List[gilda.term.Term]:
|
|
38
|
-
"""Filter out duplicates."""
|
|
39
|
-
# TODO import from gilda.term import filter_out_duplicates when it gets moved,
|
|
40
|
-
# see https://github.com/indralab/gilda/pull/103
|
|
41
|
-
logger.debug("filtering %d terms for uniqueness", len(terms))
|
|
42
|
-
new_terms: List[gilda.term.Term] = [
|
|
43
|
-
min(terms_group, key=_status_key)
|
|
44
|
-
for _, terms_group in itt.groupby(sorted(terms, key=_term_key), key=_term_key)
|
|
45
|
-
]
|
|
46
|
-
# Re-sort the terms
|
|
47
|
-
new_terms = sorted(new_terms, key=lambda x: (x.text, x.db, x.id))
|
|
48
|
-
logger.debug("got %d unique terms.", len(new_terms))
|
|
49
|
-
return new_terms
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
def _status_key(term: gilda.term.Term) -> int:
|
|
53
|
-
return _STATUSES[term.status]
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
def _term_key(term: gilda.term.Term) -> Tuple[str, str, str]:
|
|
57
|
-
return term.db, term.id, term.text
|
|
58
|
-
|
|
59
|
-
|
|
60
35
|
def iter_gilda_prediction_tuples(
|
|
61
36
|
prefix: str,
|
|
62
37
|
relation: str = "skos:exactMatch",
|
|
@@ -115,10 +90,12 @@ def normalize_identifier(prefix: str, identifier: str) -> str:
|
|
|
115
90
|
|
|
116
91
|
def get_grounder(
|
|
117
92
|
prefixes: Union[str, Iterable[str]],
|
|
93
|
+
*,
|
|
118
94
|
unnamed: Optional[Iterable[str]] = None,
|
|
119
95
|
grounder_cls: Optional[Type[Grounder]] = None,
|
|
120
96
|
versions: Union[None, str, Iterable[Union[str, None]]] = None,
|
|
121
97
|
strict: bool = True,
|
|
98
|
+
skip_obsolete: bool = False,
|
|
122
99
|
) -> Grounder:
|
|
123
100
|
"""Get a Gilda grounder for the given prefix(es)."""
|
|
124
101
|
unnamed = set() if unnamed is None else set(unnamed)
|
|
@@ -140,7 +117,11 @@ def get_grounder(
|
|
|
140
117
|
try:
|
|
141
118
|
p_terms = list(
|
|
142
119
|
get_gilda_terms(
|
|
143
|
-
prefix,
|
|
120
|
+
prefix,
|
|
121
|
+
identifiers_are_names=prefix in unnamed,
|
|
122
|
+
version=version,
|
|
123
|
+
strict=strict,
|
|
124
|
+
skip_obsolete=skip_obsolete,
|
|
144
125
|
)
|
|
145
126
|
)
|
|
146
127
|
except NoBuild:
|
|
@@ -155,26 +136,50 @@ def get_grounder(
|
|
|
155
136
|
return grounder_cls(terms_dict)
|
|
156
137
|
|
|
157
138
|
|
|
139
|
+
def _fast_term(
|
|
140
|
+
*,
|
|
141
|
+
text: str,
|
|
142
|
+
prefix: str,
|
|
143
|
+
identifier: str,
|
|
144
|
+
name: str,
|
|
145
|
+
status: str,
|
|
146
|
+
organism: Optional[str] = None,
|
|
147
|
+
) -> gilda.term.Term:
|
|
148
|
+
return gilda.term.Term(
|
|
149
|
+
norm_text=normalize(text),
|
|
150
|
+
text=text,
|
|
151
|
+
db=prefix,
|
|
152
|
+
id=identifier,
|
|
153
|
+
entry_name=name,
|
|
154
|
+
status=status,
|
|
155
|
+
source=prefix,
|
|
156
|
+
organism=organism,
|
|
157
|
+
)
|
|
158
|
+
|
|
159
|
+
|
|
158
160
|
def get_gilda_terms(
|
|
159
161
|
prefix: str,
|
|
162
|
+
*,
|
|
160
163
|
identifiers_are_names: bool = False,
|
|
161
164
|
version: Optional[str] = None,
|
|
162
165
|
strict: bool = True,
|
|
166
|
+
skip_obsolete: bool = False,
|
|
163
167
|
) -> Iterable[gilda.term.Term]:
|
|
164
168
|
"""Get gilda terms for the given namespace."""
|
|
165
169
|
id_to_name = get_id_name_mapping(prefix, version=version, strict=strict)
|
|
166
170
|
id_to_species = get_id_species_mapping(prefix, version=version, strict=strict)
|
|
171
|
+
obsoletes = get_obsolete(prefix, version=version, strict=strict) if skip_obsolete else set()
|
|
167
172
|
|
|
168
173
|
it = tqdm(id_to_name.items(), desc=f"[{prefix}] mapping", unit_scale=True, unit="name")
|
|
169
174
|
for identifier, name in it:
|
|
170
|
-
|
|
171
|
-
|
|
175
|
+
if identifier in obsoletes:
|
|
176
|
+
continue
|
|
177
|
+
yield _fast_term(
|
|
172
178
|
text=name,
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
179
|
+
prefix=prefix,
|
|
180
|
+
identifier=identifier,
|
|
181
|
+
name=name,
|
|
176
182
|
status="name",
|
|
177
|
-
source=prefix,
|
|
178
183
|
organism=id_to_species.get(identifier),
|
|
179
184
|
)
|
|
180
185
|
|
|
@@ -184,29 +189,31 @@ def get_gilda_terms(
|
|
|
184
189
|
id_to_synonyms.items(), desc=f"[{prefix}] mapping", unit_scale=True, unit="synonym"
|
|
185
190
|
)
|
|
186
191
|
for identifier, synonyms in it:
|
|
192
|
+
if identifier in obsoletes:
|
|
193
|
+
continue
|
|
187
194
|
name = id_to_name[identifier]
|
|
188
195
|
for synonym in synonyms:
|
|
189
|
-
|
|
190
|
-
|
|
196
|
+
if not synonym:
|
|
197
|
+
continue
|
|
198
|
+
yield _fast_term(
|
|
191
199
|
text=synonym,
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
200
|
+
prefix=prefix,
|
|
201
|
+
identifier=identifier,
|
|
202
|
+
name=name,
|
|
195
203
|
status="synonym",
|
|
196
|
-
source=prefix,
|
|
197
204
|
organism=id_to_species.get(identifier),
|
|
198
205
|
)
|
|
199
206
|
|
|
200
207
|
if identifiers_are_names:
|
|
201
208
|
it = tqdm(get_ids(prefix), desc=f"[{prefix}] mapping", unit_scale=True, unit="id")
|
|
202
209
|
for identifier in it:
|
|
203
|
-
|
|
204
|
-
|
|
210
|
+
if identifier in obsoletes:
|
|
211
|
+
continue
|
|
212
|
+
yield _fast_term(
|
|
205
213
|
text=identifier,
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
status="
|
|
210
|
-
source=prefix,
|
|
214
|
+
prefix=prefix,
|
|
215
|
+
identifier=identifier,
|
|
216
|
+
name=identifier,
|
|
217
|
+
status="name",
|
|
211
218
|
organism=id_to_species.get(identifier),
|
|
212
219
|
)
|
|
@@ -20,6 +20,7 @@ from .drugcentral import DrugCentralGetter
|
|
|
20
20
|
from .expasy import ExpasyGetter
|
|
21
21
|
from .famplex import FamPlexGetter
|
|
22
22
|
from .flybase import FlyBaseGetter
|
|
23
|
+
from .geonames import GeonamesGetter
|
|
23
24
|
from .gwascentral_phenotype import GWASCentralPhenotypeGetter
|
|
24
25
|
from .gwascentral_study import GWASCentralStudyGetter
|
|
25
26
|
from .hgnc import HGNCGetter
|
|
@@ -46,6 +47,7 @@ from .pubchem import PubChemCompoundGetter
|
|
|
46
47
|
from .reactome import ReactomeGetter
|
|
47
48
|
from .rgd import RGDGetter
|
|
48
49
|
from .rhea import RheaGetter
|
|
50
|
+
from .ror import RORGetter
|
|
49
51
|
from .selventa import SCHEMGetter, SCOMPGetter, SDISGetter, SFAMGetter
|
|
50
52
|
from .sgd import SGDGetter
|
|
51
53
|
from .slm import SLMGetter
|
|
@@ -74,6 +76,7 @@ __all__ = [
|
|
|
74
76
|
"FlyBaseGetter",
|
|
75
77
|
"GWASCentralPhenotypeGetter",
|
|
76
78
|
"GWASCentralStudyGetter",
|
|
79
|
+
"GeonamesGetter",
|
|
77
80
|
"HGNCGetter",
|
|
78
81
|
"HGNCGroupGetter",
|
|
79
82
|
"ICD10Getter",
|
|
@@ -98,6 +101,7 @@ __all__ = [
|
|
|
98
101
|
"PomBaseGetter",
|
|
99
102
|
"PubChemCompoundGetter",
|
|
100
103
|
"RGDGetter",
|
|
104
|
+
"RORGetter",
|
|
101
105
|
"ReactomeGetter",
|
|
102
106
|
"RheaGetter",
|
|
103
107
|
"SCHEMGetter",
|
|
@@ -8,6 +8,7 @@ from typing import Iterable
|
|
|
8
8
|
import pandas as pd
|
|
9
9
|
|
|
10
10
|
from pyobo.struct import Obo, Reference, Term, from_species
|
|
11
|
+
from pyobo.struct.typedef import exact_match
|
|
11
12
|
from pyobo.utils.path import ensure_df
|
|
12
13
|
|
|
13
14
|
__all__ = [
|
|
@@ -25,7 +26,7 @@ class CGNCGetter(Obo):
|
|
|
25
26
|
|
|
26
27
|
ontology = PREFIX
|
|
27
28
|
dynamic_version = True
|
|
28
|
-
typedefs = [from_species]
|
|
29
|
+
typedefs = [from_species, exact_match]
|
|
29
30
|
|
|
30
31
|
def iter_terms(self, force: bool = False) -> Iterable[Term]:
|
|
31
32
|
"""Iterate over terms in the ontology."""
|
|
@@ -12,7 +12,7 @@ from typing import Iterable
|
|
|
12
12
|
import chembl_downloader
|
|
13
13
|
|
|
14
14
|
from pyobo.struct import Obo, Reference, Term
|
|
15
|
-
from pyobo.struct.typedef import has_inchi, has_smiles
|
|
15
|
+
from pyobo.struct.typedef import exact_match, has_inchi, has_smiles
|
|
16
16
|
|
|
17
17
|
__all__ = [
|
|
18
18
|
"ChEMBLCompoundGetter",
|
|
@@ -45,6 +45,7 @@ class ChEMBLCompoundGetter(Obo):
|
|
|
45
45
|
|
|
46
46
|
ontology = "chembl.compound"
|
|
47
47
|
bioversions_key = "chembl"
|
|
48
|
+
typedefs = [exact_match]
|
|
48
49
|
|
|
49
50
|
def iter_terms(self, force: bool = False) -> Iterable[Term]:
|
|
50
51
|
"""Iterate over terms in the ontology."""
|
|
@@ -8,6 +8,7 @@ import pandas as pd
|
|
|
8
8
|
import pystow
|
|
9
9
|
|
|
10
10
|
from pyobo import Obo, Reference, Term
|
|
11
|
+
from pyobo.struct.typedef import exact_match
|
|
11
12
|
|
|
12
13
|
__all__ = [
|
|
13
14
|
"get_obo",
|
|
@@ -23,6 +24,7 @@ class DepMapGetter(Obo):
|
|
|
23
24
|
|
|
24
25
|
ontology = bioversions_key = PREFIX
|
|
25
26
|
data_version = VERSION
|
|
27
|
+
typedefs = [exact_match]
|
|
26
28
|
|
|
27
29
|
def iter_terms(self, force: bool = False) -> Iterable[Term]:
|
|
28
30
|
"""Iterate over terms in the ontology."""
|
|
@@ -12,7 +12,7 @@ import psycopg2
|
|
|
12
12
|
from tqdm.auto import tqdm
|
|
13
13
|
|
|
14
14
|
from pyobo.struct import Obo, Reference, Synonym, Term
|
|
15
|
-
from pyobo.struct.typedef import has_inchi, has_smiles
|
|
15
|
+
from pyobo.struct.typedef import exact_match, has_inchi, has_smiles
|
|
16
16
|
|
|
17
17
|
__all__ = [
|
|
18
18
|
"DrugCentralGetter",
|
|
@@ -34,6 +34,7 @@ class DrugCentralGetter(Obo):
|
|
|
34
34
|
"""An ontology representation of the DrugCentral database."""
|
|
35
35
|
|
|
36
36
|
ontology = bioversions_key = PREFIX
|
|
37
|
+
typedefs = [exact_match]
|
|
37
38
|
|
|
38
39
|
def iter_terms(self, force: bool = False) -> Iterable[Term]:
|
|
39
40
|
"""Iterate over terms in the ontology."""
|
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
"""Get terms from geonames."""
|
|
2
|
+
|
|
3
|
+
import logging
|
|
4
|
+
from typing import Collection, Iterable, Mapping
|
|
5
|
+
|
|
6
|
+
import pandas as pd
|
|
7
|
+
from pystow.utils import read_zipfile_csv
|
|
8
|
+
from tqdm import tqdm
|
|
9
|
+
|
|
10
|
+
from pyobo import Obo, Term
|
|
11
|
+
from pyobo.struct import Reference, part_of
|
|
12
|
+
from pyobo.utils.path import ensure_df, ensure_path
|
|
13
|
+
|
|
14
|
+
__all__ = ["GeonamesGetter"]
|
|
15
|
+
|
|
16
|
+
logger = logging.getLogger(__name__)
|
|
17
|
+
|
|
18
|
+
PREFIX = "geonames"
|
|
19
|
+
COUNTRIES_URL = "https://download.geonames.org/export/dump/countryInfo.txt"
|
|
20
|
+
ADMIN1_URL = "https://download.geonames.org/export/dump/admin1CodesASCII.txt"
|
|
21
|
+
ADMIN2_URL = "https://download.geonames.org/export/dump/admin2Codes.txt"
|
|
22
|
+
CITIES_URL = "https://download.geonames.org/export/dump/cities15000.zip"
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
class GeonamesGetter(Obo):
|
|
26
|
+
"""An ontology representation of GeoNames."""
|
|
27
|
+
|
|
28
|
+
ontology = PREFIX
|
|
29
|
+
dynamic_version = True
|
|
30
|
+
typedefs = [part_of]
|
|
31
|
+
|
|
32
|
+
def iter_terms(self, force: bool = False) -> Iterable[Term]:
|
|
33
|
+
"""Iterate over terms in the ontology."""
|
|
34
|
+
return get_terms(force=force)
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
def get_terms(*, force: bool = False) -> Collection[Term]:
|
|
38
|
+
"""Get terms."""
|
|
39
|
+
code_to_country = get_code_to_country(force=force)
|
|
40
|
+
code_to_admin1 = get_code_to_admin1(code_to_country, force=force)
|
|
41
|
+
code_to_admin2 = get_code_to_admin2(code_to_admin1, force=force)
|
|
42
|
+
id_to_term = get_cities(
|
|
43
|
+
code_to_country=code_to_country,
|
|
44
|
+
code_to_admin1=code_to_admin1,
|
|
45
|
+
code_to_admin2=code_to_admin2,
|
|
46
|
+
force=force,
|
|
47
|
+
)
|
|
48
|
+
return id_to_term.values()
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
def get_code_to_country(*, force: bool = False) -> Mapping[str, Term]:
|
|
52
|
+
"""Get a mapping from country code to country term."""
|
|
53
|
+
countries_df = ensure_df(
|
|
54
|
+
PREFIX,
|
|
55
|
+
url=COUNTRIES_URL,
|
|
56
|
+
force=force,
|
|
57
|
+
skiprows=49,
|
|
58
|
+
keep_default_na=False, # NA is a country code
|
|
59
|
+
dtype=str,
|
|
60
|
+
)
|
|
61
|
+
logger.info(f"got {len(countries_df.index):,} countries")
|
|
62
|
+
reorder = ["geonameid", *(c for c in countries_df.columns if c != "geonameid")]
|
|
63
|
+
countries_df = countries_df[reorder]
|
|
64
|
+
code_to_country = {}
|
|
65
|
+
cols = ["geonameid", "Country", "#ISO", "fips", "ISO3"]
|
|
66
|
+
for identifier, name, code, fips, iso3 in countries_df[cols].values:
|
|
67
|
+
if pd.isna(code):
|
|
68
|
+
continue
|
|
69
|
+
term = Term.from_triple(
|
|
70
|
+
"geonames", identifier, name if pd.notna(name) else None, type="Instance"
|
|
71
|
+
)
|
|
72
|
+
term.append_synonym(code)
|
|
73
|
+
if name.startswith("The "):
|
|
74
|
+
term.append_synonym(name.removeprefix("The "))
|
|
75
|
+
if pd.notna(fips):
|
|
76
|
+
term.append_synonym(fips)
|
|
77
|
+
if pd.notna(iso3):
|
|
78
|
+
term.append_synonym(iso3)
|
|
79
|
+
term.append_property("code", code)
|
|
80
|
+
code_to_country[code] = term
|
|
81
|
+
logger.info(f"got {len(code_to_country):,} country records")
|
|
82
|
+
return code_to_country
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
def get_code_to_admin1(
|
|
86
|
+
code_to_country: Mapping[str, Term], *, force: bool = False
|
|
87
|
+
) -> Mapping[str, Term]:
|
|
88
|
+
"""Get a mapping from admin1 code to term."""
|
|
89
|
+
admin1_df = ensure_df(
|
|
90
|
+
PREFIX,
|
|
91
|
+
url=ADMIN1_URL,
|
|
92
|
+
header=None,
|
|
93
|
+
names=["code", "name", "asciiname", "geonames_id"],
|
|
94
|
+
dtype=str,
|
|
95
|
+
force=force,
|
|
96
|
+
)
|
|
97
|
+
code_to_admin1 = {}
|
|
98
|
+
for code, name, asciiname, identifier in admin1_df.values:
|
|
99
|
+
if pd.isna(identifier) or pd.isna(code):
|
|
100
|
+
tqdm.write(f"Missing info for {name} / {asciiname} / {code=} / {identifier=}")
|
|
101
|
+
continue
|
|
102
|
+
|
|
103
|
+
term = Term.from_triple(
|
|
104
|
+
"geonames", identifier, name if pd.notna(name) else None, type="Instance"
|
|
105
|
+
)
|
|
106
|
+
term.append_property("code", code)
|
|
107
|
+
code_to_admin1[code] = term
|
|
108
|
+
|
|
109
|
+
country_code = code.split(".")[0]
|
|
110
|
+
country_term = code_to_country[country_code]
|
|
111
|
+
term.append_relationship(part_of, country_term)
|
|
112
|
+
return code_to_admin1
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
def get_code_to_admin2(
|
|
116
|
+
code_to_admin1: Mapping[str, Term], *, force: bool = False
|
|
117
|
+
) -> Mapping[str, Term]:
|
|
118
|
+
"""Get a mapping from admin2 code to term."""
|
|
119
|
+
admin2_df = ensure_df(
|
|
120
|
+
PREFIX,
|
|
121
|
+
url=ADMIN2_URL,
|
|
122
|
+
header=None,
|
|
123
|
+
names=["code", "name", "asciiname", "geonames_id"],
|
|
124
|
+
dtype=str,
|
|
125
|
+
force=force,
|
|
126
|
+
)
|
|
127
|
+
code_to_admin2 = {}
|
|
128
|
+
for identifier, name, code in admin2_df[["geonames_id", "name", "code"]].values:
|
|
129
|
+
if pd.isna(identifier) or pd.isna(code):
|
|
130
|
+
continue
|
|
131
|
+
term = Term.from_triple(
|
|
132
|
+
"geonames", identifier, name if pd.notna(name) else None, type="Instance"
|
|
133
|
+
)
|
|
134
|
+
term.append_property("code", code)
|
|
135
|
+
code_to_admin2[code] = term
|
|
136
|
+
admin1_code = code.rsplit(".", 1)[0]
|
|
137
|
+
admin1_term = code_to_admin1[admin1_code]
|
|
138
|
+
term.append_relationship(part_of, admin1_term)
|
|
139
|
+
return code_to_admin2
|
|
140
|
+
|
|
141
|
+
|
|
142
|
+
def get_cities(
|
|
143
|
+
code_to_country,
|
|
144
|
+
code_to_admin1,
|
|
145
|
+
code_to_admin2,
|
|
146
|
+
*,
|
|
147
|
+
minimum_population: int = 100_000,
|
|
148
|
+
force: bool = False,
|
|
149
|
+
) -> Mapping[str, Term]:
|
|
150
|
+
"""Get a mapping from city code to term."""
|
|
151
|
+
columns = [
|
|
152
|
+
"geonames_id",
|
|
153
|
+
"name",
|
|
154
|
+
"asciiname",
|
|
155
|
+
"synonyms",
|
|
156
|
+
"latitude",
|
|
157
|
+
"longitude",
|
|
158
|
+
"feature_class",
|
|
159
|
+
"feature_code",
|
|
160
|
+
"country_code",
|
|
161
|
+
"cc2",
|
|
162
|
+
"admin1",
|
|
163
|
+
"admin2",
|
|
164
|
+
"admin3",
|
|
165
|
+
"admin4",
|
|
166
|
+
"population",
|
|
167
|
+
"elevation",
|
|
168
|
+
"dem",
|
|
169
|
+
"timezone",
|
|
170
|
+
"date_modified",
|
|
171
|
+
]
|
|
172
|
+
path = ensure_path(PREFIX, url=CITIES_URL, force=force)
|
|
173
|
+
cities_df = read_zipfile_csv(
|
|
174
|
+
path=path,
|
|
175
|
+
inner_path="cities15000.txt",
|
|
176
|
+
header=None,
|
|
177
|
+
names=columns,
|
|
178
|
+
dtype=str,
|
|
179
|
+
)
|
|
180
|
+
|
|
181
|
+
cities_df = cities_df[cities_df.population.astype(int) > minimum_population]
|
|
182
|
+
cities_df.synonyms = cities_df.synonyms.str.split(",")
|
|
183
|
+
|
|
184
|
+
terms = {}
|
|
185
|
+
for term in code_to_country.values():
|
|
186
|
+
terms[term.identifier] = term
|
|
187
|
+
|
|
188
|
+
cols = ["geonames_id", "name", "synonyms", "country_code", "admin1", "admin2", "feature_code"]
|
|
189
|
+
for identifier, name, synonyms, country, admin1, admin2, feature_code in cities_df[cols].values:
|
|
190
|
+
terms[identifier] = term = Term.from_triple(
|
|
191
|
+
"geonames", identifier, name if pd.notna(name) else None, type="Instance"
|
|
192
|
+
)
|
|
193
|
+
term.append_parent(Reference(prefix="geonames.feature", identifier=feature_code))
|
|
194
|
+
if synonyms and not isinstance(synonyms, float):
|
|
195
|
+
for synonym in synonyms:
|
|
196
|
+
if pd.notna(synonym):
|
|
197
|
+
term.append_synonym(synonym)
|
|
198
|
+
|
|
199
|
+
if pd.isna(admin1):
|
|
200
|
+
tqdm.write(f"[geonames:{identifier}] missing admin 1 code for {name} ({country})")
|
|
201
|
+
continue
|
|
202
|
+
|
|
203
|
+
admin1_full = f"{country}.{admin1}"
|
|
204
|
+
admin1_term = code_to_admin1.get(admin1_full)
|
|
205
|
+
if admin1_term is None:
|
|
206
|
+
logger.info(f"could not find admin1 {admin1_full}")
|
|
207
|
+
continue
|
|
208
|
+
|
|
209
|
+
terms[admin1_term.identifier] = admin1_term
|
|
210
|
+
|
|
211
|
+
if pd.notna(admin2):
|
|
212
|
+
admin2_full = f"{country}.{admin1}.{admin2}"
|
|
213
|
+
admin2_term = code_to_admin2.get(admin2_full)
|
|
214
|
+
if admin2_term is None or admin1_term is None:
|
|
215
|
+
pass
|
|
216
|
+
# print("could not find admin2", admin2_full)
|
|
217
|
+
else:
|
|
218
|
+
term.append_relationship(part_of, admin2_term)
|
|
219
|
+
terms[admin2_term.identifier] = admin2_term
|
|
220
|
+
|
|
221
|
+
else: # pd.notna(admin1):
|
|
222
|
+
# If there's no admin 2, just annotate directly onto admin 1
|
|
223
|
+
term.append_relationship(part_of, admin1_term)
|
|
224
|
+
|
|
225
|
+
return terms
|
|
226
|
+
|
|
227
|
+
|
|
228
|
+
if __name__ == "__main__":
|
|
229
|
+
GeonamesGetter().write_default(write_obo=True, force=True)
|
|
@@ -27,6 +27,7 @@ from pyobo.struct import (
|
|
|
27
27
|
orthologous,
|
|
28
28
|
transcribes_to,
|
|
29
29
|
)
|
|
30
|
+
from pyobo.struct.typedef import exact_match
|
|
30
31
|
from pyobo.utils.path import ensure_path, prefix_directory_join
|
|
31
32
|
|
|
32
33
|
__all__ = [
|
|
@@ -108,6 +109,28 @@ ENCODINGS = {
|
|
|
108
109
|
"unknown": "GRP",
|
|
109
110
|
}
|
|
110
111
|
|
|
112
|
+
SKIP_KEYS = {
|
|
113
|
+
"date_approved_reserved",
|
|
114
|
+
"_version_",
|
|
115
|
+
"uuid",
|
|
116
|
+
"date_modified",
|
|
117
|
+
"date_name_changed",
|
|
118
|
+
"date_symbol_changed",
|
|
119
|
+
"symbol_report_tag",
|
|
120
|
+
"location_sortable",
|
|
121
|
+
"curator_notes",
|
|
122
|
+
"agr", # repeat of HGNC ID
|
|
123
|
+
"gencc", # repeat of HGNC ID
|
|
124
|
+
"bioparadigms_slc", # repeat of symbol
|
|
125
|
+
"lncrnadb", # repeat of symbol
|
|
126
|
+
"gtrnadb", # repeat of symbol
|
|
127
|
+
"horde_id", # repeat of symbol
|
|
128
|
+
"imgt", # repeat of symbol
|
|
129
|
+
"cd", # symbol
|
|
130
|
+
"homeodb", # TODO add to bioregistry, though this is defunct
|
|
131
|
+
"mamit-trnadb", # TODO add to bioregistry, though this is defunct
|
|
132
|
+
}
|
|
133
|
+
|
|
111
134
|
#: A mapping from HGNC's locus_type annotations to sequence ontology identifiers
|
|
112
135
|
LOCUS_TYPE_TO_SO = {
|
|
113
136
|
# protein-coding gene
|
|
@@ -190,6 +213,7 @@ class HGNCGetter(Obo):
|
|
|
190
213
|
transcribes_to,
|
|
191
214
|
orthologous,
|
|
192
215
|
member_of,
|
|
216
|
+
exact_match,
|
|
193
217
|
]
|
|
194
218
|
idspaces = IDSPACES
|
|
195
219
|
synonym_typedefs = [
|
|
@@ -330,6 +354,12 @@ def get_terms(version: Optional[str] = None, force: bool = False) -> Iterable[Te
|
|
|
330
354
|
else:
|
|
331
355
|
tqdm.write(f"unhandled IUPHAR: {iuphar}")
|
|
332
356
|
|
|
357
|
+
for lrg_info in entry.pop("lsdb", []):
|
|
358
|
+
if lrg_info.startswith("LRG_"):
|
|
359
|
+
lrg_curie = lrg_info.split("|")[0]
|
|
360
|
+
_, lrg_id = lrg_curie.split("_")
|
|
361
|
+
term.append_xref(Reference(prefix="lrg", identifier=lrg_id))
|
|
362
|
+
|
|
333
363
|
for xref_prefix, key in gene_xrefs:
|
|
334
364
|
xref_identifiers = entry.pop(key, None)
|
|
335
365
|
if xref_identifiers is None:
|
|
@@ -397,7 +427,8 @@ def get_terms(version: Optional[str] = None, force: bool = False) -> Iterable[Te
|
|
|
397
427
|
term.set_species(identifier="9606", name="Homo sapiens")
|
|
398
428
|
|
|
399
429
|
for key in entry:
|
|
400
|
-
|
|
430
|
+
if key not in SKIP_KEYS:
|
|
431
|
+
unhandled_entry_keys[key] += 1
|
|
401
432
|
yield term
|
|
402
433
|
|
|
403
434
|
with open(prefix_directory_join(PREFIX, name="unhandled.json"), "w") as file:
|