From f43dc3e3ab0364e72e8d0003de25234b5d4bfdf8 Mon Sep 17 00:00:00 2001 From: Eric Coissac Date: Tue, 20 Dec 2016 08:14:24 +0100 Subject: [PATCH 01/16] separate the obicolumn classes in new files --- python/obitools3/obidms/_obidms.pxd | 36 --- python/obitools3/obidms/_obidms.pyx | 308 ------------------- python/obitools3/obidms/_obidmscolumn.cfiles | 65 ++++ python/obitools3/obidms/_obidmscolumn.pxd | 52 ++++ python/obitools3/obidms/_obidmscolumn.pyx | 191 ++++++++++++ python/obitools3/obidms/_obiview.pxd | 28 ++ python/obitools3/obidms/_obiview.pyx | 60 ++++ 7 files changed, 396 insertions(+), 344 deletions(-) create mode 100644 python/obitools3/obidms/_obidmscolumn.cfiles create mode 100644 python/obitools3/obidms/_obidmscolumn.pxd create mode 100644 python/obitools3/obidms/_obidmscolumn.pyx diff --git a/python/obitools3/obidms/_obidms.pxd b/python/obitools3/obidms/_obidms.pxd index 85866c7..9777c16 100644 --- a/python/obitools3/obidms/_obidms.pxd +++ b/python/obitools3/obidms/_obidms.pxd @@ -7,42 +7,6 @@ from .capi.obitypes cimport obiversion_t, OBIType_t, index_t from ._obitaxo cimport OBI_Taxonomy -cdef class OBIDMS_column: - - cdef str _alias # associated property: alias - cdef OBIDMS_column_p* _pointer - cdef OBIView _view - - cpdef close(self) - - @staticmethod - cdef object get_subclass_type(OBIDMS_column_p column_p) - - -cdef class OBIDMS_column_multi_elts(OBIDMS_column): - - cpdef set_line(self, index_t line_nb, dict values) - - -cdef class OBIDMS_column_line: - - cdef OBIDMS_column _column - cdef index_t _index - - - - -cdef class OBIView_line : - - cdef index_t _index - cdef OBIView _view - - -cdef class OBIView_line_selection(list): - - cdef OBIView _view - cdef str _view_name - cdef class OBIDMS: diff --git a/python/obitools3/obidms/_obidms.pyx b/python/obitools3/obidms/_obidms.pyx index 1d35009..2bc083b 100644 --- a/python/obitools3/obidms/_obidms.pyx +++ b/python/obitools3/obidms/_obidms.pyx @@ -30,243 +30,13 @@ from ._obidms cimport OBIDMS, \ from ._obitaxo cimport OBI_Taxonomy -from ._obidmscolumn_int cimport OBIDMS_column_int, \ - OBIDMS_column_multi_elts_int - -from ._obidmscolumn_float cimport OBIDMS_column_float, \ - OBIDMS_column_multi_elts_float -from ._obidmscolumn_bool cimport OBIDMS_column_bool, \ - OBIDMS_column_multi_elts_bool - -from ._obidmscolumn_char cimport OBIDMS_column_char, \ - OBIDMS_column_multi_elts_char - -from ._obidmscolumn_qual cimport OBIDMS_column_qual, \ - OBIDMS_column_multi_elts_qual - -from ._obidmscolumn_str cimport OBIDMS_column_str, \ - OBIDMS_column_multi_elts_str - -from ._obidmscolumn_seq cimport OBIDMS_column_seq, \ - OBIDMS_column_multi_elts_seq - -from .capi.obiview cimport Obiview_p, \ - Obiview_infos_p, \ - Alias_column_pair_p, \ - obi_new_view_nuc_seqs, \ - obi_new_view, \ - obi_new_view_cloned_from_name, \ - obi_new_view_nuc_seqs_cloned_from_name, \ - obi_view_map_file, \ - obi_view_unmap_file, \ - obi_open_view, \ - obi_view_delete_column, \ - obi_view_add_column, \ - obi_view_create_column_alias, \ - obi_view_get_column, \ - obi_view_get_pointer_on_column_in_view, \ - obi_save_and_close_view, \ - VIEW_TYPE_NUC_SEQS, \ - NUC_SEQUENCE_COLUMN, \ - ID_COLUMN, \ - DEFINITION_COLUMN, \ - QUALITY_COLUMN from libc.stdlib cimport malloc -cdef class OBIDMS_column : - - # Note: should only be initialized through a subclass - def __init__(self, OBIView view, str column_alias): - - cdef OBIDMS_column_p column_p - cdef OBIDMS_column_p* column_pp - - column_pp = obi_view_get_pointer_on_column_in_view(view._pointer, str2bytes(column_alias)) - column_p = column_pp[0] # TODO ugly cython dereferencing but can't find better - - # Fill structure - self._alias = column_alias - self._pointer = column_pp - self._view = view - - def __setitem__(self, index_t line_nb, object value): - self.set_line(line_nb, value) - - def __getitem__(self, index_t line_nb): - return self.get_line(line_nb) - - def __len__(self): - return self.lines_used - - def __sizeof__(self): - return ((self._pointer)[0].header.header_size + (self._pointer)[0].header.data_size) - - def __iter__(self): - # Declarations - cdef index_t line_nb - # Yield each line - for line_nb in range(self.lines_used): - yield self.get_line(line_nb) - - def __str__(self) : - cdef str to_print - to_print = '' - for line in self : - to_print = to_print + str(line) + "\n" - return to_print - - def __repr__(self) : - return (self._alias + ", original name: " + self.original_name + ", version " + str(self.version) + ", data type: " + self.data_type) - - cpdef close(self): - if obi_close_column((self._pointer)[0]) < 0 : - raise Exception("Problem closing a column") - - # Column alias property getter and setter - @property - def alias(self): - return self._alias - @alias.setter - def alias(self, new_alias): # @DuplicatedSignature - self._view.change_column_alias(self._alias, new_alias) - - # elements_names property getter - @property - def elements_names(self): - return (bytes2str(((self._pointer)[0].header).elements_names)).split(';') - - # nb_elements_per_line property getter - @property - def nb_elements_per_line(self): - return ((self._pointer)[0].header).nb_elements_per_line - - # data_type property getter - @property - def data_type(self): - return bytes2str(name_data_type(((self._pointer)[0].header).returned_data_type)) - - # original_name property getter - @property - def original_name(self): - return bytes2str(((self._pointer)[0].header).name) - - # version property getter - @property - def version(self): - return ((self._pointer)[0].header).version - - # lines_used property getter - @property - def lines_used(self): - return (self._pointer)[0].header.lines_used - - # comments property getter - @property - def comments(self): - return bytes2str((self._pointer)[0].header.comments) - - # creation_date property getter - @property - def creation_date(self): - return bytes2str(obi_format_date((self._pointer)[0].header.creation_date)) - - @staticmethod - cdef object get_subclass_type(OBIDMS_column_p column_p) : - - cdef object subclass - cdef OBIDMS_column_header_p header - cdef OBIType_t col_type - cdef bint col_writable - cdef bint col_one_element_per_line - - header = column_p.header - col_type = header.returned_data_type - col_writable = column_p.writable - col_one_element_per_line = ((header.nb_elements_per_line) == 1) - - if col_type == OBI_INT : - if col_one_element_per_line : - subclass = OBIDMS_column_int - else : - subclass = OBIDMS_column_multi_elts_int - elif col_type == OBI_FLOAT : - if col_one_element_per_line : - subclass = OBIDMS_column_float - else : - subclass = OBIDMS_column_multi_elts_float - elif col_type == OBI_BOOL : - if col_one_element_per_line : - subclass = OBIDMS_column_bool - else : - subclass = OBIDMS_column_multi_elts_bool - elif col_type == OBI_CHAR : - if col_one_element_per_line : - subclass = OBIDMS_column_char - else : - subclass = OBIDMS_column_multi_elts_char - elif col_type == OBI_QUAL : - if col_one_element_per_line : - subclass = OBIDMS_column_qual - else : - subclass = OBIDMS_column_multi_elts_qual - elif col_type == OBI_STR : - if col_one_element_per_line : - subclass = OBIDMS_column_str - else : - subclass = OBIDMS_column_multi_elts_str - elif col_type == OBI_SEQ : - if col_one_element_per_line : - subclass = OBIDMS_column_seq - else : - subclass = OBIDMS_column_multi_elts_seq - else : - raise Exception("Problem with the data type") - - return subclass - - -###################################################################################################### - - -cdef class OBIDMS_column_multi_elts(OBIDMS_column) : - - def __getitem__(self, index_t line_nb): - return OBIDMS_column_line(self, line_nb) - - cpdef set_line(self, index_t line_nb, dict values): - for element_name in values : - self.set_item(line_nb, element_name, values[element_name]) - - -###################################################################################################### - - -cdef class OBIDMS_column_line : - - def __init__(self, OBIDMS_column column, index_t line_nb) : - self._index = line_nb - self._column = column - - def __getitem__(self, str element_name) : - return self._column.get_item(self._index, element_name) - - def __setitem__(self, str element_name, object value): - self._column.set_item(self._index, element_name, value) - - def __contains__(self, str element_name): - return (element_name in self._column.elements_names) - - def __repr__(self) : - return str(self._column.get_line(self._index)) - - -###################################################################################################### - @@ -277,84 +47,6 @@ cdef class OBIDMS_column_line : ###################################################################################################### -cdef class OBIView_line : - - def __init__(self, OBIView view, index_t line_nb) : - self._index = line_nb - self._view = view - - def __getitem__(self, str column_name) : - return ((self._view)._columns)[column_name][self._index] - - def __setitem__(self, str column_name, object value): - # TODO detect multiple elements (dict type)? put somewhere else? but more risky (in get) - # TODO OBI_QUAL ? - cdef type value_type - cdef str value_obitype - cdef bytes value_b - - if column_name not in self._view : - if value == None : - raise Exception("Trying to create a column from a None value (can't guess type)") - value_type = type(value) - if value_type == int : - value_obitype = 'OBI_INT' - elif value_type == float : - value_obitype = 'OBI_FLOAT' - elif value_type == bool : - value_obitype = 'OBI_BOOL' - elif value_type == str or value_type == bytes : - if value_type == str : - value_b = str2bytes(value) - else : - value_b = value - if only_ATGC(value_b) : # TODO detect IUPAC - value_obitype = 'OBI_SEQ' - elif len(value) == 1 : - value_obitype = 'OBI_CHAR' - elif (len(value) > 1) : - value_obitype = 'OBI_STR' - else : - raise Exception("Could not guess the type of a value to create a new column") - self._view.add_column(column_name, type=value_obitype) - - (((self._view)._columns)[column_name]).set_line(self._index, value) - - def __iter__(self): - for column_name in ((self._view)._columns) : - yield column_name - - def __contains__(self, str column_name): - return (column_name in self._view._columns) - - def __repr__(self): - cdef dict line - cdef str column_name - line = {} - for column_name in self._view._columns : - line[column_name] = self[column_name] - return str(line) - - -###################################################################################################### - - -cdef class OBIView_line_selection(list): - - def __init__(self, OBIView view) : - if view._pointer == NULL: - raise Exception("Error: trying to create a line selection with an invalidated view") - self._view = view - self._view_name = view.name - - def append(self, index_t idx) : - if idx >= self._view.line_count : - raise Exception("Error: trying to select a line beyond the line count of a view") -# if idx in self : # TODO discuss. Discuss order too -# pass -# else : - super(OBIView_line_selection, self).append(idx) - ###################################################################################################### diff --git a/python/obitools3/obidms/_obidmscolumn.cfiles b/python/obitools3/obidms/_obidmscolumn.cfiles new file mode 100644 index 0000000..84e0436 --- /dev/null +++ b/python/obitools3/obidms/_obidmscolumn.cfiles @@ -0,0 +1,65 @@ +../../../src/bloom.h +../../../src/bloom.c +../../../src/char_str_indexer.h +../../../src/char_str_indexer.c +../../../src/crc64.h +../../../src/crc64.c +../../../src/dna_seq_indexer.h +../../../src/dna_seq_indexer.c +../../../src/encode.h +../../../src/encode.c +../../../src/hashtable.h +../../../src/hashtable.c +../../../src/murmurhash2.h +../../../src/murmurhash2.c +../../../src/obi_align.h +../../../src/obi_align.c +../../../src/obiavl.h +../../../src/obiavl.c +../../../src/obiblob_indexer.h +../../../src/obiblob_indexer.c +../../../src/obiblob.h +../../../src/obiblob.c +../../../src/obidebug.h +../../../src/obidms_taxonomy.h +../../../src/obidms_taxonomy.c +../../../src/obidms.h +../../../src/obidms.c +../../../src/obidmscolumn_blob.c +../../../src/obidmscolumn_blob.h +../../../src/obidmscolumn_bool.c +../../../src/obidmscolumn_bool.h +../../../src/obidmscolumn_char.c +../../../src/obidmscolumn_char.h +../../../src/obidmscolumn_float.c +../../../src/obidmscolumn_float.h +../../../src/obidmscolumn_idx.h +../../../src/obidmscolumn_idx.c +../../../src/obidmscolumn_int.c +../../../src/obidmscolumn_int.h +../../../src/obidmscolumn_qual.h +../../../src/obidmscolumn_qual.c +../../../src/obidmscolumn_seq.c +../../../src/obidmscolumn_seq.h +../../../src/obidmscolumn_str.c +../../../src/obidmscolumn_str.h +../../../src/obidmscolumn.h +../../../src/obidmscolumn.c +../../../src/obidmscolumndir.h +../../../src/obidmscolumndir.c +../../../src/obierrno.h +../../../src/obierrno.c +../../../src/obilittlebigman.h +../../../src/obilittlebigman.c +../../../src/obitypes.h +../../../src/obitypes.c +../../../src/obiview.h +../../../src/obiview.c +../../../src/sse_banded_LCS_alignment.h +../../../src/sse_banded_LCS_alignment.c +../../../src/uint8_indexer.h +../../../src/uint8_indexer.c +../../../src/upperband.h +../../../src/upperband.c +../../../src/utils.h +../../../src/utils.c diff --git a/python/obitools3/obidms/_obidmscolumn.pxd b/python/obitools3/obidms/_obidmscolumn.pxd new file mode 100644 index 0000000..8ffaf9f --- /dev/null +++ b/python/obitools3/obidms/_obidmscolumn.pxd @@ -0,0 +1,52 @@ +#cython: language_level=3 + +from .capi.obidmscolumn cimport OBIDMS_column_p +from .capi.obiview cimport Obiview_p +from .capi.obitypes cimport obiversion_t, OBIType_t, index_t + +from ._obidmscolumn_int cimport OBIDMS_column_int, \ + OBIDMS_column_multi_elts_int + +from ._obidmscolumn_float cimport OBIDMS_column_float, \ + OBIDMS_column_multi_elts_float + +from ._obidmscolumn_bool cimport OBIDMS_column_bool, \ + OBIDMS_column_multi_elts_bool + +from ._obidmscolumn_char cimport OBIDMS_column_char, \ + OBIDMS_column_multi_elts_char + +from ._obidmscolumn_qual cimport OBIDMS_column_qual, \ + OBIDMS_column_multi_elts_qual + +from ._obidmscolumn_str cimport OBIDMS_column_str, \ + OBIDMS_column_multi_elts_str + +from ._obidmscolumn_seq cimport OBIDMS_column_seq, \ + OBIDMS_column_multi_elts_seq + + +from ._obiview cimport OBIView + +cdef class OBIDMS_column: + + cdef str _alias # associated property: alias + cdef OBIDMS_column_p* _pointer + cdef OBIView _view + + cpdef close(self) + + @staticmethod + cdef object get_subclass_type(OBIDMS_column_p column_p) + + +cdef class OBIDMS_column_multi_elts(OBIDMS_column): + + cpdef set_line(self, index_t line_nb, dict values) + + +cdef class OBIDMS_column_line: + + cdef OBIDMS_column _column + cdef index_t _index + diff --git a/python/obitools3/obidms/_obidmscolumn.pyx b/python/obitools3/obidms/_obidmscolumn.pyx new file mode 100644 index 0000000..b7ffbd3 --- /dev/null +++ b/python/obitools3/obidms/_obidmscolumn.pyx @@ -0,0 +1,191 @@ +#cython: language_level=3 + +cdef class OBIDMS_column : + + # Note: should only be initialized through a subclass + def __init__(self, OBIView view, str column_alias): + + cdef OBIDMS_column_p column_p + cdef OBIDMS_column_p* column_pp + + column_pp = obi_view_get_pointer_on_column_in_view(view._pointer, str2bytes(column_alias)) + column_p = column_pp[0] # TODO ugly cython dereferencing but can't find better + + # Fill structure + self._alias = column_alias + self._pointer = column_pp + self._view = view + + def __setitem__(self, index_t line_nb, object value): + self.set_line(line_nb, value) + + def __getitem__(self, index_t line_nb): + return self.get_line(line_nb) + + def __len__(self): + return self.lines_used + + def __sizeof__(self): + return ((self._pointer)[0].header.header_size + (self._pointer)[0].header.data_size) + + def __iter__(self): + # Declarations + cdef index_t line_nb + # Yield each line + for line_nb in range(self.lines_used): + yield self.get_line(line_nb) + + def __str__(self) : + cdef str to_print + to_print = '' + for line in self : + to_print = to_print + str(line) + "\n" + return to_print + + def __repr__(self) : + return (self._alias + ", original name: " + self.original_name + ", version " + str(self.version) + ", data type: " + self.data_type) + + cpdef close(self): + if obi_close_column((self._pointer)[0]) < 0 : + raise Exception("Problem closing a column") + + # Column alias property getter and setter + @property + def alias(self): + return self._alias + @alias.setter + def alias(self, new_alias): # @DuplicatedSignature + self._view.change_column_alias(self._alias, new_alias) + + # elements_names property getter + @property + def elements_names(self): + return (bytes2str(((self._pointer)[0].header).elements_names)).split(';') + + # nb_elements_per_line property getter + @property + def nb_elements_per_line(self): + return ((self._pointer)[0].header).nb_elements_per_line + + # data_type property getter + @property + def data_type(self): + return bytes2str(name_data_type(((self._pointer)[0].header).returned_data_type)) + + # original_name property getter + @property + def original_name(self): + return bytes2str(((self._pointer)[0].header).name) + + # version property getter + @property + def version(self): + return ((self._pointer)[0].header).version + + # lines_used property getter + @property + def lines_used(self): + return (self._pointer)[0].header.lines_used + + # comments property getter + @property + def comments(self): + return bytes2str((self._pointer)[0].header.comments) + + # creation_date property getter + @property + def creation_date(self): + return bytes2str(obi_format_date((self._pointer)[0].header.creation_date)) + + @staticmethod + cdef object get_subclass_type(OBIDMS_column_p column_p) : + + cdef object subclass + cdef OBIDMS_column_header_p header + cdef OBIType_t col_type + cdef bint col_writable + cdef bint col_one_element_per_line + + header = column_p.header + col_type = header.returned_data_type + col_writable = column_p.writable + col_one_element_per_line = ((header.nb_elements_per_line) == 1) + + if col_type == OBI_INT : + if col_one_element_per_line : + subclass = OBIDMS_column_int + else : + subclass = OBIDMS_column_multi_elts_int + elif col_type == OBI_FLOAT : + if col_one_element_per_line : + subclass = OBIDMS_column_float + else : + subclass = OBIDMS_column_multi_elts_float + elif col_type == OBI_BOOL : + if col_one_element_per_line : + subclass = OBIDMS_column_bool + else : + subclass = OBIDMS_column_multi_elts_bool + elif col_type == OBI_CHAR : + if col_one_element_per_line : + subclass = OBIDMS_column_char + else : + subclass = OBIDMS_column_multi_elts_char + elif col_type == OBI_QUAL : + if col_one_element_per_line : + subclass = OBIDMS_column_qual + else : + subclass = OBIDMS_column_multi_elts_qual + elif col_type == OBI_STR : + if col_one_element_per_line : + subclass = OBIDMS_column_str + else : + subclass = OBIDMS_column_multi_elts_str + elif col_type == OBI_SEQ : + if col_one_element_per_line : + subclass = OBIDMS_column_seq + else : + subclass = OBIDMS_column_multi_elts_seq + else : + raise Exception("Problem with the data type") + + return subclass + + +###################################################################################################### + + +cdef class OBIDMS_column_multi_elts(OBIDMS_column) : + + def __getitem__(self, index_t line_nb): + return OBIDMS_column_line(self, line_nb) + + cpdef set_line(self, index_t line_nb, dict values): + for element_name in values : + self.set_item(line_nb, element_name, values[element_name]) + + +###################################################################################################### + + +cdef class OBIDMS_column_line : + + def __init__(self, OBIDMS_column column, index_t line_nb) : + self._index = line_nb + self._column = column + + def __getitem__(self, str element_name) : + return self._column.get_item(self._index, element_name) + + def __setitem__(self, str element_name, object value): + self._column.set_item(self._index, element_name, value) + + def __contains__(self, str element_name): + return (element_name in self._column.elements_names) + + def __repr__(self) : + return str(self._column.get_line(self._index)) + + +###################################################################################################### + diff --git a/python/obitools3/obidms/_obiview.pxd b/python/obitools3/obidms/_obiview.pxd index f49bfc7..ecbac30 100644 --- a/python/obitools3/obidms/_obiview.pxd +++ b/python/obitools3/obidms/_obiview.pxd @@ -1,5 +1,27 @@ #cython: language_level=3 +from .capi.obiview cimport Obiview_p, \ + Obiview_infos_p, \ + Alias_column_pair_p, \ + obi_new_view_nuc_seqs, \ + obi_new_view, \ + obi_new_view_cloned_from_name, \ + obi_new_view_nuc_seqs_cloned_from_name, \ + obi_view_map_file, \ + obi_view_unmap_file, \ + obi_open_view, \ + obi_view_delete_column, \ + obi_view_add_column, \ + obi_view_create_column_alias, \ + obi_view_get_column, \ + obi_view_get_pointer_on_column_in_view, \ + obi_save_and_close_view, \ + VIEW_TYPE_NUC_SEQS, \ + NUC_SEQUENCE_COLUMN, \ + ID_COLUMN, \ + DEFINITION_COLUMN, \ + QUALITY_COLUMN + cdef class OBIView: cdef Obiview_p _pointer @@ -52,3 +74,9 @@ cdef class OBIView_line_selection(list): str view_name, str comments=*) +cdef class OBIView_line : + + cdef index_t _index + cdef OBIView _view + + diff --git a/python/obitools3/obidms/_obiview.pyx b/python/obitools3/obidms/_obiview.pyx index 9742e2d..519e441 100644 --- a/python/obitools3/obidms/_obiview.pyx +++ b/python/obitools3/obidms/_obiview.pyx @@ -322,3 +322,63 @@ cdef class OBIView_line_selection(list): return view +cdef class OBIView_line : + + def __init__(self, OBIView view, index_t line_nb) : + self._index = line_nb + self._view = view + + def __getitem__(self, str column_name) : + return ((self._view)._columns)[column_name][self._index] + + def __setitem__(self, str column_name, object value): + # TODO detect multiple elements (dict type)? put somewhere else? but more risky (in get) + # TODO OBI_QUAL ? + cdef type value_type + cdef str value_obitype + cdef bytes value_b + + if column_name not in self._view : + if value == None : + raise Exception("Trying to create a column from a None value (can't guess type)") + value_type = type(value) + if value_type == int : + value_obitype = 'OBI_INT' + elif value_type == float : + value_obitype = 'OBI_FLOAT' + elif value_type == bool : + value_obitype = 'OBI_BOOL' + elif value_type == str or value_type == bytes : + if value_type == str : + value_b = str2bytes(value) + else : + value_b = value + if only_ATGC(value_b) : # TODO detect IUPAC + value_obitype = 'OBI_SEQ' + elif len(value) == 1 : + value_obitype = 'OBI_CHAR' + elif (len(value) > 1) : + value_obitype = 'OBI_STR' + else : + raise Exception("Could not guess the type of a value to create a new column") + self._view.add_column(column_name, type=value_obitype) + + (((self._view)._columns)[column_name]).set_line(self._index, value) + + def __iter__(self): + for column_name in ((self._view)._columns) : + yield column_name + + def __contains__(self, str column_name): + return (column_name in self._view._columns) + + def __repr__(self): + cdef dict line + cdef str column_name + line = {} + for column_name in self._view._columns : + line[column_name] = self[column_name] + return str(line) + + + From d1a972dfcbfbf1c80f1a461a264b657115050a3f Mon Sep 17 00:00:00 2001 From: Eric Coissac Date: Tue, 20 Dec 2016 08:15:42 +0100 Subject: [PATCH 02/16] patch import --- python/obitools3/obidms/_obiview_nuc_seq.pxd | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/python/obitools3/obidms/_obiview_nuc_seq.pxd b/python/obitools3/obidms/_obiview_nuc_seq.pxd index fecca30..badb5c4 100644 --- a/python/obitools3/obidms/_obiview_nuc_seq.pxd +++ b/python/obitools3/obidms/_obiview_nuc_seq.pxd @@ -1,7 +1,7 @@ #cython: language_level=3 -from ._obidms cimport OBIView -from ._obiseq cimport OBI_Nuc_Seq, OBI_Nuc_Seq_Stored +from ._obiview cimport OBIView +from ._obiseq cimport OBI_Nuc_Seq, OBI_Nuc_Seq_Stored cdef class OBIView_NUC_SEQS_QUAL(OBIView_NUC_SEQS): From 82fbe439804e3aabcd9544e36360b87b359ad374 Mon Sep 17 00:00:00 2001 From: Eric Coissac Date: Tue, 20 Dec 2016 08:18:47 +0100 Subject: [PATCH 03/16] transfert method to obiviews --- python/obitools3/obidms/_obidms.pxd | 6 +- python/obitools3/obidms/_obidms.pyx | 88 ----------------------------- 2 files changed, 1 insertion(+), 93 deletions(-) diff --git a/python/obitools3/obidms/_obidms.pxd b/python/obitools3/obidms/_obidms.pxd index 9777c16..d46059e 100644 --- a/python/obitools3/obidms/_obidms.pxd +++ b/python/obitools3/obidms/_obidms.pxd @@ -14,11 +14,7 @@ cdef class OBIDMS: cpdef close(self) cpdef OBI_Taxonomy open_taxonomy(self, str taxo_name) - - cpdef OBIView new_view(self, str view_name, str view_type=*, bint quality_column=*, str comments=*) - cpdef OBIView clone_view(self, str view_name, object view_to_clone, str comments=*) - cpdef OBIView clone_view_with_line_selection(self, str view_name, OBIView_line_selection line_selection, str comments=*) - + cpdef dict read_view_infos(self, str view_name) # cpdef dict read_views(self) TODO diff --git a/python/obitools3/obidms/_obidms.pyx b/python/obitools3/obidms/_obidms.pyx index 2bc083b..8a51ef4 100644 --- a/python/obitools3/obidms/_obidms.pyx +++ b/python/obitools3/obidms/_obidms.pyx @@ -36,21 +36,6 @@ from libc.stdlib cimport malloc - - - - -###################################################################################################### - - - -###################################################################################################### - - - -###################################################################################################### - - cdef class OBIDMS : def __init__(self, str dms_name) : @@ -82,32 +67,6 @@ cdef class OBIDMS : return OBI_Taxonomy(self, taxo_name) - cpdef OBIView new_view(self, str view_name, str view_type="", bint quality_column=False, str comments="") : - cdef object view_class - # Get right subclass depending on view type - view_class = OBIView.get_view_subclass(view_type) - return view_class(self, view_name, new=True, comments=comments, quality_column=quality_column, view_type=view_type) - - - cpdef OBIView clone_view(self, str view_name, object view_to_clone, str comments="") : - cdef object view_class # @DuplicatedSignature - cdef str view_type - # Get right subclass depending on view type - if type(view_to_clone) == str : - view_type = self.read_view_infos(view_to_clone)["view_type"] - else : - view_type = view_to_clone.type - view_class = OBIView.get_view_subclass(view_type) - return view_class(self, view_name, new=True, view_to_clone=view_to_clone, comments=comments, view_type=view_type) - - - cpdef OBIView clone_view_with_line_selection(self, str view_name, OBIView_line_selection line_selection, str comments="") : - cdef object view_class # @DuplicatedSignature - # Get right subclass depending on view type - view_class = OBIView.get_view_subclass(line_selection._view.type) - return view_class(self, view_name, new=True, view_to_clone=line_selection._view, line_selection=line_selection, comments=comments) - - cpdef dict read_view_infos(self, str view_name) : cdef Obiview_infos_p view_infos_p @@ -144,51 +103,4 @@ cdef class OBIDMS : return view_infos_d -# cpdef dict read_views(self) : # TODO function that prints the dic nicely and function that prints 1 view nicely. Add column type in col ref -# -# cdef Obiviews_infos_all_p all_views_p -# cdef Obiview_infos_p view_p -# cdef Column_reference_p column_refs -# cdef int nb_views -# cdef int i, j -# cdef str view_name -# cdef str column_name -# cdef dict views -# cdef bytes name_b -# -# views = {} -# all_views_p = obi_read_view_infos(self._pointer) -# if all_views_p == NULL : -# raise Exception("No views to read") -# nb_views = (all_views_p.header).view_count -# for i in range(nb_views) : -# view_p = ( (all_views_p.view_infos)) + i -# view_name = bytes2str(view_p.name) -# views[view_name] = {} -# views[view_name]["comments"] = bytes2str(view_p.comments) -# views[view_name]["view_type"] = bytes2str(view_p.view_type) -# views[view_name]["column_count"] = view_p.column_count -# views[view_name]["line_count"] = view_p.line_count -# views[view_name]["view_number"] = view_p.view_number -# views[view_name]["created_from"] = bytes2str(view_p.created_from) -# views[view_name]["creation_date"] = bytes2str(obi_format_date(view_p.creation_date)) -# if (view_p.all_lines) : -# views[view_name]["line_selection"] = None -# else : -# views[view_name]["line_selection"] = {} -# views[view_name]["line_selection"]["column_name"] = bytes2str((view_p.line_selection).column_name) -# views[view_name]["line_selection"]["version"] = (view_p.line_selection).version -# views[view_name]["column_references"] = {} -# column_refs = view_p.column_references -# for j in range(views[view_name]["column_count"]) : -# column_name = bytes2str((column_refs[j]).column_name) -# views[view_name]["column_references"][column_name] = {} -# views[view_name]["column_references"][column_name]["version"] = column_refs[j].version -# -# obi_close_view_infos(all_views_p); -# -# return views - - - \ No newline at end of file From 3cedd00d7fef0b6392c29b7e7dc1c0494aca6d76 Mon Sep 17 00:00:00 2001 From: Eric Coissac Date: Tue, 20 Dec 2016 11:13:57 +0100 Subject: [PATCH 04/16] Add register function for column type --- python/obitools3/obidms/_obidmscolumn.pxd | 4 +++- python/obitools3/obidms/_obidmscolumn.pyx | 9 +++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/python/obitools3/obidms/_obidmscolumn.pxd b/python/obitools3/obidms/_obidmscolumn.pxd index 8ffaf9f..3c9460a 100644 --- a/python/obitools3/obidms/_obidmscolumn.pxd +++ b/python/obitools3/obidms/_obidmscolumn.pxd @@ -4,6 +4,7 @@ from .capi.obidmscolumn cimport OBIDMS_column_p from .capi.obiview cimport Obiview_p from .capi.obitypes cimport obiversion_t, OBIType_t, index_t + from ._obidmscolumn_int cimport OBIDMS_column_int, \ OBIDMS_column_multi_elts_int @@ -49,4 +50,5 @@ cdef class OBIDMS_column_line: cdef OBIDMS_column _column cdef index_t _index - + +cdef register_column_class(OBIType_t obitype,type classe) diff --git a/python/obitools3/obidms/_obidmscolumn.pyx b/python/obitools3/obidms/_obidmscolumn.pyx index b7ffbd3..5bf5673 100644 --- a/python/obitools3/obidms/_obidmscolumn.pyx +++ b/python/obitools3/obidms/_obidmscolumn.pyx @@ -1,5 +1,7 @@ #cython: language_level=3 +cdef dict __OBIDMS_COLUMN_CLASS__ = {} + cdef class OBIDMS_column : # Note: should only be initialized through a subclass @@ -15,6 +17,8 @@ cdef class OBIDMS_column : self._alias = column_alias self._pointer = column_pp self._view = view + + cpdef getitem(self,index_t line_nb, str element_name): def __setitem__(self, index_t line_nb, object value): self.set_line(line_nb, value) @@ -189,3 +193,8 @@ cdef class OBIDMS_column_line : ###################################################################################################### + +cdef register_column_class(OBIType_t obitype,type classe): + assert issubclass(classe,OBIDMS_column) + + __OBIDMS_COLUMN_CLASS__[obitype]=classe From daacd0df76647f2059882582f185f38574c9bb9f Mon Sep 17 00:00:00 2001 From: Eric Coissac Date: Mon, 26 Dec 2016 13:35:31 +0100 Subject: [PATCH 05/16] Strong refactoring 1 --- python/obitools3/{obidms => dms}/__init__.py | 0 .../obitools3/{obidms => dms}/_obidms.cfiles | 0 python/obitools3/{obidms => dms}/_obidms.pxd | 0 python/obitools3/{obidms => dms}/_obidms.pyx | 13 +- .../{obidms => dms}/_obidmscolumn.cfiles | 0 python/obitools3/dms/_obidmscolumn.pxd | 41 +++ python/obitools3/dms/_obidmscolumn.pyx | 182 +++++++++++ .../{obidms => dms}/_obidmscolumn_bool.cfiles | 0 python/obitools3/dms/_obidmscolumn_bool.pxd | 57 ++++ python/obitools3/dms/_obidmscolumn_bool.pyx | 294 ++++++++++++++++++ .../obitools3/{obidms => dms}/_obiseq.cfiles | 0 python/obitools3/{obidms => dms}/_obiseq.pxd | 2 +- python/obitools3/{obidms => dms}/_obiseq.pyx | 0 .../obitools3/{obidms => dms}/_obitaxo.cfiles | 0 python/obitools3/{obidms => dms}/_obitaxo.pxd | 0 python/obitools3/{obidms => dms}/_obitaxo.pyx | 0 python/obitools3/{obidms => dms}/_obiview.pxd | 50 +-- python/obitools3/{obidms => dms}/_obiview.pyx | 109 ++++--- .../{obidms => dms}/_obiview_nuc_seq.pxd | 0 .../{obidms => dms}/_obiview_nuc_seq.pyx | 0 .../{obidms => dms}/_obiview_nuc_seq_qual.pxd | 0 .../{obidms => dms}/_obiview_nuc_seq_qual.pyx | 0 .../{obidms => dms}/capi/__init__.py | 0 .../{obidms => dms}/capi/obialign.pxd | 0 .../obitools3/{obidms => dms}/capi/obidms.pxd | 0 .../{obidms => dms}/capi/obidmscolumn.pxd | 6 +- python/obitools3/dms/capi/obierrno.pxd | 5 + .../{obidms => dms}/capi/obitaxonomy.pxd | 0 .../{obidms => dms}/capi/obitypes.pxd | 0 .../{obidms => dms}/capi/obiutils.pxd | 0 .../{obidms => dms}/capi/obiview.pxd | 0 python/obitools3/obidms/_obidmscolumn.pxd | 54 ---- python/obitools3/obidms/_obidmscolumn.pyx | 200 ------------ .../obitools3/obidms/_obidmscolumn_bool.pxd | 14 - .../obitools3/obidms/_obidmscolumn_bool.pyx | 77 ----- .../obidms/_obidmscolumn_char.cfiles | 65 ---- .../obitools3/obidms/_obidmscolumn_char.pxd | 14 - .../obitools3/obidms/_obidmscolumn_char.pyx | 76 ----- .../obidms/_obidmscolumn_float.cfiles | 65 ---- .../obitools3/obidms/_obidmscolumn_float.pxd | 14 - .../obitools3/obidms/_obidmscolumn_float.pyx | 76 ----- .../obitools3/obidms/_obidmscolumn_int.cfiles | 65 ---- python/obitools3/obidms/_obidmscolumn_int.pxd | 14 - python/obitools3/obidms/_obidmscolumn_int.pyx | 78 ----- .../obidms/_obidmscolumn_qual.cfiles | 65 ---- .../obitools3/obidms/_obidmscolumn_qual.pxd | 20 -- .../obitools3/obidms/_obidmscolumn_qual.pyx | 189 ----------- .../obitools3/obidms/_obidmscolumn_seq.cfiles | 65 ---- python/obitools3/obidms/_obidmscolumn_seq.pxd | 15 - python/obitools3/obidms/_obidmscolumn_seq.pyx | 108 ------- .../obitools3/obidms/_obidmscolumn_str.cfiles | 65 ---- python/obitools3/obidms/_obidmscolumn_str.pxd | 14 - python/obitools3/obidms/_obidmscolumn_str.pyx | 84 ----- python/obitools3/obidms/capi/obierrno.pxd | 5 - python/obitools3/utils.pxd | 5 +- python/obitools3/utils.pyx | 30 ++ src/obidmscolumn.c | 4 +- src/obidmscolumn.h | 17 +- 58 files changed, 732 insertions(+), 1525 deletions(-) rename python/obitools3/{obidms => dms}/__init__.py (100%) rename python/obitools3/{obidms => dms}/_obidms.cfiles (100%) rename python/obitools3/{obidms => dms}/_obidms.pxd (100%) rename python/obitools3/{obidms => dms}/_obidms.pyx (93%) rename python/obitools3/{obidms => dms}/_obidmscolumn.cfiles (100%) create mode 100644 python/obitools3/dms/_obidmscolumn.pxd create mode 100644 python/obitools3/dms/_obidmscolumn.pyx rename python/obitools3/{obidms => dms}/_obidmscolumn_bool.cfiles (100%) create mode 100644 python/obitools3/dms/_obidmscolumn_bool.pxd create mode 100644 python/obitools3/dms/_obidmscolumn_bool.pyx rename python/obitools3/{obidms => dms}/_obiseq.cfiles (100%) rename python/obitools3/{obidms => dms}/_obiseq.pxd (92%) rename python/obitools3/{obidms => dms}/_obiseq.pyx (100%) rename python/obitools3/{obidms => dms}/_obitaxo.cfiles (100%) rename python/obitools3/{obidms => dms}/_obitaxo.pxd (100%) rename python/obitools3/{obidms => dms}/_obitaxo.pyx (100%) rename python/obitools3/{obidms => dms}/_obiview.pxd (64%) rename python/obitools3/{obidms => dms}/_obiview.pyx (81%) rename python/obitools3/{obidms => dms}/_obiview_nuc_seq.pxd (100%) rename python/obitools3/{obidms => dms}/_obiview_nuc_seq.pyx (100%) rename python/obitools3/{obidms => dms}/_obiview_nuc_seq_qual.pxd (100%) rename python/obitools3/{obidms => dms}/_obiview_nuc_seq_qual.pyx (100%) rename python/obitools3/{obidms => dms}/capi/__init__.py (100%) rename python/obitools3/{obidms => dms}/capi/obialign.pxd (100%) rename python/obitools3/{obidms => dms}/capi/obidms.pxd (100%) rename python/obitools3/{obidms => dms}/capi/obidmscolumn.pxd (99%) create mode 100644 python/obitools3/dms/capi/obierrno.pxd rename python/obitools3/{obidms => dms}/capi/obitaxonomy.pxd (100%) rename python/obitools3/{obidms => dms}/capi/obitypes.pxd (100%) rename python/obitools3/{obidms => dms}/capi/obiutils.pxd (100%) rename python/obitools3/{obidms => dms}/capi/obiview.pxd (100%) delete mode 100644 python/obitools3/obidms/_obidmscolumn.pxd delete mode 100644 python/obitools3/obidms/_obidmscolumn.pyx delete mode 100644 python/obitools3/obidms/_obidmscolumn_bool.pxd delete mode 100644 python/obitools3/obidms/_obidmscolumn_bool.pyx delete mode 100644 python/obitools3/obidms/_obidmscolumn_char.cfiles delete mode 100644 python/obitools3/obidms/_obidmscolumn_char.pxd delete mode 100644 python/obitools3/obidms/_obidmscolumn_char.pyx delete mode 100644 python/obitools3/obidms/_obidmscolumn_float.cfiles delete mode 100644 python/obitools3/obidms/_obidmscolumn_float.pxd delete mode 100644 python/obitools3/obidms/_obidmscolumn_float.pyx delete mode 100644 python/obitools3/obidms/_obidmscolumn_int.cfiles delete mode 100644 python/obitools3/obidms/_obidmscolumn_int.pxd delete mode 100644 python/obitools3/obidms/_obidmscolumn_int.pyx delete mode 100644 python/obitools3/obidms/_obidmscolumn_qual.cfiles delete mode 100644 python/obitools3/obidms/_obidmscolumn_qual.pxd delete mode 100644 python/obitools3/obidms/_obidmscolumn_qual.pyx delete mode 100644 python/obitools3/obidms/_obidmscolumn_seq.cfiles delete mode 100644 python/obitools3/obidms/_obidmscolumn_seq.pxd delete mode 100644 python/obitools3/obidms/_obidmscolumn_seq.pyx delete mode 100644 python/obitools3/obidms/_obidmscolumn_str.cfiles delete mode 100644 python/obitools3/obidms/_obidmscolumn_str.pxd delete mode 100644 python/obitools3/obidms/_obidmscolumn_str.pyx delete mode 100644 python/obitools3/obidms/capi/obierrno.pxd diff --git a/python/obitools3/obidms/__init__.py b/python/obitools3/dms/__init__.py similarity index 100% rename from python/obitools3/obidms/__init__.py rename to python/obitools3/dms/__init__.py diff --git a/python/obitools3/obidms/_obidms.cfiles b/python/obitools3/dms/_obidms.cfiles similarity index 100% rename from python/obitools3/obidms/_obidms.cfiles rename to python/obitools3/dms/_obidms.cfiles diff --git a/python/obitools3/obidms/_obidms.pxd b/python/obitools3/dms/_obidms.pxd similarity index 100% rename from python/obitools3/obidms/_obidms.pxd rename to python/obitools3/dms/_obidms.pxd diff --git a/python/obitools3/obidms/_obidms.pyx b/python/obitools3/dms/_obidms.pyx similarity index 93% rename from python/obitools3/obidms/_obidms.pyx rename to python/obitools3/dms/_obidms.pyx index 8a51ef4..d0134b7 100644 --- a/python/obitools3/obidms/_obidms.pyx +++ b/python/obitools3/dms/_obidms.pyx @@ -10,7 +10,13 @@ from .capi.obidmscolumn cimport obi_close_column, \ OBIDMS_column_header_p from .capi.obiutils cimport obi_format_date - + +from .capi.obiview cimport Obiview_p, \ + Obiview_infos_p, \ + Alias_column_pair_p, \ + obi_view_map_file, \ + obi_view_unmap_file + from .capi.obitypes cimport const_char_p, \ OBIType_t, \ OBI_INT, \ @@ -23,11 +29,6 @@ from .capi.obitypes cimport const_char_p, \ name_data_type, \ only_ATGC # discuss -from ._obidms cimport OBIDMS, \ - OBIDMS_column, \ - OBIView, \ - OBIView_line - from ._obitaxo cimport OBI_Taxonomy diff --git a/python/obitools3/obidms/_obidmscolumn.cfiles b/python/obitools3/dms/_obidmscolumn.cfiles similarity index 100% rename from python/obitools3/obidms/_obidmscolumn.cfiles rename to python/obitools3/dms/_obidmscolumn.cfiles diff --git a/python/obitools3/dms/_obidmscolumn.pxd b/python/obitools3/dms/_obidmscolumn.pxd new file mode 100644 index 0000000..dc1be0d --- /dev/null +++ b/python/obitools3/dms/_obidmscolumn.pxd @@ -0,0 +1,41 @@ +#cython: language_level=3 + +from .capi.obidmscolumn cimport OBIDMS_column_p, \ + OBIDMS_column_header_p, \ + obi_close_column, \ + obi_column_prepare_to_get_value + +from .capi.obiview cimport Obiview_p, \ + obi_view_get_pointer_on_column_in_view + +from .capi.obitypes cimport obiversion_t, \ + OBIType_t, \ + index_t, \ + name_data_type + +from .capi.obiutils cimport obi_format_date + +from ._obiview cimport OBIView + +cdef class OBIDMS_column: + + cdef bytes _alias # associated property: alias + cdef OBIDMS_column_p* _pointer + cdef OBIView _view + + cpdef close(self) + + @staticmethod + cdef type get_subclass_type(OBIDMS_column_p column_p) + +cdef class OBIDMS_column_line: + + cdef OBIDMS_column _column + cdef OBIDMS_column_p _column_p + cdef OBIDMS_column_p* _column_pp + cdef index_t _index + cdef int _len + + cpdef update(self, data) + +cdef register_column_class(OBIType_t obitype,type classe) diff --git a/python/obitools3/dms/_obidmscolumn.pyx b/python/obitools3/dms/_obidmscolumn.pyx new file mode 100644 index 0000000..1d17d00 --- /dev/null +++ b/python/obitools3/dms/_obidmscolumn.pyx @@ -0,0 +1,182 @@ +#cython: language_level=3 + +cdef dict __OBIDMS_COLUMN_CLASS__ = {} + +cdef class Column : + """ + The OBIDMS.Column class + """ + + # Note: should only be initialized through a subclass + def __init__(self, + View view, + object name): + ''' + Create a new OBDMS column objected referring to a already created column + in the context of a view. + + This constructor is normally only called by subclass constructor. + + @param view: The view object containing the column. + @type view: OBIView + @param name: The name of the column in the view + @type name: a `str` or a `bytes` + ''' + + cdef OBIDMS_column_p* column_pp + + # Check that the class is only created as a subclass instance + if type(self)==Column or not isinstance(self, Column): + raise RuntimeError('OBIDMS.Column constructor cannot be called directly') + + column_pp = obi_view_get_pointer_on_column_in_view(view._pointer, + tobytes(column_alias)) + + # Fill structure + self._alias = column_alias + self._pointer = column_pp + self._view = view + + def __len__(self): + ''' + implements the len() function for the Column class + + @rtype: `int` + ''' + return self.lines_used + + def __sizeof__(self): + ''' + returns the size of the C object wrapped by the Column instance + ''' + cdef OBIDMS_column_header_p header = self._pointer[0].header + return header.header_size + header.data_size + + def __iter__(self): + cdef index_t line_nb + + for line_nb in range(self.lines_used): + yield self[line_nb] + + def __str__(self) : + cdef str to_print + to_print = '' + for line in self : + to_print = to_print + str(line) + "\n" + return to_print + + def __repr__(self) : + return b"%s, original name: %s, version %d, data type: %d" % ( + self._alias, + self.original_name, + self.version, + self.data_type + ) + + cpdef close(self): + if obi_close_column((self._pointer)[0]) < 0 : + raise Exception("Problem closing a column") + + # Column alias property getter and setter + @property + def alias(self): + return self._alias + @alias.setter + def alias(self, new_alias): # @DuplicatedSignature + self._view.change_column_alias(self._alias, new_alias) + + # elements_names property getter + @property + def elements_names(self): + return (((self._pointer)[0].header).elements_names).split(b';') + + # nb_elements_per_line property getter + @property + def nb_elements_per_line(self): + return ((self._pointer)[0].header).nb_elements_per_line + + # data_type property getter + @property + def data_type(self): + return name_data_type(((self._pointer)[0].header).returned_data_type) + + # original_name property getter + @property + def original_name(self): + return ((self._pointer)[0].header).name + + # version property getter + @property + def version(self): + return ((self._pointer)[0].header).version + + # lines_used property getter + @property + def lines_used(self): + return (self._pointer)[0].header.lines_used + + # comments property getter + @property + def comments(self): + return (self._pointer)[0].header.comments + + # creation_date property getter + @property + def creation_date(self): + return obi_format_date((self._pointer)[0].header.creation_date) + + @staticmethod + cdef type get_subclass_type(OBIDMS_column_p column_p) : + + cdef type subclass + cdef OBIType_t col_type + + col_type = column_p.header.returned_data_type + subclass = __OBIDMS_COLUMN_CLASS__[col_type] + + return subclass + + + + +###################################################################################################### + + +cdef class OBIDMS_column_line : + + def __init__(self, OBIDMS_column column, index_t line_nb) : + self._index = line_nb + self._column = column + self._column_pp = column._pointer + self._column_p = NULL + self._len = self._column_pp[0].header.nb_elements_per_line + + if obi_column_prepare_to_get_value(self._column_pp[0],line_nb) < 0: + raise IndexError("Cannot access to the line %d" % line_nb) + + + def __contains__(self, str element_name): + return (element_name in self._column.elements_names) + + def __repr__(self) : + return str(self._column.get_line(self._index)) + + cpdef update(self, data): + if isinstance(data, dict): + data=data.items() + for key,value in data: + if key in self: + self[key]=value + + +###################################################################################################### + + +cdef register_column_class(OBIType_t obitype,type classe): + """ + Each sub class of `OBIDMS_column` needs to be registered after its declaration + to declare its relationship with an `OBIType_t` + """ + assert issubclass(classe,OBIDMS_column) + + __OBIDMS_COLUMN_CLASS__[obitype]=classe diff --git a/python/obitools3/obidms/_obidmscolumn_bool.cfiles b/python/obitools3/dms/_obidmscolumn_bool.cfiles similarity index 100% rename from python/obitools3/obidms/_obidmscolumn_bool.cfiles rename to python/obitools3/dms/_obidmscolumn_bool.cfiles diff --git a/python/obitools3/dms/_obidmscolumn_bool.pxd b/python/obitools3/dms/_obidmscolumn_bool.pxd new file mode 100644 index 0000000..deaba52 --- /dev/null +++ b/python/obitools3/dms/_obidmscolumn_bool.pxd @@ -0,0 +1,57 @@ +#cython: language_level=3 + +from .capi.obiview cimport obi_get_bool_with_elt_name_and_col_p_in_view, \ + obi_get_bool_with_elt_idx_and_col_p_in_view, \ + obi_set_bool_with_elt_name_and_col_p_in_view, \ + obi_set_bool_with_elt_idx_and_col_p_in_view + +from cpython.bool cimport bool, PyBool_FromLong +from .capi.obitypes cimport index_t, \ + const_char_p, \ + OBIType_t, \ + obibool_t, \ + OBI_BOOL, \ + OBIBool_NA + +from .capi.obierrno cimport obi_errno + +from ._obidmscolumn cimport OBIDMS_column, \ + OBIDMS_column_line, \ + OBIDMS_column_p, \ + register_column_class + +from .capi.obidmscolumn cimport obi_column_get_obibool_with_elt_name, \ + obi_column_get_obibool_with_elt_idx, \ + obi_column_set_obibool_with_elt_name, \ + obi_column_set_obibool_with_elt_idx + + +from obitools3.utils cimport str2bytes, bytes2str + +cdef class OBIDMS_column_line_bool(OBIDMS_column_line) : + cdef update_pointer(self) + + @staticmethod + cdef bool obibool_t2bool(obibool_t value) + + @staticmethod + cdef bool2obibool_t(bool value) + + cpdef bool get_bool_item_by_name(self,bytes element_name) + cpdef bool get_bool_item_by_idx(self,index_t index) + cpdef set_bool_item_by_name(self,bytes element_name,bool value) + cpdef set_bool_item_by_idx(self,index_t index,bool value) + + +# cdef obibool_t [:] _data_view + +cdef class OBIDMS_column_bool(OBIDMS_column): + cdef OBIDMS_column _new(OBIView view, + bytes column_name, + index_t nb_elements_per_line=1, + object elements_names=None, + bytes comments=b""): + + cpdef object get_line(self, index_t line_nb) + cpdef set_line(self, index_t line_nb, object value) + diff --git a/python/obitools3/dms/_obidmscolumn_bool.pyx b/python/obitools3/dms/_obidmscolumn_bool.pyx new file mode 100644 index 0000000..20d3328 --- /dev/null +++ b/python/obitools3/dms/_obidmscolumn_bool.pyx @@ -0,0 +1,294 @@ +#cython: language_level=3 + + +cdef class OBIDMS_column_line_bool(OBIDMS_column_line) : + + cdef update_pointer(self): + """ + Checks if the obicolumn address changed since the last call and update + if need the `_column_p` and `_data_view` data structure fields. + """ + cdef OBIDMS_column_p column_p = self._column_pp[0] + + if column_p != self._column_p: + self._column_p = column_p +# self._data_view = ( (column_p.data)) + \ +# self._index * column_p.header.nb_elements_per_line + + @staticmethod + cdef bool obibool_t2bool(obibool_t value): + cdef bool result + + if value == OBIBool_NA : + result = None + else : + result = PyBool_FromLong(value) + + return result + + @staticmethod + cdef bool2obibool_t(bool value): + cdef obibool_t result + + if value is None: + result=OBIBool_NA + else: + result= value + + return result + + + def __init__(self, OBIDMS_column column, index_t line_nb) : + """ + Creates a new `OBIDMS_column_line_bool` + + @param column: an OBIDMS_column instance + @param line_nb: the line in the column + """ + + OBIDMS_column_line.__init__(self,column,line_nb) + self.update_pointer() + + + + cpdef bool get_bool_item_by_name(self,bytes element_name): + """ + Returns the value associated to the name `element_name` of the current line + + @param element_name: a `bytes` instance containing the name of the element + + @return: the `bool` value corresponding to the name + """ + cdef char* cname = element_name + cdef obibool_t value + global obi_errno + + self.update_pointer() + + value = obi_column_get_obibool_with_elt_name(self._column_p, + self._index, + cname) + + if obi_errno > 0 : + obi_errno = 0 + raise KeyError("Cannot access to key %s" % bytes2str(element_name)) + + return OBIDMS_column_line_bool.obibool_t2bool(value) + + cpdef bool get_bool_item_by_idx(self,index_t index): + """ + Returns the value associated to the name `element_name` of the current line + + @param index: a `int` instance containing the index of the element + + @return: the `bool` value corresponding to the name + """ + cdef obibool_t value # @DuplicatedSignature + global obi_errno + + + self.update_pointer() + + value = obi_column_get_obibool_with_elt_idx(self._column_p, + self._index, + index) + + if obi_errno > 0 : + obi_errno = 0 + raise IndexError("Cannot access to element %d" % index) + + return OBIDMS_column_line_bool.obibool_t2bool(value) + + + def __getitem__(self, object element_name) : + cdef bytes name + cdef int cindex + cdef obibool_t value + cdef type typearg = type(element_name) + cdef bool result + + + if typearg == int: + cindex=element_name + if cindex < 0: + cindex = self._len - cindex + result=self.get_bool_item_by_idx(cindex) + elif typearg == bytes: + result=self.get_bool_item_by_name(element_name) + elif typearg == str: + name = str2bytes(element_name) + result=self.get_bool_item_by_name(name) + + return result + + cpdef set_bool_item_by_name(self,bytes element_name,bool value): + """ + Sets the value associated to the name `element_name` of the current line + + @param element_name: a `bytes` instance containing the name of the element + @param value: a `bool` instance of the new value + + @return: the `bool` value corresponding to the name + """ + cdef char* cname = element_name + cdef obibool_t cvalue + + self.update_pointer() + cvalue = OBIDMS_column_line_bool.bool2obibool_t(value) + + if ( obi_column_set_obibool_with_elt_name(self._column_p, + self._index, + cname, + cvalue) < 0 ): + raise KeyError("Cannot access to key %s" % bytes2str(element_name)) + + cpdef set_bool_item_by_idx(self,index_t index,bool value): + """ + Sets the value associated to the name `element_name` of the current line + + @param index: a `int` instance containing the index of the element + @param value: a `bool` instance of the new value + + @return: the `bool` value corresponding to the name + """ + cdef obibool_t cvalue # @DuplicatedSignature + + self.update_pointer() + cvalue = OBIDMS_column_line_bool.bool2obibool_t(value) + + if ( obi_column_set_obibool_with_elt_idx(self._column_p, + self._index, + index, + cvalue) < 0 ): + raise IndexError("Cannot access to item index %d" % index) + + + + def __setitem__(self, object element_name, object value): + cdef bytes name + cdef int cindex + cdef type typearg = type(element_name) + cdef bool result + + + if typearg == int: + cindex=element_name + if cindex < 0: + cindex = self._len - cindex + self.set_bool_item_by_idx(cindex,value) + elif typearg == bytes: + self.set_bool_item_by_name(element_name,value) + elif typearg == str: + name = str2bytes(element_name) + self.set_bool_item_by_name(name,value) + + def __repr__(self) : + return str(self._column.get_line(self._index)) + + def __len__(self): + return self._len + + + +cdef class OBIDMS_column_bool(OBIDMS_column): + + @staticmethod + cdef OBIDMS_column _new(OBIView view, + bytes column_name, + index_t nb_elements_per_line=1, + object elements_names=None, + bytes comments=b""): + + cdef bytes elements_names_b + cdef char* elements_names_p + cdef OBIDMS_column new_column + + if elements_names is not None: + elements_names_b = b''.join([tobytes(x) for x in elements_names]) + elements_names_p = elements_names_b + else: + elements_names_p = NULL + + if (obi_view_add_column(view = view._pointer, + column_name = column_name, + version_number = -1, + alias = NULL, + data_type = OBI_BOOL, + nb_lines = len(view), + nb_elements_per_line = nb_elements_per_line, + elements_names = elements_names_p, + indexer_name = NULL, + associated_column_name = NULL, + associated_column_version = -1, + comments = comments, + create = True)<0): + raise RuntimeError("Cannot create column %s in view %s" % (bytes2str(column_name), + bytes2str(view.name))) + + view.__init_columns__() + new_column = self._columns[column_name] + + return new_column + + @staticmethod + def new(OBIView view, + object column_name, + index_t nb_elements_per_line=1, + object elements_names=None, + object comments=b""): + + return OBIDMS_column_bool._new(view, + tobytes(column_name), + nb_elements_per_line, + elements_names, + tobytes(comments)) + + cpdef add_to_view(self, + OBIView view, + object column_name=None, + object comments=b""): + + cdef OBIDMS_column_p column_p = self._column_pp[0] + cdef bytes alias + + if (column_name is None): + alias = self._alias + else: + alias = tobytes(column_name) + + obi_view_add_column(view = view._ponter, + column_name = column_p.header.name, + version_number = column_p.header.version, + alias = alias, + data_type = OBI_BOOL, + nb_lines = column_p.header.lines_used, + nb_elements_per_line = column_p.header.nb_elements_per_line, + elements_names = column_p.header.elements_names, + indexer_name = NULL, + associated_column_name = NULL, + associated_column_version = NULL, + comments = tobytes(comments), + create = False) + + cpdef object get_line(self, index_t line_nb): + cdef obibool_t value + cdef object result + global obi_errno + + value = obi_get_bool_with_elt_idx_and_col_p_in_view(self._view._pointer, (self._pointer)[0], line_nb, 0) + if obi_errno > 0 : + raise IndexError(line_nb) + if value == OBIBool_NA : + result = None + else : + result = PyBool_FromLong(value) + return result + + cpdef set_line(self, index_t line_nb, object value): + if value is None : + value = OBIBool_NA + if obi_set_bool_with_elt_idx_and_col_p_in_view(self._view._pointer, (self._pointer)[0], line_nb, 0, value) < 0: + raise Exception("Problem setting a value in a column") + + +register_column_class(OBI_BOOL,OBIDMS_column_bool) \ No newline at end of file diff --git a/python/obitools3/obidms/_obiseq.cfiles b/python/obitools3/dms/_obiseq.cfiles similarity index 100% rename from python/obitools3/obidms/_obiseq.cfiles rename to python/obitools3/dms/_obiseq.cfiles diff --git a/python/obitools3/obidms/_obiseq.pxd b/python/obitools3/dms/_obiseq.pxd similarity index 92% rename from python/obitools3/obidms/_obiseq.pxd rename to python/obitools3/dms/_obiseq.pxd index c8cf2a9..62ecc5e 100644 --- a/python/obitools3/obidms/_obiseq.pxd +++ b/python/obitools3/dms/_obiseq.pxd @@ -1,6 +1,6 @@ #cython: language_level=3 -from ._obidms cimport OBIView_line +from ._obiview cimport OBIView_line cdef class OBI_Seq(dict) : diff --git a/python/obitools3/obidms/_obiseq.pyx b/python/obitools3/dms/_obiseq.pyx similarity index 100% rename from python/obitools3/obidms/_obiseq.pyx rename to python/obitools3/dms/_obiseq.pyx diff --git a/python/obitools3/obidms/_obitaxo.cfiles b/python/obitools3/dms/_obitaxo.cfiles similarity index 100% rename from python/obitools3/obidms/_obitaxo.cfiles rename to python/obitools3/dms/_obitaxo.cfiles diff --git a/python/obitools3/obidms/_obitaxo.pxd b/python/obitools3/dms/_obitaxo.pxd similarity index 100% rename from python/obitools3/obidms/_obitaxo.pxd rename to python/obitools3/dms/_obitaxo.pxd diff --git a/python/obitools3/obidms/_obitaxo.pyx b/python/obitools3/dms/_obitaxo.pyx similarity index 100% rename from python/obitools3/obidms/_obitaxo.pyx rename to python/obitools3/dms/_obitaxo.pyx diff --git a/python/obitools3/obidms/_obiview.pxd b/python/obitools3/dms/_obiview.pxd similarity index 64% rename from python/obitools3/obidms/_obiview.pxd rename to python/obitools3/dms/_obiview.pxd index ecbac30..48fc4f5 100644 --- a/python/obitools3/obidms/_obiview.pxd +++ b/python/obitools3/dms/_obiview.pxd @@ -1,5 +1,9 @@ #cython: language_level=3 +from .capi.obitypes cimport obiversion_t, \ + index_t, \ + only_ATGC + from .capi.obiview cimport Obiview_p, \ Obiview_infos_p, \ Alias_column_pair_p, \ @@ -21,45 +25,55 @@ from .capi.obiview cimport Obiview_p, \ ID_COLUMN, \ DEFINITION_COLUMN, \ QUALITY_COLUMN + +from ._obidmscolumn cimport OBIDMS_column_p, \ + OBIDMS_column + +from ._obidms cimport OBIDMS +from obitools3.utils cimport tobytes, \ + bytes2str, \ + tostr cdef class OBIView: + cdef OBIDMS _dms cdef Obiview_p _pointer cdef dict _columns - cdef __init_columns__(self): + cdef __init_columns__(self) cpdef OBIView clone(self, - str view_name, - OBIView_line_selection line_selection=*, - str comments=*) + view_name, + comments=*) @staticmethod - cpdef OBIView new(OBIDMS dms, - str view_name, - str comments=*) + cdef OBIView _new(OBIDMS dms, + bytes view_name, + bytes comments=*) @staticmethod - cpdef OBIView open(OBIDMS dms, - str view_name) + cdef OBIView _open(OBIDMS dms, + bytes view_name) - cpdef delete_column(self, str column_name) + cpdef delete_column(self, column_name) cpdef add_column(self, str column_name, obiversion_t version_number=*, - str alias=*, - str type=*, + object alias=*, + object type=*, index_t nb_lines=*, index_t nb_elements_per_line=*, list elements_names=*, - str indexer_name=*, - str associated_column_name=*, + object indexer_name=*, + object associated_column_name=*, obiversion_t associated_column_version=*, - str comments=*, + object comments=*, bint create=* - ) - cpdef change_column_alias(self, str current_alias, str new_alias) - cpdef update_column_pointers(self) + ) + + + cpdef change_column_alias(self, bytes current_alias, bytes new_alias) + cdef update_column_pointers(self) cpdef OBIView_line_selection new_selection(self, list lines=*) diff --git a/python/obitools3/obidms/_obiview.pyx b/python/obitools3/dms/_obiview.pyx similarity index 81% rename from python/obitools3/obidms/_obiview.pyx rename to python/obitools3/dms/_obiview.pyx index 519e441..8b8bf92 100644 --- a/python/obitools3/obidms/_obiview.pyx +++ b/python/obitools3/dms/_obiview.pyx @@ -3,84 +3,100 @@ cdef class OBIView : - def __init__(self,int __internalCall__): + def __init__(self,dms,int __internalCall__): if __internalCall__!=987654: raise RuntimeError('OBIView constructor cannot be called directly') + self._dms = dms self._pointer = NULL self._columns = {} cdef __init_columns__(self): cdef size_t i - cdef str col_alias + cdef bytes col_alias cdef OBIDMS_column_p column_p cdef Obiview_p pointer = self._pointer self._columns = {} for i in range(pointer.infos.column_count) : - col_alias = bytes2str(pointer.infos.column_references[i].alias) + col_alias = pointer.infos.column_references[i].alias column_p = (pointer.columns)[i] subclass = OBIDMS_column.get_subclass_type(column_p) self._columns[col_alias] = subclass(self, col_alias) cpdef OBIView clone(self, - str view_name, - str comments=""): + view_name, + comments=b""): - cdef OBIView view = OBIView(987654) + cdef OBIView view = OBIView(self._dms, + 987654) view._pointer = obi_new_view(self._pointer.dms, - str2bytes(view_name), + tobytes(view_name), self._pointer, NULL, - str2bytes(comments)) + tobytes(comments)) if view._pointer == NULL : raise RuntimeError("Error : Cannot clone view %s into view %s" % (str(self.name), - view_name) + tobytes(view_name)) ) - view.__init_columns__(self) + view.__init_columns__() return view @staticmethod - cpdef OBIView new(OBIDMS dms, - str view_name, - str comments=""): + cdef OBIView _new(OBIDMS dms, + bytes view_name, + bytes comments=b""): - cdef OBIView view = OBIView(987654) # @DuplicatedSignature + cdef OBIView view = OBIView(dms, + 987654) # @DuplicatedSignature view._pointer = obi_new_view(dms._pointer, - str2bytes(view_name), + view_name, NULL, NULL, - str2bytes(comments)) + comments) if view._pointer == NULL : raise RuntimeError("Error : Cannot create view %s" % view_name) - view.__init_columns__(self) + view.__init_columns__() return view - + @staticmethod - cpdef OBIView open(OBIDMS dms, - str view_name): + def new(OBIDMS dms, + view_name, + comments=b""): + return OBIView._new(dms,tobytes(view_name),tobytes(comments)) + + + @staticmethod + cdef OBIView _open(OBIDMS dms, + bytes view_name): - cdef OBIView view = OBIView(987654) # @DuplicatedSignature + cdef OBIView view = OBIView(dms, + 987654) # @DuplicatedSignature view._pointer = obi_open_view(dms._pointer, - str2bytes(view_name)) + view_name) if view._pointer == NULL : - raise RuntimeError("Error : Cannot open view %s" % view_name) + raise RuntimeError("Error : Cannot open view %s" % bytes2str(view_name)) - view.__init_columns__(self) + view.__init_columns__() return view + + @staticmethod + def open(OBIDMS dms, # @ReservedAssignment + view_name): + return OBIView._open(dms,tobytes(view_name)) def __dealloc__(self): if (obi_save_and_close_view(self._pointer) < 0) : @@ -95,46 +111,45 @@ cdef class OBIView : return s - cpdef delete_column(self, str column_name) : - cdef str column_n - if obi_view_delete_column(self._pointer, str2bytes(column_name)) < 0 : - raise Exception("Problem deleting a column from a view") + cpdef delete_column(self, column_name) : + if obi_view_delete_column(self._pointer, tobytes(column_name)) < 0 : + raise Exception("Problem deleting column %s from a view", + tostr(column_name)) # Update the dictionary of column objects: (self._columns).pop(column_name) self.update_column_pointers() - - + cpdef add_column(self, str column_name, obiversion_t version_number=-1, - str alias='', - str type='', + object alias=None, + object type=b'', index_t nb_lines=0, index_t nb_elements_per_line=1, list elements_names=None, - str indexer_name="", - str associated_column_name="", + object indexer_name=b"", + object associated_column_name=b"", obiversion_t associated_column_version=-1, - str comments="", + object comments=b"", bint create=True ) : cdef bytes column_name_b cdef bytes elements_names_b + cdef bytes alias_b cdef object subclass cdef OBIDMS_column_p column_p - column_name_b = str2bytes(column_name) - if alias == '' : - alias = column_name + column_name_b = tobytes(column_name) + if alias is None : alias_b = column_name_b else : - alias_b = str2bytes(alias) + alias_b = tobytes(alias) if elements_names is None : - elements_names_b = str2bytes("") + elements_names_b = b"" else : - elements_names_b = str2bytes(';'.join(elements_names)) + elements_names_b = b';'.join([tobytes(i) for i in elements_names]) if type : # TODO make C function that does that if type == 'OBI_INT' : @@ -169,9 +184,9 @@ cdef class OBIView : (self._columns)[alias] = subclass(self, alias) - cpdef change_column_alias(self, str current_alias, str new_alias): + cpdef change_column_alias(self, bytes current_alias, bytes new_alias): cdef OBIDMS_column column - if (obi_view_create_column_alias(self._pointer, str2bytes(current_alias), str2bytes(new_alias)) < 0) : + if (obi_view_create_column_alias(self._pointer, current_alias, new_alias) < 0) : raise Exception("Problem changing a column alias") # Update the dictionaries of column objects self._columns[new_alias] = self._columns[current_alias] @@ -180,7 +195,7 @@ cdef class OBIView : (self._columns).pop(current_alias) - cpdef update_column_pointers(self): + cdef update_column_pointers(self): cdef str column_n cdef OBIDMS_column column for column_n in self._columns : @@ -227,6 +242,10 @@ cdef class OBIView : return to_print + @property + def dms(self): + return self._dms + # line_count property getter @property def line_count(self): @@ -317,7 +336,7 @@ cdef class OBIView_line_selection(list): view_name) ) - view.__init_columns__(self) + view.__init_columns__() return view diff --git a/python/obitools3/obidms/_obiview_nuc_seq.pxd b/python/obitools3/dms/_obiview_nuc_seq.pxd similarity index 100% rename from python/obitools3/obidms/_obiview_nuc_seq.pxd rename to python/obitools3/dms/_obiview_nuc_seq.pxd diff --git a/python/obitools3/obidms/_obiview_nuc_seq.pyx b/python/obitools3/dms/_obiview_nuc_seq.pyx similarity index 100% rename from python/obitools3/obidms/_obiview_nuc_seq.pyx rename to python/obitools3/dms/_obiview_nuc_seq.pyx diff --git a/python/obitools3/obidms/_obiview_nuc_seq_qual.pxd b/python/obitools3/dms/_obiview_nuc_seq_qual.pxd similarity index 100% rename from python/obitools3/obidms/_obiview_nuc_seq_qual.pxd rename to python/obitools3/dms/_obiview_nuc_seq_qual.pxd diff --git a/python/obitools3/obidms/_obiview_nuc_seq_qual.pyx b/python/obitools3/dms/_obiview_nuc_seq_qual.pyx similarity index 100% rename from python/obitools3/obidms/_obiview_nuc_seq_qual.pyx rename to python/obitools3/dms/_obiview_nuc_seq_qual.pyx diff --git a/python/obitools3/obidms/capi/__init__.py b/python/obitools3/dms/capi/__init__.py similarity index 100% rename from python/obitools3/obidms/capi/__init__.py rename to python/obitools3/dms/capi/__init__.py diff --git a/python/obitools3/obidms/capi/obialign.pxd b/python/obitools3/dms/capi/obialign.pxd similarity index 100% rename from python/obitools3/obidms/capi/obialign.pxd rename to python/obitools3/dms/capi/obialign.pxd diff --git a/python/obitools3/obidms/capi/obidms.pxd b/python/obitools3/dms/capi/obidms.pxd similarity index 100% rename from python/obitools3/obidms/capi/obidms.pxd rename to python/obitools3/dms/capi/obidms.pxd diff --git a/python/obitools3/obidms/capi/obidmscolumn.pxd b/python/obitools3/dms/capi/obidmscolumn.pxd similarity index 99% rename from python/obitools3/obidms/capi/obidmscolumn.pxd rename to python/obitools3/dms/capi/obidmscolumn.pxd index b23b85f..2562dda 100644 --- a/python/obitools3/obidms/capi/obidmscolumn.pxd +++ b/python/obitools3/dms/capi/obidmscolumn.pxd @@ -62,9 +62,7 @@ cdef extern from "obidmscolumn.h" nogil: OBIDMS_column_p obi_open_column(OBIDMS_p dms, const_char_p column_name, obiversion_t version_number) - - int obi_close_column(OBIDMS_column_p column) - + OBIDMS_column_p obi_clone_column(OBIDMS_p dms, OBIDMS_column_p line_selection, const_char_p column_name, @@ -83,6 +81,8 @@ cdef extern from "obidmscolumn.h" nogil: int obi_close_header(OBIDMS_column_header_p header) int obi_select(OBIDMS_column_p line_selection_column, index_t line_to_grep) + + int obi_column_prepare_to_get_value(OBIDMS_column_p column, index_t line_nb) cdef extern from "obidmscolumn_int.h" nogil: diff --git a/python/obitools3/dms/capi/obierrno.pxd b/python/obitools3/dms/capi/obierrno.pxd new file mode 100644 index 0000000..7ba7f1e --- /dev/null +++ b/python/obitools3/dms/capi/obierrno.pxd @@ -0,0 +1,5 @@ +#cython: language_level=3 + + +cdef extern from "obierrno.h": + int obi_errno diff --git a/python/obitools3/obidms/capi/obitaxonomy.pxd b/python/obitools3/dms/capi/obitaxonomy.pxd similarity index 100% rename from python/obitools3/obidms/capi/obitaxonomy.pxd rename to python/obitools3/dms/capi/obitaxonomy.pxd diff --git a/python/obitools3/obidms/capi/obitypes.pxd b/python/obitools3/dms/capi/obitypes.pxd similarity index 100% rename from python/obitools3/obidms/capi/obitypes.pxd rename to python/obitools3/dms/capi/obitypes.pxd diff --git a/python/obitools3/obidms/capi/obiutils.pxd b/python/obitools3/dms/capi/obiutils.pxd similarity index 100% rename from python/obitools3/obidms/capi/obiutils.pxd rename to python/obitools3/dms/capi/obiutils.pxd diff --git a/python/obitools3/obidms/capi/obiview.pxd b/python/obitools3/dms/capi/obiview.pxd similarity index 100% rename from python/obitools3/obidms/capi/obiview.pxd rename to python/obitools3/dms/capi/obiview.pxd diff --git a/python/obitools3/obidms/_obidmscolumn.pxd b/python/obitools3/obidms/_obidmscolumn.pxd deleted file mode 100644 index 3c9460a..0000000 --- a/python/obitools3/obidms/_obidmscolumn.pxd +++ /dev/null @@ -1,54 +0,0 @@ -#cython: language_level=3 - -from .capi.obidmscolumn cimport OBIDMS_column_p -from .capi.obiview cimport Obiview_p -from .capi.obitypes cimport obiversion_t, OBIType_t, index_t - - -from ._obidmscolumn_int cimport OBIDMS_column_int, \ - OBIDMS_column_multi_elts_int - -from ._obidmscolumn_float cimport OBIDMS_column_float, \ - OBIDMS_column_multi_elts_float - -from ._obidmscolumn_bool cimport OBIDMS_column_bool, \ - OBIDMS_column_multi_elts_bool - -from ._obidmscolumn_char cimport OBIDMS_column_char, \ - OBIDMS_column_multi_elts_char - -from ._obidmscolumn_qual cimport OBIDMS_column_qual, \ - OBIDMS_column_multi_elts_qual - -from ._obidmscolumn_str cimport OBIDMS_column_str, \ - OBIDMS_column_multi_elts_str - -from ._obidmscolumn_seq cimport OBIDMS_column_seq, \ - OBIDMS_column_multi_elts_seq - - -from ._obiview cimport OBIView - -cdef class OBIDMS_column: - - cdef str _alias # associated property: alias - cdef OBIDMS_column_p* _pointer - cdef OBIView _view - - cpdef close(self) - - @staticmethod - cdef object get_subclass_type(OBIDMS_column_p column_p) - - -cdef class OBIDMS_column_multi_elts(OBIDMS_column): - - cpdef set_line(self, index_t line_nb, dict values) - - -cdef class OBIDMS_column_line: - - cdef OBIDMS_column _column - cdef index_t _index - -cdef register_column_class(OBIType_t obitype,type classe) diff --git a/python/obitools3/obidms/_obidmscolumn.pyx b/python/obitools3/obidms/_obidmscolumn.pyx deleted file mode 100644 index 5bf5673..0000000 --- a/python/obitools3/obidms/_obidmscolumn.pyx +++ /dev/null @@ -1,200 +0,0 @@ -#cython: language_level=3 - -cdef dict __OBIDMS_COLUMN_CLASS__ = {} - -cdef class OBIDMS_column : - - # Note: should only be initialized through a subclass - def __init__(self, OBIView view, str column_alias): - - cdef OBIDMS_column_p column_p - cdef OBIDMS_column_p* column_pp - - column_pp = obi_view_get_pointer_on_column_in_view(view._pointer, str2bytes(column_alias)) - column_p = column_pp[0] # TODO ugly cython dereferencing but can't find better - - # Fill structure - self._alias = column_alias - self._pointer = column_pp - self._view = view - - cpdef getitem(self,index_t line_nb, str element_name): - - def __setitem__(self, index_t line_nb, object value): - self.set_line(line_nb, value) - - def __getitem__(self, index_t line_nb): - return self.get_line(line_nb) - - def __len__(self): - return self.lines_used - - def __sizeof__(self): - return ((self._pointer)[0].header.header_size + (self._pointer)[0].header.data_size) - - def __iter__(self): - # Declarations - cdef index_t line_nb - # Yield each line - for line_nb in range(self.lines_used): - yield self.get_line(line_nb) - - def __str__(self) : - cdef str to_print - to_print = '' - for line in self : - to_print = to_print + str(line) + "\n" - return to_print - - def __repr__(self) : - return (self._alias + ", original name: " + self.original_name + ", version " + str(self.version) + ", data type: " + self.data_type) - - cpdef close(self): - if obi_close_column((self._pointer)[0]) < 0 : - raise Exception("Problem closing a column") - - # Column alias property getter and setter - @property - def alias(self): - return self._alias - @alias.setter - def alias(self, new_alias): # @DuplicatedSignature - self._view.change_column_alias(self._alias, new_alias) - - # elements_names property getter - @property - def elements_names(self): - return (bytes2str(((self._pointer)[0].header).elements_names)).split(';') - - # nb_elements_per_line property getter - @property - def nb_elements_per_line(self): - return ((self._pointer)[0].header).nb_elements_per_line - - # data_type property getter - @property - def data_type(self): - return bytes2str(name_data_type(((self._pointer)[0].header).returned_data_type)) - - # original_name property getter - @property - def original_name(self): - return bytes2str(((self._pointer)[0].header).name) - - # version property getter - @property - def version(self): - return ((self._pointer)[0].header).version - - # lines_used property getter - @property - def lines_used(self): - return (self._pointer)[0].header.lines_used - - # comments property getter - @property - def comments(self): - return bytes2str((self._pointer)[0].header.comments) - - # creation_date property getter - @property - def creation_date(self): - return bytes2str(obi_format_date((self._pointer)[0].header.creation_date)) - - @staticmethod - cdef object get_subclass_type(OBIDMS_column_p column_p) : - - cdef object subclass - cdef OBIDMS_column_header_p header - cdef OBIType_t col_type - cdef bint col_writable - cdef bint col_one_element_per_line - - header = column_p.header - col_type = header.returned_data_type - col_writable = column_p.writable - col_one_element_per_line = ((header.nb_elements_per_line) == 1) - - if col_type == OBI_INT : - if col_one_element_per_line : - subclass = OBIDMS_column_int - else : - subclass = OBIDMS_column_multi_elts_int - elif col_type == OBI_FLOAT : - if col_one_element_per_line : - subclass = OBIDMS_column_float - else : - subclass = OBIDMS_column_multi_elts_float - elif col_type == OBI_BOOL : - if col_one_element_per_line : - subclass = OBIDMS_column_bool - else : - subclass = OBIDMS_column_multi_elts_bool - elif col_type == OBI_CHAR : - if col_one_element_per_line : - subclass = OBIDMS_column_char - else : - subclass = OBIDMS_column_multi_elts_char - elif col_type == OBI_QUAL : - if col_one_element_per_line : - subclass = OBIDMS_column_qual - else : - subclass = OBIDMS_column_multi_elts_qual - elif col_type == OBI_STR : - if col_one_element_per_line : - subclass = OBIDMS_column_str - else : - subclass = OBIDMS_column_multi_elts_str - elif col_type == OBI_SEQ : - if col_one_element_per_line : - subclass = OBIDMS_column_seq - else : - subclass = OBIDMS_column_multi_elts_seq - else : - raise Exception("Problem with the data type") - - return subclass - - -###################################################################################################### - - -cdef class OBIDMS_column_multi_elts(OBIDMS_column) : - - def __getitem__(self, index_t line_nb): - return OBIDMS_column_line(self, line_nb) - - cpdef set_line(self, index_t line_nb, dict values): - for element_name in values : - self.set_item(line_nb, element_name, values[element_name]) - - -###################################################################################################### - - -cdef class OBIDMS_column_line : - - def __init__(self, OBIDMS_column column, index_t line_nb) : - self._index = line_nb - self._column = column - - def __getitem__(self, str element_name) : - return self._column.get_item(self._index, element_name) - - def __setitem__(self, str element_name, object value): - self._column.set_item(self._index, element_name, value) - - def __contains__(self, str element_name): - return (element_name in self._column.elements_names) - - def __repr__(self) : - return str(self._column.get_line(self._index)) - - -###################################################################################################### - - -cdef register_column_class(OBIType_t obitype,type classe): - assert issubclass(classe,OBIDMS_column) - - __OBIDMS_COLUMN_CLASS__[obitype]=classe diff --git a/python/obitools3/obidms/_obidmscolumn_bool.pxd b/python/obitools3/obidms/_obidmscolumn_bool.pxd deleted file mode 100644 index 7fd3985..0000000 --- a/python/obitools3/obidms/_obidmscolumn_bool.pxd +++ /dev/null @@ -1,14 +0,0 @@ -#cython: language_level=3 - -from .capi.obitypes cimport index_t -from ._obidms cimport OBIDMS_column, OBIDMS_column_multi_elts - - -cdef class OBIDMS_column_bool(OBIDMS_column): - cpdef object get_line(self, index_t line_nb) - cpdef set_line(self, index_t line_nb, object value) - -cdef class OBIDMS_column_multi_elts_bool(OBIDMS_column_multi_elts): - cpdef object get_item(self, index_t line_nb, str element_name) - cpdef object get_line(self, index_t line_nb) - cpdef set_item(self, index_t line_nb, str element_name, object value) diff --git a/python/obitools3/obidms/_obidmscolumn_bool.pyx b/python/obitools3/obidms/_obidmscolumn_bool.pyx deleted file mode 100644 index 148c47b..0000000 --- a/python/obitools3/obidms/_obidmscolumn_bool.pyx +++ /dev/null @@ -1,77 +0,0 @@ -#cython: language_level=3 - -from .capi.obiview cimport obi_get_bool_with_elt_name_and_col_p_in_view, \ - obi_get_bool_with_elt_idx_and_col_p_in_view, \ - obi_set_bool_with_elt_name_and_col_p_in_view, \ - obi_set_bool_with_elt_idx_and_col_p_in_view -from .capi.obierrno cimport obi_errno -from .capi.obitypes cimport OBIBool_NA, obibool_t - -from obitools3.utils cimport str2bytes - -from cpython.bool cimport PyBool_FromLong - - -cdef class OBIDMS_column_bool(OBIDMS_column): - - cpdef object get_line(self, index_t line_nb): - cdef obibool_t value - cdef object result - value = obi_get_bool_with_elt_idx_and_col_p_in_view(self._view._pointer, (self._pointer)[0], line_nb, 0) - if obi_errno > 0 : - raise IndexError(line_nb) - if value == OBIBool_NA : - result = None - else : - result = PyBool_FromLong(value) - return result - - cpdef set_line(self, index_t line_nb, object value): - if value is None : - value = OBIBool_NA - if obi_set_bool_with_elt_idx_and_col_p_in_view(self._view._pointer, (self._pointer)[0], line_nb, 0, value) < 0: - raise Exception("Problem setting a value in a column") - - -cdef class OBIDMS_column_multi_elts_bool(OBIDMS_column_multi_elts): - - cpdef object get_item(self, index_t line_nb, str element_name): - cdef obibool_t value - cdef object result - value = obi_get_bool_with_elt_name_and_col_p_in_view(self._view._pointer, (self._pointer)[0], line_nb, str2bytes(element_name)) - if obi_errno > 0 : - raise IndexError(line_nb, element_name) - if value == OBIBool_NA : - result = None - else : - result = PyBool_FromLong(value) - return result - - cpdef object get_line(self, index_t line_nb) : - cdef obibool_t value - cdef object value_in_result - cdef dict result - cdef index_t i - cdef bint all_NA - result = {} - all_NA = True - for i in range(self.nb_elements_per_line) : - value = obi_get_bool_with_elt_idx_and_col_p_in_view(self._view._pointer, (self._pointer)[0], line_nb, i) - if obi_errno > 0 : - raise IndexError(line_nb) - if value == OBIBool_NA : - value_in_result = None - else : - value_in_result = PyBool_FromLong(value) - result[self.elements_names[i]] = value_in_result - if all_NA and (value_in_result is not None) : - all_NA = False - if all_NA : - result = None - return result - - cpdef set_item(self, index_t line_nb, str element_name, object value): - if value is None : - value = OBIBool_NA - if obi_set_bool_with_elt_name_and_col_p_in_view(self._view._pointer, (self._pointer)[0], line_nb, str2bytes(element_name), value) < 0: - raise Exception("Problem setting a value in a column") diff --git a/python/obitools3/obidms/_obidmscolumn_char.cfiles b/python/obitools3/obidms/_obidmscolumn_char.cfiles deleted file mode 100644 index 84e0436..0000000 --- a/python/obitools3/obidms/_obidmscolumn_char.cfiles +++ /dev/null @@ -1,65 +0,0 @@ -../../../src/bloom.h -../../../src/bloom.c -../../../src/char_str_indexer.h -../../../src/char_str_indexer.c -../../../src/crc64.h -../../../src/crc64.c -../../../src/dna_seq_indexer.h -../../../src/dna_seq_indexer.c -../../../src/encode.h -../../../src/encode.c -../../../src/hashtable.h -../../../src/hashtable.c -../../../src/murmurhash2.h -../../../src/murmurhash2.c -../../../src/obi_align.h -../../../src/obi_align.c -../../../src/obiavl.h -../../../src/obiavl.c -../../../src/obiblob_indexer.h -../../../src/obiblob_indexer.c -../../../src/obiblob.h -../../../src/obiblob.c -../../../src/obidebug.h -../../../src/obidms_taxonomy.h -../../../src/obidms_taxonomy.c -../../../src/obidms.h -../../../src/obidms.c -../../../src/obidmscolumn_blob.c -../../../src/obidmscolumn_blob.h -../../../src/obidmscolumn_bool.c -../../../src/obidmscolumn_bool.h -../../../src/obidmscolumn_char.c -../../../src/obidmscolumn_char.h -../../../src/obidmscolumn_float.c -../../../src/obidmscolumn_float.h -../../../src/obidmscolumn_idx.h -../../../src/obidmscolumn_idx.c -../../../src/obidmscolumn_int.c -../../../src/obidmscolumn_int.h -../../../src/obidmscolumn_qual.h -../../../src/obidmscolumn_qual.c -../../../src/obidmscolumn_seq.c -../../../src/obidmscolumn_seq.h -../../../src/obidmscolumn_str.c -../../../src/obidmscolumn_str.h -../../../src/obidmscolumn.h -../../../src/obidmscolumn.c -../../../src/obidmscolumndir.h -../../../src/obidmscolumndir.c -../../../src/obierrno.h -../../../src/obierrno.c -../../../src/obilittlebigman.h -../../../src/obilittlebigman.c -../../../src/obitypes.h -../../../src/obitypes.c -../../../src/obiview.h -../../../src/obiview.c -../../../src/sse_banded_LCS_alignment.h -../../../src/sse_banded_LCS_alignment.c -../../../src/uint8_indexer.h -../../../src/uint8_indexer.c -../../../src/upperband.h -../../../src/upperband.c -../../../src/utils.h -../../../src/utils.c diff --git a/python/obitools3/obidms/_obidmscolumn_char.pxd b/python/obitools3/obidms/_obidmscolumn_char.pxd deleted file mode 100644 index 515100f..0000000 --- a/python/obitools3/obidms/_obidmscolumn_char.pxd +++ /dev/null @@ -1,14 +0,0 @@ -#cython: language_level=3 - -from .capi.obitypes cimport index_t -from ._obidms cimport OBIDMS_column, OBIDMS_column_multi_elts - - -cdef class OBIDMS_column_char(OBIDMS_column): - cpdef object get_line(self, index_t line_nb) - cpdef set_line(self, index_t line_nb, object value) - -cdef class OBIDMS_column_multi_elts_char(OBIDMS_column_multi_elts): - cpdef object get_item(self, index_t line_nb, str element_name) - cpdef object get_line(self, index_t line_nb) - cpdef set_item(self, index_t line_nb, str element_name, object value) diff --git a/python/obitools3/obidms/_obidmscolumn_char.pyx b/python/obitools3/obidms/_obidmscolumn_char.pyx deleted file mode 100644 index 9c80f11..0000000 --- a/python/obitools3/obidms/_obidmscolumn_char.pyx +++ /dev/null @@ -1,76 +0,0 @@ -#cython: language_level=3 - -from .capi.obiview cimport obi_get_char_with_elt_name_and_col_p_in_view, \ - obi_get_char_with_elt_idx_and_col_p_in_view, \ - obi_set_char_with_elt_name_and_col_p_in_view, \ - obi_set_char_with_elt_idx_and_col_p_in_view -from .capi.obierrno cimport obi_errno -from .capi.obitypes cimport OBIChar_NA, obichar_t - -from obitools3.utils cimport str2bytes, bytes2str - - -cdef class OBIDMS_column_char(OBIDMS_column): - - cpdef object get_line(self, index_t line_nb): - cdef obichar_t value - cdef object result - value = obi_get_char_with_elt_idx_and_col_p_in_view(self._view._pointer, (self._pointer)[0], line_nb, 0) - if obi_errno > 0 : - raise IndexError(line_nb) - if value == OBIChar_NA : - result = None - else : - result = bytes2str(value) - return result - - cpdef set_line(self, index_t line_nb, object value): - if value is None : - value = OBIChar_NA - if obi_set_char_with_elt_idx_and_col_p_in_view(self._view._pointer, (self._pointer)[0], line_nb, 0, str2bytes(value)[0]) < 0: - raise Exception("Problem setting a value in a column") - - -cdef class OBIDMS_column_multi_elts_char(OBIDMS_column_multi_elts): - - cpdef object get_item(self, index_t line_nb, str element_name): - cdef obichar_t value - cdef object result - value = obi_get_char_with_elt_name_and_col_p_in_view(self._view._pointer, (self._pointer)[0], line_nb, str2bytes(element_name)) - if obi_errno > 0 : - raise IndexError(line_nb, element_name) - if value == OBIChar_NA : - result = None - else : - result = bytes2str(value) - return result - - cpdef object get_line(self, index_t line_nb) : - cdef obichar_t value - cdef object value_in_result - cdef dict result - cdef index_t i - cdef bint all_NA - result = {} - all_NA = True - for i in range(self.nb_elements_per_line) : - value = obi_get_char_with_elt_idx_and_col_p_in_view(self._view._pointer, (self._pointer)[0], line_nb, i) - if obi_errno > 0 : - raise IndexError(line_nb) - if value == OBIChar_NA : - value_in_result = None - else : - value_in_result = bytes2str(value) - result[self.elements_names[i]] = value_in_result - if all_NA and (value_in_result is not None) : - all_NA = False - if all_NA : - result = None - return result - - cpdef set_item(self, index_t line_nb, str element_name, object value): - if value is None : - value = OBIChar_NA - if obi_set_char_with_elt_name_and_col_p_in_view(self._view._pointer, (self._pointer)[0], line_nb, str2bytes(element_name), str2bytes(value)[0]) < 0: - raise Exception("Problem setting a value in a column") - diff --git a/python/obitools3/obidms/_obidmscolumn_float.cfiles b/python/obitools3/obidms/_obidmscolumn_float.cfiles deleted file mode 100644 index 84e0436..0000000 --- a/python/obitools3/obidms/_obidmscolumn_float.cfiles +++ /dev/null @@ -1,65 +0,0 @@ -../../../src/bloom.h -../../../src/bloom.c -../../../src/char_str_indexer.h -../../../src/char_str_indexer.c -../../../src/crc64.h -../../../src/crc64.c -../../../src/dna_seq_indexer.h -../../../src/dna_seq_indexer.c -../../../src/encode.h -../../../src/encode.c -../../../src/hashtable.h -../../../src/hashtable.c -../../../src/murmurhash2.h -../../../src/murmurhash2.c -../../../src/obi_align.h -../../../src/obi_align.c -../../../src/obiavl.h -../../../src/obiavl.c -../../../src/obiblob_indexer.h -../../../src/obiblob_indexer.c -../../../src/obiblob.h -../../../src/obiblob.c -../../../src/obidebug.h -../../../src/obidms_taxonomy.h -../../../src/obidms_taxonomy.c -../../../src/obidms.h -../../../src/obidms.c -../../../src/obidmscolumn_blob.c -../../../src/obidmscolumn_blob.h -../../../src/obidmscolumn_bool.c -../../../src/obidmscolumn_bool.h -../../../src/obidmscolumn_char.c -../../../src/obidmscolumn_char.h -../../../src/obidmscolumn_float.c -../../../src/obidmscolumn_float.h -../../../src/obidmscolumn_idx.h -../../../src/obidmscolumn_idx.c -../../../src/obidmscolumn_int.c -../../../src/obidmscolumn_int.h -../../../src/obidmscolumn_qual.h -../../../src/obidmscolumn_qual.c -../../../src/obidmscolumn_seq.c -../../../src/obidmscolumn_seq.h -../../../src/obidmscolumn_str.c -../../../src/obidmscolumn_str.h -../../../src/obidmscolumn.h -../../../src/obidmscolumn.c -../../../src/obidmscolumndir.h -../../../src/obidmscolumndir.c -../../../src/obierrno.h -../../../src/obierrno.c -../../../src/obilittlebigman.h -../../../src/obilittlebigman.c -../../../src/obitypes.h -../../../src/obitypes.c -../../../src/obiview.h -../../../src/obiview.c -../../../src/sse_banded_LCS_alignment.h -../../../src/sse_banded_LCS_alignment.c -../../../src/uint8_indexer.h -../../../src/uint8_indexer.c -../../../src/upperband.h -../../../src/upperband.c -../../../src/utils.h -../../../src/utils.c diff --git a/python/obitools3/obidms/_obidmscolumn_float.pxd b/python/obitools3/obidms/_obidmscolumn_float.pxd deleted file mode 100644 index 2121ccd..0000000 --- a/python/obitools3/obidms/_obidmscolumn_float.pxd +++ /dev/null @@ -1,14 +0,0 @@ -#cython: language_level=3 - -from .capi.obitypes cimport index_t -from ._obidms cimport OBIDMS_column, OBIDMS_column_multi_elts - - -cdef class OBIDMS_column_float(OBIDMS_column): - cpdef object get_line(self, index_t line_nb) - cpdef set_line(self, index_t line_nb, object value) - -cdef class OBIDMS_column_multi_elts_float(OBIDMS_column_multi_elts): - cpdef object get_item(self, index_t line_nb, str element_name) - cpdef object get_line(self, index_t line_nb) - cpdef set_item(self, index_t line_nb, str element_name, object value) diff --git a/python/obitools3/obidms/_obidmscolumn_float.pyx b/python/obitools3/obidms/_obidmscolumn_float.pyx deleted file mode 100644 index 52602e2..0000000 --- a/python/obitools3/obidms/_obidmscolumn_float.pyx +++ /dev/null @@ -1,76 +0,0 @@ -#cython: language_level=3 - -from .capi.obiview cimport obi_get_float_with_elt_name_and_col_p_in_view, \ - obi_get_float_with_elt_idx_and_col_p_in_view, \ - obi_set_float_with_elt_name_and_col_p_in_view, \ - obi_set_float_with_elt_idx_and_col_p_in_view -from .capi.obierrno cimport obi_errno -from .capi.obitypes cimport OBIFloat_NA, obifloat_t - -from obitools3.utils cimport str2bytes - - -cdef class OBIDMS_column_float(OBIDMS_column): - - cpdef object get_line(self, index_t line_nb): - cdef obifloat_t value - cdef object result - value = obi_get_float_with_elt_idx_and_col_p_in_view(self._view._pointer, (self._pointer)[0], line_nb, 0) - if obi_errno > 0 : - raise IndexError(line_nb) - if value == OBIFloat_NA : - result = None - else : - result = value - return result - - cpdef set_line(self, index_t line_nb, object value): - if value is None : - value = OBIFloat_NA - if obi_set_float_with_elt_idx_and_col_p_in_view(self._view._pointer, (self._pointer)[0], line_nb, 0, value) < 0: - raise Exception("Problem setting a value in a column") - - -cdef class OBIDMS_column_multi_elts_float(OBIDMS_column_multi_elts): - - cpdef object get_item(self, index_t line_nb, str element_name): - cdef obifloat_t value - cdef object result - value = obi_get_float_with_elt_name_and_col_p_in_view(self._view._pointer, (self._pointer)[0], line_nb, str2bytes(element_name)) - if obi_errno > 0 : - raise IndexError(line_nb, element_name) - if value == OBIFloat_NA : - result = None - else : - result = value - return result - - cpdef object get_line(self, index_t line_nb) : - cdef obifloat_t value - cdef object value_in_result - cdef dict result - cdef index_t i - cdef bint all_NA - result = {} - all_NA = True - for i in range(self.nb_elements_per_line) : - value = obi_get_float_with_elt_idx_and_col_p_in_view(self._view._pointer, (self._pointer)[0], line_nb, i) - if obi_errno > 0 : - raise IndexError(line_nb) - if value == OBIFloat_NA : - value_in_result = None - else : - value_in_result = value - result[self.elements_names[i]] = value_in_result - if all_NA and (value_in_result is not None) : - all_NA = False - if all_NA : - result = None - return result - - cpdef set_item(self, index_t line_nb, str element_name, object value): - if value is None : - value = OBIFloat_NA - if obi_set_float_with_elt_name_and_col_p_in_view(self._view._pointer, (self._pointer)[0], line_nb, str2bytes(element_name), value) < 0: - raise Exception("Problem setting a value in a column") - \ No newline at end of file diff --git a/python/obitools3/obidms/_obidmscolumn_int.cfiles b/python/obitools3/obidms/_obidmscolumn_int.cfiles deleted file mode 100644 index 84e0436..0000000 --- a/python/obitools3/obidms/_obidmscolumn_int.cfiles +++ /dev/null @@ -1,65 +0,0 @@ -../../../src/bloom.h -../../../src/bloom.c -../../../src/char_str_indexer.h -../../../src/char_str_indexer.c -../../../src/crc64.h -../../../src/crc64.c -../../../src/dna_seq_indexer.h -../../../src/dna_seq_indexer.c -../../../src/encode.h -../../../src/encode.c -../../../src/hashtable.h -../../../src/hashtable.c -../../../src/murmurhash2.h -../../../src/murmurhash2.c -../../../src/obi_align.h -../../../src/obi_align.c -../../../src/obiavl.h -../../../src/obiavl.c -../../../src/obiblob_indexer.h -../../../src/obiblob_indexer.c -../../../src/obiblob.h -../../../src/obiblob.c -../../../src/obidebug.h -../../../src/obidms_taxonomy.h -../../../src/obidms_taxonomy.c -../../../src/obidms.h -../../../src/obidms.c -../../../src/obidmscolumn_blob.c -../../../src/obidmscolumn_blob.h -../../../src/obidmscolumn_bool.c -../../../src/obidmscolumn_bool.h -../../../src/obidmscolumn_char.c -../../../src/obidmscolumn_char.h -../../../src/obidmscolumn_float.c -../../../src/obidmscolumn_float.h -../../../src/obidmscolumn_idx.h -../../../src/obidmscolumn_idx.c -../../../src/obidmscolumn_int.c -../../../src/obidmscolumn_int.h -../../../src/obidmscolumn_qual.h -../../../src/obidmscolumn_qual.c -../../../src/obidmscolumn_seq.c -../../../src/obidmscolumn_seq.h -../../../src/obidmscolumn_str.c -../../../src/obidmscolumn_str.h -../../../src/obidmscolumn.h -../../../src/obidmscolumn.c -../../../src/obidmscolumndir.h -../../../src/obidmscolumndir.c -../../../src/obierrno.h -../../../src/obierrno.c -../../../src/obilittlebigman.h -../../../src/obilittlebigman.c -../../../src/obitypes.h -../../../src/obitypes.c -../../../src/obiview.h -../../../src/obiview.c -../../../src/sse_banded_LCS_alignment.h -../../../src/sse_banded_LCS_alignment.c -../../../src/uint8_indexer.h -../../../src/uint8_indexer.c -../../../src/upperband.h -../../../src/upperband.c -../../../src/utils.h -../../../src/utils.c diff --git a/python/obitools3/obidms/_obidmscolumn_int.pxd b/python/obitools3/obidms/_obidmscolumn_int.pxd deleted file mode 100644 index 4bc6711..0000000 --- a/python/obitools3/obidms/_obidmscolumn_int.pxd +++ /dev/null @@ -1,14 +0,0 @@ -#cython: language_level=3 - -from .capi.obitypes cimport index_t -from ._obidms cimport OBIDMS_column, OBIDMS_column_multi_elts - - -cdef class OBIDMS_column_int(OBIDMS_column): - cpdef object get_line(self, index_t line_nb) - cpdef set_line(self, index_t line_nb, object value) - -cdef class OBIDMS_column_multi_elts_int(OBIDMS_column_multi_elts): - cpdef object get_item(self, index_t line_nb, str element_name) - cpdef object get_line(self, index_t line_nb) - cpdef set_item(self, index_t line_nb, str element_name, object value) diff --git a/python/obitools3/obidms/_obidmscolumn_int.pyx b/python/obitools3/obidms/_obidmscolumn_int.pyx deleted file mode 100644 index bccf6b7..0000000 --- a/python/obitools3/obidms/_obidmscolumn_int.pyx +++ /dev/null @@ -1,78 +0,0 @@ -#cython: language_level=3 - -from .capi.obiview cimport obi_get_int_with_elt_name_and_col_p_in_view, \ - obi_get_int_with_elt_idx_and_col_p_in_view, \ - obi_set_int_with_elt_name_and_col_p_in_view, \ - obi_set_int_with_elt_idx_and_col_p_in_view -from .capi.obierrno cimport obi_errno -from .capi.obitypes cimport OBIInt_NA, obiint_t - -from obitools3.utils cimport str2bytes - -from cpython.int cimport PyInt_FromLong - - -cdef class OBIDMS_column_int(OBIDMS_column): - - cpdef object get_line(self, index_t line_nb): - cdef obiint_t value - cdef object result - value = obi_get_int_with_elt_idx_and_col_p_in_view(self._view._pointer, (self._pointer)[0], line_nb, 0) - if obi_errno > 0 : - raise IndexError(line_nb) - if value == OBIInt_NA : - result = None - else : - result = PyInt_FromLong(value) - return result - - cpdef set_line(self, index_t line_nb, object value): - if value is None : - value = OBIInt_NA - if obi_set_int_with_elt_idx_and_col_p_in_view(self._view._pointer, (self._pointer)[0], line_nb, 0, value) < 0: - raise Exception("Problem setting a value in a column") - - -cdef class OBIDMS_column_multi_elts_int(OBIDMS_column_multi_elts): - - cpdef object get_item(self, index_t line_nb, str element_name): - cdef obiint_t value - cdef object result - value = obi_get_int_with_elt_name_and_col_p_in_view(self._view._pointer, (self._pointer)[0], line_nb, str2bytes(element_name)) - if obi_errno > 0 : - raise IndexError(line_nb, element_name) - if value == OBIInt_NA : - result = None - else : - result = PyInt_FromLong(value) - return result - - cpdef object get_line(self, index_t line_nb) : - cdef obiint_t value - cdef object value_in_result - cdef dict result - cdef index_t i - cdef bint all_NA - result = {} - all_NA = True - for i in range(self.nb_elements_per_line) : - value = obi_get_int_with_elt_idx_and_col_p_in_view(self._view._pointer, (self._pointer)[0], line_nb, i) - if obi_errno > 0 : - raise IndexError(line_nb) - if value == OBIInt_NA : - value_in_result = None - else : - value_in_result = PyInt_FromLong(value) - result[self.elements_names[i]] = value_in_result - if all_NA and (value_in_result is not None) : - all_NA = False - if all_NA : - result = None # TODO discuss - return result - - cpdef set_item(self, index_t line_nb, str element_name, object value): - if value is None : - value = OBIInt_NA - if obi_set_int_with_elt_name_and_col_p_in_view(self._view._pointer, (self._pointer)[0], line_nb, str2bytes(element_name), value) < 0: - raise Exception("Problem setting a value in a column") - diff --git a/python/obitools3/obidms/_obidmscolumn_qual.cfiles b/python/obitools3/obidms/_obidmscolumn_qual.cfiles deleted file mode 100644 index 84e0436..0000000 --- a/python/obitools3/obidms/_obidmscolumn_qual.cfiles +++ /dev/null @@ -1,65 +0,0 @@ -../../../src/bloom.h -../../../src/bloom.c -../../../src/char_str_indexer.h -../../../src/char_str_indexer.c -../../../src/crc64.h -../../../src/crc64.c -../../../src/dna_seq_indexer.h -../../../src/dna_seq_indexer.c -../../../src/encode.h -../../../src/encode.c -../../../src/hashtable.h -../../../src/hashtable.c -../../../src/murmurhash2.h -../../../src/murmurhash2.c -../../../src/obi_align.h -../../../src/obi_align.c -../../../src/obiavl.h -../../../src/obiavl.c -../../../src/obiblob_indexer.h -../../../src/obiblob_indexer.c -../../../src/obiblob.h -../../../src/obiblob.c -../../../src/obidebug.h -../../../src/obidms_taxonomy.h -../../../src/obidms_taxonomy.c -../../../src/obidms.h -../../../src/obidms.c -../../../src/obidmscolumn_blob.c -../../../src/obidmscolumn_blob.h -../../../src/obidmscolumn_bool.c -../../../src/obidmscolumn_bool.h -../../../src/obidmscolumn_char.c -../../../src/obidmscolumn_char.h -../../../src/obidmscolumn_float.c -../../../src/obidmscolumn_float.h -../../../src/obidmscolumn_idx.h -../../../src/obidmscolumn_idx.c -../../../src/obidmscolumn_int.c -../../../src/obidmscolumn_int.h -../../../src/obidmscolumn_qual.h -../../../src/obidmscolumn_qual.c -../../../src/obidmscolumn_seq.c -../../../src/obidmscolumn_seq.h -../../../src/obidmscolumn_str.c -../../../src/obidmscolumn_str.h -../../../src/obidmscolumn.h -../../../src/obidmscolumn.c -../../../src/obidmscolumndir.h -../../../src/obidmscolumndir.c -../../../src/obierrno.h -../../../src/obierrno.c -../../../src/obilittlebigman.h -../../../src/obilittlebigman.c -../../../src/obitypes.h -../../../src/obitypes.c -../../../src/obiview.h -../../../src/obiview.c -../../../src/sse_banded_LCS_alignment.h -../../../src/sse_banded_LCS_alignment.c -../../../src/uint8_indexer.h -../../../src/uint8_indexer.c -../../../src/upperband.h -../../../src/upperband.c -../../../src/utils.h -../../../src/utils.c diff --git a/python/obitools3/obidms/_obidmscolumn_qual.pxd b/python/obitools3/obidms/_obidmscolumn_qual.pxd deleted file mode 100644 index 5015a52..0000000 --- a/python/obitools3/obidms/_obidmscolumn_qual.pxd +++ /dev/null @@ -1,20 +0,0 @@ -#cython: language_level=3 - -from .capi.obitypes cimport index_t -from ._obidms cimport OBIDMS_column , OBIDMS_column_multi_elts - - -cdef class OBIDMS_column_qual(OBIDMS_column): - cpdef object get_line(self, index_t line_nb) - cpdef object get_str_line(self, index_t line_nb) - cpdef set_line(self, index_t line_nb, object value) - cpdef set_str_line(self, index_t line_nb, object value) - - -cdef class OBIDMS_column_multi_elts_qual(OBIDMS_column_multi_elts): - cpdef object get_item(self, index_t line_nb, str element_name) - cpdef object get_str_item(self, index_t line_nb, str element_name) - cpdef object get_line(self, index_t line_nb) - cpdef object get_str_line(self, index_t line_nb) - cpdef set_item(self, index_t line_nb, str element_name, object value) - cpdef set_str_item(self, index_t line_nb, str element_name, object value) diff --git a/python/obitools3/obidms/_obidmscolumn_qual.pyx b/python/obitools3/obidms/_obidmscolumn_qual.pyx deleted file mode 100644 index bf22a53..0000000 --- a/python/obitools3/obidms/_obidmscolumn_qual.pyx +++ /dev/null @@ -1,189 +0,0 @@ -#cython: language_level=3 - -from .capi.obiview cimport obi_get_qual_char_with_elt_name_and_col_p_in_view, \ - obi_get_qual_char_with_elt_idx_and_col_p_in_view, \ - obi_set_qual_char_with_elt_name_and_col_p_in_view, \ - obi_set_qual_char_with_elt_idx_and_col_p_in_view, \ - obi_get_qual_int_with_elt_name_and_col_p_in_view, \ - obi_get_qual_int_with_elt_idx_and_col_p_in_view, \ - obi_set_qual_int_with_elt_name_and_col_p_in_view, \ - obi_set_qual_int_with_elt_idx_and_col_p_in_view - -from .capi.obierrno cimport obi_errno -from .capi.obitypes cimport OBIQual_char_NA, OBIQual_int_NA, const_char_p - -from ._obidms cimport OBIView - -from obitools3.utils cimport str2bytes, bytes2str - -from libc.stdlib cimport free -from libc.string cimport strcmp -from libc.stdint cimport uint8_t -from libc.stdlib cimport malloc - - -cdef class OBIDMS_column_qual(OBIDMS_column): - - cpdef object get_line(self, index_t line_nb): - cdef const uint8_t* value - cdef int value_length - cdef object result - cdef int i - value = obi_get_qual_int_with_elt_idx_and_col_p_in_view(self._view._pointer, (self._pointer)[0], line_nb, 0, &value_length) - if obi_errno > 0 : - raise IndexError(line_nb) - if value == OBIQual_int_NA : - result = None - else : - result = [] - for i in range(value_length) : - result.append(value[i]) - return result - - cpdef object get_str_line(self, index_t line_nb): - cdef char* value - cdef object result - cdef int i - value = obi_get_qual_char_with_elt_idx_and_col_p_in_view(self._view._pointer, (self._pointer)[0], line_nb, 0) - if obi_errno > 0 : - raise IndexError(line_nb) - if value == OBIQual_char_NA : - result = None - else : - result = bytes2str(value) - free(value) - return result - - cpdef set_line(self, index_t line_nb, object value): - cdef uint8_t* value_b - cdef int value_length - if value is None : - if obi_set_qual_int_with_elt_idx_and_col_p_in_view(self._view._pointer, (self._pointer)[0], line_nb, 0, OBIQual_int_NA, 0) < 0: - raise Exception("Problem setting a value in a column") - else : - value_length = len(value) - value_b = malloc(value_length * sizeof(uint8_t)) - for i in range(value_length) : - value_b[i] = value[i] - if obi_set_qual_int_with_elt_idx_and_col_p_in_view(self._view._pointer, (self._pointer)[0], line_nb, 0, value_b, value_length) < 0: - raise Exception("Problem setting a value in a column") - free(value_b) - - cpdef set_str_line(self, index_t line_nb, object value): - cdef bytes value_b - if value is None : - if obi_set_qual_char_with_elt_idx_and_col_p_in_view(self._view._pointer, (self._pointer)[0], line_nb, 0, OBIQual_char_NA) < 0: - raise Exception("Problem setting a value in a column") - else : - if type(value) == str: - value_b = str2bytes(value) - else : - value_b = value - if obi_set_qual_char_with_elt_idx_and_col_p_in_view(self._view._pointer, (self._pointer)[0], line_nb, 0, value_b) < 0: - raise Exception("Problem setting a value in a column") - - -cdef class OBIDMS_column_multi_elts_qual(OBIDMS_column_multi_elts): - - cpdef object get_item(self, index_t line_nb, str element_name): - cdef const uint8_t* value - cdef int value_length - cdef object result - cdef int i - value = obi_get_qual_int_with_elt_name_and_col_p_in_view(self._view._pointer, (self._pointer)[0], line_nb, str2bytes(element_name), &value_length) - if obi_errno > 0 : - raise IndexError(line_nb, element_name) - if value == OBIQual_int_NA : - result = None - else : - result = [] - for i in range(value_length) : - result.append(value[i]) - return result - - cpdef object get_str_item(self, index_t line_nb, str element_name): - cdef char* value - cdef object result - value = obi_get_qual_char_with_elt_name_and_col_p_in_view(self._view._pointer, (self._pointer)[0], line_nb, str2bytes(element_name)) - if obi_errno > 0 : - raise IndexError(line_nb, element_name) - if value == OBIQual_char_NA : - result = None - else : - result = bytes2str(value) - free(value) - return result - - cpdef object get_line(self, index_t line_nb) : - cdef const uint8_t* value - cdef int value_length - cdef object value_in_result - cdef dict result - cdef index_t i - cdef int j - cdef bint all_NA - result = {} - all_NA = True - for i in range(self.nb_elements_per_line) : - value = obi_get_qual_int_with_elt_idx_and_col_p_in_view(self._view._pointer, (self._pointer)[0], line_nb, i, &value_length) - if obi_errno > 0 : - raise IndexError(line_nb) - if value == OBIQual_int_NA : - value_in_result = None - else : - value_in_result = [] - for j in range(value_length) : - value_in_result.append(value[j]) - result[self.elements_names[i]] = value_in_result - if all_NA and (value_in_result is not None) : - all_NA = False - if all_NA : - result = None - return result - - cpdef object get_str_line(self, index_t line_nb) : - cdef char* value - cdef object value_in_result - cdef dict result - cdef index_t i - cdef bint all_NA - result = {} - all_NA = True - for i in range(self.nb_elements_per_line) : - value = obi_get_qual_char_with_elt_idx_and_col_p_in_view(self._view._pointer, (self._pointer)[0], line_nb, i) - if obi_errno > 0 : - raise IndexError(line_nb) - if value == OBIQual_char_NA : - value_in_result = None - else : - value_in_result = bytes2str(value) - free(value) - result[self.elements_names[i]] = value_in_result - if all_NA and (value_in_result is not None) : - all_NA = False - if all_NA : - result = None - return result - - cpdef set_item(self, index_t line_nb, str element_name, object value): - cdef uint8_t* value_b - cdef int value_length - if value is None : - if obi_set_qual_int_with_elt_name_and_col_p_in_view(self._view._pointer, (self._pointer)[0], line_nb, str2bytes(element_name), OBIQual_int_NA, 0) < 0: - raise Exception("Problem setting a value in a column") - else : - value_length = len(value) - value_b = malloc(value_length * sizeof(uint8_t)) - for i in range(value_length) : - value_b[i] = value[i] - if obi_set_qual_int_with_elt_name_and_col_p_in_view(self._view._pointer, (self._pointer)[0], line_nb, str2bytes(element_name), value_b, value_length) < 0: - raise Exception("Problem setting a value in a column") - free(value_b) - - cpdef set_str_item(self, index_t line_nb, str element_name, object value): - if value is None : - if obi_set_qual_char_with_elt_name_and_col_p_in_view(self._view._pointer, (self._pointer)[0], line_nb, str2bytes(element_name), OBIQual_char_NA) < 0: - raise Exception("Problem setting a value in a column") - else : - if obi_set_qual_char_with_elt_name_and_col_p_in_view(self._view._pointer, (self._pointer)[0], line_nb, str2bytes(element_name), str2bytes(value)) < 0: - raise Exception("Problem setting a value in a column") diff --git a/python/obitools3/obidms/_obidmscolumn_seq.cfiles b/python/obitools3/obidms/_obidmscolumn_seq.cfiles deleted file mode 100644 index 84e0436..0000000 --- a/python/obitools3/obidms/_obidmscolumn_seq.cfiles +++ /dev/null @@ -1,65 +0,0 @@ -../../../src/bloom.h -../../../src/bloom.c -../../../src/char_str_indexer.h -../../../src/char_str_indexer.c -../../../src/crc64.h -../../../src/crc64.c -../../../src/dna_seq_indexer.h -../../../src/dna_seq_indexer.c -../../../src/encode.h -../../../src/encode.c -../../../src/hashtable.h -../../../src/hashtable.c -../../../src/murmurhash2.h -../../../src/murmurhash2.c -../../../src/obi_align.h -../../../src/obi_align.c -../../../src/obiavl.h -../../../src/obiavl.c -../../../src/obiblob_indexer.h -../../../src/obiblob_indexer.c -../../../src/obiblob.h -../../../src/obiblob.c -../../../src/obidebug.h -../../../src/obidms_taxonomy.h -../../../src/obidms_taxonomy.c -../../../src/obidms.h -../../../src/obidms.c -../../../src/obidmscolumn_blob.c -../../../src/obidmscolumn_blob.h -../../../src/obidmscolumn_bool.c -../../../src/obidmscolumn_bool.h -../../../src/obidmscolumn_char.c -../../../src/obidmscolumn_char.h -../../../src/obidmscolumn_float.c -../../../src/obidmscolumn_float.h -../../../src/obidmscolumn_idx.h -../../../src/obidmscolumn_idx.c -../../../src/obidmscolumn_int.c -../../../src/obidmscolumn_int.h -../../../src/obidmscolumn_qual.h -../../../src/obidmscolumn_qual.c -../../../src/obidmscolumn_seq.c -../../../src/obidmscolumn_seq.h -../../../src/obidmscolumn_str.c -../../../src/obidmscolumn_str.h -../../../src/obidmscolumn.h -../../../src/obidmscolumn.c -../../../src/obidmscolumndir.h -../../../src/obidmscolumndir.c -../../../src/obierrno.h -../../../src/obierrno.c -../../../src/obilittlebigman.h -../../../src/obilittlebigman.c -../../../src/obitypes.h -../../../src/obitypes.c -../../../src/obiview.h -../../../src/obiview.c -../../../src/sse_banded_LCS_alignment.h -../../../src/sse_banded_LCS_alignment.c -../../../src/uint8_indexer.h -../../../src/uint8_indexer.c -../../../src/upperband.h -../../../src/upperband.c -../../../src/utils.h -../../../src/utils.c diff --git a/python/obitools3/obidms/_obidmscolumn_seq.pxd b/python/obitools3/obidms/_obidmscolumn_seq.pxd deleted file mode 100644 index 5319b38..0000000 --- a/python/obitools3/obidms/_obidmscolumn_seq.pxd +++ /dev/null @@ -1,15 +0,0 @@ -#cython: language_level=3 - -from .capi.obitypes cimport index_t -from ._obidms cimport OBIView, OBIDMS_column, OBIDMS_column_multi_elts - - -cdef class OBIDMS_column_seq(OBIDMS_column): - cpdef object get_line(self, index_t line_nb) - cpdef set_line(self, index_t line_nb, object value) - - -cdef class OBIDMS_column_multi_elts_seq(OBIDMS_column_multi_elts): - cpdef object get_item(self, index_t line_nb, str element_name) - cpdef object get_line(self, index_t line_nb) - cpdef set_item(self, index_t line_nb, str element_name, object value) diff --git a/python/obitools3/obidms/_obidmscolumn_seq.pyx b/python/obitools3/obidms/_obidmscolumn_seq.pyx deleted file mode 100644 index 77c8335..0000000 --- a/python/obitools3/obidms/_obidmscolumn_seq.pyx +++ /dev/null @@ -1,108 +0,0 @@ -#cython: language_level=3 - -from .capi.obiview cimport obi_get_seq_with_elt_name_and_col_p_in_view, \ - obi_get_seq_with_elt_idx_and_col_p_in_view, \ - obi_set_seq_with_elt_name_and_col_p_in_view, \ - obi_set_seq_with_elt_idx_and_col_p_in_view -from .capi.obierrno cimport obi_errno -from .capi.obitypes cimport OBISeq_NA, const_char_p - -from ._obidms cimport OBIView - -from obitools3.utils cimport str2bytes, bytes2str - -from libc.stdlib cimport free - - -cdef class OBIDMS_column_seq(OBIDMS_column): - - cpdef object get_line(self, index_t line_nb): - cdef char* value - cdef object result - value = obi_get_seq_with_elt_idx_and_col_p_in_view(self._view._pointer, (self._pointer)[0], line_nb, 0) - if obi_errno > 0 : - raise IndexError(line_nb) - if value == OBISeq_NA : - result = None - else : - try: - result = value - finally: - free(value) - return result - - cpdef set_line(self, index_t line_nb, object value): - cdef bytes value_b - - if value is None : - value_b = OBISeq_NA - elif isinstance(value, bytes) : - value_b = value - elif isinstance(value, str) : - value_b = str2bytes(value) - else: - raise TypeError('Sequence value must be of type Bytes, Str or None') - - if obi_set_seq_with_elt_idx_and_col_p_in_view(self._view._pointer, (self._pointer)[0], line_nb, 0, value_b) < 0: - raise Exception("Problem setting a value in a column") - - -cdef class OBIDMS_column_multi_elts_seq(OBIDMS_column_multi_elts): - - cpdef object get_item(self, index_t line_nb, str element_name): - cdef char* value - cdef object result - value = obi_get_seq_with_elt_name_and_col_p_in_view(self._view._pointer, (self._pointer)[0], line_nb, str2bytes(element_name)) - if obi_errno > 0 : - raise IndexError(line_nb, element_name) - if value == OBISeq_NA : - result = None - else : - try: - result = value - finally: - free(value) - return result - - - cpdef object get_line(self, index_t line_nb) : - cdef char* value - cdef object value_in_result - cdef dict result - cdef index_t i - cdef bint all_NA - result = {} - all_NA = True - for i in range(self.nb_elements_per_line) : - value = obi_get_seq_with_elt_idx_and_col_p_in_view(self._view._pointer, (self._pointer)[0], line_nb, i) - if obi_errno > 0 : - raise IndexError(line_nb) - if value == OBISeq_NA : - value_in_result = None - else : - try: - value_in_result = value - finally: - free(value) - result[self.elements_names[i]] = value_in_result - if all_NA and (value_in_result is not None) : - all_NA = False - if all_NA : - result = None - return result - - cpdef set_item(self, index_t line_nb, str element_name, object value): - cdef bytes value_b - - if value is None : - value_b = OBISeq_NA - elif isinstance(value, bytes) : - value_b = value - elif isinstance(value, str) : - value_b = str2bytes(value) - else: - raise TypeError('Sequence value must be of type Bytes, Str or None') - - if obi_set_seq_with_elt_name_and_col_p_in_view(self._view._pointer, (self._pointer)[0], line_nb, str2bytes(element_name), value_b) < 0: - raise Exception("Problem setting a value in a column") - diff --git a/python/obitools3/obidms/_obidmscolumn_str.cfiles b/python/obitools3/obidms/_obidmscolumn_str.cfiles deleted file mode 100644 index 84e0436..0000000 --- a/python/obitools3/obidms/_obidmscolumn_str.cfiles +++ /dev/null @@ -1,65 +0,0 @@ -../../../src/bloom.h -../../../src/bloom.c -../../../src/char_str_indexer.h -../../../src/char_str_indexer.c -../../../src/crc64.h -../../../src/crc64.c -../../../src/dna_seq_indexer.h -../../../src/dna_seq_indexer.c -../../../src/encode.h -../../../src/encode.c -../../../src/hashtable.h -../../../src/hashtable.c -../../../src/murmurhash2.h -../../../src/murmurhash2.c -../../../src/obi_align.h -../../../src/obi_align.c -../../../src/obiavl.h -../../../src/obiavl.c -../../../src/obiblob_indexer.h -../../../src/obiblob_indexer.c -../../../src/obiblob.h -../../../src/obiblob.c -../../../src/obidebug.h -../../../src/obidms_taxonomy.h -../../../src/obidms_taxonomy.c -../../../src/obidms.h -../../../src/obidms.c -../../../src/obidmscolumn_blob.c -../../../src/obidmscolumn_blob.h -../../../src/obidmscolumn_bool.c -../../../src/obidmscolumn_bool.h -../../../src/obidmscolumn_char.c -../../../src/obidmscolumn_char.h -../../../src/obidmscolumn_float.c -../../../src/obidmscolumn_float.h -../../../src/obidmscolumn_idx.h -../../../src/obidmscolumn_idx.c -../../../src/obidmscolumn_int.c -../../../src/obidmscolumn_int.h -../../../src/obidmscolumn_qual.h -../../../src/obidmscolumn_qual.c -../../../src/obidmscolumn_seq.c -../../../src/obidmscolumn_seq.h -../../../src/obidmscolumn_str.c -../../../src/obidmscolumn_str.h -../../../src/obidmscolumn.h -../../../src/obidmscolumn.c -../../../src/obidmscolumndir.h -../../../src/obidmscolumndir.c -../../../src/obierrno.h -../../../src/obierrno.c -../../../src/obilittlebigman.h -../../../src/obilittlebigman.c -../../../src/obitypes.h -../../../src/obitypes.c -../../../src/obiview.h -../../../src/obiview.c -../../../src/sse_banded_LCS_alignment.h -../../../src/sse_banded_LCS_alignment.c -../../../src/uint8_indexer.h -../../../src/uint8_indexer.c -../../../src/upperband.h -../../../src/upperband.c -../../../src/utils.h -../../../src/utils.c diff --git a/python/obitools3/obidms/_obidmscolumn_str.pxd b/python/obitools3/obidms/_obidmscolumn_str.pxd deleted file mode 100644 index 7c813d0..0000000 --- a/python/obitools3/obidms/_obidmscolumn_str.pxd +++ /dev/null @@ -1,14 +0,0 @@ -#cython: language_level=3 - -from .capi.obitypes cimport index_t -from ._obidms cimport OBIDMS_column, OBIDMS_column_multi_elts - - -cdef class OBIDMS_column_str(OBIDMS_column): - cpdef object get_line(self, index_t line_nb) - cpdef set_line(self, index_t line_nb, object value) - -cdef class OBIDMS_column_multi_elts_str(OBIDMS_column_multi_elts): - cpdef object get_item(self, index_t line_nb, str element_name) - cpdef object get_line(self, index_t line_nb) - cpdef set_item(self, index_t line_nb, str element_name, object value) diff --git a/python/obitools3/obidms/_obidmscolumn_str.pyx b/python/obitools3/obidms/_obidmscolumn_str.pyx deleted file mode 100644 index 2cac353..0000000 --- a/python/obitools3/obidms/_obidmscolumn_str.pyx +++ /dev/null @@ -1,84 +0,0 @@ -#cython: language_level=3 - -from .capi.obiview cimport obi_get_str_with_elt_name_and_col_p_in_view, \ - obi_get_str_with_elt_idx_and_col_p_in_view, \ - obi_set_str_with_elt_name_and_col_p_in_view, \ - obi_set_str_with_elt_idx_and_col_p_in_view -from .capi.obierrno cimport obi_errno -from .capi.obitypes cimport OBIStr_NA, const_char_p - -from obitools3.utils cimport str2bytes, bytes2str - - -cdef class OBIDMS_column_str(OBIDMS_column): - - cpdef object get_line(self, index_t line_nb): - cdef const_char_p value - cdef object result - value = obi_get_str_with_elt_idx_and_col_p_in_view(self._view._pointer, (self._pointer)[0], line_nb, 0) - if obi_errno > 0 : - raise IndexError(line_nb) - if value == OBIStr_NA : - result = None - else : - result = bytes2str(value) - # NOTE: value is not freed because the pointer points to a mmapped region in an AVL data file. (TODO discuss) - return result - - cpdef set_line(self, index_t line_nb, object value): - if value is None : - if obi_set_str_with_elt_idx_and_col_p_in_view(self._view._pointer, (self._pointer)[0], line_nb, 0, OBIStr_NA) < 0: - raise Exception("Problem setting a value in a column") - else : - if obi_set_str_with_elt_idx_and_col_p_in_view(self._view._pointer, (self._pointer)[0], line_nb, 0, str2bytes(value)) < 0: - raise Exception("Problem setting a value in a column") - - -cdef class OBIDMS_column_multi_elts_str(OBIDMS_column_multi_elts): - - cpdef object get_item(self, index_t line_nb, str element_name): - cdef const_char_p value - cdef object result - value = obi_get_str_with_elt_name_and_col_p_in_view(self._view._pointer, (self._pointer)[0], line_nb, str2bytes(element_name)) - if obi_errno > 0 : - raise IndexError(line_nb, element_name) - if value == OBIStr_NA : - result = None - else : - result = bytes2str(value) - # NOTE: value is not freed because the pointer points to a mmapped region in an AVL data file. (TODO discuss) - return result - - cpdef object get_line(self, index_t line_nb) : - cdef const_char_p value # @DuplicatedSignature - cdef object value_in_result - cdef dict result - cdef index_t i - cdef bint all_NA - result = {} - all_NA = True - for i in range(self.nb_elements_per_line) : - value = obi_get_str_with_elt_idx_and_col_p_in_view(self._view._pointer, (self._pointer)[0], line_nb, i) - if obi_errno > 0 : - raise IndexError(line_nb) - if value == OBIStr_NA : - value_in_result = None - else : - value_in_result = bytes2str(value) - # NOTE: value is not freed because the pointer points to a mmapped region in an AVL data file. (TODO discuss) - result[self.elements_names[i]] = value_in_result - if all_NA and (value_in_result is not None) : - all_NA = False - if all_NA : - result = None - return result - - cpdef set_item(self, index_t line_nb, str element_name, object value): - cdef bytes value_b - if value is None : - value_b = OBIStr_NA - else : - value_b = str2bytes(value) - if obi_set_str_with_elt_name_and_col_p_in_view(self._view._pointer, (self._pointer)[0], line_nb, str2bytes(element_name), value_b) < 0: - raise Exception("Problem setting a value in a column") - diff --git a/python/obitools3/obidms/capi/obierrno.pxd b/python/obitools3/obidms/capi/obierrno.pxd deleted file mode 100644 index eb8c4bb..0000000 --- a/python/obitools3/obidms/capi/obierrno.pxd +++ /dev/null @@ -1,5 +0,0 @@ -#cython: language_level=3 - - -cdef extern from "obierrno.h" nogil: - extern int obi_errno diff --git a/python/obitools3/utils.pxd b/python/obitools3/utils.pxd index 2a1b144..725a9fe 100644 --- a/python/obitools3/utils.pxd +++ b/python/obitools3/utils.pxd @@ -2,5 +2,6 @@ cdef bytes str2bytes(str string) - -cdef str bytes2str(bytes string) \ No newline at end of file +cdef str bytes2str(bytes string) +cdef bytes tobytes(object string) +cdef str tostr(object string) \ No newline at end of file diff --git a/python/obitools3/utils.pyx b/python/obitools3/utils.pyx index 76c2493..ea9eb1c 100644 --- a/python/obitools3/utils.pyx +++ b/python/obitools3/utils.pyx @@ -1,4 +1,5 @@ #cython: language_level=3 +from IPython.utils._tokenize_py2 import String cdef bytes str2bytes(str string): @@ -24,3 +25,32 @@ cdef str bytes2str(bytes string): """ return string.decode('ascii') +cdef bytes tobytes(object string): + """ + Short cut to convert ascii encoded string (str or bytes) to bytes + which can be easily converted to C-strings. + + @param string: the python string to be converted. + @type string: bytes or str + @return a transcoded string + @rtype: bytes + """ + if isinstance(string, bytes): + return string + return str2bytes(string) + + +cdef str tostr(object string): + """ + Short cut to convert ascii encoded string (str or bytes) to bytes + which can be easily converted to C-strings. + + @param string: the python string to be converted. + @type string: bytes or str + @return a transcoded string + @rtype: bytes + """ + if isinstance(string, str): + return string + return bytes2str(string) + diff --git a/src/obidmscolumn.c b/src/obidmscolumn.c index a704ab1..fdf2edd 100644 --- a/src/obidmscolumn.c +++ b/src/obidmscolumn.c @@ -639,7 +639,7 @@ OBIDMS_column_p obi_create_column(OBIDMS_p dms, obidebug(1, "\nCan't create column because of empty column name"); return NULL; } - if ((data_type < 1) || (data_type > 8)) // TODO check in more robust way + if ((data_type < 1) || (data_type > 8)) // TODO check in more robust way and use macro define somewhere { obi_set_errno(OBICOL_UNKNOWN_ERROR); obidebug(1, "\nCan't create column because of invalid data type"); @@ -665,7 +665,7 @@ OBIDMS_column_p obi_create_column(OBIDMS_p dms, // Build the indexer name if needed if ((data_type == OBI_STR) || (data_type == OBI_SEQ) || (data_type == OBI_QUAL)) { - if ((indexer_name == NULL) || (strcmp(indexer_name, "") == 0)) + if ((indexer_name == NULL) || (*indexer_name == 0)) { final_indexer_name = obi_build_indexer_name(column_name, version_number); if (final_indexer_name == NULL) diff --git a/src/obidmscolumn.h b/src/obidmscolumn.h index 9e5e348..d8eb016 100644 --- a/src/obidmscolumn.h +++ b/src/obidmscolumn.h @@ -102,18 +102,22 @@ typedef struct OBIDMS_column_header { * creating, opening or cloning an OBIDMS column. */ typedef struct OBIDMS_column { - OBIDMS_p dms; /**< A pointer to the OBIDMS structure to which the column belongs. + OBIDMS_p dms; /**< A pointer to the OBIDMS structure to + * which the column belongs. */ - OBIDMS_column_directory_p column_directory; /**< A pointer to the OBIDMS column directory structure to which the column belongs. + OBIDMS_column_directory_p column_directory; /**< A pointer to the OBIDMS column directory + * structure to which the column belongs. */ OBIDMS_column_header_p header; /**< A pointer to the header of the column. */ - Obi_indexer_p indexer; /**< A pointer to the blob indexer associated with the column if there is one. + Obi_indexer_p indexer; /**< A pointer to the blob indexer associated + * with the column if there is one. */ void* data; /**< A `void` pointer to the beginning of the data. * - * @warning Never use this member directly outside of the code of the - * low level functions of the OBIDMS. + * @warning Never use this member directly outside + * of the code of the low level functions + * of the OBIDMS. */ bool writable; /**< Indicates if the column is writable or not. * - `true` the column is writable @@ -122,7 +126,8 @@ typedef struct OBIDMS_column { * A column is writable only by its creator * until it closes it. */ - size_t counter; /**< Indicates by how many threads/programs (TODO) the column is used. + size_t counter; /**< Indicates by how many threads/programs + * (TODO) the column is used. */ } OBIDMS_column_t, *OBIDMS_column_p; From e6db2086d5281a7ae863bd143a9e9f6f6ea1f922 Mon Sep 17 00:00:00 2001 From: Eric Coissac Date: Mon, 26 Dec 2016 13:56:31 +0100 Subject: [PATCH 06/16] Big refactoring 2 --- python/obitools3/dms/_obidms.pyx | 107 ------------------ python/obitools3/dms/{_obidms.pxd => dms.pxd} | 8 +- python/obitools3/dms/dms.pyx | 94 +++++++++++++++ 3 files changed, 98 insertions(+), 111 deletions(-) delete mode 100644 python/obitools3/dms/_obidms.pyx rename python/obitools3/dms/{_obidms.pxd => dms.pxd} (73%) create mode 100644 python/obitools3/dms/dms.pyx diff --git a/python/obitools3/dms/_obidms.pyx b/python/obitools3/dms/_obidms.pyx deleted file mode 100644 index d0134b7..0000000 --- a/python/obitools3/dms/_obidms.pyx +++ /dev/null @@ -1,107 +0,0 @@ -#cython: language_level=3 - -from obitools3.utils cimport bytes2str, str2bytes - -from .capi.obidms cimport obi_dms, \ - obi_close_dms - -from .capi.obidmscolumn cimport obi_close_column, \ - OBIDMS_column_p, \ - OBIDMS_column_header_p - -from .capi.obiutils cimport obi_format_date - -from .capi.obiview cimport Obiview_p, \ - Obiview_infos_p, \ - Alias_column_pair_p, \ - obi_view_map_file, \ - obi_view_unmap_file - -from .capi.obitypes cimport const_char_p, \ - OBIType_t, \ - OBI_INT, \ - OBI_FLOAT, \ - OBI_BOOL, \ - OBI_CHAR, \ - OBI_QUAL, \ - OBI_STR, \ - OBI_SEQ, \ - name_data_type, \ - only_ATGC # discuss - -from ._obitaxo cimport OBI_Taxonomy - - - -from libc.stdlib cimport malloc - - - -cdef class OBIDMS : - - def __init__(self, str dms_name) : - - # Declarations - cdef bytes dms_name_b - - # Format the character string to send to C function - dms_name_b = str2bytes(dms_name) - - # Fill structure and create or open the DMS - self._pointer = obi_dms( dms_name_b) - if self._pointer == NULL : - raise Exception("Failed opening or creating an OBIDMS") - - - # name property getter - @property - def name(self): - return bytes2str(self._pointer.dms_name) - - - cpdef close(self) : - if (obi_close_dms(self._pointer)) < 0 : - raise Exception("Problem closing an OBIDMS") - - - cpdef OBI_Taxonomy open_taxonomy(self, str taxo_name) : - return OBI_Taxonomy(self, taxo_name) - - - cpdef dict read_view_infos(self, str view_name) : - - cdef Obiview_infos_p view_infos_p - cdef dict view_infos_d - cdef Alias_column_pair_p column_refs - cdef int i, j - cdef str column_name - - view_infos_p = obi_view_map_file(self._pointer, str2bytes(view_name)) - view_infos_d = {} - view_infos_d["name"] = bytes2str(view_infos_p.name) - view_infos_d["comments"] = bytes2str(view_infos_p.comments) - view_infos_d["view_type"] = bytes2str(view_infos_p.view_type) - view_infos_d["column_count"] = view_infos_p.column_count - view_infos_d["line_count"] = view_infos_p.line_count - view_infos_d["created_from"] = bytes2str(view_infos_p.created_from) - view_infos_d["creation_date"] = bytes2str(obi_format_date(view_infos_p.creation_date)) - if (view_infos_p.all_lines) : - view_infos_d["line_selection"] = None - else : - view_infos_d["line_selection"] = {} - view_infos_d["line_selection"]["column_name"] = bytes2str((view_infos_p.line_selection).column_name) - view_infos_d["line_selection"]["version"] = (view_infos_p.line_selection).version - view_infos_d["column_references"] = {} - column_references = view_infos_p.column_references - for j in range(view_infos_d["column_count"]) : - column_name = bytes2str((column_references[j]).alias) - view_infos_d["column_references"][column_name] = {} - view_infos_d["column_references"][column_name]["original_name"] = bytes2str((column_references[j]).column_refs.column_name) - view_infos_d["column_references"][column_name]["version"] = (column_references[j]).column_refs.version - - obi_view_unmap_file(self._pointer, view_infos_p) - - return view_infos_d - - - \ No newline at end of file diff --git a/python/obitools3/dms/_obidms.pxd b/python/obitools3/dms/dms.pxd similarity index 73% rename from python/obitools3/dms/_obidms.pxd rename to python/obitools3/dms/dms.pxd index d46059e..167e692 100644 --- a/python/obitools3/dms/_obidms.pxd +++ b/python/obitools3/dms/dms.pxd @@ -8,13 +8,13 @@ from ._obitaxo cimport OBI_Taxonomy -cdef class OBIDMS: +cdef class DMS: cdef OBIDMS_p _pointer cpdef close(self) - cpdef OBI_Taxonomy open_taxonomy(self, str taxo_name) - - cpdef dict read_view_infos(self, str view_name) + cpdef Taxonomy open_taxonomy(self, str taxo_name) + cpdef dict read_view_infos(self, objec view_name) + # cpdef dict read_views(self) TODO diff --git a/python/obitools3/dms/dms.pyx b/python/obitools3/dms/dms.pyx new file mode 100644 index 0000000..a592560 --- /dev/null +++ b/python/obitools3/dms/dms.pyx @@ -0,0 +1,94 @@ +#cython: language_level=3 + +from libc.stdlib cimport malloc + +from .capi.obidms cimport obi_dms, \ + obi_close_dms + +from .capi.obidmscolumn cimport obi_close_column, \ + OBIDMS_column_p, \ + OBIDMS_column_header_p + +from .capi.obiutils cimport obi_format_date + +from .capi.obiview cimport Obiview_p, \ + Obiview_infos_p, \ + Alias_column_pair_p, \ + obi_view_map_file, \ + obi_view_unmap_file + +from .capi.obitypes cimport const_char_p, \ + OBIType_t, \ + OBI_INT, \ + OBI_FLOAT, \ + OBI_BOOL, \ + OBI_CHAR, \ + OBI_QUAL, \ + OBI_STR, \ + OBI_SEQ, \ + name_data_type, \ + only_ATGC # discuss + +from obitools3.utils cimport bytes2str, \ + str2bytes, \ + tobytes + + +from .taxonomy cimport Taxonomy + + + + + + +cdef class DMS : + + def __init__(self, object dms_name) : + ''' + Constructor of a obitools3.dms.DMS instance. + + @param dms_name: The name of the DMS + @type dms_name: a `str` or a `bytes` instance + ''' + + # Declarations + cdef bytes dms_name_b = tobytes(dms_name): + + # Fill structure and create or open the DMS + self._pointer = obi_dms( dms_name_b) + + if self._pointer == NULL : + raise Exception("Failed opening or creating an OBIDMS") + + + def __dealloc__(self): + """ + Destructor of the DMS instance. + + The destructor automatically call the `close` methode and + therefore free all the associated memory. + """ + + self.close() + self._pointer=NULL + + # name property getter + @property + def name(self): + """ + Returns the name of the DMS instance + """ + return bytes2str(self._pointer.dms_name) + + cpdef close(self) : + """ + Closes the DNS instance and free the associated memory + + the `close` method is automatically called by the object destructor. + """ + if (obi_close_dms(self._pointer)) < 0 : + raise Exception("Problem closing an OBIDMS") + + + + \ No newline at end of file From 5156f6bb9ee0d01e12ff643793e646c6d55914cf Mon Sep 17 00:00:00 2001 From: Eric Coissac Date: Mon, 26 Dec 2016 14:18:01 +0100 Subject: [PATCH 07/16] Big refactoring 3 --- .../obitools3/dms/{_obiview.pxd => view.pxd} | 66 ++++---- .../obitools3/dms/{_obiview.pyx => view.pyx} | 141 +++++++++++------- 2 files changed, 119 insertions(+), 88 deletions(-) rename python/obitools3/dms/{_obiview.pxd => view.pxd} (55%) rename python/obitools3/dms/{_obiview.pyx => view.pyx} (77%) diff --git a/python/obitools3/dms/_obiview.pxd b/python/obitools3/dms/view.pxd similarity index 55% rename from python/obitools3/dms/_obiview.pxd rename to python/obitools3/dms/view.pxd index 48fc4f5..b7a9d72 100644 --- a/python/obitools3/dms/_obiview.pxd +++ b/python/obitools3/dms/view.pxd @@ -26,71 +26,61 @@ from .capi.obiview cimport Obiview_p, \ DEFINITION_COLUMN, \ QUALITY_COLUMN -from ._obidmscolumn cimport OBIDMS_column_p, \ - OBIDMS_column - -from ._obidms cimport OBIDMS from obitools3.utils cimport tobytes, \ bytes2str, \ tostr + +from .dms cimport DMS -cdef class OBIView: + +cdef class View: - cdef OBIDMS _dms + cdef DMS _dms cdef Obiview_p _pointer cdef dict _columns cdef __init_columns__(self) - cpdef OBIView clone(self, - view_name, - comments=*) + cpdef View clone(self, + object view_name, + object comments=*) @staticmethod - cdef OBIView _new(OBIDMS dms, - bytes view_name, - bytes comments=*) + cdef View _new(DMS dms, + bytes view_name, + bytes comments=*) @staticmethod - cdef OBIView _open(OBIDMS dms, - bytes view_name) + cdef View _open(DMS dms, + bytes view_name) - cpdef delete_column(self, column_name) - cpdef add_column(self, - str column_name, - obiversion_t version_number=*, - object alias=*, - object type=*, - index_t nb_lines=*, - index_t nb_elements_per_line=*, - list elements_names=*, - object indexer_name=*, - object associated_column_name=*, - obiversion_t associated_column_version=*, - object comments=*, - bint create=* - ) + cpdef close(self) + cpdef delete_column(self, + object column_name) + + cpdef rename_column(self, + object current_name, + object new_name) - cpdef change_column_alias(self, bytes current_alias, bytes new_alias) cdef update_column_pointers(self) cpdef OBIView_line_selection new_selection(self, list lines=*) -cdef class OBIView_line_selection(list): +cdef class View_line_selection(list): - cdef OBIView _view - cdef str _view_name + cdef View _view cdef index_t* __build_binary_list__(self) - cpdef OBIView materialize(self, - str view_name, - str comments=*) + + cpdef View materialize(self, + object view_name, + object comments=*) -cdef class OBIView_line : +cdef class View_line : cdef index_t _index - cdef OBIView _view + cdef View _view diff --git a/python/obitools3/dms/_obiview.pyx b/python/obitools3/dms/view.pyx similarity index 77% rename from python/obitools3/dms/_obiview.pyx rename to python/obitools3/dms/view.pyx index 8b8bf92..68edf70 100644 --- a/python/obitools3/dms/_obiview.pyx +++ b/python/obitools3/dms/view.pyx @@ -1,60 +1,52 @@ #cython: language_level=3 -cdef class OBIView : +cdef class View : def __init__(self,dms,int __internalCall__): + if __internalCall__!=987654: raise RuntimeError('OBIView constructor cannot be called directly') + self._dms = dms self._pointer = NULL - self._columns = {} - - cdef __init_columns__(self): - cdef size_t i - cdef bytes col_alias - cdef OBIDMS_column_p column_p - cdef Obiview_p pointer = self._pointer - - self._columns = {} - - for i in range(pointer.infos.column_count) : - col_alias = pointer.infos.column_references[i].alias - column_p = (pointer.columns)[i] - subclass = OBIDMS_column.get_subclass_type(column_p) - self._columns[col_alias] = subclass(self, col_alias) - - - cpdef OBIView clone(self, - view_name, - comments=b""): + + cpdef View clone(self, + object view_name, + object comments=None): - cdef OBIView view = OBIView(self._dms, - 987654) + + cdef bytes view_name_b = tobytes(view_name) + cdef bytes comments_b + cdef View view = View(self._dms, + 987654) + + if comments is not None: + comments_b = tobytes(comments) + else: + comments_b = b'' view._pointer = obi_new_view(self._pointer.dms, - tobytes(view_name), + view_name_b, self._pointer, NULL, - tobytes(comments)) + comments_b) if view._pointer == NULL : raise RuntimeError("Error : Cannot clone view %s into view %s" % (str(self.name), - tobytes(view_name)) + bytes2str(view_name_b)) ) - - view.__init_columns__() - + return view @staticmethod - cdef OBIView _new(OBIDMS dms, - bytes view_name, - bytes comments=b""): + cdef View _new(DMS dms, + bytes view_name, + bytes comments=b""): - cdef OBIView view = OBIView(dms, - 987654) # @DuplicatedSignature + cdef View view = OBIView(dms, + 987654) # @DuplicatedSignature view._pointer = obi_new_view(dms._pointer, view_name, @@ -64,24 +56,34 @@ cdef class OBIView : if view._pointer == NULL : raise RuntimeError("Error : Cannot create view %s" % view_name) - - view.__init_columns__() - + return view @staticmethod def new(OBIDMS dms, - view_name, - comments=b""): - return OBIView._new(dms,tobytes(view_name),tobytes(comments)) + object view_name, + object comments=None): + + cdef bytes view_name_b = tobytes(view_name) + cdef bytes comments_b + + if comments is not None: + comments_b = tobytes(comments) + else: + comments_b = b'' + + + return View._new(dms, + view_name_b, + comments_b) @staticmethod - cdef OBIView _open(OBIDMS dms, - bytes view_name): + cdef View _open(DMS dms, + bytes view_name): - cdef OBIView view = OBIView(dms, - 987654) # @DuplicatedSignature + cdef View view = View(dms, + 987654) # @DuplicatedSignature view._pointer = obi_open_view(dms._pointer, view_name) @@ -89,19 +91,22 @@ cdef class OBIView : if view._pointer == NULL : raise RuntimeError("Error : Cannot open view %s" % bytes2str(view_name)) - view.__init_columns__() - return view @staticmethod - def open(OBIDMS dms, # @ReservedAssignment - view_name): - return OBIView._open(dms,tobytes(view_name)) + def open(DMS dms, # @ReservedAssignment + object view_name): - def __dealloc__(self): + cdef bytes view_name_b = tobytes(view_name) + + return View._open(dms,view_name_b) + + cpdef close(self): if (obi_save_and_close_view(self._pointer) < 0) : raise Exception("Problem closing a view") + def __dealloc__(self): + self.close() def __repr__(self) : cdef str s @@ -400,4 +405,40 @@ cdef class OBIView_line : return str(line) + cpdef dict get_view_infos(self, str view_name) : + + cdef Obiview_infos_p view_infos_p + cdef dict view_infos_d + cdef Alias_column_pair_p column_refs + cdef int i, j + cdef str column_name + + view_infos_p = obi_view_map_file(self._pointer, + tobytes(view_name)) + view_infos_d = {} + view_infos_d["name"] = bytes2str(view_infos_p.name) + view_infos_d["comments"] = bytes2str(view_infos_p.comments) + view_infos_d["view_type"] = bytes2str(view_infos_p.view_type) + view_infos_d["column_count"] = view_infos_p.column_count + view_infos_d["line_count"] = view_infos_p.line_count + view_infos_d["created_from"] = bytes2str(view_infos_p.created_from) + view_infos_d["creation_date"] = bytes2str(obi_format_date(view_infos_p.creation_date)) + if (view_infos_p.all_lines) : + view_infos_d["line_selection"] = None + else : + view_infos_d["line_selection"] = {} + view_infos_d["line_selection"]["column_name"] = bytes2str((view_infos_p.line_selection).column_name) + view_infos_d["line_selection"]["version"] = (view_infos_p.line_selection).version + view_infos_d["column_references"] = {} + column_references = view_infos_p.column_references + for j in range(view_infos_d["column_count"]) : + column_name = bytes2str((column_references[j]).alias) + view_infos_d["column_references"][column_name] = {} + view_infos_d["column_references"][column_name]["original_name"] = bytes2str((column_references[j]).column_refs.column_name) + view_infos_d["column_references"][column_name]["version"] = (column_references[j]).column_refs.version + + obi_view_unmap_file(self._pointer, view_infos_p) + + return view_infos_d + From 3ac6e85fb3562f9fe0efa99a0dd8313b9d8a1434 Mon Sep 17 00:00:00 2001 From: Eric Coissac Date: Mon, 26 Dec 2016 14:58:03 +0100 Subject: [PATCH 08/16] Big refactoring 4 --- .../dms/{_obidmscolumn.pxd => column.pxd} | 8 +- .../dms/{_obidmscolumn.pyx => column.pyx} | 17 ++- python/obitools3/dms/dms.pyx | 20 +++- python/obitools3/dms/view.pxd | 1 - python/obitools3/dms/view.pyx | 103 ++++-------------- 5 files changed, 51 insertions(+), 98 deletions(-) rename python/obitools3/dms/{_obidmscolumn.pxd => column.pxd} (88%) rename python/obitools3/dms/{_obidmscolumn.pyx => column.pyx} (92%) diff --git a/python/obitools3/dms/_obidmscolumn.pxd b/python/obitools3/dms/column.pxd similarity index 88% rename from python/obitools3/dms/_obidmscolumn.pxd rename to python/obitools3/dms/column.pxd index dc1be0d..94aa986 100644 --- a/python/obitools3/dms/_obidmscolumn.pxd +++ b/python/obitools3/dms/column.pxd @@ -15,9 +15,9 @@ from .capi.obitypes cimport obiversion_t, \ from .capi.obiutils cimport obi_format_date -from ._obiview cimport OBIView +from .view cimport View -cdef class OBIDMS_column: +cdef class Column: cdef bytes _alias # associated property: alias cdef OBIDMS_column_p* _pointer @@ -28,7 +28,7 @@ cdef class OBIDMS_column: @staticmethod cdef type get_subclass_type(OBIDMS_column_p column_p) -cdef class OBIDMS_column_line: +cdef class Column_line: cdef OBIDMS_column _column cdef OBIDMS_column_p _column_p @@ -38,4 +38,4 @@ cdef class OBIDMS_column_line: cpdef update(self, data) -cdef register_column_class(OBIType_t obitype,type classe) +cdef register_column_class(OBIType_t obitype,type classe, type python) diff --git a/python/obitools3/dms/_obidmscolumn.pyx b/python/obitools3/dms/column.pyx similarity index 92% rename from python/obitools3/dms/_obidmscolumn.pyx rename to python/obitools3/dms/column.pyx index 1d17d00..e021d8f 100644 --- a/python/obitools3/dms/_obidmscolumn.pyx +++ b/python/obitools3/dms/column.pyx @@ -1,12 +1,13 @@ #cython: language_level=3 -cdef dict __OBIDMS_COLUMN_CLASS__ = {} +from .dms cimport __OBIDMS_COLUMN_CLASS__ + cdef class Column : """ - The OBIDMS.Column class + The obitools3.dms.column.Column class wraps a c instance of a column in the context of a View """ - + # Note: should only be initialized through a subclass def __init__(self, View view, @@ -172,11 +173,15 @@ cdef class OBIDMS_column_line : ###################################################################################################### -cdef register_column_class(OBIType_t obitype,type classe): +cdef register_column_class(OBIType_t obitype, + type classe, + type python): """ Each sub class of `OBIDMS_column` needs to be registered after its declaration to declare its relationship with an `OBIType_t` """ - assert issubclass(classe,OBIDMS_column) + global __OBIDMS_COLUMN_CLASS__ + + assert issubclass(classe,Column) - __OBIDMS_COLUMN_CLASS__[obitype]=classe + __OBIDMS_COLUMN_CLASS__[obitype]=(classe,python) diff --git a/python/obitools3/dms/dms.pyx b/python/obitools3/dms/dms.pyx index a592560..347e5f8 100644 --- a/python/obitools3/dms/dms.pyx +++ b/python/obitools3/dms/dms.pyx @@ -36,13 +36,27 @@ from obitools3.utils cimport bytes2str, \ from .taxonomy cimport Taxonomy - - - +__OBIDMS_COLUMN_CLASS__ = {} cdef class DMS : + @staticmethod + cdef type get_column_class(obitype_t obitype): + """ + Internal function returning the python class representing + a column for a given obitype. + """ + return __OBIDMS_COLUMN_CLASS__[obitype][0] + + @staticmethod + cdef type get_python_type(obitype_t obitype): + """ + Internal function returning the python type representing + an instance for a given obitype. + """ + return __OBIDMS_COLUMN_CLASS__[obitype][1] + def __init__(self, object dms_name) : ''' Constructor of a obitools3.dms.DMS instance. diff --git a/python/obitools3/dms/view.pxd b/python/obitools3/dms/view.pxd index b7a9d72..e0c09ba 100644 --- a/python/obitools3/dms/view.pxd +++ b/python/obitools3/dms/view.pxd @@ -32,7 +32,6 @@ from obitools3.utils cimport tobytes, \ from .dms cimport DMS - cdef class View: cdef DMS _dms diff --git a/python/obitools3/dms/view.pyx b/python/obitools3/dms/view.pyx index 68edf70..ca74570 100644 --- a/python/obitools3/dms/view.pyx +++ b/python/obitools3/dms/view.pyx @@ -2,7 +2,8 @@ cdef class View : - + + def __init__(self,dms,int __internalCall__): if __internalCall__!=987654: @@ -116,97 +117,31 @@ cdef class View : return s - cpdef delete_column(self, column_name) : + cpdef delete_column(self, + object column_name) : if obi_view_delete_column(self._pointer, tobytes(column_name)) < 0 : raise Exception("Problem deleting column %s from a view", tostr(column_name)) # Update the dictionary of column objects: - (self._columns).pop(column_name) self.update_column_pointers() - cpdef add_column(self, - str column_name, - obiversion_t version_number=-1, - object alias=None, - object type=b'', - index_t nb_lines=0, - index_t nb_elements_per_line=1, - list elements_names=None, - object indexer_name=b"", - object associated_column_name=b"", - obiversion_t associated_column_version=-1, - object comments=b"", - bint create=True - ) : - - cdef bytes column_name_b - cdef bytes elements_names_b - cdef bytes alias_b - cdef object subclass - cdef OBIDMS_column_p column_p - - column_name_b = tobytes(column_name) - if alias is None : - alias_b = column_name_b - else : - alias_b = tobytes(alias) - - if elements_names is None : - elements_names_b = b"" - else : - elements_names_b = b';'.join([tobytes(i) for i in elements_names]) - - if type : # TODO make C function that does that - if type == 'OBI_INT' : - data_type = OBI_INT - elif type == 'OBI_FLOAT' : - data_type = OBI_FLOAT - elif type == 'OBI_BOOL' : - data_type = OBI_BOOL - elif type == 'OBI_CHAR' : - data_type = OBI_CHAR - elif type == 'OBI_QUAL' : - data_type = OBI_QUAL - elif type == 'OBI_STR' : - data_type = OBI_STR - elif type == 'OBI_SEQ' : - data_type = OBI_SEQ - else : - raise Exception("Invalid provided data type") - - if (obi_view_add_column(self._pointer, column_name_b, version_number, alias_b, - data_type, nb_lines, nb_elements_per_line, - elements_names_b, str2bytes(indexer_name), - str2bytes(associated_column_name), associated_column_version, - str2bytes(comments), create) < 0) : - raise Exception("Problem adding a column in a view") - - # Get the column pointer - column_p = obi_view_get_column(self._pointer, alias_b) - - # Open and store the subclass - subclass = OBIDMS_column.get_subclass_type(column_p) - (self._columns)[alias] = subclass(self, alias) - - cpdef change_column_alias(self, bytes current_alias, bytes new_alias): + cpdef rename_column(self, + object current_name, + object new_name): + cdef OBIDMS_column column - if (obi_view_create_column_alias(self._pointer, current_alias, new_alias) < 0) : - raise Exception("Problem changing a column alias") - # Update the dictionaries of column objects - self._columns[new_alias] = self._columns[current_alias] - column = self._columns[new_alias] - column._alias = new_alias - (self._columns).pop(current_alias) - - - cdef update_column_pointers(self): - cdef str column_n - cdef OBIDMS_column column - for column_n in self._columns : - column = self._columns[column_n] - column._pointer = obi_view_get_pointer_on_column_in_view(self._pointer, str2bytes(column_n)) - + cdef bytes current_name_b = tobytes(current_name) + cdef bytes new_name_b = tobyes(new_name) + + if (obi_view_create_column_alias(self._pointer, + tobytes(current_name_b), + tobytes(new_name_b)) < 0) : + raise Exception("Problem in renaming column %s to %s" % ( + bytes2str(current_name_b), + bytes2str(new_name_b))) + + cpdef OBIView_line_selection new_selection(self,list lines=None): return OBIView_line_selection(self,lines) From 62caf1346ebf4d897e6c26691b1ad3392603300f Mon Sep 17 00:00:00 2001 From: Eric Coissac Date: Mon, 26 Dec 2016 15:03:24 +0100 Subject: [PATCH 09/16] temporary remove some files --- python/obitools3/dms/_obidms.cfiles | 65 ---- python/obitools3/dms/_obidmscolumn.cfiles | 65 ---- .../obitools3/dms/_obidmscolumn_bool.cfiles | 65 ---- python/obitools3/dms/_obidmscolumn_bool.pxd | 57 ---- python/obitools3/dms/_obidmscolumn_bool.pyx | 294 ------------------ python/obitools3/dms/_obiseq.cfiles | 65 ---- python/obitools3/dms/_obiseq.pxd | 21 -- python/obitools3/dms/_obiseq.pyx | 188 ----------- python/obitools3/dms/_obitaxo.cfiles | 65 ---- python/obitools3/dms/_obitaxo.pxd | 20 -- python/obitools3/dms/_obitaxo.pyx | 129 -------- python/obitools3/dms/_obiview_nuc_seq.pxd | 25 -- python/obitools3/dms/_obiview_nuc_seq.pyx | 105 ------- .../obitools3/dms/_obiview_nuc_seq_qual.pxd | 25 -- .../obitools3/dms/_obiview_nuc_seq_qual.pyx | 90 ------ 15 files changed, 1279 deletions(-) delete mode 100644 python/obitools3/dms/_obidms.cfiles delete mode 100644 python/obitools3/dms/_obidmscolumn.cfiles delete mode 100644 python/obitools3/dms/_obidmscolumn_bool.cfiles delete mode 100644 python/obitools3/dms/_obidmscolumn_bool.pxd delete mode 100644 python/obitools3/dms/_obidmscolumn_bool.pyx delete mode 100644 python/obitools3/dms/_obiseq.cfiles delete mode 100644 python/obitools3/dms/_obiseq.pxd delete mode 100644 python/obitools3/dms/_obiseq.pyx delete mode 100644 python/obitools3/dms/_obitaxo.cfiles delete mode 100644 python/obitools3/dms/_obitaxo.pxd delete mode 100644 python/obitools3/dms/_obitaxo.pyx delete mode 100644 python/obitools3/dms/_obiview_nuc_seq.pxd delete mode 100644 python/obitools3/dms/_obiview_nuc_seq.pyx delete mode 100644 python/obitools3/dms/_obiview_nuc_seq_qual.pxd delete mode 100644 python/obitools3/dms/_obiview_nuc_seq_qual.pyx diff --git a/python/obitools3/dms/_obidms.cfiles b/python/obitools3/dms/_obidms.cfiles deleted file mode 100644 index 84e0436..0000000 --- a/python/obitools3/dms/_obidms.cfiles +++ /dev/null @@ -1,65 +0,0 @@ -../../../src/bloom.h -../../../src/bloom.c -../../../src/char_str_indexer.h -../../../src/char_str_indexer.c -../../../src/crc64.h -../../../src/crc64.c -../../../src/dna_seq_indexer.h -../../../src/dna_seq_indexer.c -../../../src/encode.h -../../../src/encode.c -../../../src/hashtable.h -../../../src/hashtable.c -../../../src/murmurhash2.h -../../../src/murmurhash2.c -../../../src/obi_align.h -../../../src/obi_align.c -../../../src/obiavl.h -../../../src/obiavl.c -../../../src/obiblob_indexer.h -../../../src/obiblob_indexer.c -../../../src/obiblob.h -../../../src/obiblob.c -../../../src/obidebug.h -../../../src/obidms_taxonomy.h -../../../src/obidms_taxonomy.c -../../../src/obidms.h -../../../src/obidms.c -../../../src/obidmscolumn_blob.c -../../../src/obidmscolumn_blob.h -../../../src/obidmscolumn_bool.c -../../../src/obidmscolumn_bool.h -../../../src/obidmscolumn_char.c -../../../src/obidmscolumn_char.h -../../../src/obidmscolumn_float.c -../../../src/obidmscolumn_float.h -../../../src/obidmscolumn_idx.h -../../../src/obidmscolumn_idx.c -../../../src/obidmscolumn_int.c -../../../src/obidmscolumn_int.h -../../../src/obidmscolumn_qual.h -../../../src/obidmscolumn_qual.c -../../../src/obidmscolumn_seq.c -../../../src/obidmscolumn_seq.h -../../../src/obidmscolumn_str.c -../../../src/obidmscolumn_str.h -../../../src/obidmscolumn.h -../../../src/obidmscolumn.c -../../../src/obidmscolumndir.h -../../../src/obidmscolumndir.c -../../../src/obierrno.h -../../../src/obierrno.c -../../../src/obilittlebigman.h -../../../src/obilittlebigman.c -../../../src/obitypes.h -../../../src/obitypes.c -../../../src/obiview.h -../../../src/obiview.c -../../../src/sse_banded_LCS_alignment.h -../../../src/sse_banded_LCS_alignment.c -../../../src/uint8_indexer.h -../../../src/uint8_indexer.c -../../../src/upperband.h -../../../src/upperband.c -../../../src/utils.h -../../../src/utils.c diff --git a/python/obitools3/dms/_obidmscolumn.cfiles b/python/obitools3/dms/_obidmscolumn.cfiles deleted file mode 100644 index 84e0436..0000000 --- a/python/obitools3/dms/_obidmscolumn.cfiles +++ /dev/null @@ -1,65 +0,0 @@ -../../../src/bloom.h -../../../src/bloom.c -../../../src/char_str_indexer.h -../../../src/char_str_indexer.c -../../../src/crc64.h -../../../src/crc64.c -../../../src/dna_seq_indexer.h -../../../src/dna_seq_indexer.c -../../../src/encode.h -../../../src/encode.c -../../../src/hashtable.h -../../../src/hashtable.c -../../../src/murmurhash2.h -../../../src/murmurhash2.c -../../../src/obi_align.h -../../../src/obi_align.c -../../../src/obiavl.h -../../../src/obiavl.c -../../../src/obiblob_indexer.h -../../../src/obiblob_indexer.c -../../../src/obiblob.h -../../../src/obiblob.c -../../../src/obidebug.h -../../../src/obidms_taxonomy.h -../../../src/obidms_taxonomy.c -../../../src/obidms.h -../../../src/obidms.c -../../../src/obidmscolumn_blob.c -../../../src/obidmscolumn_blob.h -../../../src/obidmscolumn_bool.c -../../../src/obidmscolumn_bool.h -../../../src/obidmscolumn_char.c -../../../src/obidmscolumn_char.h -../../../src/obidmscolumn_float.c -../../../src/obidmscolumn_float.h -../../../src/obidmscolumn_idx.h -../../../src/obidmscolumn_idx.c -../../../src/obidmscolumn_int.c -../../../src/obidmscolumn_int.h -../../../src/obidmscolumn_qual.h -../../../src/obidmscolumn_qual.c -../../../src/obidmscolumn_seq.c -../../../src/obidmscolumn_seq.h -../../../src/obidmscolumn_str.c -../../../src/obidmscolumn_str.h -../../../src/obidmscolumn.h -../../../src/obidmscolumn.c -../../../src/obidmscolumndir.h -../../../src/obidmscolumndir.c -../../../src/obierrno.h -../../../src/obierrno.c -../../../src/obilittlebigman.h -../../../src/obilittlebigman.c -../../../src/obitypes.h -../../../src/obitypes.c -../../../src/obiview.h -../../../src/obiview.c -../../../src/sse_banded_LCS_alignment.h -../../../src/sse_banded_LCS_alignment.c -../../../src/uint8_indexer.h -../../../src/uint8_indexer.c -../../../src/upperband.h -../../../src/upperband.c -../../../src/utils.h -../../../src/utils.c diff --git a/python/obitools3/dms/_obidmscolumn_bool.cfiles b/python/obitools3/dms/_obidmscolumn_bool.cfiles deleted file mode 100644 index 84e0436..0000000 --- a/python/obitools3/dms/_obidmscolumn_bool.cfiles +++ /dev/null @@ -1,65 +0,0 @@ -../../../src/bloom.h -../../../src/bloom.c -../../../src/char_str_indexer.h -../../../src/char_str_indexer.c -../../../src/crc64.h -../../../src/crc64.c -../../../src/dna_seq_indexer.h -../../../src/dna_seq_indexer.c -../../../src/encode.h -../../../src/encode.c -../../../src/hashtable.h -../../../src/hashtable.c -../../../src/murmurhash2.h -../../../src/murmurhash2.c -../../../src/obi_align.h -../../../src/obi_align.c -../../../src/obiavl.h -../../../src/obiavl.c -../../../src/obiblob_indexer.h -../../../src/obiblob_indexer.c -../../../src/obiblob.h -../../../src/obiblob.c -../../../src/obidebug.h -../../../src/obidms_taxonomy.h -../../../src/obidms_taxonomy.c -../../../src/obidms.h -../../../src/obidms.c -../../../src/obidmscolumn_blob.c -../../../src/obidmscolumn_blob.h -../../../src/obidmscolumn_bool.c -../../../src/obidmscolumn_bool.h -../../../src/obidmscolumn_char.c -../../../src/obidmscolumn_char.h -../../../src/obidmscolumn_float.c -../../../src/obidmscolumn_float.h -../../../src/obidmscolumn_idx.h -../../../src/obidmscolumn_idx.c -../../../src/obidmscolumn_int.c -../../../src/obidmscolumn_int.h -../../../src/obidmscolumn_qual.h -../../../src/obidmscolumn_qual.c -../../../src/obidmscolumn_seq.c -../../../src/obidmscolumn_seq.h -../../../src/obidmscolumn_str.c -../../../src/obidmscolumn_str.h -../../../src/obidmscolumn.h -../../../src/obidmscolumn.c -../../../src/obidmscolumndir.h -../../../src/obidmscolumndir.c -../../../src/obierrno.h -../../../src/obierrno.c -../../../src/obilittlebigman.h -../../../src/obilittlebigman.c -../../../src/obitypes.h -../../../src/obitypes.c -../../../src/obiview.h -../../../src/obiview.c -../../../src/sse_banded_LCS_alignment.h -../../../src/sse_banded_LCS_alignment.c -../../../src/uint8_indexer.h -../../../src/uint8_indexer.c -../../../src/upperband.h -../../../src/upperband.c -../../../src/utils.h -../../../src/utils.c diff --git a/python/obitools3/dms/_obidmscolumn_bool.pxd b/python/obitools3/dms/_obidmscolumn_bool.pxd deleted file mode 100644 index deaba52..0000000 --- a/python/obitools3/dms/_obidmscolumn_bool.pxd +++ /dev/null @@ -1,57 +0,0 @@ -#cython: language_level=3 - -from .capi.obiview cimport obi_get_bool_with_elt_name_and_col_p_in_view, \ - obi_get_bool_with_elt_idx_and_col_p_in_view, \ - obi_set_bool_with_elt_name_and_col_p_in_view, \ - obi_set_bool_with_elt_idx_and_col_p_in_view - -from cpython.bool cimport bool, PyBool_FromLong -from .capi.obitypes cimport index_t, \ - const_char_p, \ - OBIType_t, \ - obibool_t, \ - OBI_BOOL, \ - OBIBool_NA - -from .capi.obierrno cimport obi_errno - -from ._obidmscolumn cimport OBIDMS_column, \ - OBIDMS_column_line, \ - OBIDMS_column_p, \ - register_column_class - -from .capi.obidmscolumn cimport obi_column_get_obibool_with_elt_name, \ - obi_column_get_obibool_with_elt_idx, \ - obi_column_set_obibool_with_elt_name, \ - obi_column_set_obibool_with_elt_idx - - -from obitools3.utils cimport str2bytes, bytes2str - -cdef class OBIDMS_column_line_bool(OBIDMS_column_line) : - cdef update_pointer(self) - - @staticmethod - cdef bool obibool_t2bool(obibool_t value) - - @staticmethod - cdef bool2obibool_t(bool value) - - cpdef bool get_bool_item_by_name(self,bytes element_name) - cpdef bool get_bool_item_by_idx(self,index_t index) - cpdef set_bool_item_by_name(self,bytes element_name,bool value) - cpdef set_bool_item_by_idx(self,index_t index,bool value) - - -# cdef obibool_t [:] _data_view - -cdef class OBIDMS_column_bool(OBIDMS_column): - cdef OBIDMS_column _new(OBIView view, - bytes column_name, - index_t nb_elements_per_line=1, - object elements_names=None, - bytes comments=b""): - - cpdef object get_line(self, index_t line_nb) - cpdef set_line(self, index_t line_nb, object value) - diff --git a/python/obitools3/dms/_obidmscolumn_bool.pyx b/python/obitools3/dms/_obidmscolumn_bool.pyx deleted file mode 100644 index 20d3328..0000000 --- a/python/obitools3/dms/_obidmscolumn_bool.pyx +++ /dev/null @@ -1,294 +0,0 @@ -#cython: language_level=3 - - -cdef class OBIDMS_column_line_bool(OBIDMS_column_line) : - - cdef update_pointer(self): - """ - Checks if the obicolumn address changed since the last call and update - if need the `_column_p` and `_data_view` data structure fields. - """ - cdef OBIDMS_column_p column_p = self._column_pp[0] - - if column_p != self._column_p: - self._column_p = column_p -# self._data_view = ( (column_p.data)) + \ -# self._index * column_p.header.nb_elements_per_line - - @staticmethod - cdef bool obibool_t2bool(obibool_t value): - cdef bool result - - if value == OBIBool_NA : - result = None - else : - result = PyBool_FromLong(value) - - return result - - @staticmethod - cdef bool2obibool_t(bool value): - cdef obibool_t result - - if value is None: - result=OBIBool_NA - else: - result= value - - return result - - - def __init__(self, OBIDMS_column column, index_t line_nb) : - """ - Creates a new `OBIDMS_column_line_bool` - - @param column: an OBIDMS_column instance - @param line_nb: the line in the column - """ - - OBIDMS_column_line.__init__(self,column,line_nb) - self.update_pointer() - - - - cpdef bool get_bool_item_by_name(self,bytes element_name): - """ - Returns the value associated to the name `element_name` of the current line - - @param element_name: a `bytes` instance containing the name of the element - - @return: the `bool` value corresponding to the name - """ - cdef char* cname = element_name - cdef obibool_t value - global obi_errno - - self.update_pointer() - - value = obi_column_get_obibool_with_elt_name(self._column_p, - self._index, - cname) - - if obi_errno > 0 : - obi_errno = 0 - raise KeyError("Cannot access to key %s" % bytes2str(element_name)) - - return OBIDMS_column_line_bool.obibool_t2bool(value) - - cpdef bool get_bool_item_by_idx(self,index_t index): - """ - Returns the value associated to the name `element_name` of the current line - - @param index: a `int` instance containing the index of the element - - @return: the `bool` value corresponding to the name - """ - cdef obibool_t value # @DuplicatedSignature - global obi_errno - - - self.update_pointer() - - value = obi_column_get_obibool_with_elt_idx(self._column_p, - self._index, - index) - - if obi_errno > 0 : - obi_errno = 0 - raise IndexError("Cannot access to element %d" % index) - - return OBIDMS_column_line_bool.obibool_t2bool(value) - - - def __getitem__(self, object element_name) : - cdef bytes name - cdef int cindex - cdef obibool_t value - cdef type typearg = type(element_name) - cdef bool result - - - if typearg == int: - cindex=element_name - if cindex < 0: - cindex = self._len - cindex - result=self.get_bool_item_by_idx(cindex) - elif typearg == bytes: - result=self.get_bool_item_by_name(element_name) - elif typearg == str: - name = str2bytes(element_name) - result=self.get_bool_item_by_name(name) - - return result - - cpdef set_bool_item_by_name(self,bytes element_name,bool value): - """ - Sets the value associated to the name `element_name` of the current line - - @param element_name: a `bytes` instance containing the name of the element - @param value: a `bool` instance of the new value - - @return: the `bool` value corresponding to the name - """ - cdef char* cname = element_name - cdef obibool_t cvalue - - self.update_pointer() - cvalue = OBIDMS_column_line_bool.bool2obibool_t(value) - - if ( obi_column_set_obibool_with_elt_name(self._column_p, - self._index, - cname, - cvalue) < 0 ): - raise KeyError("Cannot access to key %s" % bytes2str(element_name)) - - cpdef set_bool_item_by_idx(self,index_t index,bool value): - """ - Sets the value associated to the name `element_name` of the current line - - @param index: a `int` instance containing the index of the element - @param value: a `bool` instance of the new value - - @return: the `bool` value corresponding to the name - """ - cdef obibool_t cvalue # @DuplicatedSignature - - self.update_pointer() - cvalue = OBIDMS_column_line_bool.bool2obibool_t(value) - - if ( obi_column_set_obibool_with_elt_idx(self._column_p, - self._index, - index, - cvalue) < 0 ): - raise IndexError("Cannot access to item index %d" % index) - - - - def __setitem__(self, object element_name, object value): - cdef bytes name - cdef int cindex - cdef type typearg = type(element_name) - cdef bool result - - - if typearg == int: - cindex=element_name - if cindex < 0: - cindex = self._len - cindex - self.set_bool_item_by_idx(cindex,value) - elif typearg == bytes: - self.set_bool_item_by_name(element_name,value) - elif typearg == str: - name = str2bytes(element_name) - self.set_bool_item_by_name(name,value) - - def __repr__(self) : - return str(self._column.get_line(self._index)) - - def __len__(self): - return self._len - - - -cdef class OBIDMS_column_bool(OBIDMS_column): - - @staticmethod - cdef OBIDMS_column _new(OBIView view, - bytes column_name, - index_t nb_elements_per_line=1, - object elements_names=None, - bytes comments=b""): - - cdef bytes elements_names_b - cdef char* elements_names_p - cdef OBIDMS_column new_column - - if elements_names is not None: - elements_names_b = b''.join([tobytes(x) for x in elements_names]) - elements_names_p = elements_names_b - else: - elements_names_p = NULL - - if (obi_view_add_column(view = view._pointer, - column_name = column_name, - version_number = -1, - alias = NULL, - data_type = OBI_BOOL, - nb_lines = len(view), - nb_elements_per_line = nb_elements_per_line, - elements_names = elements_names_p, - indexer_name = NULL, - associated_column_name = NULL, - associated_column_version = -1, - comments = comments, - create = True)<0): - raise RuntimeError("Cannot create column %s in view %s" % (bytes2str(column_name), - bytes2str(view.name))) - - view.__init_columns__() - new_column = self._columns[column_name] - - return new_column - - @staticmethod - def new(OBIView view, - object column_name, - index_t nb_elements_per_line=1, - object elements_names=None, - object comments=b""): - - return OBIDMS_column_bool._new(view, - tobytes(column_name), - nb_elements_per_line, - elements_names, - tobytes(comments)) - - cpdef add_to_view(self, - OBIView view, - object column_name=None, - object comments=b""): - - cdef OBIDMS_column_p column_p = self._column_pp[0] - cdef bytes alias - - if (column_name is None): - alias = self._alias - else: - alias = tobytes(column_name) - - obi_view_add_column(view = view._ponter, - column_name = column_p.header.name, - version_number = column_p.header.version, - alias = alias, - data_type = OBI_BOOL, - nb_lines = column_p.header.lines_used, - nb_elements_per_line = column_p.header.nb_elements_per_line, - elements_names = column_p.header.elements_names, - indexer_name = NULL, - associated_column_name = NULL, - associated_column_version = NULL, - comments = tobytes(comments), - create = False) - - cpdef object get_line(self, index_t line_nb): - cdef obibool_t value - cdef object result - global obi_errno - - value = obi_get_bool_with_elt_idx_and_col_p_in_view(self._view._pointer, (self._pointer)[0], line_nb, 0) - if obi_errno > 0 : - raise IndexError(line_nb) - if value == OBIBool_NA : - result = None - else : - result = PyBool_FromLong(value) - return result - - cpdef set_line(self, index_t line_nb, object value): - if value is None : - value = OBIBool_NA - if obi_set_bool_with_elt_idx_and_col_p_in_view(self._view._pointer, (self._pointer)[0], line_nb, 0, value) < 0: - raise Exception("Problem setting a value in a column") - - -register_column_class(OBI_BOOL,OBIDMS_column_bool) \ No newline at end of file diff --git a/python/obitools3/dms/_obiseq.cfiles b/python/obitools3/dms/_obiseq.cfiles deleted file mode 100644 index 84e0436..0000000 --- a/python/obitools3/dms/_obiseq.cfiles +++ /dev/null @@ -1,65 +0,0 @@ -../../../src/bloom.h -../../../src/bloom.c -../../../src/char_str_indexer.h -../../../src/char_str_indexer.c -../../../src/crc64.h -../../../src/crc64.c -../../../src/dna_seq_indexer.h -../../../src/dna_seq_indexer.c -../../../src/encode.h -../../../src/encode.c -../../../src/hashtable.h -../../../src/hashtable.c -../../../src/murmurhash2.h -../../../src/murmurhash2.c -../../../src/obi_align.h -../../../src/obi_align.c -../../../src/obiavl.h -../../../src/obiavl.c -../../../src/obiblob_indexer.h -../../../src/obiblob_indexer.c -../../../src/obiblob.h -../../../src/obiblob.c -../../../src/obidebug.h -../../../src/obidms_taxonomy.h -../../../src/obidms_taxonomy.c -../../../src/obidms.h -../../../src/obidms.c -../../../src/obidmscolumn_blob.c -../../../src/obidmscolumn_blob.h -../../../src/obidmscolumn_bool.c -../../../src/obidmscolumn_bool.h -../../../src/obidmscolumn_char.c -../../../src/obidmscolumn_char.h -../../../src/obidmscolumn_float.c -../../../src/obidmscolumn_float.h -../../../src/obidmscolumn_idx.h -../../../src/obidmscolumn_idx.c -../../../src/obidmscolumn_int.c -../../../src/obidmscolumn_int.h -../../../src/obidmscolumn_qual.h -../../../src/obidmscolumn_qual.c -../../../src/obidmscolumn_seq.c -../../../src/obidmscolumn_seq.h -../../../src/obidmscolumn_str.c -../../../src/obidmscolumn_str.h -../../../src/obidmscolumn.h -../../../src/obidmscolumn.c -../../../src/obidmscolumndir.h -../../../src/obidmscolumndir.c -../../../src/obierrno.h -../../../src/obierrno.c -../../../src/obilittlebigman.h -../../../src/obilittlebigman.c -../../../src/obitypes.h -../../../src/obitypes.c -../../../src/obiview.h -../../../src/obiview.c -../../../src/sse_banded_LCS_alignment.h -../../../src/sse_banded_LCS_alignment.c -../../../src/uint8_indexer.h -../../../src/uint8_indexer.c -../../../src/upperband.h -../../../src/upperband.c -../../../src/utils.h -../../../src/utils.c diff --git a/python/obitools3/dms/_obiseq.pxd b/python/obitools3/dms/_obiseq.pxd deleted file mode 100644 index 62ecc5e..0000000 --- a/python/obitools3/dms/_obiseq.pxd +++ /dev/null @@ -1,21 +0,0 @@ -#cython: language_level=3 - -from ._obiview cimport OBIView_line - - -cdef class OBI_Seq(dict) : - cdef str _id - cdef object _seq - cdef str _definition - - -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/dms/_obiseq.pyx b/python/obitools3/dms/_obiseq.pyx deleted file mode 100644 index a0f1b94..0000000 --- a/python/obitools3/dms/_obiseq.pyx +++ /dev/null @@ -1,188 +0,0 @@ -#cython: language_level=3 - -from obitools3.utils cimport bytes2str, str2bytes - -from .capi.obiview cimport NUC_SEQUENCE_COLUMN, \ - ID_COLUMN, \ - DEFINITION_COLUMN, \ - QUALITY_COLUMN -from docutils.nodes import definition - - -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, - str definition=None, - dict tags=None) : - - if tags is not None: - self.update(tags) - - self._id = id - self._seq = seq - - if definition is not None : - self._definition = definition - else: - self._definition = None - - - - 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) - - def __setitem__(self,str key,object value): - if key == __str__ID_COLUMN__: - self._id=value - elif key == __str__DEFINITION_COLUMN__: - self._definition=value - else: - dict.__setitem__(self,key,value) - - # sequence id property getter and setter - @property - def id(self): # @ReservedAssignment - return self._id - @id.setter - def id(self, str new_id): # @ReservedAssignment @DuplicatedSignature - self._id = new_id - - # sequence property getter and setter - @property - def seq(self): - return self._seq - @seq.setter - def seq(self, object new_seq): # @DuplicatedSignature - self._seq = new_seq - # self["SEQ"] = new_seq # TODO discuss - - # sequence definition property getter and setter - @property - def definition(self): - return self._definition - @definition.setter - def definition(self, object new_definition): # @DuplicatedSignature - self._definition = new_definition - - -cdef class OBI_Nuc_Seq(OBI_Seq) : - - def __init__(self, str id, - object seq, - str quality=None, - str definition=None, - dict tags=None) : - OBI_Seq.__init__(self,id,seq,tags) - if quality is not None: - self._quality=quality - else: - self._quality=None - - - - def __getitem__(self,str key): - if key == __str__NUC_SEQUENCE_COLUMN__: - return self._seq - elif key == __str__QUALITY_COLUMN__: - return self._quality - else: - return OBI_Seq.__getitem__(self,key) - - def __setitem__(self,str key, object value): - if key == __str__NUC_SEQUENCE_COLUMN__: - self._seq = value - elif key == __str__QUALITY_COLUMN__: - self._quality=value - else: - OBI_Seq.__setitem__(self,key,value) - - - - 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): - return self._seq - @seq.setter - def seq(self, object new_seq): # @DuplicatedSignature - self._seq = new_seq -# self[bytes2str(NUC_SEQUENCE_COLUMN)] = new_seq - - # sequence quality property getter and setter - @property - def quality(self): - return self._quality - @quality.setter - def quality(self, object new_quality): # @DuplicatedSignature - self._quality = new_quality -# self[bytes2str(QUALITY_COLUMN)] = new_quality - -# cpdef str reverse_complement(self) : TODO in C ? -# pass - - -cdef class OBI_Nuc_Seq_Stored(OBIView_line) : - - # TODO store the str version of column name macros? - - # sequence id property getter and setter - @property - def id(self): # @ReservedAssignment @DuplicatedSignature - return self[__str__ID_COLUMN__] - - @id.setter - def id(self, str new_id): # @ReservedAssignment @DuplicatedSignature - self[__str__ID_COLUMN__] = new_id - - # sequence definition property getter and setter - @property - def definition(self): - return self[__str__DEFINITION_COLUMN__] - - @definition.setter - def definition(self, str new_def): # @DuplicatedSignature - self[__str__DEFINITION_COLUMN__] = new_def - - # nuc_seq property getter and setter - @property - def nuc_seq(self): - return self[__str__NUC_SEQUENCE_COLUMN__] - - @nuc_seq.setter - def nuc_seq(self, object new_seq): # @DuplicatedSignature - self[__str__NUC_SEQUENCE_COLUMN__] = new_seq - - # quality property getter and setter - @property - def quality(self): - 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[__str__QUALITY_COLUMN__] = new_qual - else : # Quality is in str form - (((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)[__str__QUALITY_COLUMN__].get_str_line(self._index) - -# cpdef str reverse_complement(self) : TODO in C ? -# pass - - # TODO static method to import OBI_Nuc_Seq to OBI_Nuc_Seq_Stored ? - diff --git a/python/obitools3/dms/_obitaxo.cfiles b/python/obitools3/dms/_obitaxo.cfiles deleted file mode 100644 index 84e0436..0000000 --- a/python/obitools3/dms/_obitaxo.cfiles +++ /dev/null @@ -1,65 +0,0 @@ -../../../src/bloom.h -../../../src/bloom.c -../../../src/char_str_indexer.h -../../../src/char_str_indexer.c -../../../src/crc64.h -../../../src/crc64.c -../../../src/dna_seq_indexer.h -../../../src/dna_seq_indexer.c -../../../src/encode.h -../../../src/encode.c -../../../src/hashtable.h -../../../src/hashtable.c -../../../src/murmurhash2.h -../../../src/murmurhash2.c -../../../src/obi_align.h -../../../src/obi_align.c -../../../src/obiavl.h -../../../src/obiavl.c -../../../src/obiblob_indexer.h -../../../src/obiblob_indexer.c -../../../src/obiblob.h -../../../src/obiblob.c -../../../src/obidebug.h -../../../src/obidms_taxonomy.h -../../../src/obidms_taxonomy.c -../../../src/obidms.h -../../../src/obidms.c -../../../src/obidmscolumn_blob.c -../../../src/obidmscolumn_blob.h -../../../src/obidmscolumn_bool.c -../../../src/obidmscolumn_bool.h -../../../src/obidmscolumn_char.c -../../../src/obidmscolumn_char.h -../../../src/obidmscolumn_float.c -../../../src/obidmscolumn_float.h -../../../src/obidmscolumn_idx.h -../../../src/obidmscolumn_idx.c -../../../src/obidmscolumn_int.c -../../../src/obidmscolumn_int.h -../../../src/obidmscolumn_qual.h -../../../src/obidmscolumn_qual.c -../../../src/obidmscolumn_seq.c -../../../src/obidmscolumn_seq.h -../../../src/obidmscolumn_str.c -../../../src/obidmscolumn_str.h -../../../src/obidmscolumn.h -../../../src/obidmscolumn.c -../../../src/obidmscolumndir.h -../../../src/obidmscolumndir.c -../../../src/obierrno.h -../../../src/obierrno.c -../../../src/obilittlebigman.h -../../../src/obilittlebigman.c -../../../src/obitypes.h -../../../src/obitypes.c -../../../src/obiview.h -../../../src/obiview.c -../../../src/sse_banded_LCS_alignment.h -../../../src/sse_banded_LCS_alignment.c -../../../src/uint8_indexer.h -../../../src/uint8_indexer.c -../../../src/upperband.h -../../../src/upperband.c -../../../src/utils.h -../../../src/utils.c diff --git a/python/obitools3/dms/_obitaxo.pxd b/python/obitools3/dms/_obitaxo.pxd deleted file mode 100644 index 51c6c0f..0000000 --- a/python/obitools3/dms/_obitaxo.pxd +++ /dev/null @@ -1,20 +0,0 @@ -#cython: language_level=3 - -from .capi.obitaxonomy cimport ecotx_t, OBIDMS_taxonomy_p -from ._obidms cimport OBIDMS - - -cdef class OBI_Taxonomy : - - cdef str _name - cdef OBIDMS_taxonomy_p _pointer - cdef OBIDMS _dms - - cpdef write(self, str prefix) - cpdef int add_taxon(self, str name, str rank_name, int parent_taxid, int min_taxid=*) - cpdef close(self) - - -cdef class OBI_Taxon : - - cdef ecotx_t* _pointer diff --git a/python/obitools3/dms/_obitaxo.pyx b/python/obitools3/dms/_obitaxo.pyx deleted file mode 100644 index b9d7e98..0000000 --- a/python/obitools3/dms/_obitaxo.pyx +++ /dev/null @@ -1,129 +0,0 @@ -#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, \ - obi_taxonomy_add_local_taxon, \ - ecotx_t - - -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) - if taxon_p == NULL : - raise Exception("Taxon not found") - 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 - cdef int t - - taxa = self._pointer.taxa.taxon - - # Yield each taxid - for t in range(self._pointer.taxa.count): - taxon_p = (taxa+t) - 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 int add_taxon(self, str name, str rank_name, int parent_taxid, int min_taxid=10000000) : - cdef int taxid - taxid = obi_taxonomy_add_local_taxon(self._pointer, str2bytes(name), str2bytes(rank_name), parent_taxid, min_taxid) - if taxid < 0 : - raise Exception("Error adding a new taxon to the taxonomy") - else : - return taxid - - - 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 = 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) - - - diff --git a/python/obitools3/dms/_obiview_nuc_seq.pxd b/python/obitools3/dms/_obiview_nuc_seq.pxd deleted file mode 100644 index badb5c4..0000000 --- a/python/obitools3/dms/_obiview_nuc_seq.pxd +++ /dev/null @@ -1,25 +0,0 @@ -#cython: language_level=3 - -from ._obiview cimport OBIView -from ._obiseq cimport OBI_Nuc_Seq, OBI_Nuc_Seq_Stored - - -cdef class OBIView_NUC_SEQS_QUAL(OBIView_NUC_SEQS): - cpdef OBIView clone(self, - str view_name, - OBIView_line_selection line_selection=*, - str comments=*) - - @staticmethod - cpdef OBIView new(OBIDMS dms, - str view_name, - str comments=*) - - @staticmethod - cpdef OBIView open(OBIDMS dms, - str view_name) - -cdef class OBIView_NUC_SEQS_line_selection(OBIView_line_selection): - cpdef OBIView materialize(self, - str view_name, - str comments=*) diff --git a/python/obitools3/dms/_obiview_nuc_seq.pyx b/python/obitools3/dms/_obiview_nuc_seq.pyx deleted file mode 100644 index 6b58303..0000000 --- a/python/obitools3/dms/_obiview_nuc_seq.pyx +++ /dev/null @@ -1,105 +0,0 @@ -#cython: language_level=3 - -from .capi.obitypes cimport index_t - - -cdef class OBIView_NUC_SEQS(OBIView): - - cpdef OBIView clone(self, - str view_name, - str comments=""): - - cdef OBIView view = OBIView_NUC_SEQS(987654) - - view._pointer = obi_new_view_nuc_seqs(self._pointer.dms, - str2bytes(view_name), - self._pointer, - NULL, - str2bytes(comments), - False) - - if view._pointer == NULL : - raise RuntimeError("Error : Cannot clone view %s into view %s" - % (str(self.name), - view_name) - ) - - view.__init_columns__(self) - - return view - - @staticmethod - cpdef OBIView new(OBIDMS dms, - str view_name, - str comments=""): - - cdef OBIView view = OBIView_NUC_SEQS(987654) # @DuplicatedSignature - - view._pointer = obi_new_view_nuc_seqs(dms._pointer, - str2bytes(view_name), - NULL, - NULL, - str2bytes(comments), - False) - - if view._pointer == NULL : - raise RuntimeError("Error : Cannot create view %s" % view_name) - - view.__init_columns__(self) - - return view - - @staticmethod - cpdef OBIView open(OBIDMS dms, - str view_name): - - cdef OBIView view = OBIView_NUC_SEQS(987654) # @DuplicatedSignature - - view._pointer = obi_open_view(dms._pointer, - str2bytes(view_name)) - - if view._pointer == NULL : - raise RuntimeError("Error : Cannot open view %s" % view_name) - - view.__init_columns__(self) - - return view - - cpdef OBIView_line_selection new_selection(self,list lines=None): - return OBIView_NUC_SEQS_line_selection(self,lines) - - def __getitem__(self, object item) : - if type(item) == str : - return (self._columns)[item] - elif type(item) == int : - return OBI_Nuc_Seq_Stored(self, item) - - - def __setitem__(self, index_t line_idx, OBI_Nuc_Seq sequence_obj) : - for key in sequence_obj : - self[line_idx][key] = sequence_obj[key] - - -cdef class OBIView_NUC_SEQS_line_selection(OBIView_line_selection): - - cpdef OBIView materialize(self, - str view_name, - str comments=""): - - cdef OBIView view = OBIView_NUC_SEQS(987654) - - view._pointer = obi_new_view(self._view._pointer.dms, - str2bytes(view_name), - self._view._pointer, - self.__build_binary_list__(), - str2bytes(comments)) - - if view._pointer == NULL : - raise RuntimeError("Error : Cannot clone view %s into view %s" - % (str(self.name), - view_name) - ) - - view.__init_columns__(self) - - return view diff --git a/python/obitools3/dms/_obiview_nuc_seq_qual.pxd b/python/obitools3/dms/_obiview_nuc_seq_qual.pxd deleted file mode 100644 index 72259d9..0000000 --- a/python/obitools3/dms/_obiview_nuc_seq_qual.pxd +++ /dev/null @@ -1,25 +0,0 @@ -#cython: language_level=3 - -from ._obidms cimport OBIView -from ._obiseq cimport OBI_Nuc_Seq, OBI_Nuc_Seq_Stored - - -cdef class OBIView_NUC_SEQS_QUAL(OBIView_NUC_SEQS): - cpdef OBIView clone(self, - str view_name, - OBIView_line_selection line_selection=*, - str comments=*) - - @staticmethod - cpdef OBIView new(OBIDMS dms, - str view_name, - str comments=*) - - @staticmethod - cpdef OBIView open(OBIDMS dms, - str view_name) - -cdef class OBIView_NUC_SEQS_QUAL_line_selection(OBIView_NUC_SEQS_line_selection): - cpdef OBIView materialize(self, - str view_name, - str comments=*) diff --git a/python/obitools3/dms/_obiview_nuc_seq_qual.pyx b/python/obitools3/dms/_obiview_nuc_seq_qual.pyx deleted file mode 100644 index b6454ec..0000000 --- a/python/obitools3/dms/_obiview_nuc_seq_qual.pyx +++ /dev/null @@ -1,90 +0,0 @@ -#cython: language_level=3 - -from .capi.obitypes cimport index_t - - -cdef class OBIView_NUC_SEQS_QUAL(OBIView_NUC_SEQS): - - cpdef OBIView clone(self, - str view_name, - str comments=""): - - cdef OBIView view = OBIView_NUC_SEQS_QUAL(987654) - - view._pointer = obi_new_view_nuc_seqs(self._pointer.dms, - str2bytes(view_name), - self._pointer, - NULL, - str2bytes(comments), - True) - - if view._pointer == NULL : - raise RuntimeError("Error : Cannot clone view %s into view %s" - % (str(self.name), - view_name) - ) - - view.__init_columns__(self) - - return view - - @staticmethod - cpdef OBIView new(OBIDMS dms, - str view_name, - str comments=""): - - cdef OBIView view = OBIView_NUC_SEQS_QUAL(987654) # @DuplicatedSignature - - view._pointer = obi_new_view_nuc_seqs(dms._pointer, - str2bytes(view_name), - NULL, - NULL, - str2bytes(comments), - True) - - if view._pointer == NULL : - raise RuntimeError("Error : Cannot create view %s" % view_name) - - view.__init_columns__(self) - - return view - - @staticmethod - cpdef OBIView open(OBIDMS dms, - str view_name): - - cdef OBIView view = OBIView_NUC_SEQS_QUAL(987654) # @DuplicatedSignature - - view._pointer = obi_open_view(dms._pointer, - str2bytes(view_name)) - - if view._pointer == NULL : - raise RuntimeError("Error : Cannot open view %s" % view_name) - - view.__init_columns__(self) - - return view - -cdef class OBIView_NUC_SEQS_QUAL_line_selection(OBIView_NUC_SEQS_line_selection): - - cpdef OBIView materialize(self, - str view_name, - str comments=""): - - cdef OBIView view = OBIView_NUC_SEQS_QUAL(987654) - - view._pointer = obi_new_view(self._view._pointer.dms, - str2bytes(view_name), - self._view._pointer, - self.__build_binary_list__(), - str2bytes(comments)) - - if view._pointer == NULL : - raise RuntimeError("Error : Cannot clone view %s into view %s" - % (str(self.name), - view_name) - ) - - view.__init_columns__(self) - - return view From 0526386337d9f865e5a75d149f746d80780e8ecc Mon Sep 17 00:00:00 2001 From: Eric Coissac Date: Tue, 27 Dec 2016 06:17:45 +0100 Subject: [PATCH 10/16] first working DMS class --- python/obitools3/dms/__init__.py | 2 + python/obitools3/dms/capi/obidms.pxd | 4 + python/obitools3/dms/capi/obidmscolumn.pxd | 8 +- python/obitools3/dms/capi/obitypes.pxd | 1 + python/obitools3/dms/capi/obiview.pxd | 4 +- python/obitools3/dms/column.pxd | 38 +-- python/obitools3/dms/column.pyx | 67 +++-- python/obitools3/dms/dms.cfiles | 32 +++ python/obitools3/dms/dms.pxd | 19 +- python/obitools3/dms/dms.pyx | 58 +++-- python/obitools3/dms/view.pxd | 53 ++-- python/obitools3/dms/view.pyx | 280 ++++++++++++--------- python/obitools3/parsers/fasta.pyx | 62 ++++- python/obitools3/utils.pyx | 2 - 14 files changed, 371 insertions(+), 259 deletions(-) create mode 100644 python/obitools3/dms/dms.cfiles diff --git a/python/obitools3/dms/__init__.py b/python/obitools3/dms/__init__.py index e69de29..60bfaf1 100644 --- a/python/obitools3/dms/__init__.py +++ b/python/obitools3/dms/__init__.py @@ -0,0 +1,2 @@ +from .dms import DMS # @UnresolvedImport + diff --git a/python/obitools3/dms/capi/obidms.pxd b/python/obitools3/dms/capi/obidms.pxd index 9bb116f..5f30088 100644 --- a/python/obitools3/dms/capi/obidms.pxd +++ b/python/obitools3/dms/capi/obidms.pxd @@ -10,3 +10,7 @@ cdef extern from "obidms.h" nogil: OBIDMS_p obi_dms(const_char_p dms_name) int obi_close_dms(OBIDMS_p dms) + char* obi_dms_get_dms_path(OBIDMS_p dms) + char* obi_dms_get_full_path(OBIDMS_p dms, const_char_p path_name) + + diff --git a/python/obitools3/dms/capi/obidmscolumn.pxd b/python/obitools3/dms/capi/obidmscolumn.pxd index 2562dda..0bd0a5b 100644 --- a/python/obitools3/dms/capi/obidmscolumn.pxd +++ b/python/obitools3/dms/capi/obidmscolumn.pxd @@ -2,7 +2,7 @@ from ..capi.obidms cimport OBIDMS_p from ..capi.obitypes cimport const_char_p, \ - OBIType_t, \ + obitype_t, \ obiversion_t, \ obiint_t, \ obibool_t, \ @@ -29,8 +29,8 @@ cdef extern from "obidmscolumn.h" nogil: index_t lines_used index_t nb_elements_per_line const_char_p elements_names - OBIType_t returned_data_type - OBIType_t stored_data_type + obitype_t returned_data_type + obitype_t stored_data_type time_t creation_date obiversion_t version obiversion_t cloned_from @@ -50,7 +50,7 @@ cdef extern from "obidmscolumn.h" nogil: OBIDMS_column_p obi_create_column(OBIDMS_p dms, const_char_p column_name, - OBIType_t type, + obitype_t type, index_t nb_lines, index_t nb_elements_per_line, const_char_p elements_names, diff --git a/python/obitools3/dms/capi/obitypes.pxd b/python/obitools3/dms/capi/obitypes.pxd index d765629..efc2fb5 100644 --- a/python/obitools3/dms/capi/obitypes.pxd +++ b/python/obitools3/dms/capi/obitypes.pxd @@ -53,3 +53,4 @@ cdef extern from "obitypes.h" nogil: const_char_p name_data_type(int data_type) +ctypedef OBIType_t obitype_t diff --git a/python/obitools3/dms/capi/obiview.pxd b/python/obitools3/dms/capi/obiview.pxd index 34521ca..4abe361 100644 --- a/python/obitools3/dms/capi/obiview.pxd +++ b/python/obitools3/dms/capi/obiview.pxd @@ -1,7 +1,7 @@ #cython: language_level=3 from .obitypes cimport const_char_p, \ - OBIType_t, \ + obitype_t, \ obiversion_t, \ obiint_t, \ obibool_t, \ @@ -78,7 +78,7 @@ cdef extern from "obiview.h" nogil: const_char_p column_name, obiversion_t version_number, const_char_p alias, - OBIType_t data_type, + obitype_t data_type, index_t nb_lines, index_t nb_elements_per_line, char* elements_names, diff --git a/python/obitools3/dms/column.pxd b/python/obitools3/dms/column.pxd index 94aa986..cbdd86b 100644 --- a/python/obitools3/dms/column.pxd +++ b/python/obitools3/dms/column.pxd @@ -1,41 +1,25 @@ #cython: language_level=3 -from .capi.obidmscolumn cimport OBIDMS_column_p, \ - OBIDMS_column_header_p, \ - obi_close_column, \ - obi_column_prepare_to_get_value - -from .capi.obiview cimport Obiview_p, \ - obi_view_get_pointer_on_column_in_view - -from .capi.obitypes cimport obiversion_t, \ - OBIType_t, \ - index_t, \ - name_data_type - -from .capi.obiutils cimport obi_format_date - +from .capi.obitypes cimport index_t, \ + obitype_t +from .capi.obidmscolumn cimport OBIDMS_column_p + from .view cimport View cdef class Column: - cdef bytes _alias # associated property: alias - cdef OBIDMS_column_p* _pointer - cdef OBIView _view + cdef OBIDMS_column_p* _pointer + cdef View _view cpdef close(self) - @staticmethod - cdef type get_subclass_type(OBIDMS_column_p column_p) - cdef class Column_line: - cdef OBIDMS_column _column - cdef OBIDMS_column_p _column_p - cdef OBIDMS_column_p* _column_pp - cdef index_t _index - cdef int _len + cdef Column _column + cdef index_t _index cpdef update(self, data) -cdef register_column_class(OBIType_t obitype,type classe, type python) +cdef register_column_class(obitype_t obitype, + type classe, + type python) diff --git a/python/obitools3/dms/column.pyx b/python/obitools3/dms/column.pyx index e021d8f..77205ff 100644 --- a/python/obitools3/dms/column.pyx +++ b/python/obitools3/dms/column.pyx @@ -1,7 +1,17 @@ #cython: language_level=3 +from .capi.obitypes cimport name_data_type + +from .capi.obidmscolumn cimport OBIDMS_column_header_p, \ + obi_close_column, \ + obi_column_prepare_to_get_value + +from .capi.obiutils cimport obi_format_date + from .dms cimport __OBIDMS_COLUMN_CLASS__ +from obitools3.utils cimport bytes2str + cdef class Column : """ @@ -9,9 +19,9 @@ cdef class Column : """ # Note: should only be initialized through a subclass - def __init__(self, - View view, - object name): + def __init__(self, + View view, + int __internalCall__): ''' Create a new OBDMS column objected referring to a already created column in the context of a view. @@ -20,22 +30,19 @@ cdef class Column : @param view: The view object containing the column. @type view: OBIView - @param name: The name of the column in the view - @type name: a `str` or a `bytes` ''' cdef OBIDMS_column_p* column_pp + if __internalCall__!=987654: + raise RuntimeError('OBIView constructor cannot be called directly') + # Check that the class is only created as a subclass instance if type(self)==Column or not isinstance(self, Column): raise RuntimeError('OBIDMS.Column constructor cannot be called directly') - - column_pp = obi_view_get_pointer_on_column_in_view(view._pointer, - tobytes(column_alias)) - + # Fill structure - self._alias = column_alias - self._pointer = column_pp + self._pointer = NULL self._view = view def __len__(self): @@ -75,15 +82,16 @@ cdef class Column : ) cpdef close(self): - if obi_close_column((self._pointer)[0]) < 0 : - raise Exception("Problem closing a column") + if self._pointer != NULL: + if obi_close_column(self._pointer[0]) < 0 : + raise Exception("Problem closing column %s" % bytes2str(self.name)) # Column alias property getter and setter @property - def alias(self): + def name(self): return self._alias - @alias.setter - def alias(self, new_alias): # @DuplicatedSignature + @name.setter + def name(self, new_alias): # @DuplicatedSignature self._view.change_column_alias(self._alias, new_alias) # elements_names property getter @@ -126,38 +134,23 @@ cdef class Column : def creation_date(self): return obi_format_date((self._pointer)[0].header.creation_date) - @staticmethod - cdef type get_subclass_type(OBIDMS_column_p column_p) : - - cdef type subclass - cdef OBIType_t col_type - - col_type = column_p.header.returned_data_type - subclass = __OBIDMS_COLUMN_CLASS__[col_type] - - return subclass - - - ###################################################################################################### -cdef class OBIDMS_column_line : +cdef class Column_line : - def __init__(self, OBIDMS_column column, index_t line_nb) : + def __init__(self, Column column, index_t line_nb) : self._index = line_nb self._column = column - self._column_pp = column._pointer - self._column_p = NULL - self._len = self._column_pp[0].header.nb_elements_per_line - if obi_column_prepare_to_get_value(self._column_pp[0],line_nb) < 0: + if obi_column_prepare_to_get_value(self._column._pointer[0],line_nb) < 0: raise IndexError("Cannot access to the line %d" % line_nb) def __contains__(self, str element_name): - return (element_name in self._column.elements_names) + pass + #return (element_name in self._column.elements_names) def __repr__(self) : return str(self._column.get_line(self._index)) @@ -173,7 +166,7 @@ cdef class OBIDMS_column_line : ###################################################################################################### -cdef register_column_class(OBIType_t obitype, +cdef register_column_class(obitype_t obitype, type classe, type python): """ diff --git a/python/obitools3/dms/dms.cfiles b/python/obitools3/dms/dms.cfiles new file mode 100644 index 0000000..f541dda --- /dev/null +++ b/python/obitools3/dms/dms.cfiles @@ -0,0 +1,32 @@ +../../../src/bloom.c +../../../src/char_str_indexer.c +../../../src/crc64.c +../../../src/dna_seq_indexer.c +../../../src/encode.c +../../../src/hashtable.c +../../../src/murmurhash2.c +../../../src/obi_align.c +../../../src/obiavl.c +../../../src/obiblob_indexer.c +../../../src/obiblob.c +../../../src/obidms_taxonomy.c +../../../src/obidms.c +../../../src/obidmscolumn_blob.c +../../../src/obidmscolumn_bool.c +../../../src/obidmscolumn_char.c +../../../src/obidmscolumn_float.c +../../../src/obidmscolumn_idx.c +../../../src/obidmscolumn_int.c +../../../src/obidmscolumn_qual.c +../../../src/obidmscolumn_seq.c +../../../src/obidmscolumn_str.c +../../../src/obidmscolumn.c +../../../src/obidmscolumndir.c +../../../src/obierrno.c +../../../src/obilittlebigman.c +../../../src/obitypes.c +../../../src/obiview.c +../../../src/sse_banded_LCS_alignment.c +../../../src/uint8_indexer.c +../../../src/upperband.c +../../../src/utils.c diff --git a/python/obitools3/dms/dms.pxd b/python/obitools3/dms/dms.pxd index 167e692..cc11ef2 100644 --- a/python/obitools3/dms/dms.pxd +++ b/python/obitools3/dms/dms.pxd @@ -1,20 +1,25 @@ #cython: language_level=3 from .capi.obidms cimport OBIDMS_p -from .capi.obidmscolumn cimport OBIDMS_column_p -from .capi.obiview cimport Obiview_p -from .capi.obitypes cimport obiversion_t, OBIType_t, index_t -from ._obitaxo cimport OBI_Taxonomy - +from .capi.obitypes cimport obiversion_t, \ + obitype_t, \ + index_t +cdef dict __OBIDMS_COLUMN_CLASS__ +cdef dict __OBIDMS_VIEW_CLASS__ cdef class DMS: cdef OBIDMS_p _pointer + @staticmethod + cdef type get_column_class(obitype_t obitype) + + @staticmethod + cdef type get_python_type(obitype_t obitype) + cpdef close(self) - cpdef Taxonomy open_taxonomy(self, str taxo_name) - cpdef dict read_view_infos(self, objec view_name) + cpdef int view_count(self) # cpdef dict read_views(self) TODO diff --git a/python/obitools3/dms/dms.pyx b/python/obitools3/dms/dms.pyx index 347e5f8..514c4ea 100644 --- a/python/obitools3/dms/dms.pyx +++ b/python/obitools3/dms/dms.pyx @@ -1,9 +1,10 @@ #cython: language_level=3 -from libc.stdlib cimport malloc +from libc.stdlib cimport malloc,free from .capi.obidms cimport obi_dms, \ - obi_close_dms + obi_close_dms, \ + obi_dms_get_full_path from .capi.obidmscolumn cimport obi_close_column, \ OBIDMS_column_p, \ @@ -18,26 +19,18 @@ from .capi.obiview cimport Obiview_p, \ obi_view_unmap_file from .capi.obitypes cimport const_char_p, \ - OBIType_t, \ - OBI_INT, \ - OBI_FLOAT, \ - OBI_BOOL, \ - OBI_CHAR, \ - OBI_QUAL, \ - OBI_STR, \ - OBI_SEQ, \ name_data_type, \ only_ATGC # discuss from obitools3.utils cimport bytes2str, \ str2bytes, \ - tobytes + tobytes, \ + tostr - -from .taxonomy cimport Taxonomy - +from pathlib import Path __OBIDMS_COLUMN_CLASS__ = {} +__OBIDMS_VIEW_CLASS__= {} cdef class DMS : @@ -66,7 +59,7 @@ cdef class DMS : ''' # Declarations - cdef bytes dms_name_b = tobytes(dms_name): + cdef bytes dms_name_b = tobytes(dms_name) # Fill structure and create or open the DMS self._pointer = obi_dms( dms_name_b) @@ -79,7 +72,7 @@ cdef class DMS : """ Destructor of the DMS instance. - The destructor automatically call the `close` methode and + The destructor automatically call the `close` method and therefore free all the associated memory. """ @@ -91,8 +84,10 @@ cdef class DMS : def name(self): """ Returns the name of the DMS instance + + @rtype: bytes """ - return bytes2str(self._pointer.dms_name) + return self._pointer.dms_name cpdef close(self) : """ @@ -100,9 +95,36 @@ cdef class DMS : the `close` method is automatically called by the object destructor. """ + if (obi_close_dms(self._pointer)) < 0 : raise Exception("Problem closing an OBIDMS") + def keys(self): + cdef const_char_p path = obi_dms_get_full_path(self._pointer, + b"VIEWS" + ) + + if path==NULL: + raise RuntimeError("Cannot retreive the Dataabase path") + + p = Path(bytes2str(path)) + + free(path) + + for v in p.glob("*.obiview"): + yield str2bytes(v.stem) + + def __contains__(self,key): + cdef str key_s = tostr(key) + cdef const_char_p path = obi_dms_get_full_path(self._pointer, + b"VIEWS" + ) + p = Path(bytes2str(path),key_s) - + free(path) + + return p.with_suffix(".obiview").is_file() + + cpdef int view_count(self): + return PyList_Size(list(self.keys())) \ No newline at end of file diff --git a/python/obitools3/dms/view.pxd b/python/obitools3/dms/view.pxd index e0c09ba..59dcff3 100644 --- a/python/obitools3/dms/view.pxd +++ b/python/obitools3/dms/view.pxd @@ -1,44 +1,18 @@ #cython: language_level=3 -from .capi.obitypes cimport obiversion_t, \ - index_t, \ - only_ATGC - -from .capi.obiview cimport Obiview_p, \ - Obiview_infos_p, \ - Alias_column_pair_p, \ - obi_new_view_nuc_seqs, \ - obi_new_view, \ - obi_new_view_cloned_from_name, \ - obi_new_view_nuc_seqs_cloned_from_name, \ - obi_view_map_file, \ - obi_view_unmap_file, \ - obi_open_view, \ - obi_view_delete_column, \ - obi_view_add_column, \ - obi_view_create_column_alias, \ - obi_view_get_column, \ - obi_view_get_pointer_on_column_in_view, \ - obi_save_and_close_view, \ - VIEW_TYPE_NUC_SEQS, \ - NUC_SEQUENCE_COLUMN, \ - ID_COLUMN, \ - DEFINITION_COLUMN, \ - QUALITY_COLUMN - -from obitools3.utils cimport tobytes, \ - bytes2str, \ - tostr - +from .capi.obiview cimport Obiview_p +from .capi.obitypes cimport index_t, \ + obitype_t + from .dms cimport DMS +from .column cimport Column + + cdef class View: cdef DMS _dms cdef Obiview_p _pointer - cdef dict _columns - - cdef __init_columns__(self) cpdef View clone(self, object view_name, @@ -55,17 +29,18 @@ cdef class View: cpdef close(self) + cpdef get_column(self, + object column_name) + cpdef delete_column(self, object column_name) cpdef rename_column(self, object current_name, object new_name) - - cdef update_column_pointers(self) - - cpdef OBIView_line_selection new_selection(self, - list lines=*) + + cpdef View_line_selection new_selection(self, + list lines=*) cdef class View_line_selection(list): @@ -80,6 +55,6 @@ cdef class View_line_selection(list): cdef class View_line : cdef index_t _index - cdef View _view + cdef View _view diff --git a/python/obitools3/dms/view.pyx b/python/obitools3/dms/view.pyx index ca74570..aa860d8 100644 --- a/python/obitools3/dms/view.pyx +++ b/python/obitools3/dms/view.pyx @@ -1,5 +1,19 @@ #cython: language_level=3 +from libc.stdlib cimport malloc + +from .capi.obiview cimport obi_new_view, \ + obi_open_view, \ + obi_save_and_close_view, \ + obi_view_get_pointer_on_column_in_view, \ + obi_view_delete_column, \ + obi_view_create_column_alias + +from .capi.obidmscolumn cimport OBIDMS_column_p + +from obitools3.utils cimport tobytes, \ + bytes2str + cdef class View : @@ -46,8 +60,8 @@ cdef class View : bytes view_name, bytes comments=b""): - cdef View view = OBIView(dms, - 987654) # @DuplicatedSignature + cdef View view = View(dms, + 987654) # @DuplicatedSignature view._pointer = obi_new_view(dms._pointer, view_name, @@ -61,7 +75,7 @@ cdef class View : return view @staticmethod - def new(OBIDMS dms, + def new(DMS dms, object view_name, object comments=None): @@ -104,35 +118,65 @@ cdef class View : cpdef close(self): if (obi_save_and_close_view(self._pointer) < 0) : - raise Exception("Problem closing a view") + raise Exception("Problem closing view %s" % + bytes2str(self.name)) def __dealloc__(self): self.close() def __repr__(self) : - cdef str s - s = str(self.name) + "\n" + str(self.comments) + "\n" + str(self.line_count) + " lines\n" - for column_name in self._columns : - s = s + repr(self._columns[column_name]) + '\n' + cdef str s = "{name:s}\n{comments:s}\n{line_count:d} lines\n".format(name = str(self.name), + comments = str(self.comments), + line_count = self.line_count) + + #for column_name in self._columns : + # s = s + repr(self._columns[column_name]) + '\n' + return s + cpdef get_column(self, + object column_name): + cdef bytes column_name_b = tobytes(column_name) + cdef OBIDMS_column_p* column_pp + cdef OBIDMS_column_p column_p + cdef Column column + cdef obitype_t column_type + + column_pp = obi_view_get_pointer_on_column_in_view(self._pointer, + column_name_b) + + if column_pp == NULL: + raise KeyError("Cannot access to column %s in view %s" % ( + bytes2str(column_name_b), + bytes2str(self.name) + )) + + column_p = column_pp[0] + column_type = column_p.header.returned_data_type + + column = DMS.get_column_class(column_type)(self) + column._pointer = column_pp + + return column cpdef delete_column(self, object column_name) : - if obi_view_delete_column(self._pointer, tobytes(column_name)) < 0 : + + cdef bytes column_name_b = tobytes(column_name) + + if obi_view_delete_column(self._pointer, column_name_b) < 0 : raise Exception("Problem deleting column %s from a view", - tostr(column_name)) - # Update the dictionary of column objects: - self.update_column_pointers() + bytes2str(column_name_b)) + cpdef rename_column(self, object current_name, object new_name): - cdef OBIDMS_column column + cdef Column column cdef bytes current_name_b = tobytes(current_name) - cdef bytes new_name_b = tobyes(new_name) + cdef bytes new_name_b = tobytes(new_name) if (obi_view_create_column_alias(self._pointer, tobytes(current_name_b), @@ -142,15 +186,15 @@ cdef class View : bytes2str(new_name_b))) - cpdef OBIView_line_selection new_selection(self,list lines=None): - return OBIView_line_selection(self,lines) + cpdef View_line_selection new_selection(self,list lines=None): + return View_line_selection(self,lines) def __iter__(self): # Iteration on each line of all columns # Declarations cdef index_t line_nb - cdef OBIView_line line + cdef View_line line # Yield each line for line_nb in range(self.line_count) : @@ -162,7 +206,7 @@ cdef class View : if type(item) == str : return (self._columns)[item] elif type(item) == int : - return OBIView_line(self, item) + return View_line(self, item) def __contains__(self, str column_name): @@ -174,7 +218,7 @@ cdef class View : def __str__(self) : - cdef OBIView_line line + cdef View_line line cdef str to_print to_print = "" for line in self : @@ -194,28 +238,23 @@ cdef class View : # name property getter @property def name(self): - return bytes2str(self._pointer.infos.name) + return self._pointer.infos.name # view type property getter @property def type(self): # @ReservedAssignment return bytes2str(self._pointer.infos.view_type) - # columns property getter - @property - def columns(self): - return self._columns - # comments property getter @property def comments(self): - return bytes2str(self._pointer.infos.comments) + return self._pointer.infos.comments # TODO setter that concatenates new comments? -cdef class OBIView_line_selection(list): +cdef class View_line_selection(list): - def __init__(self, OBIView view, lines=None) : + def __init__(self, View view, lines=None) : if view._pointer == NULL: raise Exception("Error: trying to create a line selection with an invalidated view") self._view = view @@ -239,10 +278,10 @@ cdef class OBIView_line_selection(list): def append(self, index_t idx) : if idx >= self._view.line_count : - raise RuntimeError("Error: trying to select line %d beyond the line count %d of view %s" % - (i, - max_i, - self._view_name) + raise IndexError("Error: trying to select line %d beyond the line count %d of view %s" % + (idx, + self._view.line_count, + bytes2str(self.name)) ) list.append(self,idx) @@ -253,22 +292,23 @@ cdef class OBIView_line_selection(list): line_selection_p = malloc((l_selection + 1) * sizeof(index_t)) # +1 for the -1 flagging the end of the array for i in range(l_selection) : - line_selection_p[i] = line_selection[i] + line_selection_p[i] = self[i] line_selection_p[l_selection] = -1 # flagging the end of the array return line_selection_p - cpdef OBIView materialize(self, - str view_name, - str comments=""): + cpdef View materialize(self, + object view_name, + object comments=""): - cdef OBIView view = OBIView(987654) - + cdef View view = View(987654) + cdef bytes view_name_b=tobytes(view_name) + view._pointer = obi_new_view(self._view._pointer.dms, - str2bytes(view_name), + view_name_b, self._view._pointer, self.__build_binary_list__(), - str2bytes(comments)) + tobytes(comments)) if view._pointer == NULL : raise RuntimeError("Error : Cannot clone view %s into view %s" @@ -276,104 +316,102 @@ cdef class OBIView_line_selection(list): view_name) ) - view.__init_columns__() - return view -cdef class OBIView_line : +cdef class View_line : - def __init__(self, OBIView view, index_t line_nb) : + def __init__(self, View view, index_t line_nb) : self._index = line_nb self._view = view def __getitem__(self, str column_name) : return ((self._view)._columns)[column_name][self._index] - def __setitem__(self, str column_name, object value): - # TODO detect multiple elements (dict type)? put somewhere else? but more risky (in get) - # TODO OBI_QUAL ? - cdef type value_type - cdef str value_obitype - cdef bytes value_b - - if column_name not in self._view : - if value == None : - raise Exception("Trying to create a column from a None value (can't guess type)") - value_type = type(value) - if value_type == int : - value_obitype = 'OBI_INT' - elif value_type == float : - value_obitype = 'OBI_FLOAT' - elif value_type == bool : - value_obitype = 'OBI_BOOL' - elif value_type == str or value_type == bytes : - if value_type == str : - value_b = str2bytes(value) - else : - value_b = value - if only_ATGC(value_b) : # TODO detect IUPAC - value_obitype = 'OBI_SEQ' - elif len(value) == 1 : - value_obitype = 'OBI_CHAR' - elif (len(value) > 1) : - value_obitype = 'OBI_STR' - else : - raise Exception("Could not guess the type of a value to create a new column") - self._view.add_column(column_name, type=value_obitype) - - (((self._view)._columns)[column_name]).set_line(self._index, value) - - def __iter__(self): - for column_name in ((self._view)._columns) : - yield column_name - - def __contains__(self, str column_name): - return (column_name in self._view._columns) +# def __setitem__(self, str column_name, object value): +# # TODO detect multiple elements (dict type)? put somewhere else? but more risky (in get) +# # TODO OBI_QUAL ? +# cdef type value_type +# cdef str value_obitype +# cdef bytes value_b +# +# if column_name not in self._view : +# if value == None : +# raise Exception("Trying to create a column from a None value (can't guess type)") +# value_type = type(value) +# if value_type == int : +# value_obitype = 'OBI_INT' +# elif value_type == float : +# value_obitype = 'OBI_FLOAT' +# elif value_type == bool : +# value_obitype = 'OBI_BOOL' +# elif value_type == str or value_type == bytes : +# if value_type == str : +# value_b = str2bytes(value) +# else : +# value_b = value +# if only_ATGC(value_b) : # TODO detect IUPAC +# value_obitype = 'OBI_SEQ' +# elif len(value) == 1 : +# value_obitype = 'OBI_CHAR' +# elif (len(value) > 1) : +# value_obitype = 'OBI_STR' +# else : +# raise Exception("Could not guess the type of a value to create a new column") +# self._view.add_column(column_name, type=value_obitype) +# +# (((self._view)._columns)[column_name]).set_line(self._index, value) +# +# def __iter__(self): +# for column_name in ((self._view)._columns) : +# yield column_name +# +# def __contains__(self, str column_name): +# return (column_name in self._view._columns) def __repr__(self): cdef dict line cdef str column_name line = {} - for column_name in self._view._columns : - line[column_name] = self[column_name] +# for column_name in self._view._columns : +# line[column_name] = self[column_name] return str(line) - cpdef dict get_view_infos(self, str view_name) : - - cdef Obiview_infos_p view_infos_p - cdef dict view_infos_d - cdef Alias_column_pair_p column_refs - cdef int i, j - cdef str column_name - - view_infos_p = obi_view_map_file(self._pointer, - tobytes(view_name)) - view_infos_d = {} - view_infos_d["name"] = bytes2str(view_infos_p.name) - view_infos_d["comments"] = bytes2str(view_infos_p.comments) - view_infos_d["view_type"] = bytes2str(view_infos_p.view_type) - view_infos_d["column_count"] = view_infos_p.column_count - view_infos_d["line_count"] = view_infos_p.line_count - view_infos_d["created_from"] = bytes2str(view_infos_p.created_from) - view_infos_d["creation_date"] = bytes2str(obi_format_date(view_infos_p.creation_date)) - if (view_infos_p.all_lines) : - view_infos_d["line_selection"] = None - else : - view_infos_d["line_selection"] = {} - view_infos_d["line_selection"]["column_name"] = bytes2str((view_infos_p.line_selection).column_name) - view_infos_d["line_selection"]["version"] = (view_infos_p.line_selection).version - view_infos_d["column_references"] = {} - column_references = view_infos_p.column_references - for j in range(view_infos_d["column_count"]) : - column_name = bytes2str((column_references[j]).alias) - view_infos_d["column_references"][column_name] = {} - view_infos_d["column_references"][column_name]["original_name"] = bytes2str((column_references[j]).column_refs.column_name) - view_infos_d["column_references"][column_name]["version"] = (column_references[j]).column_refs.version - - obi_view_unmap_file(self._pointer, view_infos_p) - - return view_infos_d +# cpdef dict get_view_infos(self, str view_name) : +# +# cdef Obiview_infos_p view_infos_p +# cdef dict view_infos_d +# cdef Alias_column_pair_p column_refs +# cdef int i, j +# cdef str column_name +# +# view_infos_p = obi_view_map_file(self._pointer, +# tobytes(view_name)) +# view_infos_d = {} +# view_infos_d["name"] = bytes2str(view_infos_p.name) +# view_infos_d["comments"] = bytes2str(view_infos_p.comments) +# view_infos_d["view_type"] = bytes2str(view_infos_p.view_type) +# view_infos_d["column_count"] = view_infos_p.column_count +# view_infos_d["line_count"] = view_infos_p.line_count +# view_infos_d["created_from"] = bytes2str(view_infos_p.created_from) +# view_infos_d["creation_date"] = bytes2str(obi_format_date(view_infos_p.creation_date)) +# if (view_infos_p.all_lines) : +# view_infos_d["line_selection"] = None +# else : +# view_infos_d["line_selection"] = {} +# view_infos_d["line_selection"]["column_name"] = bytes2str((view_infos_p.line_selection).column_name) +# view_infos_d["line_selection"]["version"] = (view_infos_p.line_selection).version +# view_infos_d["column_references"] = {} +# column_references = view_infos_p.column_references +# for j in range(view_infos_d["column_count"]) : +# column_name = bytes2str((column_references[j]).alias) +# view_infos_d["column_references"][column_name] = {} +# view_infos_d["column_references"][column_name]["original_name"] = bytes2str((column_references[j]).column_refs.column_name) +# view_infos_d["column_references"][column_name]["version"] = (column_references[j]).column_refs.version +# +# obi_view_unmap_file(self._pointer, view_infos_p) +# +# return view_infos_d diff --git a/python/obitools3/parsers/fasta.pyx b/python/obitools3/parsers/fasta.pyx index c788414..685b865 100644 --- a/python/obitools3/parsers/fasta.pyx +++ b/python/obitools3/parsers/fasta.pyx @@ -6,8 +6,12 @@ Created on 30 mars 2016 @author: coissac ''' +#from obitools3.dms._obiseq cimport OBI_Seq -def fastaIterator(lineiterator, int buffersize=100000000): + +def fastaIterator(lineiterator, + int buffersize=100000000 + ): cdef LineBuffer lb cdef str ident cdef str definition @@ -15,6 +19,7 @@ def fastaIterator(lineiterator, int buffersize=100000000): cdef list s cdef bytes sequence cdef bytes quality +# cdef OBI_Seq seq if isinstance(lineiterator,(str,bytes)): lineiterator=uopen(lineiterator) @@ -41,7 +46,60 @@ def fastaIterator(lineiterator, int buffersize=100000000): sequence = b"".join(s) quality = None - + + +# seq = OBI_Seq(id, +# sequence, +# definition, +# tags=tags, +# ) + yield { "id" : ident, + "definition" : definition, + "sequence" : sequence, + "quality" : quality, + "tags" : tags, + "annotation" : {} + } + + +def fastaNucIterator(lineiterator, int buffersize=100000000): + cdef LineBuffer lb + cdef str ident + cdef str definition + cdef dict tags + cdef list s + cdef bytes sequence + cdef bytes quality +# cdef OBI_Seq seq + + if isinstance(lineiterator,(str,bytes)): + lineiterator=uopen(lineiterator) + + if isinstance(lineiterator, LineBuffer): + lb=lineiterator + else: + lb=LineBuffer(lineiterator,buffersize) + + i = iter(lb) + line = next(i) + + while True: + ident,tags,definition = parseHeader(line) + s = [] + line = next(i) + + try: + while line[0]!='>': + s.append(str2bytes(line)[0:-1]) + line = next(i) + except StopIteration: + pass + + sequence = b"".join(s) + quality = None + + +# seq = yield { "id" : ident, "definition" : definition, "sequence" : sequence, diff --git a/python/obitools3/utils.pyx b/python/obitools3/utils.pyx index ea9eb1c..b7e4399 100644 --- a/python/obitools3/utils.pyx +++ b/python/obitools3/utils.pyx @@ -1,6 +1,4 @@ #cython: language_level=3 -from IPython.utils._tokenize_py2 import String - cdef bytes str2bytes(str string): """ From 65f3b16e6d0eb7ec51fe9e256202b1eef62a88f8 Mon Sep 17 00:00:00 2001 From: Eric Coissac Date: Thu, 29 Dec 2016 18:22:05 +0100 Subject: [PATCH 11/16] Refactoring ... --- python/obitools3/dms/column/__init__.py | 1 + python/obitools3/dms/column/bool.pxd | 56 ++++ python/obitools3/dms/column/bool.pyx | 294 +++++++++++++++++ python/obitools3/dms/column/column.pxd | 25 ++ python/obitools3/dms/column/column.pyx | 180 +++++++++++ python/obitools3/dms/dms.pyx | 3 +- python/obitools3/dms/view/__init__.py | 3 + python/obitools3/dms/view/view.pxd | 42 +++ python/obitools3/dms/view/view.pyx | 412 ++++++++++++++++++++++++ 9 files changed, 1015 insertions(+), 1 deletion(-) create mode 100644 python/obitools3/dms/column/__init__.py create mode 100644 python/obitools3/dms/column/bool.pxd create mode 100644 python/obitools3/dms/column/bool.pyx create mode 100644 python/obitools3/dms/column/column.pxd create mode 100644 python/obitools3/dms/column/column.pyx create mode 100644 python/obitools3/dms/view/__init__.py create mode 100644 python/obitools3/dms/view/view.pxd create mode 100644 python/obitools3/dms/view/view.pyx diff --git a/python/obitools3/dms/column/__init__.py b/python/obitools3/dms/column/__init__.py new file mode 100644 index 0000000..e975aa6 --- /dev/null +++ b/python/obitools3/dms/column/__init__.py @@ -0,0 +1 @@ +from .column import column # @UnresolvedImport \ No newline at end of file diff --git a/python/obitools3/dms/column/bool.pxd b/python/obitools3/dms/column/bool.pxd new file mode 100644 index 0000000..8e5fdc3 --- /dev/null +++ b/python/obitools3/dms/column/bool.pxd @@ -0,0 +1,56 @@ +#cython: language_level=3 + +from cpython.bool cimport bool, PyBool_FromLong + +from ..capi.obitypes cimport index_t, \ + const_char_p, \ + OBIType_t, \ + obibool_t, \ + OBI_BOOL, \ + OBIBool_NA + +from ..capi.obiview cimport obi_get_bool_with_elt_name_and_col_p_in_view, \ + obi_get_bool_with_elt_idx_and_col_p_in_view, \ + obi_set_bool_with_elt_name_and_col_p_in_view, \ + obi_set_bool_with_elt_idx_and_col_p_in_view + +from ..capi.obidmscolumn cimport obi_column_get_obibool_with_elt_name, \ + obi_column_get_obibool_with_elt_idx, \ + obi_column_set_obibool_with_elt_name, \ + obi_column_set_obibool_with_elt_idx, \ + OBIDMS_column_p + +from ..capi.obierrno cimport obi_errno + +from .column cimport Column, \ + Column_line, \ + register_column_class + +from obitools3.utils cimport str2bytes, bytes2str + +cdef class Column_line_bool(OBIDMS_column_line) : + + @staticmethod + cdef bool obibool_t2bool(obibool_t value) + + @staticmethod + cdef bool2obibool_t(bool value) + + cpdef bool get_bool_item_by_name(self,bytes element_name) + cpdef bool get_bool_item_by_idx(self,index_t index) + cpdef set_bool_item_by_name(self,bytes element_name,bool value) + cpdef set_bool_item_by_idx(self,index_t index,bool value) + + +# cdef obibool_t [:] _data_view + +cdef class Column_bool(OBIDMS_column): + cdef Column _new(OBIView view, + bytes column_name, + index_t nb_elements_per_line=1, + object elements_names=None, + bytes comments=b""): + + cpdef object get_line(self, index_t line_nb) + cpdef set_line(self, index_t line_nb, object value) + diff --git a/python/obitools3/dms/column/bool.pyx b/python/obitools3/dms/column/bool.pyx new file mode 100644 index 0000000..20d3328 --- /dev/null +++ b/python/obitools3/dms/column/bool.pyx @@ -0,0 +1,294 @@ +#cython: language_level=3 + + +cdef class OBIDMS_column_line_bool(OBIDMS_column_line) : + + cdef update_pointer(self): + """ + Checks if the obicolumn address changed since the last call and update + if need the `_column_p` and `_data_view` data structure fields. + """ + cdef OBIDMS_column_p column_p = self._column_pp[0] + + if column_p != self._column_p: + self._column_p = column_p +# self._data_view = ( (column_p.data)) + \ +# self._index * column_p.header.nb_elements_per_line + + @staticmethod + cdef bool obibool_t2bool(obibool_t value): + cdef bool result + + if value == OBIBool_NA : + result = None + else : + result = PyBool_FromLong(value) + + return result + + @staticmethod + cdef bool2obibool_t(bool value): + cdef obibool_t result + + if value is None: + result=OBIBool_NA + else: + result= value + + return result + + + def __init__(self, OBIDMS_column column, index_t line_nb) : + """ + Creates a new `OBIDMS_column_line_bool` + + @param column: an OBIDMS_column instance + @param line_nb: the line in the column + """ + + OBIDMS_column_line.__init__(self,column,line_nb) + self.update_pointer() + + + + cpdef bool get_bool_item_by_name(self,bytes element_name): + """ + Returns the value associated to the name `element_name` of the current line + + @param element_name: a `bytes` instance containing the name of the element + + @return: the `bool` value corresponding to the name + """ + cdef char* cname = element_name + cdef obibool_t value + global obi_errno + + self.update_pointer() + + value = obi_column_get_obibool_with_elt_name(self._column_p, + self._index, + cname) + + if obi_errno > 0 : + obi_errno = 0 + raise KeyError("Cannot access to key %s" % bytes2str(element_name)) + + return OBIDMS_column_line_bool.obibool_t2bool(value) + + cpdef bool get_bool_item_by_idx(self,index_t index): + """ + Returns the value associated to the name `element_name` of the current line + + @param index: a `int` instance containing the index of the element + + @return: the `bool` value corresponding to the name + """ + cdef obibool_t value # @DuplicatedSignature + global obi_errno + + + self.update_pointer() + + value = obi_column_get_obibool_with_elt_idx(self._column_p, + self._index, + index) + + if obi_errno > 0 : + obi_errno = 0 + raise IndexError("Cannot access to element %d" % index) + + return OBIDMS_column_line_bool.obibool_t2bool(value) + + + def __getitem__(self, object element_name) : + cdef bytes name + cdef int cindex + cdef obibool_t value + cdef type typearg = type(element_name) + cdef bool result + + + if typearg == int: + cindex=element_name + if cindex < 0: + cindex = self._len - cindex + result=self.get_bool_item_by_idx(cindex) + elif typearg == bytes: + result=self.get_bool_item_by_name(element_name) + elif typearg == str: + name = str2bytes(element_name) + result=self.get_bool_item_by_name(name) + + return result + + cpdef set_bool_item_by_name(self,bytes element_name,bool value): + """ + Sets the value associated to the name `element_name` of the current line + + @param element_name: a `bytes` instance containing the name of the element + @param value: a `bool` instance of the new value + + @return: the `bool` value corresponding to the name + """ + cdef char* cname = element_name + cdef obibool_t cvalue + + self.update_pointer() + cvalue = OBIDMS_column_line_bool.bool2obibool_t(value) + + if ( obi_column_set_obibool_with_elt_name(self._column_p, + self._index, + cname, + cvalue) < 0 ): + raise KeyError("Cannot access to key %s" % bytes2str(element_name)) + + cpdef set_bool_item_by_idx(self,index_t index,bool value): + """ + Sets the value associated to the name `element_name` of the current line + + @param index: a `int` instance containing the index of the element + @param value: a `bool` instance of the new value + + @return: the `bool` value corresponding to the name + """ + cdef obibool_t cvalue # @DuplicatedSignature + + self.update_pointer() + cvalue = OBIDMS_column_line_bool.bool2obibool_t(value) + + if ( obi_column_set_obibool_with_elt_idx(self._column_p, + self._index, + index, + cvalue) < 0 ): + raise IndexError("Cannot access to item index %d" % index) + + + + def __setitem__(self, object element_name, object value): + cdef bytes name + cdef int cindex + cdef type typearg = type(element_name) + cdef bool result + + + if typearg == int: + cindex=element_name + if cindex < 0: + cindex = self._len - cindex + self.set_bool_item_by_idx(cindex,value) + elif typearg == bytes: + self.set_bool_item_by_name(element_name,value) + elif typearg == str: + name = str2bytes(element_name) + self.set_bool_item_by_name(name,value) + + def __repr__(self) : + return str(self._column.get_line(self._index)) + + def __len__(self): + return self._len + + + +cdef class OBIDMS_column_bool(OBIDMS_column): + + @staticmethod + cdef OBIDMS_column _new(OBIView view, + bytes column_name, + index_t nb_elements_per_line=1, + object elements_names=None, + bytes comments=b""): + + cdef bytes elements_names_b + cdef char* elements_names_p + cdef OBIDMS_column new_column + + if elements_names is not None: + elements_names_b = b''.join([tobytes(x) for x in elements_names]) + elements_names_p = elements_names_b + else: + elements_names_p = NULL + + if (obi_view_add_column(view = view._pointer, + column_name = column_name, + version_number = -1, + alias = NULL, + data_type = OBI_BOOL, + nb_lines = len(view), + nb_elements_per_line = nb_elements_per_line, + elements_names = elements_names_p, + indexer_name = NULL, + associated_column_name = NULL, + associated_column_version = -1, + comments = comments, + create = True)<0): + raise RuntimeError("Cannot create column %s in view %s" % (bytes2str(column_name), + bytes2str(view.name))) + + view.__init_columns__() + new_column = self._columns[column_name] + + return new_column + + @staticmethod + def new(OBIView view, + object column_name, + index_t nb_elements_per_line=1, + object elements_names=None, + object comments=b""): + + return OBIDMS_column_bool._new(view, + tobytes(column_name), + nb_elements_per_line, + elements_names, + tobytes(comments)) + + cpdef add_to_view(self, + OBIView view, + object column_name=None, + object comments=b""): + + cdef OBIDMS_column_p column_p = self._column_pp[0] + cdef bytes alias + + if (column_name is None): + alias = self._alias + else: + alias = tobytes(column_name) + + obi_view_add_column(view = view._ponter, + column_name = column_p.header.name, + version_number = column_p.header.version, + alias = alias, + data_type = OBI_BOOL, + nb_lines = column_p.header.lines_used, + nb_elements_per_line = column_p.header.nb_elements_per_line, + elements_names = column_p.header.elements_names, + indexer_name = NULL, + associated_column_name = NULL, + associated_column_version = NULL, + comments = tobytes(comments), + create = False) + + cpdef object get_line(self, index_t line_nb): + cdef obibool_t value + cdef object result + global obi_errno + + value = obi_get_bool_with_elt_idx_and_col_p_in_view(self._view._pointer, (self._pointer)[0], line_nb, 0) + if obi_errno > 0 : + raise IndexError(line_nb) + if value == OBIBool_NA : + result = None + else : + result = PyBool_FromLong(value) + return result + + cpdef set_line(self, index_t line_nb, object value): + if value is None : + value = OBIBool_NA + if obi_set_bool_with_elt_idx_and_col_p_in_view(self._view._pointer, (self._pointer)[0], line_nb, 0, value) < 0: + raise Exception("Problem setting a value in a column") + + +register_column_class(OBI_BOOL,OBIDMS_column_bool) \ No newline at end of file diff --git a/python/obitools3/dms/column/column.pxd b/python/obitools3/dms/column/column.pxd new file mode 100644 index 0000000..cbdd86b --- /dev/null +++ b/python/obitools3/dms/column/column.pxd @@ -0,0 +1,25 @@ +#cython: language_level=3 + +from .capi.obitypes cimport index_t, \ + obitype_t +from .capi.obidmscolumn cimport OBIDMS_column_p + +from .view cimport View + +cdef class Column: + + cdef OBIDMS_column_p* _pointer + cdef View _view + + cpdef close(self) + +cdef class Column_line: + + cdef Column _column + cdef index_t _index + + cpdef update(self, data) + +cdef register_column_class(obitype_t obitype, + type classe, + type python) diff --git a/python/obitools3/dms/column/column.pyx b/python/obitools3/dms/column/column.pyx new file mode 100644 index 0000000..77205ff --- /dev/null +++ b/python/obitools3/dms/column/column.pyx @@ -0,0 +1,180 @@ +#cython: language_level=3 + +from .capi.obitypes cimport name_data_type + +from .capi.obidmscolumn cimport OBIDMS_column_header_p, \ + obi_close_column, \ + obi_column_prepare_to_get_value + +from .capi.obiutils cimport obi_format_date + +from .dms cimport __OBIDMS_COLUMN_CLASS__ + +from obitools3.utils cimport bytes2str + + +cdef class Column : + """ + The obitools3.dms.column.Column class wraps a c instance of a column in the context of a View + """ + + # Note: should only be initialized through a subclass + def __init__(self, + View view, + int __internalCall__): + ''' + Create a new OBDMS column objected referring to a already created column + in the context of a view. + + This constructor is normally only called by subclass constructor. + + @param view: The view object containing the column. + @type view: OBIView + ''' + + cdef OBIDMS_column_p* column_pp + + if __internalCall__!=987654: + raise RuntimeError('OBIView constructor cannot be called directly') + + # Check that the class is only created as a subclass instance + if type(self)==Column or not isinstance(self, Column): + raise RuntimeError('OBIDMS.Column constructor cannot be called directly') + + # Fill structure + self._pointer = NULL + self._view = view + + def __len__(self): + ''' + implements the len() function for the Column class + + @rtype: `int` + ''' + return self.lines_used + + def __sizeof__(self): + ''' + returns the size of the C object wrapped by the Column instance + ''' + cdef OBIDMS_column_header_p header = self._pointer[0].header + return header.header_size + header.data_size + + def __iter__(self): + cdef index_t line_nb + + for line_nb in range(self.lines_used): + yield self[line_nb] + + def __str__(self) : + cdef str to_print + to_print = '' + for line in self : + to_print = to_print + str(line) + "\n" + return to_print + + def __repr__(self) : + return b"%s, original name: %s, version %d, data type: %d" % ( + self._alias, + self.original_name, + self.version, + self.data_type + ) + + cpdef close(self): + if self._pointer != NULL: + if obi_close_column(self._pointer[0]) < 0 : + raise Exception("Problem closing column %s" % bytes2str(self.name)) + + # Column alias property getter and setter + @property + def name(self): + return self._alias + @name.setter + def name(self, new_alias): # @DuplicatedSignature + self._view.change_column_alias(self._alias, new_alias) + + # elements_names property getter + @property + def elements_names(self): + return (((self._pointer)[0].header).elements_names).split(b';') + + # nb_elements_per_line property getter + @property + def nb_elements_per_line(self): + return ((self._pointer)[0].header).nb_elements_per_line + + # data_type property getter + @property + def data_type(self): + return name_data_type(((self._pointer)[0].header).returned_data_type) + + # original_name property getter + @property + def original_name(self): + return ((self._pointer)[0].header).name + + # version property getter + @property + def version(self): + return ((self._pointer)[0].header).version + + # lines_used property getter + @property + def lines_used(self): + return (self._pointer)[0].header.lines_used + + # comments property getter + @property + def comments(self): + return (self._pointer)[0].header.comments + + # creation_date property getter + @property + def creation_date(self): + return obi_format_date((self._pointer)[0].header.creation_date) + + +###################################################################################################### + + +cdef class Column_line : + + def __init__(self, Column column, index_t line_nb) : + self._index = line_nb + self._column = column + + if obi_column_prepare_to_get_value(self._column._pointer[0],line_nb) < 0: + raise IndexError("Cannot access to the line %d" % line_nb) + + + def __contains__(self, str element_name): + pass + #return (element_name in self._column.elements_names) + + def __repr__(self) : + return str(self._column.get_line(self._index)) + + cpdef update(self, data): + if isinstance(data, dict): + data=data.items() + for key,value in data: + if key in self: + self[key]=value + + +###################################################################################################### + + +cdef register_column_class(obitype_t obitype, + type classe, + type python): + """ + Each sub class of `OBIDMS_column` needs to be registered after its declaration + to declare its relationship with an `OBIType_t` + """ + global __OBIDMS_COLUMN_CLASS__ + + assert issubclass(classe,Column) + + __OBIDMS_COLUMN_CLASS__[obitype]=(classe,python) diff --git a/python/obitools3/dms/dms.pyx b/python/obitools3/dms/dms.pyx index 514c4ea..345460e 100644 --- a/python/obitools3/dms/dms.pyx +++ b/python/obitools3/dms/dms.pyx @@ -1,6 +1,7 @@ #cython: language_level=3 -from libc.stdlib cimport malloc,free +from libc.stdlib cimport malloc,free +from cpython.list cimport PyList_Size from .capi.obidms cimport obi_dms, \ obi_close_dms, \ diff --git a/python/obitools3/dms/view/__init__.py b/python/obitools3/dms/view/__init__.py new file mode 100644 index 0000000..154f29e --- /dev/null +++ b/python/obitools3/dms/view/__init__.py @@ -0,0 +1,3 @@ +from .view import View # @UnresolvedImport +from .view import Line_selection # @UnresolvedImport +from .view import Line # @UnresolvedImport \ No newline at end of file diff --git a/python/obitools3/dms/view/view.pxd b/python/obitools3/dms/view/view.pxd new file mode 100644 index 0000000..6806e2a --- /dev/null +++ b/python/obitools3/dms/view/view.pxd @@ -0,0 +1,42 @@ +#cython: language_level=3 + +from ..capi.obiview cimport Obiview_p +from ..capi.obitypes cimport index_t, \ + obitype_t + +from ..dms cimport DMS +from ..column.column cimport Column + + + +cdef class View: + + cdef DMS _dms + cdef Obiview_p _pointer + + cpdef delete_column(self, + object column_name) + + cpdef rename_column(self, + object current_name, + object new_name) + + cpdef View_line_selection new_selection(self, + list lines=*) + +cdef class Line_selection(list): + + cdef View _view + + cdef index_t* __build_binary_list__(self) + + cpdef View materialize(self, + object view_name, + object comments=*) + +cdef class Line : + + cdef index_t _index + cdef View _view + + diff --git a/python/obitools3/dms/view/view.pyx b/python/obitools3/dms/view/view.pyx new file mode 100644 index 0000000..0852eb2 --- /dev/null +++ b/python/obitools3/dms/view/view.pyx @@ -0,0 +1,412 @@ +#cython: language_level=3 + +from libc.stdlib cimport malloc + +from ..capi.obiview cimport Alias_column_pair_p, \ + obi_new_view, \ + obi_open_view, \ + obi_save_and_close_view, \ + obi_view_get_pointer_on_column_in_view, \ + obi_view_delete_column, \ + obi_view_create_column_alias + +from ..capi.obidmscolumn cimport OBIDMS_column_p + +from obitools3.utils cimport tobytes, \ + bytes2str + + +cdef class View : + + + def __init__(self,dms,int __internalCall__): + + if __internalCall__!=987654: + raise RuntimeError('OBIView constructor cannot be called directly') + + self._dms = dms + self._pointer = NULL + + def clone(self, + object view_name, + object comments=None): + + + cdef bytes view_name_b = tobytes(view_name) + cdef bytes comments_b + cdef View view = View(self._dms, + 987654) + + if comments is not None: + comments_b = tobytes(comments) + else: + comments_b = b'' + + view._pointer = obi_new_view(self._pointer.dms, + view_name_b, + self._pointer, + NULL, + comments_b) + + if view._pointer == NULL : + raise RuntimeError("Error : Cannot clone view %s into view %s" + % (str(self.name), + bytes2str(view_name_b)) + ) + + return view + + @staticmethod + def new(DMS dms, + object view_name, + object comments=None): + + cdef bytes view_name_b = tobytes(view_name) + cdef bytes comments_b + cdef str message + + cdef View view = View(dms, + 987654) # @DuplicatedSignature + + if comments is not None: + comments_b = tobytes(comments) + else: + comments_b = b'' + + view._pointer = obi_new_view(dms._pointer, + view_name_b, + NULL, + NULL, + comments_b) + + if view._pointer == NULL : + message = "Error : Cannot create view %s" % bytes2str(view_name_b) + raise RuntimeError(message) + + return view + + @staticmethod + def open(DMS dms, # @ReservedAssignment + object view_name): + + cdef bytes view_name_b = tobytes(view_name) + cdef View view = View(dms, + 987654) # @DuplicatedSignature + + view._pointer = obi_open_view(dms._pointer, + view_name_b) + + if view._pointer == NULL : + raise RuntimeError("Error : Cannot open view %s" % bytes2str(view_name_b)) + + return view + + def close(self): + if (self._pointer != NULL + and obi_save_and_close_view(self._pointer) < 0) : + raise Exception("Problem closing view %s" % + bytes2str(self.name)) + + def __dealloc__(self): + self.close() + + def __repr__(self) : + cdef str s = "{name:s}\n{comments:s}\n{line_count:d} lines\n".format(name = str(self.name), + comments = str(self.comments), + line_count = self.line_count) + + #for column_name in self._columns : + # s = s + repr(self._columns[column_name]) + '\n' + + return s + + def keys(self): + cdef int i + cdef int nb_column = self._pointer.infos.column_count + cdef Alias_column_pair_p column_p = self._pointer.infos.column_references + + for i in range(nb_column) : + col_alias = bytes2str(self._pointer.infos.column_references[i].alias) + yield col_alias + + def get_column(self, + object column_name): + cdef bytes column_name_b = tobytes(column_name) + cdef OBIDMS_column_p* column_pp + cdef OBIDMS_column_p column_p + cdef Column column + cdef obitype_t column_type + + column_pp = obi_view_get_pointer_on_column_in_view(self._pointer, + column_name_b) + + if column_pp == NULL: + raise KeyError("Cannot access to column %s in view %s" % ( + bytes2str(column_name_b), + bytes2str(self.name) + )) + + column_p = column_pp[0] + column_type = column_p.header.returned_data_type + + column = DMS.get_column_class(column_type)(self) + column._pointer = column_pp + + return column + + cpdef delete_column(self, + object column_name) : + + cdef bytes column_name_b = tobytes(column_name) + + if obi_view_delete_column(self._pointer, column_name_b) < 0 : + raise Exception("Problem deleting column %s from a view", + bytes2str(column_name_b)) + + + + cpdef rename_column(self, + object current_name, + object new_name): + + cdef Column column + cdef bytes current_name_b = tobytes(current_name) + cdef bytes new_name_b = tobytes(new_name) + + if (obi_view_create_column_alias(self._pointer, + tobytes(current_name_b), + tobytes(new_name_b)) < 0) : + raise Exception("Problem in renaming column %s to %s" % ( + bytes2str(current_name_b), + bytes2str(new_name_b))) + + + cpdef View_line_selection new_selection(self,list lines=None): + return View_line_selection(self,lines) + + def __iter__(self): + # Iteration on each line of all columns + + # Declarations + cdef index_t line_nb + cdef View_line line + + # Yield each line + for line_nb in range(self.line_count) : + line = self[line_nb] + yield line + + + def __getitem__(self, object item) : + if type(item) == str : + return (self._columns)[item] + elif type(item) == int : + return View_line(self, item) + + + def __contains__(self, str column_name): + return (column_name in self._columns) + + + def __len__(self): + return(self.line_count) + + + def __str__(self) : + cdef View_line line + cdef str to_print + to_print = "" + for line in self : + to_print = to_print + str(line) + "\n" + return to_print + + + @property + def dms(self): + return self._dms + + # line_count property getter + @property + def line_count(self): + return self._pointer.infos.line_count + + # name property getter + @property + def name(self): + return self._pointer.infos.name + + # view type property getter + @property + def type(self): # @ReservedAssignment + return bytes2str(self._pointer.infos.view_type) + + # comments property getter + @property + def comments(self): + return self._pointer.infos.comments + # TODO setter that concatenates new comments? + + +cdef class Line_selection(list): + + def __init__(self, View view, lines=None) : + if view._pointer == NULL: + raise Exception("Error: trying to create a line selection with an invalidated view") + self._view = view + self._view_name = view.name + + if lines is not None: + self.extend(lines) + + def extend(self, iterable): + cdef index_t i + cdef index_t max_i = self._view.line_count + + for i in iterable: + if i > max_i: + raise RuntimeError("Error: trying to select line %d beyond the line count %d of view %s" % + (i, + max_i, + self._view_name) + ) + list.append(self,i) + + def append(self, index_t idx) : + if idx >= self._view.line_count : + raise IndexError("Error: trying to select line %d beyond the line count %d of view %s" % + (idx, + self._view.line_count, + bytes2str(self.name)) + ) + list.append(self,idx) + + cdef index_t* __build_binary_list__(self): + cdef index_t* line_selection_p = NULL + cdef int i + cdef size_t l_selection = len(self) + + line_selection_p = malloc((l_selection + 1) * sizeof(index_t)) # +1 for the -1 flagging the end of the array + for i in range(l_selection) : + line_selection_p[i] = self[i] + line_selection_p[l_selection] = -1 # flagging the end of the array + + return line_selection_p + + cpdef View materialize(self, + object view_name, + object comments=""): + + cdef View view = View(987654) + cdef bytes view_name_b=tobytes(view_name) + + view._pointer = obi_new_view(self._view._pointer.dms, + view_name_b, + self._view._pointer, + self.__build_binary_list__(), + tobytes(comments)) + + if view._pointer == NULL : + raise RuntimeError("Error : Cannot clone view %s into view %s" + % (str(self.name), + view_name) + ) + + return view + + +cdef class Line : + + def __init__(self, View view, index_t line_nb) : + self._index = line_nb + self._view = view + + def __getitem__(self, str column_name) : + return ((self._view)._columns)[column_name][self._index] + +# def __setitem__(self, str column_name, object value): +# # TODO detect multiple elements (dict type)? put somewhere else? but more risky (in get) +# # TODO OBI_QUAL ? +# cdef type value_type +# cdef str value_obitype +# cdef bytes value_b +# +# if column_name not in self._view : +# if value == None : +# raise Exception("Trying to create a column from a None value (can't guess type)") +# value_type = type(value) +# if value_type == int : +# value_obitype = 'OBI_INT' +# elif value_type == float : +# value_obitype = 'OBI_FLOAT' +# elif value_type == bool : +# value_obitype = 'OBI_BOOL' +# elif value_type == str or value_type == bytes : +# if value_type == str : +# value_b = str2bytes(value) +# else : +# value_b = value +# if only_ATGC(value_b) : # TODO detect IUPAC +# value_obitype = 'OBI_SEQ' +# elif len(value) == 1 : +# value_obitype = 'OBI_CHAR' +# elif (len(value) > 1) : +# value_obitype = 'OBI_STR' +# else : +# raise Exception("Could not guess the type of a value to create a new column") +# self._view.add_column(column_name, type=value_obitype) +# +# (((self._view)._columns)[column_name]).set_line(self._index, value) +# +# def __iter__(self): +# for column_name in ((self._view)._columns) : +# yield column_name +# +# def __contains__(self, str column_name): +# return (column_name in self._view._columns) + + def __repr__(self): + cdef dict line + cdef str column_name + line = {} +# for column_name in self._view._columns : +# line[column_name] = self[column_name] + return str(line) + + +# cpdef dict get_view_infos(self, str view_name) : +# +# cdef Obiview_infos_p view_infos_p +# cdef dict view_infos_d +# cdef Alias_column_pair_p column_refs +# cdef int i, j +# cdef str column_name +# +# view_infos_p = obi_view_map_file(self._pointer, +# tobytes(view_name)) +# view_infos_d = {} +# view_infos_d["name"] = bytes2str(view_infos_p.name) +# view_infos_d["comments"] = bytes2str(view_infos_p.comments) +# view_infos_d["view_type"] = bytes2str(view_infos_p.view_type) +# view_infos_d["column_count"] = view_infos_p.column_count +# view_infos_d["line_count"] = view_infos_p.line_count +# view_infos_d["created_from"] = bytes2str(view_infos_p.created_from) +# view_infos_d["creation_date"] = bytes2str(obi_format_date(view_infos_p.creation_date)) +# if (view_infos_p.all_lines) : +# view_infos_d["line_selection"] = None +# else : +# view_infos_d["line_selection"] = {} +# view_infos_d["line_selection"]["column_name"] = bytes2str((view_infos_p.line_selection).column_name) +# view_infos_d["line_selection"]["version"] = (view_infos_p.line_selection).version +# view_infos_d["column_references"] = {} +# column_references = view_infos_p.column_references +# for j in range(view_infos_d["column_count"]) : +# column_name = bytes2str((column_references[j]).alias) +# view_infos_d["column_references"][column_name] = {} +# view_infos_d["column_references"][column_name]["original_name"] = bytes2str((column_references[j]).column_refs.column_name) +# view_infos_d["column_references"][column_name]["version"] = (column_references[j]).column_refs.version +# +# obi_view_unmap_file(self._pointer, view_infos_p) +# +# return view_infos_d + + From 2139bfc74885823a333cdc4fd4109f745d24df90 Mon Sep 17 00:00:00 2001 From: Eric Coissac Date: Mon, 2 Jan 2017 13:05:22 +0100 Subject: [PATCH 12/16] refactoring... --- python/obitools3/dms/column/column.pxd | 8 ++--- python/obitools3/dms/column/column.pyx | 45 ++++++++++++++++++++++++++ 2 files changed, 49 insertions(+), 4 deletions(-) diff --git a/python/obitools3/dms/column/column.pxd b/python/obitools3/dms/column/column.pxd index cbdd86b..b3f1751 100644 --- a/python/obitools3/dms/column/column.pxd +++ b/python/obitools3/dms/column/column.pxd @@ -1,10 +1,10 @@ #cython: language_level=3 -from .capi.obitypes cimport index_t, \ - obitype_t -from .capi.obidmscolumn cimport OBIDMS_column_p +from ..capi.obitypes cimport index_t, \ + obitype_t +from ..capi.obidmscolumn cimport OBIDMS_column_p -from .view cimport View +from ..view cimport View cdef class Column: diff --git a/python/obitools3/dms/column/column.pyx b/python/obitools3/dms/column/column.pyx index 77205ff..dfb57c2 100644 --- a/python/obitools3/dms/column/column.pyx +++ b/python/obitools3/dms/column/column.pyx @@ -45,6 +45,51 @@ cdef class Column : self._pointer = NULL self._view = view + @staticmethod + def new(OBIView view, + object column_name, + index_t nb_elements_per_line=1, + object elements_names=None, + object comments=b""): + + cdef bytes column_name_b = tobytes(column_name) + cdef bytes comments_b + cdef bytes elements_names_b + cdef char* elements_names_p + cdef OBIDMS_column new_column + + if comments is not None: + comments_b = tobytes(comments) + else: + comments_b = b'' + + if elements_names is not None: + elements_names_b = b''.join([tobytes(x) for x in elements_names]) + elements_names_p = elements_names_b + else: + elements_names_p = NULL + + if (obi_view_add_column(view = view._pointer, + column_name = column_name_b, + version_number = -1, + alias = NULL, + data_type = self.pointer.header.returned_data_type, + nb_lines = len(view), + nb_elements_per_line = nb_elements_per_line, + elements_names = elements_names_p, + indexer_name = NULL, + associated_column_name = NULL, + associated_column_version = -1, + comments = comments_b, + create = True)<0): + raise RuntimeError("Cannot create column %s in view %s" % (bytes2str(column_name), + bytes2str(view.name))) + + view.__init_columns__() + new_column = self._columns[column_name] + + return new_column + def __len__(self): ''' implements the len() function for the Column class From 153c22257f10fedde073e0c591745802db5979a4 Mon Sep 17 00:00:00 2001 From: Eric Coissac Date: Mon, 2 Jan 2017 16:46:17 +0100 Subject: [PATCH 13/16] Last change on my branch --- python/obitools3/dms/dms.pyx | 34 ++++++++++++++++++++++++++++++ python/obitools3/dms/view/view.pyx | 24 ++++++++++++++++----- 2 files changed, 53 insertions(+), 5 deletions(-) diff --git a/python/obitools3/dms/dms.pyx b/python/obitools3/dms/dms.pyx index 345460e..e0de92e 100644 --- a/python/obitools3/dms/dms.pyx +++ b/python/obitools3/dms/dms.pyx @@ -51,6 +51,11 @@ cdef class DMS : """ return __OBIDMS_COLUMN_CLASS__[obitype][1] + @staticmethod + cdef type get_view_class(bytes viewtype): + return __OBIDMS_VIEW_CLASS__[viewtype] + + def __init__(self, object dms_name) : ''' Constructor of a obitools3.dms.DMS instance. @@ -114,6 +119,18 @@ cdef class DMS : for v in p.glob("*.obiview"): yield str2bytes(v.stem) + + def values(self): + cdef bytes view_name + + for view_name in self.keys(): + yield self.get_view(view_name) + + def items(self): + cdef bytes view_name + + for view_name in self.keys(): + yield (view_name,self.get_view(view_name)) def __contains__(self,key): cdef str key_s = tostr(key) @@ -128,4 +145,21 @@ cdef class DMS : cpdef int view_count(self): return PyList_Size(list(self.keys())) + + def get_view(self): + raise NotImplemented + + def __len__(self): + return self.view_count() + + def __getitem__(self, object view_name): + return self.get_view(view_name) + + def __iter__(self): + return self.keys() + + cpdef bint is_view_writable(self, object view_name): + raise NotImplemented + + \ No newline at end of file diff --git a/python/obitools3/dms/view/view.pyx b/python/obitools3/dms/view/view.pyx index 0852eb2..d1b6287 100644 --- a/python/obitools3/dms/view/view.pyx +++ b/python/obitools3/dms/view/view.pyx @@ -12,6 +12,8 @@ from ..capi.obiview cimport Alias_column_pair_p, \ from ..capi.obidmscolumn cimport OBIDMS_column_p +from .dms cimport __OBIDMS_VIEW_CLASS__ + from obitools3.utils cimport tobytes, \ bytes2str @@ -102,10 +104,10 @@ cdef class View : return view def close(self): - if (self._pointer != NULL - and obi_save_and_close_view(self._pointer) < 0) : - raise Exception("Problem closing view %s" % - bytes2str(self.name)) + if (self._pointer != NULL): + if obi_save_and_close_view(self._pointer) < 0 : + raise Exception("Problem closing view %s" % + bytes2str(self.name)) def __dealloc__(self): self.close() @@ -238,7 +240,7 @@ cdef class View : # view type property getter @property def type(self): # @ReservedAssignment - return bytes2str(self._pointer.infos.view_type) + return self._pointer.infos.view_type # comments property getter @property @@ -410,3 +412,15 @@ cdef class Line : # return view_infos_d +cdef register_view_class(bytes viewtype, + type classe): + """ + Each sub class of `dms.View` needs to be registered after its declaration + to declare its relationship with an `OBIType_t` + """ + global __OBIDMS_VIEW_CLASS__ + + assert issubclass(classe,View) + + __OBIDMS_VIEW_CLASS__[viewtype]=classe + From 4a1d3167a7fca4545add79c7aecb9ce1e75601f5 Mon Sep 17 00:00:00 2001 From: Eric Coissac Date: Mon, 2 Jan 2017 16:46:17 +0100 Subject: [PATCH 14/16] Last change on my branch --- python/obitools3/dms/column/column.pxd | 1 + python/obitools3/dms/dms.pyx | 34 ++++++++++++++++++++++++++ python/obitools3/dms/view/view.pyx | 24 ++++++++++++++---- 3 files changed, 54 insertions(+), 5 deletions(-) diff --git a/python/obitools3/dms/column/column.pxd b/python/obitools3/dms/column/column.pxd index b3f1751..4c6047e 100644 --- a/python/obitools3/dms/column/column.pxd +++ b/python/obitools3/dms/column/column.pxd @@ -22,4 +22,5 @@ cdef class Column_line: cdef register_column_class(obitype_t obitype, type classe, + type matrix, type python) diff --git a/python/obitools3/dms/dms.pyx b/python/obitools3/dms/dms.pyx index 345460e..e0de92e 100644 --- a/python/obitools3/dms/dms.pyx +++ b/python/obitools3/dms/dms.pyx @@ -51,6 +51,11 @@ cdef class DMS : """ return __OBIDMS_COLUMN_CLASS__[obitype][1] + @staticmethod + cdef type get_view_class(bytes viewtype): + return __OBIDMS_VIEW_CLASS__[viewtype] + + def __init__(self, object dms_name) : ''' Constructor of a obitools3.dms.DMS instance. @@ -114,6 +119,18 @@ cdef class DMS : for v in p.glob("*.obiview"): yield str2bytes(v.stem) + + def values(self): + cdef bytes view_name + + for view_name in self.keys(): + yield self.get_view(view_name) + + def items(self): + cdef bytes view_name + + for view_name in self.keys(): + yield (view_name,self.get_view(view_name)) def __contains__(self,key): cdef str key_s = tostr(key) @@ -128,4 +145,21 @@ cdef class DMS : cpdef int view_count(self): return PyList_Size(list(self.keys())) + + def get_view(self): + raise NotImplemented + + def __len__(self): + return self.view_count() + + def __getitem__(self, object view_name): + return self.get_view(view_name) + + def __iter__(self): + return self.keys() + + cpdef bint is_view_writable(self, object view_name): + raise NotImplemented + + \ No newline at end of file diff --git a/python/obitools3/dms/view/view.pyx b/python/obitools3/dms/view/view.pyx index 0852eb2..d1b6287 100644 --- a/python/obitools3/dms/view/view.pyx +++ b/python/obitools3/dms/view/view.pyx @@ -12,6 +12,8 @@ from ..capi.obiview cimport Alias_column_pair_p, \ from ..capi.obidmscolumn cimport OBIDMS_column_p +from .dms cimport __OBIDMS_VIEW_CLASS__ + from obitools3.utils cimport tobytes, \ bytes2str @@ -102,10 +104,10 @@ cdef class View : return view def close(self): - if (self._pointer != NULL - and obi_save_and_close_view(self._pointer) < 0) : - raise Exception("Problem closing view %s" % - bytes2str(self.name)) + if (self._pointer != NULL): + if obi_save_and_close_view(self._pointer) < 0 : + raise Exception("Problem closing view %s" % + bytes2str(self.name)) def __dealloc__(self): self.close() @@ -238,7 +240,7 @@ cdef class View : # view type property getter @property def type(self): # @ReservedAssignment - return bytes2str(self._pointer.infos.view_type) + return self._pointer.infos.view_type # comments property getter @property @@ -410,3 +412,15 @@ cdef class Line : # return view_infos_d +cdef register_view_class(bytes viewtype, + type classe): + """ + Each sub class of `dms.View` needs to be registered after its declaration + to declare its relationship with an `OBIType_t` + """ + global __OBIDMS_VIEW_CLASS__ + + assert issubclass(classe,View) + + __OBIDMS_VIEW_CLASS__[viewtype]=classe + From 4b02ba73ac1d15466b41440ed5f6516353fac79c Mon Sep 17 00:00:00 2001 From: Eric Coissac Date: Tue, 10 Jan 2017 14:07:10 +0100 Subject: [PATCH 15/16] Add the OBIObject concept --- python/obitools3/dms/column/bool.pyx | 80 ++++++++++++++-------------- python/obitools3/dms/dms.pxd | 4 +- python/obitools3/dms/dms.pyx | 15 ++++-- python/obitools3/dms/object.pxd | 10 ++++ python/obitools3/dms/object.pyx | 28 ++++++++++ 5 files changed, 91 insertions(+), 46 deletions(-) create mode 100644 python/obitools3/dms/object.pxd create mode 100644 python/obitools3/dms/object.pyx diff --git a/python/obitools3/dms/column/bool.pyx b/python/obitools3/dms/column/bool.pyx index 20d3328..5556ff0 100644 --- a/python/obitools3/dms/column/bool.pyx +++ b/python/obitools3/dms/column/bool.pyx @@ -190,19 +190,26 @@ cdef class OBIDMS_column_line_bool(OBIDMS_column_line) : -cdef class OBIDMS_column_bool(OBIDMS_column): +cdef class Column_bool(Column): @staticmethod - cdef OBIDMS_column _new(OBIView view, - bytes column_name, - index_t nb_elements_per_line=1, - object elements_names=None, - bytes comments=b""): + def new(OBIView view, + object column_name, + index_t nb_elements_per_line=1, + object elements_names=None, + object comments=b""): + cdef bytes column_name_b = tobytes(column_name) + cdef bytes comments_b cdef bytes elements_names_b cdef char* elements_names_p cdef OBIDMS_column new_column + if comments is not None: + comments_b = tobytes(comments) + else: + comments_b = b'' + if elements_names is not None: elements_names_b = b''.join([tobytes(x) for x in elements_names]) elements_names_p = elements_names_b @@ -210,7 +217,7 @@ cdef class OBIDMS_column_bool(OBIDMS_column): elements_names_p = NULL if (obi_view_add_column(view = view._pointer, - column_name = column_name, + column_name = column_name_b, version_number = -1, alias = NULL, data_type = OBI_BOOL, @@ -220,7 +227,7 @@ cdef class OBIDMS_column_bool(OBIDMS_column): indexer_name = NULL, associated_column_name = NULL, associated_column_version = -1, - comments = comments, + comments = comments_b, create = True)<0): raise RuntimeError("Cannot create column %s in view %s" % (bytes2str(column_name), bytes2str(view.name))) @@ -229,24 +236,11 @@ cdef class OBIDMS_column_bool(OBIDMS_column): new_column = self._columns[column_name] return new_column - - @staticmethod - def new(OBIView view, - object column_name, - index_t nb_elements_per_line=1, - object elements_names=None, - object comments=b""): - - return OBIDMS_column_bool._new(view, - tobytes(column_name), - nb_elements_per_line, - elements_names, - tobytes(comments)) - - cpdef add_to_view(self, - OBIView view, - object column_name=None, - object comments=b""): + + def add_to_view(self, + OBIView view, + object column_name=None, + object comments=b""): cdef OBIDMS_column_p column_p = self._column_pp[0] cdef bytes alias @@ -256,19 +250,25 @@ cdef class OBIDMS_column_bool(OBIDMS_column): else: alias = tobytes(column_name) - obi_view_add_column(view = view._ponter, - column_name = column_p.header.name, - version_number = column_p.header.version, - alias = alias, - data_type = OBI_BOOL, - nb_lines = column_p.header.lines_used, - nb_elements_per_line = column_p.header.nb_elements_per_line, - elements_names = column_p.header.elements_names, - indexer_name = NULL, - associated_column_name = NULL, - associated_column_version = NULL, - comments = tobytes(comments), - create = False) + if (obi_view_add_column(view = view._ponter, + column_name = column_p.header.name, + version_number = column_p.header.version, + alias = alias, + data_type = OBI_BOOL, + nb_lines = column_p.header.lines_used, + nb_elements_per_line = column_p.header.nb_elements_per_line, + elements_names = column_p.header.elements_names, + indexer_name = NULL, + associated_column_name = NULL, + associated_column_version = NULL, + comments = tobytes(comments), + create = False) < 0): + raise RuntimeError("Cannot insert column %s (%s@%d) into view %s" % + ( bytes2str(alias), + bytes2str(column_p.header.name), + column_p.header.version, + bytes2str(view.name) + )) cpdef object get_line(self, index_t line_nb): cdef obibool_t value @@ -291,4 +291,4 @@ cdef class OBIDMS_column_bool(OBIDMS_column): raise Exception("Problem setting a value in a column") -register_column_class(OBI_BOOL,OBIDMS_column_bool) \ No newline at end of file +register_column_class(OBI_BOOL,Column_bool,bool) \ No newline at end of file diff --git a/python/obitools3/dms/dms.pxd b/python/obitools3/dms/dms.pxd index cc11ef2..07ec4b1 100644 --- a/python/obitools3/dms/dms.pxd +++ b/python/obitools3/dms/dms.pxd @@ -4,11 +4,13 @@ from .capi.obidms cimport OBIDMS_p from .capi.obitypes cimport obiversion_t, \ obitype_t, \ index_t + +from .object cimport OBIObject cdef dict __OBIDMS_COLUMN_CLASS__ cdef dict __OBIDMS_VIEW_CLASS__ -cdef class DMS: +cdef class DMS(OBIObject): cdef OBIDMS_p _pointer diff --git a/python/obitools3/dms/dms.pyx b/python/obitools3/dms/dms.pyx index e0de92e..7658c13 100644 --- a/python/obitools3/dms/dms.pyx +++ b/python/obitools3/dms/dms.pyx @@ -33,7 +33,7 @@ from pathlib import Path __OBIDMS_COLUMN_CLASS__ = {} __OBIDMS_VIEW_CLASS__= {} -cdef class DMS : +cdef class DMS(OBIObject): @staticmethod cdef type get_column_class(obitype_t obitype): @@ -64,6 +64,8 @@ cdef class DMS : @type dms_name: a `str` or a `bytes` instance ''' + OBIObject.__init__(self) + # Declarations cdef bytes dms_name_b = tobytes(dms_name) @@ -95,16 +97,19 @@ cdef class DMS : """ return self._pointer.dms_name - cpdef close(self) : + def close(self) : """ Closes the DNS instance and free the associated memory the `close` method is automatically called by the object destructor. """ - if (obi_close_dms(self._pointer)) < 0 : - raise Exception("Problem closing an OBIDMS") - + if self._pointer!=NULL: + if (obi_close_dms(self._pointer)) < 0 : + raise Exception("Problem closing an OBIDMS") + else: + raise OBIObjectClosedInstance() + def keys(self): cdef const_char_p path = obi_dms_get_full_path(self._pointer, b"VIEWS" diff --git a/python/obitools3/dms/object.pxd b/python/obitools3/dms/object.pxd new file mode 100644 index 0000000..50cbe6c --- /dev/null +++ b/python/obitools3/dms/object.pxd @@ -0,0 +1,10 @@ +#cython: language_level=3 + +cdef class OBIObject: + cdef dict _dependent_object + + cpdef register(self, OBIObject object) + cpdef close(self) + +cdef class OBIObjectClosedInstance(Exception): + pass \ No newline at end of file diff --git a/python/obitools3/dms/object.pyx b/python/obitools3/dms/object.pyx new file mode 100644 index 0000000..43bd21c --- /dev/null +++ b/python/obitools3/dms/object.pyx @@ -0,0 +1,28 @@ +#cython: language_level=3 + +cdef class OBIObject: + + cpdef register(self, OBIObject object): + self._dependent_object[id(object)]=object + + cpdef close(self): + cdef OBIObject object + + for object in self._dependent_object.values(): + object.close() + + def __init__(self): + self._dependent_object={} + + def __dealloc__(self): + """ + Destructor of the DMS instance. + + The destructor automatically call the `close` method and + therefore free all the associated memory. + """ + + self.close() + +cdef class OBIObjectClosedInstance(Exception): + pass From cf7f2de016024a9d97767b4483adcaf9135fae0a Mon Sep 17 00:00:00 2001 From: Eric Coissac Date: Tue, 10 Jan 2017 14:26:16 +0100 Subject: [PATCH 16/16] Modify __init__ and close method to deal with registration process --- python/obitools3/dms/dms.pyx | 22 ++++++++-------------- python/obitools3/dms/object.pxd | 1 + python/obitools3/dms/object.pyx | 10 ++++++++-- python/obitools3/dms/view/view.pxd | 6 ++++-- python/obitools3/dms/view/view.pyx | 27 ++++++++++++++++++++++----- 5 files changed, 43 insertions(+), 23 deletions(-) diff --git a/python/obitools3/dms/dms.pyx b/python/obitools3/dms/dms.pyx index 7658c13..b5dd5df 100644 --- a/python/obitools3/dms/dms.pyx +++ b/python/obitools3/dms/dms.pyx @@ -27,6 +27,8 @@ from obitools3.utils cimport bytes2str, \ str2bytes, \ tobytes, \ tostr + +from .object cimport OBIObjectClosedInstance from pathlib import Path @@ -74,18 +76,6 @@ cdef class DMS(OBIObject): if self._pointer == NULL : raise Exception("Failed opening or creating an OBIDMS") - - - def __dealloc__(self): - """ - Destructor of the DMS instance. - - The destructor automatically call the `close` method and - therefore free all the associated memory. - """ - - self.close() - self._pointer=NULL # name property getter @property @@ -103,9 +93,13 @@ cdef class DMS(OBIObject): the `close` method is automatically called by the object destructor. """ + cdef OBIDMS_p pointer = self._pointer - if self._pointer!=NULL: - if (obi_close_dms(self._pointer)) < 0 : + OBIObject.close(self) + self._pointer=NULL + + if pointer!=NULL: + if (obi_close_dms(pointer)) < 0 : raise Exception("Problem closing an OBIDMS") else: raise OBIObjectClosedInstance() diff --git a/python/obitools3/dms/object.pxd b/python/obitools3/dms/object.pxd index 50cbe6c..1ec2513 100644 --- a/python/obitools3/dms/object.pxd +++ b/python/obitools3/dms/object.pxd @@ -4,6 +4,7 @@ cdef class OBIObject: cdef dict _dependent_object cpdef register(self, OBIObject object) + cpdef unregister(self, OBIObject object) cpdef close(self) cdef class OBIObjectClosedInstance(Exception): diff --git a/python/obitools3/dms/object.pyx b/python/obitools3/dms/object.pyx index 43bd21c..f73fba7 100644 --- a/python/obitools3/dms/object.pyx +++ b/python/obitools3/dms/object.pyx @@ -5,12 +5,18 @@ cdef class OBIObject: cpdef register(self, OBIObject object): self._dependent_object[id(object)]=object - cpdef close(self): + cpdef unregister(self, OBIObject object): + del self._dependent_object[id(object)] + + def close(self): cdef OBIObject object + cdef list toclose = list(self._dependent_object.values()) - for object in self._dependent_object.values(): + for object in toclose: object.close() + assert len(dependent_object.values)==0 + def __init__(self): self._dependent_object={} diff --git a/python/obitools3/dms/view/view.pxd b/python/obitools3/dms/view/view.pxd index 6806e2a..8963744 100644 --- a/python/obitools3/dms/view/view.pxd +++ b/python/obitools3/dms/view/view.pxd @@ -3,13 +3,15 @@ from ..capi.obiview cimport Obiview_p from ..capi.obitypes cimport index_t, \ obitype_t - + +from ..object cimport OBIObject from ..dms cimport DMS + from ..column.column cimport Column -cdef class View: +cdef class View(OBIObject): cdef DMS _dms cdef Obiview_p _pointer diff --git a/python/obitools3/dms/view/view.pyx b/python/obitools3/dms/view/view.pyx index d1b6287..7715386 100644 --- a/python/obitools3/dms/view/view.pyx +++ b/python/obitools3/dms/view/view.pyx @@ -16,13 +16,17 @@ from .dms cimport __OBIDMS_VIEW_CLASS__ from obitools3.utils cimport tobytes, \ bytes2str - + +from ..object cimport OBIObjectClosedInstance + -cdef class View : +cdef class View(OBIObject) : def __init__(self,dms,int __internalCall__): + OBIObject.__init__(self) + if __internalCall__!=987654: raise RuntimeError('OBIView constructor cannot be called directly') @@ -55,6 +59,8 @@ cdef class View : % (str(self.name), bytes2str(view_name_b)) ) + + self._dms.register(view) return view @@ -85,6 +91,8 @@ cdef class View : message = "Error : Cannot create view %s" % bytes2str(view_name_b) raise RuntimeError(message) + dms.register(view) + return view @staticmethod @@ -101,16 +109,25 @@ cdef class View : if view._pointer == NULL : raise RuntimeError("Error : Cannot open view %s" % bytes2str(view_name_b)) + dms.register(view) + return view def close(self): - if (self._pointer != NULL): + cdef Obiview_p pointer = self._pointer + + if (pointer != NULL): + self._dms.unregister(self) + OBIObject.close(self) + + self._pointer = NULL + if obi_save_and_close_view(self._pointer) < 0 : raise Exception("Problem closing view %s" % bytes2str(self.name)) + else: + raise OBIObjectClosedInstance() - def __dealloc__(self): - self.close() def __repr__(self) : cdef str s = "{name:s}\n{comments:s}\n{line_count:d} lines\n".format(name = str(self.name),