From 06cb7a9a5829da556a545596d9624b15d6bd3135 Mon Sep 17 00:00:00 2001 From: Eric Coissac Date: Tue, 13 Dec 2016 12:49:34 +0100 Subject: [PATCH] Some change in the way to manage access to special items of the dictionary like sequence or quality --- python/obitools3/obidms/_obiseq.pxd | 4 +- python/obitools3/obidms/_obiseq.pyx | 64 +++++++++++++++++++++-------- 2 files changed, 50 insertions(+), 18 deletions(-) diff --git a/python/obitools3/obidms/_obiseq.pxd b/python/obitools3/obidms/_obiseq.pxd index 0ac065e..c8cf2a9 100644 --- a/python/obitools3/obidms/_obiseq.pxd +++ b/python/obitools3/obidms/_obiseq.pxd @@ -11,9 +11,11 @@ cdef class OBI_Seq(dict) : cdef class OBI_Nuc_Seq(OBI_Seq) : cdef object _quality + cpdef object get_str_quality(self) + #cpdef object reverse_complement(self) - cdef class OBI_Nuc_Seq_Stored(OBIView_line) : cpdef object get_str_quality(self) + #cpdef object reverse_complement(self) diff --git a/python/obitools3/obidms/_obiseq.pyx b/python/obitools3/obidms/_obiseq.pyx index 7ad6f93..94e1bd4 100644 --- a/python/obitools3/obidms/_obiseq.pyx +++ b/python/obitools3/obidms/_obiseq.pyx @@ -8,14 +8,31 @@ from .capi.obiview cimport NUC_SEQUENCE_COLUMN, \ QUALITY_COLUMN +cdef str __str__ID_COLUMN__ = bytes2str(ID_COLUMN) +cdef str __str__DEFINITION_COLUMN__ = bytes2str(DEFINITION_COLUMN) +cdef str __str__QUALITY_COLUMN__ = bytes2str(QUALITY_COLUMN) +cdef str __str__NUC_SEQUENCE_COLUMN__ = bytes2str(NUC_SEQUENCE_COLUMN) + + cdef class OBI_Seq(dict) : - def __init__(self, str id, object seq, object definition=None) : + def __init__(self, str id, + object seq, + str definition=None, + dict attributes=None) : self.id = id self.seq = seq if definition is not None : self.definition = definition - + + def __getitem__(self,str key): + if key == __str__ID_COLUMN__: + return self._id + elif key == __str__DEFINITION_COLUMN__: + return self._definition + else: + return dict.__getitem__(self,key) + # sequence id property getter and setter @property def id(self): # @ReservedAssignment @@ -23,7 +40,6 @@ cdef class OBI_Seq(dict) : @id.setter def id(self, str new_id): # @ReservedAssignment @DuplicatedSignature self._id = new_id - self[bytes2str(ID_COLUMN)] = new_id # sequence property getter and setter @property @@ -32,7 +48,7 @@ cdef class OBI_Seq(dict) : @seq.setter def seq(self, object new_seq): # @DuplicatedSignature self._seq = new_seq - self["SEQ"] = new_seq # TODO discuss + # self["SEQ"] = new_seq # TODO discuss # sequence definition property getter and setter @property @@ -41,11 +57,21 @@ cdef class OBI_Seq(dict) : @definition.setter def definition(self, object new_definition): # @DuplicatedSignature self._definition = new_definition - self[bytes2str(DEFINITION_COLUMN)] = new_definition cdef class OBI_Nuc_Seq(OBI_Seq) : + def __getitem__(self,str key): + if key == __str__NUC_SEQUENCE_COLUMN__: + return self._id + elif key == __str__QUALITY_COLUMN__: + return self._quality + else: + return OBI_Seq.__getitem__(self,key) + + cpdef object get_str_quality(self) : # TODO not ideal. Make quality_int and quality_str properties + return self._quality + # nuc sequence property getter and setter @property def seq(self): @@ -53,7 +79,7 @@ cdef class OBI_Nuc_Seq(OBI_Seq) : @seq.setter def seq(self, object new_seq): # @DuplicatedSignature self._seq = new_seq - self[bytes2str(NUC_SEQUENCE_COLUMN)] = new_seq +# self[bytes2str(NUC_SEQUENCE_COLUMN)] = new_seq # sequence quality property getter and setter @property @@ -62,7 +88,7 @@ cdef class OBI_Nuc_Seq(OBI_Seq) : @quality.setter def quality(self, object new_quality): # @DuplicatedSignature self._quality = new_quality - self[bytes2str(QUALITY_COLUMN)] = new_quality +# self[bytes2str(QUALITY_COLUMN)] = new_quality # cpdef str reverse_complement(self) : TODO in C ? # pass @@ -75,40 +101,44 @@ cdef class OBI_Nuc_Seq_Stored(OBIView_line) : # sequence id property getter and setter @property def id(self): # @ReservedAssignment @DuplicatedSignature - return self[bytes2str(ID_COLUMN)] + return self[__str__ID_COLUMN__] + @id.setter def id(self, str new_id): # @ReservedAssignment @DuplicatedSignature - self[bytes2str(ID_COLUMN)] = new_id + self[__str__ID_COLUMN__] = new_id # sequence definition property getter and setter @property def definition(self): - return self[bytes2str(DEFINITION_COLUMN)] + return self[__str__DEFINITION_COLUMN__] + @definition.setter def definition(self, str new_def): # @DuplicatedSignature - self[bytes2str(DEFINITION_COLUMN)] = new_def + self[__str__DEFINITION_COLUMN__] = new_def # nuc_seq property getter and setter @property def nuc_seq(self): - return self[bytes2str(NUC_SEQUENCE_COLUMN)] + return self[__str__NUC_SEQUENCE_COLUMN__] + @nuc_seq.setter def nuc_seq(self, object new_seq): # @DuplicatedSignature - self[bytes2str(NUC_SEQUENCE_COLUMN)] = new_seq + self[__str__NUC_SEQUENCE_COLUMN__] = new_seq # quality property getter and setter @property def quality(self): - return self[bytes2str(QUALITY_COLUMN)] + return self[__str__QUALITY_COLUMN__] + @quality.setter def quality(self, object new_qual): # @DuplicatedSignature if (type(new_qual) == list) or (new_qual is None) : # TODO check that quality column exists - self[bytes2str(QUALITY_COLUMN)] = new_qual + self[__str__QUALITY_COLUMN__] = new_qual else : # Quality is in str form - (((self._view).columns)[bytes2str(QUALITY_COLUMN)]).set_str_line(self._index, new_qual) + (((self._view).columns)[__str__QUALITY_COLUMN__]).set_str_line(self._index, new_qual) cpdef object get_str_quality(self) : # TODO not ideal. Make quality_int and quality_str properties - return ((self._view).columns)[bytes2str(QUALITY_COLUMN)].get_str_line(self._index) + return ((self._view).columns)[__str__QUALITY_COLUMN__].get_str_line(self._index) # cpdef str reverse_complement(self) : TODO in C ? # pass