mirror of
https://github.com/beak-insights/felicity-lims.git
synced 2025-02-23 16:33:11 +08:00
476 lines
14 KiB
Text
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
|
|
}
|