Cython API: in taxonomy, added get_taxon_at_rank() function for Taxonomy

class and rank_idx property for Taxon class
This commit is contained in:
Celine Mercier
2018-03-21 16:38:26 +01:00
parent 4c3478d8f8
commit 123fb9d7ba
2 changed files with 21 additions and 5 deletions

View File

@ -23,8 +23,9 @@ cdef class Taxonomy(OBIWrapper) :
cpdef object get_family(self, int taxid) cpdef object get_family(self, int taxid)
cpdef bytes get_scientific_name(self, int taxid) cpdef bytes get_scientific_name(self, int taxid)
cpdef bytes get_rank(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 class Taxon :
cdef ecotx_t* _pointer cdef ecotx_t* _pointer
cdef Taxonomy _tax cdef Taxonomy _tax

View File

@ -46,7 +46,7 @@ cdef class Taxonomy(OBIWrapper) :
taxo._ranks = [] taxo._ranks = []
for r in range((<OBIDMS_taxonomy_p>pointer).ranks.count) : for r in range((<OBIDMS_taxonomy_p>pointer).ranks.count) :
taxo._ranks.append(obi_taxo_rank_index_to_label(r, (<OBIDMS_taxonomy_p>pointer).ranks)) taxo._ranks.append(obi_taxo_rank_index_to_label(r, (<OBIDMS_taxonomy_p>pointer).ranks))
return taxo return taxo
@ -71,7 +71,7 @@ cdef class Taxonomy(OBIWrapper) :
taxo._ranks = [] taxo._ranks = []
for r in range((<OBIDMS_taxonomy_p>pointer).ranks.count) : for r in range((<OBIDMS_taxonomy_p>pointer).ranks.count) :
taxo._ranks.append(obi_taxo_rank_index_to_label(r, (<OBIDMS_taxonomy_p>pointer).ranks)) taxo._ranks.append(obi_taxo_rank_index_to_label(r, (<OBIDMS_taxonomy_p>pointer).ranks))
return taxo return taxo
@ -157,7 +157,16 @@ cdef class Taxonomy(OBIWrapper) :
if taxon_p == NULL: if taxon_p == NULL:
raise Exception("Error getting a taxon with given taxid", taxid) raise Exception("Error getting a taxon with given taxid", taxid)
return self._ranks[taxon_p.rank] 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): def __len__(self):
return self.pointer().taxa.count return self.pointer().taxa.count
@ -272,7 +281,7 @@ cdef class Taxon : # TODO dict subclass?
def __richcmp__(self, Taxon taxon2, int op): def __richcmp__(self, Taxon taxon2, int op):
return (self.name == taxon2.name) and \ return (self.name == taxon2.name) and \
(self.taxid == taxon2.taxid) and \ (self.taxid == taxon2.taxid) and \
(self.rank == taxon2.rank) and \ (self.rank_idx == taxon2.rank_idx) and \
(self.farest == taxon2.farest) and \ (self.farest == taxon2.farest) and \
(self.parent.taxid == taxon2.parent.taxid) and \ (self.parent.taxid == taxon2.parent.taxid) and \
(self.preferred_name == taxon2.preferred_name) (self.preferred_name == taxon2.preferred_name)
@ -293,6 +302,11 @@ cdef class Taxon : # TODO dict subclass?
def rank(self): def rank(self):
return ((self._tax)._ranks)[(self._pointer).rank] return ((self._tax)._ranks)[(self._pointer).rank]
# rank_idx property getter
@property
def rank_idx(self):
return (self._pointer).rank
# farest property getter # farest property getter
@property @property
def farest(self): def farest(self):
@ -321,6 +335,7 @@ cdef class Taxon : # TODO dict subclass?
d['taxid'] = self.taxid d['taxid'] = self.taxid
d['name'] = self.name d['name'] = self.name
d['rank'] = self.rank d['rank'] = self.rank
d['rank_idx'] = self.rank_idx
d['preferred name'] = self.preferred_name d['preferred name'] = self.preferred_name
d['parent'] = self.parent.taxid d['parent'] = self.parent.taxid
d['farest'] = self.farest d['farest'] = self.farest