qslib 0.15.1

QSlib QuantStudio qPCR machine library
Documentation
{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "1d972ee7-2757-4b0a-a665-c021e8279799",
   "metadata": {},
   "outputs": [],
   "source": [
    "from qslib import *"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "ef80ec61-c9e1-41c1-80b2-e8bda43bd85f",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/markdown": [
       "Run Protocol Prot_2022-01-10T19-42-41 with sample volume 50.0 µL and run mode standard:\n",
       "(default filters x3-m5)\n",
       "\n",
       "  1. Stage with 21 cycles (total duration 19m57s) of [80.00 80.00 80.00 80.00 80.00 80.00] °C to [60.00 60.00 60.00 60.00 60.00 60.00] °C for 57.0 second/cycle, -1.0 delta_degree_Celsius°C/cycle from cycle 2\n",
       "  2. Stage with 1 cycle (total duration 120s) of [60.00 60.00 60.00 60.00 60.00 60.00] °C for 120 second/cycle\n",
       "  3. Stage with 31 cycles (total duration 59m56s) of [60.00 60.00 60.00 60.00 60.00 60.00] °C to [30.00 30.00 30.00 30.00 30.00 30.00] °C for 116.0 second/cycle, -1.0 delta_degree_Celsius°C/cycle from cycle 2 (collects default)\n",
       "  4. Stage with 16 cycles (total duration 60m) of [30.00 30.00 30.00 30.00 30.00 30.00] °C to [60.00 60.00 60.00 60.00 60.00 60.00] °C for 225.0 second/cycle, 2.0 delta_degree_Celsius°C/cycle from cycle 2 (collects default)\n",
       "  5. Stage with 3 cycles (total duration 9m) of [60.00 60.00 60.00 60.00 60.00 60.00] °C for 3 minute/cycle (collects x1-m4, x3-m5)\n",
       "  6. Stage with 1 cycle (total duration 40m) of:\n",
       "      1. [60.00 60.00 60.00 60.00 60.00 60.00] °C for 480.0 second/cycle (collects x1-m4)\n",
       "      2. [57.50 57.25 57.00 56.75 56.50 56.25] °C for 480.0 second/cycle (collects x1-m4)\n",
       "      3. [55.00 54.50 54.00 53.50 53.00 52.50] °C for 480.0 second/cycle (collects x1-m4)\n",
       "      4. [52.50 51.75 51.00 50.25 49.50 48.75] °C for 480.0 second/cycle (collects x1-m4)\n",
       "      5. [50.00 49.00 48.00 47.00 46.00 45.00] °C for 480.0 second/cycle (collects x1-m4)\n",
       "  7. Stage with 6 cycles (total duration 60m) of [50.00 49.00 48.00 47.00 46.00 45.00] °C for 10 minute/cycle (collects x1-m4)\n",
       "  8. Stage with 6 cycles (total duration 60m) of [50.00 49.00 48.00 47.00 46.00 45.00] °C for 10 minute/cycle (collects x1-m4)"
      ],
      "text/plain": [
       "Protocol(stages=[Stage(steps=Step(time=<Quantity(57.0, 'second')>, temperature=<Quantity(80, 'degree_Celsius')>, collect=None, temp_increment=<Quantity(-1.0, 'delta_degree_Celsius')>, temp_incrementcycle=2, time_increment=<Quantity(0, 'second')>, time_incrementcycle=2, filters=[], pcr=False, quant=True, tiff=False), repeat=21), Stage(steps=Step(time=<Quantity(120, 'second')>, temperature=<Quantity(60, 'degree_Celsius')>, collect=None, temp_increment=<Quantity(0.0, 'delta_degree_Celsius')>, temp_incrementcycle=2, time_increment=<Quantity(0, 'second')>, time_incrementcycle=2, filters=[], pcr=False, quant=True, tiff=False)), Stage(steps=Step(time=<Quantity(116.0, 'second')>, temperature=<Quantity(60.0, 'degree_Celsius')>, collect=True, temp_increment=<Quantity(-1.0, 'delta_degree_Celsius')>, temp_incrementcycle=2, time_increment=<Quantity(0, 'second')>, time_incrementcycle=2, filters=[], pcr=False, quant=True, tiff=False), repeat=31), Stage(steps=Step(time=<Quantity(225.0, 'second')>, temperature=<Quantity(30, 'degree_Celsius')>, collect=True, temp_increment=<Quantity(2.0, 'delta_degree_Celsius')>, temp_incrementcycle=2, time_increment=<Quantity(0, 'second')>, time_incrementcycle=2, filters=[], pcr=False, quant=True, tiff=False), repeat=16), Stage(steps=Step(time=<Quantity(3, 'minute')>, temperature=<Quantity(60, 'degree_Celsius')>, collect=None, temp_increment=<Quantity(0.0, 'delta_degree_Celsius')>, temp_incrementcycle=2, time_increment=<Quantity(0, 'second')>, time_incrementcycle=2, filters=[FilterSet(ex=1, em=4, quant=True), FilterSet(ex=3, em=5, quant=True)], pcr=False, quant=True, tiff=False), repeat=3), Stage(steps=[Step(time=<Quantity(480.0, 'second')>, temperature=<Quantity([60. 60. 60. 60. 60. 60.], 'degree_Celsius')>, collect=None, temp_increment=<Quantity(0.0, 'delta_degree_Celsius')>, temp_incrementcycle=2, time_increment=<Quantity(0, 'second')>, time_incrementcycle=2, filters=[FilterSet(ex=1, em=4, quant=True)], pcr=False, quant=True, tiff=False), Step(time=<Quantity(480.0, 'second')>, temperature=<Quantity([57.5  57.25 57.   56.75 56.5  56.25], 'degree_Celsius')>, collect=None, temp_increment=<Quantity(0.0, 'delta_degree_Celsius')>, temp_incrementcycle=2, time_increment=<Quantity(0, 'second')>, time_incrementcycle=2, filters=[FilterSet(ex=1, em=4, quant=True)], pcr=False, quant=True, tiff=False), Step(time=<Quantity(480.0, 'second')>, temperature=<Quantity([55.  54.5 54.  53.5 53.  52.5], 'degree_Celsius')>, collect=None, temp_increment=<Quantity(0.0, 'delta_degree_Celsius')>, temp_incrementcycle=2, time_increment=<Quantity(0, 'second')>, time_incrementcycle=2, filters=[FilterSet(ex=1, em=4, quant=True)], pcr=False, quant=True, tiff=False), Step(time=<Quantity(480.0, 'second')>, temperature=<Quantity([52.5  51.75 51.   50.25 49.5  48.75], 'degree_Celsius')>, collect=None, temp_increment=<Quantity(0.0, 'delta_degree_Celsius')>, temp_incrementcycle=2, time_increment=<Quantity(0, 'second')>, time_incrementcycle=2, filters=[FilterSet(ex=1, em=4, quant=True)], pcr=False, quant=True, tiff=False), Step(time=<Quantity(480.0, 'second')>, temperature=<Quantity([50. 49. 48. 47. 46. 45.], 'degree_Celsius')>, collect=None, temp_increment=<Quantity(0.0, 'delta_degree_Celsius')>, temp_incrementcycle=2, time_increment=<Quantity(0, 'second')>, time_incrementcycle=2, filters=[FilterSet(ex=1, em=4, quant=True)], pcr=False, quant=True, tiff=False)]), Stage(steps=Step(time=<Quantity(10, 'minute')>, temperature=<Quantity([50 49 48 47 46 45], 'degree_Celsius')>, collect=None, temp_increment=<Quantity(0.0, 'delta_degree_Celsius')>, temp_incrementcycle=2, time_increment=<Quantity(0, 'second')>, time_incrementcycle=2, filters=[FilterSet(ex=1, em=4, quant=True)], pcr=False, quant=True, tiff=False), repeat=6), Stage(steps=Step(time=<Quantity(10, 'minute')>, temperature=<Quantity([50 49 48 47 46 45], 'degree_Celsius')>, collect=None, temp_increment=<Quantity(0.0, 'delta_degree_Celsius')>, temp_incrementcycle=2, time_increment=<Quantity(0, 'second')>, time_incrementcycle=2, filters=[FilterSet(ex=1, em=4, quant=True)], pcr=False, quant=True, tiff=False), repeat=6)], name='Prot_2022-01-10T19-42-41', volume=50.0, runmode='standard', filters=[FilterSet(ex=3, em=5, quant=True)], covertemperature=105.0, _classname='Protocol')"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "protocol = Protocol(\n",
    "    [\n",
    "        Stage.stepped_ramp(\n",
    "            \"80 °C\", 60, \"20 minutes\"\n",
    "        ),  # A unitless temperature is degrees Celsius\n",
    "        Stage.hold_for(\"60 degC\", total_time=120),  # A unitless time is seconds\n",
    "        Stage.stepped_ramp(\n",
    "            from_temperature=60.0,\n",
    "            to_temperature=30.0,\n",
    "            total_time=\"1 hour\",\n",
    "            collect=True,\n",
    "        ),\n",
    "        # Collects the protocol default\n",
    "        Stage.stepped_ramp(\n",
    "            from_temperature=30,\n",
    "            to_temperature=60.0,\n",
    "            total_time=\"1 hour\",\n",
    "            temperature_step=2,\n",
    "            collect=True,\n",
    "        ),\n",
    "        Stage.hold_for(\n",
    "            \"60 degC\",\n",
    "            total_time=\"9 minutes\",\n",
    "            step_time=\"3 minutes\",\n",
    "            filters=[\"x1-m4\", \"x3-m5\"],\n",
    "        ),  # Collects a different set of filters\n",
    "        Stage.stepped_ramp(\n",
    "            60,\n",
    "            [50, 49, 48, 47, 46, 45],\n",
    "            total_time=\"40 minutes\",\n",
    "            filters=[\"x1-m4\"],\n",
    "            n_steps=5,\n",
    "        ),  # Try this in AB's software!\n",
    "        Stage.hold_for(\n",
    "            [50, 49, 48, 47, 46, 45],\n",
    "            total_time=\"1 hour\",\n",
    "            step_time=\"10 minutes\",\n",
    "            filters=[\"x1-m4\"],\n",
    "        ),\n",
    "        Stage(\n",
    "            [Step(\"10 minutes\", [50, 49, 48, 47, 46, 45], filters=[\"x1-m4\"])], repeat=6\n",
    "        ),  # An alternative\n",
    "    ],\n",
    "    filters=[\"x3-m5\"],\n",
    ")\n",
    "protocol"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "30af221f-991c-414a-ba44-6edd46d9dc6d",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "protocol.plot_protocol();"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "5ba82546-4f89-4753-94b6-f1aa3f8da816",
   "metadata": {},
   "outputs": [],
   "source": [
    "platesetup = PlateSetup({\"sample_A\": \"A1\", \"sample_B\": [\"A2\", \"A3\"]})"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "900d038e-6a0a-47fb-96f5-e063dbef9902",
   "metadata": {},
   "outputs": [],
   "source": [
    "exp = Experiment(\"example-experiment\", protocol, platesetup)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "387cd1f5-d71b-4f67-b38b-88a3527896cc",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/markdown": [
       "# QS Experiment example-experiment (INIT)\n",
       "\n",
       "Run Protocol Prot_2022-01-10T19-42-41 with sample volume 50.0 µL and run mode standard:\n",
       "(default filters x3-m5)\n",
       "\n",
       "  1. Stage with 21 cycles (total duration 19m57s) of [80.00 80.00 80.00 80.00 80.00 80.00] °C to [60.00 60.00 60.00 60.00 60.00 60.00] °C for 57.0 second/cycle, -1.0 delta_degree_Celsius°C/cycle from cycle 2\n",
       "  2. Stage with 1 cycle (total duration 120s) of [60.00 60.00 60.00 60.00 60.00 60.00] °C for 120 second/cycle\n",
       "  3. Stage with 31 cycles (total duration 59m56s) of [60.00 60.00 60.00 60.00 60.00 60.00] °C to [30.00 30.00 30.00 30.00 30.00 30.00] °C for 116.0 second/cycle, -1.0 delta_degree_Celsius°C/cycle from cycle 2 (collects default)\n",
       "  4. Stage with 16 cycles (total duration 60m) of [30.00 30.00 30.00 30.00 30.00 30.00] °C to [60.00 60.00 60.00 60.00 60.00 60.00] °C for 225.0 second/cycle, 2.0 delta_degree_Celsius°C/cycle from cycle 2 (collects default)\n",
       "  5. Stage with 3 cycles (total duration 9m) of [60.00 60.00 60.00 60.00 60.00 60.00] °C for 3 minute/cycle (collects x1-m4, x3-m5)\n",
       "  6. Stage with 1 cycle (total duration 40m) of:\n",
       "      1. [60.00 60.00 60.00 60.00 60.00 60.00] °C for 480.0 second/cycle (collects x1-m4)\n",
       "      2. [57.50 57.25 57.00 56.75 56.50 56.25] °C for 480.0 second/cycle (collects x1-m4)\n",
       "      3. [55.00 54.50 54.00 53.50 53.00 52.50] °C for 480.0 second/cycle (collects x1-m4)\n",
       "      4. [52.50 51.75 51.00 50.25 49.50 48.75] °C for 480.0 second/cycle (collects x1-m4)\n",
       "      5. [50.00 49.00 48.00 47.00 46.00 45.00] °C for 480.0 second/cycle (collects x1-m4)\n",
       "  7. Stage with 6 cycles (total duration 60m) of [50.00 49.00 48.00 47.00 46.00 45.00] °C for 10 minute/cycle (collects x1-m4)\n",
       "  8. Stage with 6 cycles (total duration 60m) of [50.00 49.00 48.00 47.00 46.00 45.00] °C for 10 minute/cycle (collects x1-m4)\n",
       "\n",
       "Plate setup:\n",
       "\n",
       " - sample_A: ['A1']\n",
       " - sample_B: ['A2', 'A3']\n",
       "\n",
       "- Created: 2022-01-10 19:43:08.510604\n",
       "- Written by: QSLib 0.5.0.post1.dev5+g6c3de52.d20220111\n",
       "- Read by: QSLib 0.5.0.post1.dev5+g6c3de52.d20220111\n"
      ],
      "text/plain": [
       "<qslib.experiment.Experiment at 0x7f49a006e440>"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "exp"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "1264fe69-f63b-408e-9eed-19bdf623f230",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "RunStatus(name='-', stage=-1, num_stages=-1, cycle=-1, num_cycles=-1, step=-1, point=0, state='Idle')"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "Machine(\"example-machine\").run_status()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "020c54ea-a3ed-447a-b1b1-dc3d2e37c43c",
   "metadata": {},
   "outputs": [],
   "source": [
    "exp.run(\"example-machine\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "60a96869-5620-4687-a03d-3912dcdbeb37",
   "metadata": {},
   "outputs": [],
   "source": [
    "exp.sync_from_machine()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "f36b79bf-758b-4258-8d29-547d7c29bcf8",
   "metadata": {},
   "outputs": [],
   "source": [
    "exp.abort()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "9628f48a-a5f9-4db3-a5f5-df691b89970c",
   "metadata": {},
   "outputs": [],
   "source": [
    "Machine(\"example-machine\").list_runs_in_storage()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "fcc8306b-7dd6-4f88-83c2-40e7d0c9af2e",
   "metadata": {},
   "outputs": [],
   "source": [
    "done_exp = Experiment.from_machine(\"qpcr1\", \"a-run-name\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "5d681572-9e06-44ba-9302-22aa3a62293f",
   "metadata": {},
   "source": [
    "Or"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "2dd39b2f-6678-48a1-9604-bce805c8b409",
   "metadata": {},
   "outputs": [],
   "source": [
    "done_exp = Experiment.from_file(\"file_name.eds\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "f446e76d-a86a-4c25-b591-dd2a8d7a9c4a",
   "metadata": {},
   "outputs": [],
   "source": [
    "done_exp.plot_protocol()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "1d54c29f-8956-42c0-af55-4a4a6bdfcc1a",
   "metadata": {},
   "outputs": [],
   "source": [
    "done_exp.plot_anneal_melt()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "10c54f29-ada5-481d-8034-7a85280f3928",
   "metadata": {},
   "outputs": [],
   "source": [
    "done_exp.plot_over_time()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "6875a9eb-e494-4c5a-bd13-7224fcc2f3be",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "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.10.1"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}