Files
obitools3/python/obitools3/obidms/_obitaxo.pyx
Celine Mercier d8a257e711 Taxonomy handling functions in C. Features: read taxdump, read binary
files, write binary files. Not fully handled yet: *.adx, *.pdx, *.ldx,
merged.dmp and delnodes.dmp files.
2016-10-27 18:56:11 +02:00

116 lines
3.2 KiB
Cython

#cython: language_level=3
from obitools3.utils cimport bytes2str, str2bytes
from .capi.obitaxonomy cimport obi_read_taxonomy, \
obi_read_taxdump, \
obi_write_taxonomy, \
obi_close_taxonomy, \
obi_taxo_get_taxon_with_taxid
from ._obidms cimport OBIDMS
from cpython.pycapsule cimport PyCapsule_New, PyCapsule_GetPointer
from logging import raiseExceptions
cdef class OBI_Taxonomy :
# TODO function to import taxonomy?
def __init__(self, OBIDMS dms, str name, bint taxdump=False) :
self._dms = dms
self._name = name
if taxdump :
self._pointer = obi_read_taxdump(str2bytes(name))
else :
self._pointer = obi_read_taxonomy(dms._pointer, str2bytes(name), True) # TODO discuss
# TODO if not found in DMS, try to import?
def __getitem__(self, object ref):
cdef ecotx_t* taxon_p
cdef object taxon_capsule
if type(ref) == int :
taxon_p = obi_taxo_get_taxon_with_taxid(self._pointer, ref)
taxon_capsule = PyCapsule_New(taxon_p, NULL, NULL)
return OBI_Taxon(taxon_capsule)
else :
raise Exception("Not implemented")
# def __iter__(self):
#
# cdef ecotx_t* taxa
# cdef ecotx_t* taxon_p
# cdef object taxon_capsule
#
# taxa = self._pointer.taxa.taxon
#
# # Yield each taxid
# for t in range(self._pointer.taxa.count):
# taxon_p = taxa+t # TODO not compiling for mysterious cython reasons
# taxon_capsule = PyCapsule_New(taxon_p, NULL, NULL)
# yield OBI_Taxon(taxon_capsule)
cpdef write(self, str prefix) :
if obi_write_taxonomy(self._dms._pointer, self._pointer, str2bytes(prefix)) < 0 :
raise Exception("Error writing the taxonomy to binary files")
cpdef close(self) :
if (obi_close_taxonomy(self._pointer) < 0) :
raise Exception("Error closing the taxonomy")
cdef class OBI_Taxon : # TODO dict subclass?
def __init__(self, object taxon_capsule) :
self._pointer = <ecotx_t*> PyCapsule_GetPointer(taxon_capsule, NULL)
if self._pointer == NULL :
raise Exception("Error reading the taxonomy")
# name property getter
@property
def name(self):
return bytes2str(self._pointer.name)
# taxid property getter
@property
def taxid(self):
return self._pointer.taxid
# rank property getter
@property
def rank(self):
return self._pointer.rank
# farest property getter
@property
def farest(self):
return self._pointer.farest
# parent property getter
@property
def parent(self):
cdef object parent_capsule
parent_capsule = PyCapsule_New(self._pointer.parent, NULL, NULL)
return OBI_Taxon(parent_capsule)
def __repr__(self):
d = {}
d['taxid'] = self.taxid
d['name'] = self.name
d['parent'] = self.parent.taxid
d['farest'] = self.farest
return str(d)