{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "*This notebook contains material from [cbe30338-2021](https://jckantor.github.io/cbe30338-2021);\n", "content is available [on Github](https://github.com/jckantor/cbe30338-2021.git).*\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "< [3.1 Case Study: Thermal Cycling for PCR](https://jckantor.github.io/cbe30338-2021/03.01-Case-Study-Thermal-Cycling-PCR.html) | [Contents](toc.html) | [Tag Index](tag_index.html) | [3.3 Relay Control](https://jckantor.github.io/cbe30338-2021/03.03-Relay-Control.html) >

\"Open

\"Download\"" ] }, { "cell_type": "markdown", "metadata": { "nbpages": { "level": 1, "link": "[3.2 Setpoints](https://jckantor.github.io/cbe30338-2021/03.02-Setpoints.html#3.2-Setpoints)", "section": "3.2 Setpoints" } }, "source": [ "# 3.2 Setpoints\n", "\n", "Setpoints are functions of time that establish target values for key control variables. This notebook describes typical nomenclature used in describing setpoint functions, and shows how to creatd setpoint functions in Python." ] }, { "cell_type": "markdown", "metadata": { "nbpages": { "level": 2, "link": "[3.2.1 Setpoint profiles](https://jckantor.github.io/cbe30338-2021/03.02-Setpoints.html#3.2.1-Setpoint-profiles)", "section": "3.2.1 Setpoint profiles" } }, "source": [ "## 3.2.1 Setpoint profiles\n", "\n", "Example descriptions from commercial vendors:\n", "\n", "* [West Control Solutions: Understanding Setpoint Ramping and Ramp/Soak Temperature Control](https://www.west-cs.com/news/understanding-setpoint-ramping-and-rampsoak-temperature-control/)\n", "* [Eurotherm: Ramp and Soak Applications](https://www.eurotherm.com/us/temperature-control-applications-us/ramp-and-soak-applications/)\n", "* [Allen-Bradley: Introduction to the Allen Bradley Ramp/Soak Controller](https://control.com/technical-articles/Introduction-to-the-Allen-Bradley-Ramp-Soak-Controller-System/)\n", "* [Wikipedia: Thermal Profiling](https://en.wikipedia.org/wiki/Thermal_profiling)\n", "\n", "Common descriptions for setpoint functions include so-called **step** changes, and **ramp** and **soak** periods.\n", "\n", "* A **step** change is an discontinuous change in setpoint value occuring as specified point in time. An example is specifying a setpoint change from 45 deg C to 65 deg C at a specified point in time.\n", "* A **soak** (or **dwell**) is a specified period of time over which the setpoint is held a constant, specified value.\n", "* A **ramp** is a specified period of time over which the setpoint changes at a constant rate from a specified starting value to a specified final value.\n", "* The **ramp rate** is the rate of change in a setpoint ramp. These may have positive or negative values." ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "nbpages": { "level": 2, "link": "[3.2.1 Setpoint profiles](https://jckantor.github.io/cbe30338-2021/03.02-Setpoints.html#3.2.1-Setpoint-profiles)", "section": "3.2.1 Setpoint profiles" } }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "

" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "%matplotlib inline\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "\n", "# specify a setpoint profile\n", "profile = [\n", " (0, 25),\n", " (50, 35),\n", " (120, 35),\n", " (120, 40),\n", " (170, 50),\n", " (170, 50),\n", " (270, 50),\n", " (370, 40),\n", " (450, 40),\n", " (600, 25),\n", "]\n", "\n", "# convert to numpy array to provide simple access to columns\n", "profile = np.array(profile)\n", "\n", "# create an annotated plot\n", "fig, ax = plt.subplots(1, 1, figsize=(10, 5))\n", "ax.plot(profile[:, 0], profile[:, 1], lw=4)\n", "ax.annotate(\"Step\", xy=(120, 37.5), xytext=(180, 37.5), fontsize=20, \n", " va=\"center\", arrowprops=dict(facecolor='black', shrink=0.05))\n", "ax.annotate(\"Ramp\", xy=(320, 45), xytext=(380, 48), fontsize=20, \n", " va=\"center\", arrowprops=dict(facecolor='black', shrink=0.05))\n", "ax.annotate(\"Soak/Dwell\", xy=(210, 50), xytext=(210, 55), fontsize=20, \n", " ha=\"center\", arrowprops=dict(facecolor='black', shrink=0.05))\n", "ax.set_ylim(25, 60)\n", "ax.set_title(\"Sample Setpoint Profile\")\n", "ax.set_xlabel(\"Time\")\n", "ax.grid(True)" ] }, { "cell_type": "markdown", "metadata": { "nbpages": { "level": 2, "link": "[3.2.1 Setpoint profiles](https://jckantor.github.io/cbe30338-2021/03.02-Setpoints.html#3.2.1-Setpoint-profiles)", "section": "3.2.1 Setpoint profiles" } }, "source": [ "
\n", "\n", "**Study Question:** Classify all of the segments in the sample setpoint profile.\n", "\n", "**Study Question:** What is the ramp rate of the first ramp in the example above.\n", "\n", "**Study Question:** Modify the data in the above example to remove the step. Replace it with a single raamp from the initial condition to the soak period that begins at t=170 at a temperature of 170C.\n", "\n", "
" ] }, { "cell_type": "markdown", "metadata": { "nbpages": { "level": 2, "link": "[3.2.2 Creating setpoint functions](https://jckantor.github.io/cbe30338-2021/03.02-Setpoints.html#3.2.2-Creating-setpoint-functions)", "section": "3.2.2 Creating setpoint functions" } }, "source": [ "## 3.2.2 Creating setpoint functions\n", "\n", "For feedback control we would like functions that return the value of a setpoint for any point in time. Functions are in the form $SP_1(t)$ and $SP_2(t)$, for example, are straightfoward to use inside in control applications. \n", "\n", "In the section we show how to write a function that accepts points defining a piecewise linear setpoint profile, then produce a function to compute the setpoint for any point in time." ] }, { "cell_type": "markdown", "metadata": { "nbpages": { "level": 3, "link": "[3.2.2.1 Specifying piecewise linear setpoint profiles](https://jckantor.github.io/cbe30338-2021/03.02-Setpoints.html#3.2.2.1-Specifying-piecewise-linear-setpoint-profiles)", "section": "3.2.2.1 Specifying piecewise linear setpoint profiles" } }, "source": [ "### 3.2.2.1 Specifying piecewise linear setpoint profiles\n", "\n", "Describiing the setpoint as a series of a step/ramp/soak periods naturally leads a piecewise linear function. The start and end of each line segment are spceified by (time, value) pairs. Ordering these points into a list provides a straightforward specification of the setpoint, \n", "\n", "Here we show the points for a typical setpoint." ] }, { "cell_type": "code", "execution_count": 21, "metadata": { "nbpages": { "level": 3, "link": "[3.2.2.1 Specifying piecewise linear setpoint profiles](https://jckantor.github.io/cbe30338-2021/03.02-Setpoints.html#3.2.2.1-Specifying-piecewise-linear-setpoint-profiles)", "section": "3.2.2.1 Specifying piecewise linear setpoint profiles" } }, "outputs": [ { "data": { "text/plain": [ "[]" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "%matplotlib inline\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "\n", "profile = [\n", " (0, 25),\n", " (50, 35),\n", " (120, 35),\n", " (120, 40),\n", " (170, 50),\n", " (170, 50),\n", " (270, 50),\n", " (370, 40),\n", " (450, 40),\n", " (600, 25),\n", "]\n", "\n", "t = [t for t, _ in profile]\n", "y = [y for _, y in profile]\n", "\n", "fig, ax = plt.subplots(1, 1)\n", "ax.plot(t, y, '.', ms=10)" ] }, { "cell_type": "markdown", "metadata": { "nbpages": { "level": 3, "link": "[3.2.2.2 A functon to create functions](https://jckantor.github.io/cbe30338-2021/03.02-Setpoints.html#3.2.2.2-A-functon-to-create-functions)", "section": "3.2.2.2 A functon to create functions" } }, "source": [ "### 3.2.2.2 A functon to create functions\n", "\n", "Python functions are frequently written to accept data, perform calculations, and return values. What may be less familiar is that functions can also return function. This is just what we neeed - a function that accepts a series of (time, value) pairs describing a setpoint profile, then returns a function that can be used to find values of the setpoint at any point in time." ] }, { "cell_type": "code", "execution_count": 22, "metadata": { "nbpages": { "level": 3, "link": "[3.2.2.2 A functon to create functions](https://jckantor.github.io/cbe30338-2021/03.02-Setpoints.html#3.2.2.2-A-functon-to-create-functions)", "section": "3.2.2.2 A functon to create functions" } }, "outputs": [], "source": [ "def create_setpoint_function(profile):\n", " \n", " profile = np.array(profile)\n", " ti = profile[:, 0]\n", " yi = profile[:, 1]\n", " \n", " # define a function to interpolate time and values\n", " def setpoint_function(t):\n", " return np.interp(t, ti, yi)\n", " \n", " # return that function\n", " return setpoint_function" ] }, { "cell_type": "markdown", "metadata": { "nbpages": { "level": 3, "link": "[3.2.2.3 Example of a setpoint function](https://jckantor.github.io/cbe30338-2021/03.02-Setpoints.html#3.2.2.3-Example-of-a-setpoint-function)", "section": "3.2.2.3 Example of a setpoint function" } }, "source": [ "### 3.2.2.3 Example of a setpoint function\n", "\n", "The following example creates a setpoint function that produces setpoints corresponding the profile described in the introduction to this notebook." ] }, { "cell_type": "code", "execution_count": 23, "metadata": { "nbpages": { "level": 3, "link": "[3.2.2.3 Example of a setpoint function](https://jckantor.github.io/cbe30338-2021/03.02-Setpoints.html#3.2.2.3-Example-of-a-setpoint-function)", "section": "3.2.2.3 Example of a setpoint function" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "at time = 100 setpoint = 35.0\n" ] } ], "source": [ "sp = create_setpoint_function(profile)\n", "\n", "# print select values\n", "t = 100\n", "print(f\"at time = {t:3d} setpoint = {sp(t)}\")" ] }, { "cell_type": "markdown", "metadata": { "nbpages": { "level": 3, "link": "[3.2.2.3 Example of a setpoint function](https://jckantor.github.io/cbe30338-2021/03.02-Setpoints.html#3.2.2.3-Example-of-a-setpoint-function)", "section": "3.2.2.3 Example of a setpoint function" } }, "source": [ "We can use the setpoint function to create plots." ] }, { "cell_type": "code", "execution_count": 24, "metadata": { "nbpages": { "level": 3, "link": "[3.2.2.3 Example of a setpoint function](https://jckantor.github.io/cbe30338-2021/03.02-Setpoints.html#3.2.2.3-Example-of-a-setpoint-function)", "section": "3.2.2.3 Example of a setpoint function" } }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# compute setpoint values\n", "t = np.linspace(0, 600, 600)\n", "y = sp(t)\n", "\n", "# create a plot\n", "fix, ax = plt.subplots(1, 1, figsize=(10, 5))\n", "ax.plot(t, y)\n", "ax.set_xlabel(\"time / seconds\")\n", "ax.set_title(\"setpoint function\")\n", "ax.grid(True)" ] }, { "cell_type": "markdown", "metadata": { "nbpages": { "level": 3, "link": "[3.2.2.4 Creating multiple setpoint functions ](https://jckantor.github.io/cbe30338-2021/03.02-Setpoints.html#3.2.2.4-Creating-multiple-setpoint-functions)", "section": "3.2.2.4 Creating multiple setpoint functions " } }, "source": [ "### 3.2.2.4 Creating multiple setpoint functions \n", "\n", "The next cell demonstrates the use of `create_setpoint_function` to create multiple independent setpoint functions." ] }, { "cell_type": "code", "execution_count": 25, "metadata": { "nbpages": { "level": 3, "link": "[3.2.2.4 Creating multiple setpoint functions ](https://jckantor.github.io/cbe30338-2021/03.02-Setpoints.html#3.2.2.4-Creating-multiple-setpoint-functions)", "section": "3.2.2.4 Creating multiple setpoint functions " } }, "outputs": [ { "data": { "text/plain": [ "[]" ] }, "execution_count": 25, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "T_amb = 21.0\n", "\n", "sp_1 = create_setpoint_function([[0, T_amb], [20, T_amb], [60, 50], [100, 50], [140, T_amb]])\n", "sp_2 = create_setpoint_function([[0, T_amb], [0, 45], [120, 35], [200, T_amb]])\n", "\n", "# create plot axes\n", "fig, ax = plt.subplots(2, 1)\n", "\n", "# plot setpoint functions\n", "t = np.linspace(-1, 250, 250)\n", "ax[0].plot(t, sp_1(t))\n", "ax[1].plot(t, sp_2(t))" ] }, { "cell_type": "markdown", "metadata": { "nbpages": { "level": 2, "link": "[3.2.3 Case Study: PCR Thermal Cycler Protocols](https://jckantor.github.io/cbe30338-2021/03.02-Setpoints.html#3.2.3-Case-Study:-PCR-Thermal-Cycler-Protocols)", "section": "3.2.3 Case Study: PCR Thermal Cycler Protocols" } }, "source": [ "## 3.2.3 Case Study: PCR Thermal Cycler Protocols\n", "\n", "The goal of this next section is to create a function that returns the value of a setpoint profile for a PCR thermal cycler. We'll break this into a series of steps:\n", "\n", "* Specify a PCR protocol\n", "* Convert the PCR protocol in a sequence of ramp and soak periods\n", "* Create a function that returns the value of setpoint at any point in time\n", "* Create a function that returns a setpoint function." ] }, { "cell_type": "markdown", "metadata": { "colab": {}, "colab_type": "code", "id": "rGhvoGiONmjt", "nbpages": { "level": 3, "link": "[3.2.3.1 Typcial PCR thermal cycler protocols](https://jckantor.github.io/cbe30338-2021/03.02-Setpoints.html#3.2.3.1-Typcial-PCR-thermal-cycler-protocols)", "section": "3.2.3.1 Typcial PCR thermal cycler protocols" } }, "source": [ "### 3.2.3.1 Typcial PCR thermal cycler protocols\n", "\n", "Here's an example of a PCR thermal cycler protocol:\n", "\n", "* Activation of polymerase: 95°C, 15 min\n", "* Thermal cycling: 30 cycles\n", " * Denaturation: 94°C, 20 s\n", " * Annealing: 60°C, 20 s\n", " * Elongation: 72°C, 30 s\n", "* Extension: 72°C, 10 min\n", "* Storage: 4°C, as necessary\n", "\n", "The details of these protocols vary depending on the nature of the test, the reagents used, and the type of detection that will be employed. In real-time PCR, the number of cycling steps will end once a positive result is obtained." ] }, { "cell_type": "markdown", "metadata": { "nbpages": { "level": 3, "link": "[3.2.3.2 Representing PCR protocols in Python](https://jckantor.github.io/cbe30338-2021/03.02-Setpoints.html#3.2.3.2-Representing-PCR-protocols-in-Python)", "section": "3.2.3.2 Representing PCR protocols in Python" } }, "source": [ "### 3.2.3.2 Representing PCR protocols in Python\n", "\n", "The PCR protocol is a series of (time, temperature) pairs. The code in the next cell represents a protocol as a sequence of (time, temperature) pairs in a Python list. The list is constructed by concatenating subprotocols denoting the activation, cycling and extension steps in a PCR protocol" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "nbpages": { "level": 3, "link": "[3.2.3.2 Representing PCR protocols in Python](https://jckantor.github.io/cbe30338-2021/03.02-Setpoints.html#3.2.3.2-Representing-PCR-protocols-in-Python)", "section": "3.2.3.2 Representing PCR protocols in Python" } }, "outputs": [ { "data": { "text/plain": [ "array([[900, 95],\n", " [ 20, 94],\n", " [ 20, 60],\n", " [ 30, 72],\n", " [ 20, 94],\n", " [ 20, 60],\n", " [ 30, 72],\n", " [ 20, 94],\n", " [ 20, 60],\n", " [ 30, 72],\n", " [ 20, 94],\n", " [ 20, 60],\n", " [ 30, 72],\n", " [ 20, 94],\n", " [ 20, 60],\n", " [ 30, 72],\n", " [600, 72],\n", " [ 0, 30]])" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "%matplotlib inline\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "\n", "# number of cycles\n", "n_cycles = 5\n", "\n", "# enter steps in the protocol as a list of (time, temperature) pairs\n", "activation = [(900, 95)]\n", "cycling = [(20, 94), (20, 60), (30, 72)]*n_cycles\n", "extension = [(600, 72)]\n", "finish = [[0, 30]]\n", "\n", "# concatenate into a list of (time, temperature) intervals\n", "protocol = np.concatenate([activation, cycling, extension, finish])\n", "protocol" ] }, { "cell_type": "markdown", "metadata": { "nbpages": { "level": 3, "link": "[3.2.3.3 Converting to ramp, soak specifications](https://jckantor.github.io/cbe30338-2021/03.02-Setpoints.html#3.2.3.3-Converting-to-ramp,-soak-specifications)", "section": "3.2.3.3 Converting to ramp, soak specifications" } }, "source": [ "### 3.2.3.3 Converting to ramp, soak specifications\n", "\n", "Each step in a PCR protocol consists of an initial ramp to the specified temperature, followed by a soak for the specified time and temperature. We begin the coding by demonstrating how to interpret the protocol specification as a series of ramp and soak periods." ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "nbpages": { "level": 3, "link": "[3.2.3.3 Converting to ramp, soak specifications](https://jckantor.github.io/cbe30338-2021/03.02-Setpoints.html#3.2.3.3-Converting-to-ramp,-soak-specifications)", "section": "3.2.3.3 Converting to ramp, soak specifications" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Ramp to 95C\n", "Soak at 95C for 900 seconds.\n", "Ramp to 94C\n", "Soak at 94C for 20 seconds.\n", "Ramp to 60C\n", "Soak at 60C for 20 seconds.\n", "Ramp to 72C\n", "Soak at 72C for 30 seconds.\n", "Ramp to 94C\n", "Soak at 94C for 20 seconds.\n", "Ramp to 60C\n", "Soak at 60C for 20 seconds.\n", "Ramp to 72C\n", "Soak at 72C for 30 seconds.\n", "Ramp to 94C\n", "Soak at 94C for 20 seconds.\n", "Ramp to 60C\n", "Soak at 60C for 20 seconds.\n", "Ramp to 72C\n", "Soak at 72C for 30 seconds.\n", "Ramp to 94C\n", "Soak at 94C for 20 seconds.\n", "Ramp to 60C\n", "Soak at 60C for 20 seconds.\n", "Ramp to 72C\n", "Soak at 72C for 30 seconds.\n", "Ramp to 94C\n", "Soak at 94C for 20 seconds.\n", "Ramp to 60C\n", "Soak at 60C for 20 seconds.\n", "Ramp to 72C\n", "Soak at 72C for 30 seconds.\n", "Ramp to 72C\n", "Soak at 72C for 600 seconds.\n", "Ramp to 30C\n", "Soak at 30C for 0 seconds.\n" ] } ], "source": [ "# each soak period is preceeded by a ramp\n", "for time, temp in protocol:\n", " print(f\"Ramp to {temp}C\")\n", " print(f\"Soak at {temp}C for {time:3d} seconds.\" )" ] }, { "cell_type": "markdown", "metadata": { "nbpages": { "level": 3, "link": "[3.2.3.3 Converting to ramp, soak specifications](https://jckantor.github.io/cbe30338-2021/03.02-Setpoints.html#3.2.3.3-Converting-to-ramp,-soak-specifications)", "section": "3.2.3.3 Converting to ramp, soak specifications" } }, "source": [ "The next step is to introduce a ramp rate and add variables to track the start time and temperature for each segment. We will assume all ramp rates have the same absolute value." ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "nbpages": { "level": 3, "link": "[3.2.3.3 Converting to ramp, soak specifications](https://jckantor.github.io/cbe30338-2021/03.02-Setpoints.html#3.2.3.3-Converting-to-ramp,-soak-specifications)", "section": "3.2.3.3 Converting to ramp, soak specifications" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Time = 0.0: Ramp to 95C\n", "Time - 29.6: Soak at 95C for 900 seconds\n", "Time = 929.6: Ramp to 94C\n", "Time - 930.0: Soak at 94C for 20 seconds\n", "Time = 950.0: Ramp to 60C\n", "Time - 963.6: Soak at 60C for 20 seconds\n", "Time = 983.6: Ramp to 72C\n", "Time - 988.4: Soak at 72C for 30 seconds\n", "Time = 1018.4: Ramp to 94C\n", "Time - 1027.2: Soak at 94C for 20 seconds\n", "Time = 1047.2: Ramp to 60C\n", "Time - 1060.8: Soak at 60C for 20 seconds\n", "Time = 1080.8: Ramp to 72C\n", "Time - 1085.6: Soak at 72C for 30 seconds\n", "Time = 1115.6: Ramp to 94C\n", "Time - 1124.4: Soak at 94C for 20 seconds\n", "Time = 1144.4: Ramp to 60C\n", "Time - 1158.0: Soak at 60C for 20 seconds\n", "Time = 1178.0: Ramp to 72C\n", "Time - 1182.8: Soak at 72C for 30 seconds\n", "Time = 1212.8: Ramp to 94C\n", "Time - 1221.6: Soak at 94C for 20 seconds\n", "Time = 1241.6: Ramp to 60C\n", "Time - 1255.2: Soak at 60C for 20 seconds\n", "Time = 1275.2: Ramp to 72C\n", "Time - 1280.0: Soak at 72C for 30 seconds\n", "Time = 1310.0: Ramp to 94C\n", "Time - 1318.8: Soak at 94C for 20 seconds\n", "Time = 1338.8: Ramp to 60C\n", "Time - 1352.4: Soak at 60C for 20 seconds\n", "Time = 1372.4: Ramp to 72C\n", "Time - 1377.2: Soak at 72C for 30 seconds\n", "Time = 1407.2: Ramp to 72C\n", "Time - 1407.2: Soak at 72C for 600 seconds\n", "Time = 2007.2: Ramp to 30C\n", "Time - 2024.0: Soak at 30C for 0 seconds\n" ] } ], "source": [ "# add varibles to track current time and temperature\n", "# ramp period is determined by a \"ramp_rate\"\n", "ramp_rate = 2.5\n", "time_now = 0.0\n", "temp_now = 21.0\n", "\n", "for time, temp in protocol:\n", " print(f\"Time = {time_now:6.1f}: Ramp to {temp}C\")\n", " time_now += np.abs((temp - temp_now)/ramp_rate) \n", " temp_now = temp\n", " print(f\"Time - {time_now:6.1f}: Soak at {temp}C for {time} seconds\")\n", " time_now += time" ] }, { "cell_type": "markdown", "metadata": { "nbpages": { "level": 3, "link": "[3.2.3.4 Finding the start and finish of each segment](https://jckantor.github.io/cbe30338-2021/03.02-Setpoints.html#3.2.3.4-Finding-the-start-and-finish-of-each-segment)", "section": "3.2.3.4 Finding the start and finish of each segment" } }, "source": [ "### 3.2.3.4 Finding the start and finish of each segment\n", "\n", "Finally, we create a two column numpy array representing the setpoint profile. The first row in the array is the starting time and temperature. Each subsequent row constains the ending time and temperature of a segment." ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "nbpages": { "level": 3, "link": "[3.2.3.4 Finding the start and finish of each segment](https://jckantor.github.io/cbe30338-2021/03.02-Setpoints.html#3.2.3.4-Finding-the-start-and-finish-of-each-segment)", "section": "3.2.3.4 Finding the start and finish of each segment" } }, "outputs": [ { "data": { "text/plain": [ "array([[ 0., 21.],\n", " [ 148., 95.],\n", " [1048., 95.],\n", " [1050., 94.],\n", " [1070., 94.],\n", " [1138., 60.],\n", " [1158., 60.],\n", " [1182., 72.],\n", " [1212., 72.],\n", " [1256., 94.],\n", " [1276., 94.],\n", " [1344., 60.],\n", " [1364., 60.],\n", " [1388., 72.],\n", " [1418., 72.],\n", " [1462., 94.],\n", " [1482., 94.],\n", " [1550., 60.],\n", " [1570., 60.],\n", " [1594., 72.],\n", " [1624., 72.],\n", " [1668., 94.],\n", " [1688., 94.],\n", " [1756., 60.],\n", " [1776., 60.],\n", " [1800., 72.],\n", " [1830., 72.],\n", " [1874., 94.],\n", " [1894., 94.],\n", " [1962., 60.],\n", " [1982., 60.],\n", " [2006., 72.],\n", " [2036., 72.],\n", " [2036., 72.],\n", " [2636., 72.],\n", " [2720., 30.],\n", " [2720., 30.]])" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# store the data in a list of time, temperature pairs marking the end of each period\n", "\n", "ramp_rate = 0.5 # deg/sec\n", "time_now = 0.0\n", "temp_now = 21.0\n", "\n", "# intialze a list with the starting time and temperature\n", "SP_list = [[time_now, temp_now]]\n", "\n", "# append the ending time and temperature to the list\n", "for time, temp in protocol:\n", " # ramp\n", " time_now += np.abs((temp - temp_now)/ramp_rate) \n", " temp_now = temp\n", " SP_list.append([time_now, temp_now])\n", "\n", " # soak\n", " time_now += time\n", " SP_list.append([time_now, temp_now])\n", "\n", "# convert list to numpy array to access columns\n", "SP_array = np.array(SP_list)\n", "SP_array" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "nbpages": { "level": 3, "link": "[3.2.3.4 Finding the start and finish of each segment](https://jckantor.github.io/cbe30338-2021/03.02-Setpoints.html#3.2.3.4-Finding-the-start-and-finish-of-each-segment)", "section": "3.2.3.4 Finding the start and finish of each segment" } }, "outputs": [ { "data": { "text/plain": [ "[]" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "fig, ax = plt.subplots(1, 1, figsize=(12, 5))\n", "ax.plot(SP_array[:,0], SP_array[:,1], '.')" ] }, { "cell_type": "markdown", "metadata": { "nbpages": { "level": 3, "link": "[3.2.3.5 Finding the setpoint function by interpolating the start and end of each segment](https://jckantor.github.io/cbe30338-2021/03.02-Setpoints.html#3.2.3.5-Finding-the-setpoint-function-by-interpolating-the-start-and-end-of-each-segment)", "section": "3.2.3.5 Finding the setpoint function by interpolating the start and end of each segment" } }, "source": [ "### 3.2.3.5 Finding the setpoint function by interpolating the start and end of each segment\n", "\n", "To implement control algorithms we will need to find values of the setpoint function at arbitrary points in time, not just at the start and finish of ramp or soak periods. The standard numpy library includes a linear interpolation function [`numpy.interp`](https://numpy.org/doc/stable/reference/generated/numpy.interp.html) well suited to this purpose." ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "nbpages": { "level": 3, "link": "[3.2.3.5 Finding the setpoint function by interpolating the start and end of each segment](https://jckantor.github.io/cbe30338-2021/03.02-Setpoints.html#3.2.3.5-Finding-the-setpoint-function-by-interpolating-the-start-and-end-of-each-segment)", "section": "3.2.3.5 Finding the setpoint function by interpolating the start and end of each segment" } }, "outputs": [ { "data": { "text/plain": [ "Text(0.5, 1.0, 'Setpoint function')" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# create function to interpolate\n", "\n", "def SP(t):\n", " return np.interp(t, SP_array[:,0], SP_array[:, 1])\n", "\n", "# plotting the setpoint function\n", "t = np.linspace(-100, max(SP_array[:,0]), 2000)\n", "fig, ax = plt.subplots(1, 1, figsize=(12,5))\n", "ax.plot(t, SP(t))\n", "ax.set_title(\"Setpoint function\")" ] }, { "cell_type": "markdown", "metadata": { "nbpages": { "level": 3, "link": "[3.2.3.6 Creating a setpoint function for PCR thermal cycler](https://jckantor.github.io/cbe30338-2021/03.02-Setpoints.html#3.2.3.6-Creating-a-setpoint-function-for-PCR-thermal-cycler)", "section": "3.2.3.6 Creating a setpoint function for PCR thermal cycler" } }, "source": [ "### 3.2.3.6 Creating a setpoint function for PCR thermal cycler\n", "\n", "The last step is to put all of these steps together to create a function that generates a setpoint function. This is an example of a very powerful coding technique of [nested functions](https://realpython.com/inner-functions-what-are-they-good-for/)." ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "nbpages": { "level": 3, "link": "[3.2.3.6 Creating a setpoint function for PCR thermal cycler](https://jckantor.github.io/cbe30338-2021/03.02-Setpoints.html#3.2.3.6-Creating-a-setpoint-function-for-PCR-thermal-cycler)", "section": "3.2.3.6 Creating a setpoint function for PCR thermal cycler" } }, "outputs": [ { "data": { "text/plain": [ "Text(0.5, 1.0, 'Setpoint function')" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# create the setpoint function from a specified PCR \n", "def PCR_setpoint(protocol):\n", " \n", " ramp_rate = 0.5 # deg/sec\n", " time_now = 0.0\n", " temp_now = 21.0\n", "\n", " # intialze a list with the starting time and temperature\n", " SP_list = [[time_now, temp_now]]\n", "\n", " # append the ending time and temperature to the list\n", " for time, temp in protocol:\n", " # ramp\n", " time_now += np.abs((temp - temp_now)/ramp_rate) \n", " temp_now = temp\n", " SP_list.append([time_now, temp_now])\n", "\n", " # soak\n", " time_now += time\n", " SP_list.append([time_now, temp_now])\n", "\n", " # convert list to numpy array to access columns\n", " SP_array = np.array(SP_list)\n", " \n", " def SP(t):\n", " return np.interp(t, SP_array[:,0], SP_array[:, 1])\n", "\n", " return SP\n", "\n", "# create a setpoint function\n", "setpoint = PCR_setpoint(protocol)\n", "\n", "# plotting the setpoint function\n", "t = np.linspace(0, 3000, 3000)\n", "fig, ax = plt.subplots(1, 1, figsize=(12,5))\n", "ax.plot(t, setpoint(t))\n", "ax.set_title(\"Setpoint function\")" ] }, { "cell_type": "markdown", "metadata": { "nbpages": { "level": 3, "link": "[3.2.3.6 Creating a setpoint function for PCR thermal cycler](https://jckantor.github.io/cbe30338-2021/03.02-Setpoints.html#3.2.3.6-Creating-a-setpoint-function-for-PCR-thermal-cycler)", "section": "3.2.3.6 Creating a setpoint function for PCR thermal cycler" } }, "source": [ "
\n", "\n", "**Study Question:** Change the protocol to include 30 thermal cycles, then create the setpoint function with `PCR_setpoint()` and plot the results.\n", "\n", "**Study Question:** To better reflect the unequal heating and cooling rates available in most PCR devices, modify `PCR_setpoint()` to provide differing ramp rates for positive going and negative going ramps. Demonstrate the result using a postive ramp_rate of 2.5 degC/sec and a negative ramp_rate of -0.5 degC/sec.\n", "\n", "
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "< [3.1 Case Study: Thermal Cycling for PCR](https://jckantor.github.io/cbe30338-2021/03.01-Case-Study-Thermal-Cycling-PCR.html) | [Contents](toc.html) | [Tag Index](tag_index.html) | [3.3 Relay Control](https://jckantor.github.io/cbe30338-2021/03.03-Relay-Control.html) >

\"Open

\"Download\"" ] } ], "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": 4 }