{ "cells": [ { "cell_type": "code", "execution_count": 2, "id": "anticipated-nepal", "metadata": {}, "outputs": [], "source": [ "class WSTypes(object):\n", " \"\"\"Worksheet Types\n", "\n", " FLAT: Single Column, can be displayed as Multi Column when needed \n", " GRID: Multi Column: Specific Rows and Columns\n", " \"\"\"\n", " FLAT = 0\n", " GRID = 1\n", "\n", "\n", "worksheet_types = WSTypes()\n", "\n", "\n", "class WSStates(object):\n", " \"\"\"Worksheet States\n", " \"\"\"\n", " OPEN = 'open'\n", " TO_BE_VERIFIED = 'to_be_verified'\n", " VERIFIED = 'verified'\n", "\n", "\n", "worksheet_states = WSStates()" ] }, { "cell_type": "code", "execution_count": 3, "id": "naval-orange", "metadata": {}, "outputs": [], "source": [ "\n", "\n", "class WorkSheetPlater:\n", " \"\"\" WorkSheet Plate Populator / WorkSheetTemplate creator\n", " 100% Grid Compatible\n", " \n", " A B C\n", " ---------------------------\n", " 1 | A1 | B1 | C1 | ...\n", " -- -- -- \n", " 2 | A2 | B2 | C2 | ...\n", " -- -- -- \n", " \n", " plate = {\n", " 1: {\n", " 'row': 'A',\n", " 'col': 1,\n", " 'name': 'sample/low-pos/blank',\n", " 'sample_uid': 'sample uid',\n", " },\n", " ...\n", " }\n", " \"\"\"\n", " letters = list('ABCDEFGHIJKLMNOPQRSTUVWXYZ')\n", " template: dict = {}\n", "\n", " def __init__(\n", " self,\n", " reserved: dict,\n", " n_samples: int,\n", " t_type: int = worksheet_types.FLAT,\n", " rows: int = None,\n", " cols: int = None,\n", " row_wise: bool = True\n", "\n", " ):\n", " self.reserved_positions = reserved\n", " self.number_of_samples = n_samples\n", " self.template_type = t_type\n", " self.rows = rows\n", " self.cols = cols\n", " self.row_wise = row_wise\n", "\n", " def count_reserved(self):\n", " return len(self.reserved_positions)\n", "\n", " def all_keys(self):\n", " plate_count = self.number_of_samples + self.count_reserved()\n", " return list(range(1, plate_count + 1))\n", "\n", " def remove_reserved_keys(self):\n", " keys = self.all_keys()\n", " for k in self.reserved_positions.keys():\n", " if k in keys:\n", " keys.remove(k)\n", " return keys\n", "\n", " def create(self):\n", " keys = self.remove_reserved_keys()\n", " for key in keys:\n", " self.template[key] = {\n", " 'row': None,\n", " 'col': 1,\n", " 'name': 'sample/dc/blank',\n", " 'sample_uid': 'sample uid',\n", " }\n", "\n", " # Add Samples Here\n", " # self.add_samples()\n", "\n", " for k, v in self.reserved_positions.items():\n", " self.template[k] = v\n", "\n", " if self.template_type == worksheet_types.GRID:\n", " self.make_grid_ready()\n", "\n", " return self._sorted()\n", "\n", " def _sorted(self):\n", " return dict(sorted(self.template.items()))\n", "\n", " def get_cols(self):\n", " return self.letters[:self.cols]\n", "\n", " def get_rows(self):\n", " return list(range(1, self.rows + 1))\n", "\n", " def make_grid_ready(self):\n", " if not self.rows or not self.cols:\n", " raise Exception(\"Rows and Cols cannot be None or Zero\")\n", "\n", " across = self.get_rows()\n", " down = self.get_cols()\n", "\n", " index = 1\n", " if self.row_wise:\n", " for _r in across:\n", " for _c in down:\n", " self.assign_grid(index, row=_r, col=_c)\n", " index += 1\n", " else:\n", " for _r in down:\n", " for _c in across:\n", " self.assign_grid(index, row=_c, col=_r)\n", " index += 1\n", "\n", " def assign_grid(self, index, col, row):\n", " self.template[index]['row'] = row\n", " self.template[index]['col'] = col\n", "\n", "\n", "def add_samples(template: dict, samples, reserved: list):\n", " temp = copy.deepcopy(template)\n", " # sort samples by uid or sample_id\n", " sorted_samples = samples.sort()\n", " for c, val in enumerate(sorted_samples):\n", " if c not in reserved:\n", " temp[c] = val\n", " return temp\n" ] }, { "cell_type": "code", "execution_count": 34, "id": "according-shock", "metadata": {}, "outputs": [], "source": [ "reserved = {\n", " 1: {'row': None, 'col': 1, 'name': 'blank', 'sample_uid': 'sample uid'},\n", " 4: {'row': None,\n", " 'col': 1,\n", " 'name': 'QC',\n", " 'sample_uid': 'sample uid'},\n", " 9: {'row': None,\n", " 'col': 1,\n", " 'name': 'QC',\n", " 'sample_uid': 'sample uid'},\n", "}" ] }, { "cell_type": "code", "execution_count": 39, "id": "developmental-sierra", "metadata": {}, "outputs": [], "source": [ "plater = WorkSheetPlater(reserved=reserved, n_samples=21, rows=6, cols=3, row_wise=True, t_type=worksheet_types.GRID)" ] }, { "cell_type": "code", "execution_count": 40, "id": "proof-florida", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{1: {'row': 1, 'col': 'A', 'name': 'blank', 'sample_uid': 'sample uid'},\n", " 2: {'row': 1,\n", " 'col': 'B',\n", " 'name': 'sample/dc/blank',\n", " 'sample_uid': 'sample uid'},\n", " 3: {'row': 1,\n", " 'col': 'C',\n", " 'name': 'sample/dc/blank',\n", " 'sample_uid': 'sample uid'},\n", " 4: {'row': 2, 'col': 'A', 'name': 'QC', 'sample_uid': 'sample uid'},\n", " 5: {'row': 2,\n", " 'col': 'B',\n", " 'name': 'sample/dc/blank',\n", " 'sample_uid': 'sample uid'},\n", " 6: {'row': 2,\n", " 'col': 'C',\n", " 'name': 'sample/dc/blank',\n", " 'sample_uid': 'sample uid'},\n", " 7: {'row': 3,\n", " 'col': 'A',\n", " 'name': 'sample/dc/blank',\n", " 'sample_uid': 'sample uid'},\n", " 8: {'row': 3,\n", " 'col': 'B',\n", " 'name': 'sample/dc/blank',\n", " 'sample_uid': 'sample uid'},\n", " 9: {'row': 3, 'col': 'C', 'name': 'QC', 'sample_uid': 'sample uid'},\n", " 10: {'row': 4,\n", " 'col': 'A',\n", " 'name': 'sample/dc/blank',\n", " 'sample_uid': 'sample uid'},\n", " 11: {'row': 4,\n", " 'col': 'B',\n", " 'name': 'sample/dc/blank',\n", " 'sample_uid': 'sample uid'},\n", " 12: {'row': 4,\n", " 'col': 'C',\n", " 'name': 'sample/dc/blank',\n", " 'sample_uid': 'sample uid'},\n", " 13: {'row': 5,\n", " 'col': 'A',\n", " 'name': 'sample/dc/blank',\n", " 'sample_uid': 'sample uid'},\n", " 14: {'row': 5,\n", " 'col': 'B',\n", " 'name': 'sample/dc/blank',\n", " 'sample_uid': 'sample uid'},\n", " 15: {'row': 5,\n", " 'col': 'C',\n", " 'name': 'sample/dc/blank',\n", " 'sample_uid': 'sample uid'},\n", " 16: {'row': 6,\n", " 'col': 'A',\n", " 'name': 'sample/dc/blank',\n", " 'sample_uid': 'sample uid'},\n", " 17: {'row': 6,\n", " 'col': 'B',\n", " 'name': 'sample/dc/blank',\n", " 'sample_uid': 'sample uid'},\n", " 18: {'row': 6,\n", " 'col': 'C',\n", " 'name': 'sample/dc/blank',\n", " 'sample_uid': 'sample uid'},\n", " 19: {'row': None,\n", " 'col': 1,\n", " 'name': 'sample/dc/blank',\n", " 'sample_uid': 'sample uid'},\n", " 20: {'row': None,\n", " 'col': 1,\n", " 'name': 'sample/dc/blank',\n", " 'sample_uid': 'sample uid'},\n", " 21: {'row': None,\n", " 'col': 1,\n", " 'name': 'sample/dc/blank',\n", " 'sample_uid': 'sample uid'},\n", " 22: {'row': None,\n", " 'col': 1,\n", " 'name': 'sample/dc/blank',\n", " 'sample_uid': 'sample uid'},\n", " 23: {'row': None,\n", " 'col': 1,\n", " 'name': 'sample/dc/blank',\n", " 'sample_uid': 'sample uid'},\n", " 24: {'row': None,\n", " 'col': 1,\n", " 'name': 'sample/dc/blank',\n", " 'sample_uid': 'sample uid'}}" ] }, "execution_count": 40, "metadata": {}, "output_type": "execute_result" } ], "source": [ "plater.create()" ] }, { "cell_type": "code", "execution_count": 41, "id": "commercial-caribbean", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{1: {'row': 1, 'col': 'A', 'name': 'blank', 'sample_uid': 'sample uid'},\n", " 2: {'row': 1,\n", " 'col': 'B',\n", " 'name': 'sample/dc/blank',\n", " 'sample_uid': 'sample uid'},\n", " 3: {'row': 1,\n", " 'col': 'C',\n", " 'name': 'sample/dc/blank',\n", " 'sample_uid': 'sample uid'},\n", " 4: {'row': 2, 'col': 'A', 'name': 'QC', 'sample_uid': 'sample uid'},\n", " 5: {'row': 2,\n", " 'col': 'B',\n", " 'name': 'sample/dc/blank',\n", " 'sample_uid': 'sample uid'},\n", " 6: {'row': 2,\n", " 'col': 'C',\n", " 'name': 'sample/dc/blank',\n", " 'sample_uid': 'sample uid'},\n", " 7: {'row': 3,\n", " 'col': 'A',\n", " 'name': 'sample/dc/blank',\n", " 'sample_uid': 'sample uid'},\n", " 8: {'row': 3,\n", " 'col': 'B',\n", " 'name': 'sample/dc/blank',\n", " 'sample_uid': 'sample uid'},\n", " 9: {'row': 3, 'col': 'C', 'name': 'QC', 'sample_uid': 'sample uid'},\n", " 10: {'row': 4,\n", " 'col': 'A',\n", " 'name': 'sample/dc/blank',\n", " 'sample_uid': 'sample uid'},\n", " 11: {'row': 4,\n", " 'col': 'B',\n", " 'name': 'sample/dc/blank',\n", " 'sample_uid': 'sample uid'},\n", " 12: {'row': 4,\n", " 'col': 'C',\n", " 'name': 'sample/dc/blank',\n", " 'sample_uid': 'sample uid'},\n", " 13: {'row': 5,\n", " 'col': 'A',\n", " 'name': 'sample/dc/blank',\n", " 'sample_uid': 'sample uid'},\n", " 14: {'row': 5,\n", " 'col': 'B',\n", " 'name': 'sample/dc/blank',\n", " 'sample_uid': 'sample uid'},\n", " 15: {'row': 5,\n", " 'col': 'C',\n", " 'name': 'sample/dc/blank',\n", " 'sample_uid': 'sample uid'},\n", " 16: {'row': 6,\n", " 'col': 'A',\n", " 'name': 'sample/dc/blank',\n", " 'sample_uid': 'sample uid'},\n", " 17: {'row': 6,\n", " 'col': 'B',\n", " 'name': 'sample/dc/blank',\n", " 'sample_uid': 'sample uid'},\n", " 18: {'row': 6,\n", " 'col': 'C',\n", " 'name': 'sample/dc/blank',\n", " 'sample_uid': 'sample uid'},\n", " 19: {'row': None,\n", " 'col': 1,\n", " 'name': 'sample/dc/blank',\n", " 'sample_uid': 'sample uid'},\n", " 20: {'row': None,\n", " 'col': 1,\n", " 'name': 'sample/dc/blank',\n", " 'sample_uid': 'sample uid'},\n", " 21: {'row': None,\n", " 'col': 1,\n", " 'name': 'sample/dc/blank',\n", " 'sample_uid': 'sample uid'},\n", " 22: {'row': None,\n", " 'col': 1,\n", " 'name': 'sample/dc/blank',\n", " 'sample_uid': 'sample uid'},\n", " 23: {'row': None,\n", " 'col': 1,\n", " 'name': 'sample/dc/blank',\n", " 'sample_uid': 'sample uid'},\n", " 24: {'row': None,\n", " 'col': 1,\n", " 'name': 'sample/dc/blank',\n", " 'sample_uid': 'sample uid'}}" ] }, "execution_count": 41, "metadata": {}, "output_type": "execute_result" } ], "source": [ "plater.template" ] }, { "cell_type": "code", "execution_count": null, "id": "ecological-newcastle", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "educational-survival", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "pretty-desire", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "opposed-forest", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "arranged-netherlands", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "fixed-brisbane", "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.5" } }, "nbformat": 4, "nbformat_minor": 5 }