From 123fb9d7ba36f0a087059367154a980ce38e3c76 Mon Sep 17 00:00:00 2001 From: Celine Mercier Date: Wed, 21 Mar 2018 16:38:26 +0100 Subject: [PATCH] Cython API: in taxonomy, added get_taxon_at_rank() function for Taxonomy class and rank_idx property for Taxon class --- python/obitools3/dms/taxo/taxo.pxd | 3 ++- python/obitools3/dms/taxo/taxo.pyx | 23 +++++++++++++++++++---- 2 files changed, 21 insertions(+), 5 deletions(-) diff --git a/python/obitools3/dms/taxo/taxo.pxd b/python/obitools3/dms/taxo/taxo.pxd index 85c4420..0e4cbd0 100644 --- a/python/obitools3/dms/taxo/taxo.pxd +++ b/python/obitools3/dms/taxo/taxo.pxd @@ -23,8 +23,9 @@ cdef class Taxonomy(OBIWrapper) : cpdef object get_family(self, int taxid) cpdef bytes get_scientific_name(self, int taxid) cpdef bytes get_rank(self, int taxid) + cpdef object get_taxon_at_rank(self, int taxid, object rank) + - cdef class Taxon : cdef ecotx_t* _pointer cdef Taxonomy _tax \ No newline at end of file diff --git a/python/obitools3/dms/taxo/taxo.pyx b/python/obitools3/dms/taxo/taxo.pyx index 3724ea5..86ebcf4 100644 --- a/python/obitools3/dms/taxo/taxo.pyx +++ b/python/obitools3/dms/taxo/taxo.pyx @@ -46,7 +46,7 @@ cdef class Taxonomy(OBIWrapper) : taxo._ranks = [] for r in range((pointer).ranks.count) : taxo._ranks.append(obi_taxo_rank_index_to_label(r, (pointer).ranks)) - + return taxo @@ -71,7 +71,7 @@ cdef class Taxonomy(OBIWrapper) : taxo._ranks = [] for r in range((pointer).ranks.count) : taxo._ranks.append(obi_taxo_rank_index_to_label(r, (pointer).ranks)) - + return taxo @@ -157,7 +157,16 @@ cdef class Taxonomy(OBIWrapper) : if taxon_p == NULL: raise Exception("Error getting a taxon with given taxid", taxid) return self._ranks[taxon_p.rank] - + + + cpdef object get_taxon_at_rank(self, int taxid, object rank): + if isinstance(rank, str) or isinstance(rank, bytes): + rank = self._ranks.index(tobytes(rank)) + try: + return [x.taxid for x in self.parental_tree_iterator(taxid) if x.rank_idx==rank][0] + except IndexError: + return None + def __len__(self): return self.pointer().taxa.count @@ -272,7 +281,7 @@ cdef class Taxon : # TODO dict subclass? def __richcmp__(self, Taxon taxon2, int op): return (self.name == taxon2.name) and \ (self.taxid == taxon2.taxid) and \ - (self.rank == taxon2.rank) and \ + (self.rank_idx == taxon2.rank_idx) and \ (self.farest == taxon2.farest) and \ (self.parent.taxid == taxon2.parent.taxid) and \ (self.preferred_name == taxon2.preferred_name) @@ -293,6 +302,11 @@ cdef class Taxon : # TODO dict subclass? def rank(self): return ((self._tax)._ranks)[(self._pointer).rank] + # rank_idx property getter + @property + def rank_idx(self): + return (self._pointer).rank + # farest property getter @property def farest(self): @@ -321,6 +335,7 @@ cdef class Taxon : # TODO dict subclass? d['taxid'] = self.taxid d['name'] = self.name d['rank'] = self.rank + d['rank_idx'] = self.rank_idx d['preferred name'] = self.preferred_name d['parent'] = self.parent.taxid d['farest'] = self.farest