def __get_integer_id(self, cell_value, row_index): """ Converts the parsed ID into an integer. """ if isinstance(cell_value, int): result = cell_value elif isinstance(cell_value, float): result = int(cell_value) elif isinstance(cell_value, string_types): # FIXME: This is highly suspicious - do we really want to parse # 1.99999 as 1?? if '.' in cell_value: cell_value = cell_value.split('.')[0] try: result = int(cell_value) except ValueError: result = None cell_name = '%s%i' \ % (label_from_number(self.column_index + 1), row_index + 1) msg = 'There is a non-number character in row %i. ' \ % (row_index + 1) error_msg = self.format_log_message(self.SHEET_NAME, cell_name, msg) self.add_error(error_msg) if not result is None: result = int(cell_value) return result
def __check_for_duplicate_id(self, pool_id, row_index): """ Checks whether the current molecule design has been found before. """ if pool_id in self.molecule_design_pool_ids: cell_name = '%s%i' % (label_from_number(self.column_index + 1), row_index + 1) msg = 'Duplicate molecule design pool ID %i in row %i!' \ % (pool_id, row_index + 1) warning_msg = self.format_log_message(self.SHEET_NAME, cell_name, msg) self.add_warning(warning_msg)
def get_cell_name(row_index, column_index): """ Convenience method deriving an Excel cell label from a row and column index. :returns: Cell name. :rtype: :class:`str` """ if row_index is None or column_index is None: result = None else: result = '%s%i' \ % (label_from_number(column_index + 1), row_index + 1) return result
def __determine_layout_dimension(self): # Makes sure the layout is in the right position and determines # the layout dimension. self.add_debug('Determine layout dimension ...') first_col_value = self.get_cell_value(self.sheet, self.TOP_LEFT_POSITION[0] + 1, self.TOP_LEFT_POSITION[1]) is_layout = first_col_value == 'A' if not is_layout: msg = 'Error when trying to locate the layout. Please make sure ' \ 'the columns header start in row 2 in column A.' self.add_error(msg) return None row_number = self.get_sheet_row_number(self.sheet) col_number = self.get_sheet_column_number(self.sheet) rack_row, rack_column = 0, 0 start_row = self.TOP_LEFT_POSITION[0] start_column = self.TOP_LEFT_POSITION[1] # Get number of rows, row labels are alphanumeric. while True: row_cell_value = self.get_cell_value(self.sheet, (start_row + rack_row + 1), start_column) if row_cell_value != label_from_number(rack_row + 1): break rack_row += 1 if (start_row + rack_row + 1) >= row_number: break # Get number of columns, column labels are numbers. while True: column_cell_value = self.get_cell_value( self.sheet, start_row, (start_column + rack_column + 1)) if column_cell_value != (rack_column + 1): break rack_column += 1 if (start_column + rack_column + 1) >= col_number: break if not (rack_row, rack_column) in self.RACK_SHAPES: msg = 'Invalid layout block shape (%ix%i).' % (rack_row, rack_column) self.add_error(msg) else: self.shape = RackShapeParsingContainer(self, rack_row, rack_column)
def get_cell_value(self, sheet, row_index, column_index): """ Returns the value of the specified in the given sheet. Converts the passed cell value either into a ascii string (if basestring) or a number (if non_string). """ cell_value = sheet.cell_value(row_index, column_index) cell_name = '%s%i' % (label_from_number(column_index + 1), row_index + 1) sheet_name = self.get_sheet_name(sheet) conv_value = None if isinstance(cell_value, string_types): try: conv_value = ascii_native_(cell_value) except UnicodeEncodeError: msg = 'Unknown character in cell %s (sheet "%s"). Remove ' \ 'or replace the character, please.' \ % (cell_name, sheet_name) self.add_error(msg) else: if conv_value == '': conv_value = None else: # Try to convert to an int or float. try: conv_value = int(conv_value) except ValueError: try: conv_value = float(conv_value) except ValueError: pass elif isinstance(cell_value, (float, int)): if is_valid_number(value=cell_value, is_integer=True): conv_value = int(cell_value) else: conv_value = cell_value else: msg = 'There is some unknown content in cell %s (sheet %s).' \ % (cell_name, sheet_name) self.add_error(msg) return conv_value
def __parse_layout_shape(self, start_row, start_col): """ Determines the dimensions of plate layout definition. """ rack_row = 0 rack_col = 0 # Get number of rows, row labels are alphanumeric. while rack_row + start_row + 2 < self._row_number: row_value = self._get_cell_value(start_row + rack_row + 1, start_col) if row_value != label_from_number(rack_row + 1): break rack_row += 1 # Get number of columns, column labels are numbers. while start_col + rack_col + 1 < self._col_number: col_value = self._get_cell_value(start_row, start_col + rack_col + 1) if col_value != rack_col + 1: break rack_col += 1 if not (rack_row, rack_col) in self._parser.allowed_rack_dimensions: msg = 'Invalid layout block shape (%ix%i). Make sure you ' \ 'have placed an "%s" maker, too.' % (rack_row, rack_col, self._END_MARKER) self._create_error(msg, self._get_cell_name(start_row, start_col)) result = None else: shape = RackShapeParsingContainer(self._parser, rack_row, rack_col) result = shape if self._parser.HAS_COMMON_LAYOUT_DIMENSION: if self._parser.shape is None: self._parser.shape = shape elif not shape == self._parser.shape: msg = 'There are 2 different layout shapes in the file ' \ '(%s and %s). For this parser, all layout ' \ 'dimensions have to be the same.' \ % (shape, self._parser.shape) self._create_error(msg) result = None return result
def __determine_layout_dimension(self): # Makes sure the layout is in the right position and determines # the layout dimension. self.add_debug('Determine layout dimension ...') first_col_value = self.get_cell_value(self.sheet, self.TOP_LEFT_POSITION[0] + 1, self.TOP_LEFT_POSITION[1]) is_layout = first_col_value == 'A' if not is_layout: msg = 'Error when trying to locate the layout. Please make sure ' \ 'the columns header start in row 2 in column A.' self.add_error(msg) return None row_number = self.get_sheet_row_number(self.sheet) col_number = self.get_sheet_column_number(self.sheet) rack_row, rack_column = 0, 0 start_row = self.TOP_LEFT_POSITION[0] start_column = self.TOP_LEFT_POSITION[1] # Get number of rows, row labels are alphanumeric. while True: row_cell_value = self.get_cell_value(self.sheet, (start_row + rack_row + 1), start_column) if row_cell_value != label_from_number(rack_row + 1): break rack_row += 1 if (start_row + rack_row + 1) >= row_number: break # Get number of columns, column labels are numbers. while True: column_cell_value = self.get_cell_value(self.sheet, start_row, (start_column + rack_column + 1)) if column_cell_value != (rack_column + 1): break rack_column += 1 if (start_column + rack_column + 1) >= col_number: break if not (rack_row, rack_column) in self.RACK_SHAPES: msg = 'Invalid layout block shape (%ix%i).' % (rack_row, rack_column) self.add_error(msg) else: self.shape = RackShapeParsingContainer(self, rack_row, rack_column)
def get_label(cls, row_index, column_index): """ Return the label for the given row and column indices. :param row_index: The row index (0-based) of the rack position. :type row_index: :class:`int` :param column_index: The column index (0-based) of the rack position. :type column_index: :class:`int` :raises TypeError: If one of the indices is not an non-negative integer. :raises ValueError: If there is not rack position for these indices in the DB. """ if not cls.is_positive_integer(row_index): raise ValueError('The row index must be a non-negative integer ' \ '(obtained: %s).' % (row_index)) if not cls.is_positive_integer(column_index): raise ValueError('The column index must be a non-negative ' \ 'integer (obtained: %s).' % (column_index)) return '%s%d' % (label_from_number(row_index + 1), column_index + 1)
db_name = 'buffalo_backup' db_string = "postgresql+psycopg2://%(db_user)s:%(db_password)s" \ "@%(db_server)s:%(db_port)s/%(db_name)s" % locals() engine = create_engine(db_string) metadata = create_metadata(engine) sess = Session() max_row_number = 32 max_col_number = 48 pos_map = dict() for r in range(max_row_number): row_letter = label_from_number(r + 1) for c in range(max_col_number): label = '%s%i' % (row_letter, c + 1) rack_pos = RackPosition(row_index=r, column_index=c, label=label) pos_map[label] = rack_pos sess.add(rack_pos) print '%i rack positions have been created.' % (len(pos_map)) print 'Done processing.' if COMMIT: sess.commit() else: sess.rollback()
def test_basic(self): assert 'AG' == label_from_number(33)
def label(self): """ The label for this rack position. """ return '%s%d' % (label_from_number(self.row_index + 1), self.column_index + 1)