felicity-lims/worksheet.ipynb
2021-04-09 00:37:58 +02:00

476 lines
14 KiB
Text

{
"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
}