{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Initializing a Connection\n",
"\n",
"We'll be using a MockConnection object and some sampledata for this example. Please feel free to follow along with your local credentials and switching the ids with the relevant object-ids."
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"from transcriptic import connect\n",
"\n",
"api = connect()\n",
"\n",
"# If you receive an `Unable to find .transcriptic` file error, please try\n",
"# `transcriptic login` into the commandline."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"For the rest of the demo, we'll be using the sampledata. If using your credentials, please do not execute the cell below."
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"from transcriptic import connect\n",
"\n",
"api = connect(mocked=True)"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"'sample-org'"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"## Initialized organization\n",
"api.organization_id"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"[{'id': 'p123',\n",
" 'name': 'sample project',\n",
" 'created_at': '2020-10-01T00:00:00.000-07:00',\n",
" 'updated_at': '2020-10-01T00:59:59.100-07:00'}]"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"## List projects\n",
"api.projects()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Project"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
"from transcriptic.sampledata import load_sample_project"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [],
"source": [
"my_project = load_sample_project()"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [],
"source": [
"## Bring up documentation\n",
"my_project?"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"'sample project'"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"my_project.name"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" id | \n",
" Name | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" r123 | \n",
" Sample Run | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" id Name\n",
"0 r123 Sample Run"
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"## View runs in the project as a pandas DataFrame\n",
"my_project.runs()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Typically, you would initialize a project directly with the given Project-id."
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [],
"source": [
"from transcriptic.jupyter import Project"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [],
"source": [
"my_project = Project(\"p123\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Run"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [],
"source": [
"from transcriptic.sampledata import load_sample_run"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [],
"source": [
"my_run = load_sample_run()"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [],
"source": [
"## Bring up documentation\n",
"my_run?"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"'r123'"
]
},
"execution_count": 15,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"my_run.id"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {
"scrolled": true
},
"outputs": [
{
"data": {
"text/plain": [
"'p123'"
]
},
"execution_count": 16,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"my_run.project_id"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Instruction Exploration"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {
"scrolled": true
},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" Name | \n",
" Id | \n",
" Started | \n",
" Completed | \n",
" Instructions | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" acoustic_transfer | \n",
" i123 | \n",
" 2020-06-01T15:39:50.873-07:00 | \n",
" 2020-06-01T15:39:55.049-07:00 | \n",
" <transcriptic.jupyter.objects.Instruction obje... | \n",
"
\n",
" \n",
" 1 | \n",
" absorbance | \n",
" i124 | \n",
" 2020-06-01T15:40:50.873-07:00 | \n",
" 2020-06-01T15:40:55.049-07:00 | \n",
" <transcriptic.jupyter.objects.Instruction obje... | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" Name Id Started \\\n",
"0 acoustic_transfer i123 2020-06-01T15:39:50.873-07:00 \n",
"1 absorbance i124 2020-06-01T15:40:50.873-07:00 \n",
"\n",
" Completed \\\n",
"0 2020-06-01T15:39:55.049-07:00 \n",
"1 2020-06-01T15:40:55.049-07:00 \n",
"\n",
" Instructions \n",
"0 \n",
"\n",
"\n",
" \n",
" \n",
" | \n",
" Name | \n",
" WarpId | \n",
" Completed | \n",
" Started | \n",
" Params | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" AcousticLiquidHandler.Transfer | \n",
" w123 | \n",
" 2020-06-01T15:39:54.989-07:00 | \n",
" 2020-06-01T15:39:50.791-07:00 | \n",
" {'sourceContainer': {'id': 'ct123', 'cType': '... | \n",
"
\n",
" \n",
"
\n",
""
],
"text/plain": [
" Name WarpId Completed \\\n",
"0 AcousticLiquidHandler.Transfer w123 2020-06-01T15:39:54.989-07:00 \n",
"\n",
" Started \\\n",
"0 2020-06-01T15:39:50.791-07:00 \n",
"\n",
" Params \n",
"0 {'sourceContainer': {'id': 'ct123', 'cType': '... "
]
},
"execution_count": 21,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Examine warp-specifics\n",
"my_inst.warps"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Container Exploration"
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {
"scrolled": false
},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" Name | \n",
" ContainerId | \n",
" Type | \n",
" Status | \n",
" Storage Condition | \n",
" Containers | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" Echo Source Plate | \n",
" ct123 | \n",
" 384-echo | \n",
" available | \n",
" cold_4 | \n",
" Container(Echo Source Plate) | \n",
"
\n",
" \n",
" 1 | \n",
" VbottomPlate | \n",
" ct124 | \n",
" 96-well-v-bottom | \n",
" available | \n",
" cold_4 | \n",
" Container(VbottomPlate) | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" Name ContainerId Type Status \\\n",
"0 Echo Source Plate ct123 384-echo available \n",
"1 VbottomPlate ct124 96-well-v-bottom available \n",
"\n",
" Storage Condition Containers \n",
"0 cold_4 Container(Echo Source Plate) \n",
"1 cold_4 Container(VbottomPlate) "
]
},
"execution_count": 22,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"my_run.containers"
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {},
"outputs": [],
"source": [
"# Access column of Containers\n",
"my_containers = my_run.containers.Containers\n",
"cont_123 = my_containers.loc[0]"
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Container(Echo Source Plate)"
]
},
"execution_count": 24,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"cont_123"
]
},
{
"cell_type": "code",
"execution_count": 25,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" Name | \n",
" Id | \n",
" Volume | \n",
"
\n",
" \n",
" Well Index | \n",
" | \n",
" | \n",
" | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" None | \n",
" aq1egnpw5q5ythw | \n",
" 99:microliter | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" Name Id Volume\n",
"Well Index \n",
"0 None aq1egnpw5q5ythw 99:microliter"
]
},
"execution_count": 25,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Examine aliqutos of this container\n",
"cont_123.aliquots"
]
},
{
"cell_type": "code",
"execution_count": 26,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"ContainerType(name='384-well Echo plate', is_tube=False, well_count=384, well_depth_mm=None, well_volume_ul=Unit(65.0, 'microliter'), well_coating=None, sterile=None, cover_types=['universal'], seal_types=['foil', 'ultra-clear'], capabilities=['liquid_handle', 'seal', 'spin', 'incubate', 'dispense', 'cover'], shortname='384-echo', col_count=24, dead_volume_ul=Unit(15, 'microliter'), safe_min_volume_ul=Unit(15, 'microliter'), true_max_vol_ul=Unit(135, 'microliter'), vendor='Labcyte', cat_no='PP-0200', prioritize_seal_or_cover='seal')"
]
},
"execution_count": 26,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# View the autoprotocol container-type\n",
"cont_123.container_type"
]
},
{
"cell_type": "code",
"execution_count": 27,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"'cold_4'"
]
},
"execution_count": 27,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# View storage status\n",
"cont_123.storage"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Dataset Exploration"
]
},
{
"cell_type": "code",
"execution_count": 28,
"metadata": {
"scrolled": true
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Attempting to fetch 1 datasets...\n"
]
},
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" Name | \n",
" DataType | \n",
" Operation | \n",
" AnalysisTool | \n",
" Datasets | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" OD600 | \n",
" platereader | \n",
" absorbance | \n",
" None | \n",
" <transcriptic.jupyter.objects.Dataset object a... | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" Name DataType Operation AnalysisTool \\\n",
"0 OD600 platereader absorbance None \n",
"\n",
" Datasets \n",
"0 \n",
"\n",
"\n",
" \n",
" \n",
" | \n",
" A1 | \n",
" A2 | \n",
" A3 | \n",
" B1 | \n",
" B2 | \n",
" B3 | \n",
" C1 | \n",
" C2 | \n",
" C3 | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" 0.05 | \n",
" 0.04 | \n",
" 0.06 | \n",
" 1.21 | \n",
" 1.13 | \n",
" 1.32 | \n",
" 2.22 | \n",
" 2.15 | \n",
" 2.37 | \n",
"
\n",
" \n",
"
\n",
""
],
"text/plain": [
" A1 A2 A3 B1 B2 B3 C1 C2 C3\n",
"0 0.05 0.04 0.06 1.21 1.13 1.32 2.22 2.15 2.37"
]
},
"execution_count": 29,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"my_run.Datasets.loc[0].data"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Some basic analysis is supported on datasets. See the Analysis notebook for more examples."
]
},
{
"cell_type": "code",
"execution_count": 30,
"metadata": {},
"outputs": [],
"source": [
"from transcriptic.analysis.spectrophotometry import Absorbance"
]
},
{
"cell_type": "code",
"execution_count": 31,
"metadata": {},
"outputs": [],
"source": [
"Absorbance?"
]
},
{
"cell_type": "code",
"execution_count": 32,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
""
]
},
"execution_count": 32,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"abs_dataset = Absorbance(\n",
" my_run.Datasets.loc[0],\n",
" [\"control\", \"sample1\", \"sample2\"],\n",
" group_wells = [[0,1,2], [12, 13, 14], [24, 25, 26]]\n",
")\n",
"abs_dataset"
]
},
{
"cell_type": "code",
"execution_count": 33,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" control | \n",
" sample1 | \n",
" sample2 | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" 0.05 | \n",
" 1.21 | \n",
" 2.22 | \n",
"
\n",
" \n",
" 1 | \n",
" 0.04 | \n",
" 1.13 | \n",
" 2.15 | \n",
"
\n",
" \n",
" 2 | \n",
" 0.06 | \n",
" 1.32 | \n",
" 2.37 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" control sample1 sample2\n",
"0 0.05 1.21 2.22\n",
"1 0.04 1.13 2.15\n",
"2 0.06 1.32 2.37"
]
},
"execution_count": 33,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"abs_dataset.df"
]
},
{
"cell_type": "code",
"execution_count": 34,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
""
],
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"