Thermal shift assay#

Introduction#


In a Thermal Shift Assay (TSA), we use a protein-binding dye, such as SYPRO® Orange (Molecular Probes), and a real-time PCR system, such as the LightCycler® 480 Instrument II (Roche), to measure a protein melting curve (i.e. a fluorescence versus temperature plot). Basically, when the protein unfolds due to an increase in temperature, the dye binds to its exposed hydrophobic residues. This results in an increase in fluorescence. A typical result is shown below:

Principle behind thermal shift assay

These melting curves can be used to calculate the protein’s melting temperature, i.e. \(T_m\), for each test buffer. Changes in \(T_m\) are related to changes in protein stability.

This notebook shows you how to analyze protein melting curves generated by the LightCycler® 480 Instrument II using Python.

Data#


Get the data needed for this exercise here.

The data we will analyze are from an optimization run to determine the optimal protein and dye concentrations for the TSA.

  • Protein: T4 Lysozyme WT* (i.e. C54T/C97A)

  • Protein storage buffer: 50 mM sodium phosphate, 2 mM ethylenediamine tetra-acetic acid, 350 mM NaCl, pH 6.5

  • Dye: SYPRO® Orange (Thermo Scientific)

  • Assay buffer: 1 x PBS (Lonza), pH 7.41

  • Sample volume: 20 µl

  • Protein concentration: 8, 4, 2, and 1 µM

  • Dye concentration: 5, 6.67, 10 and 20 x

  • Data acquisition:

    • Excitation: 465nm

    • Emission: 580nm

    • Temperature: 20-85°C, in smooth ramp mode, rate of 0.06°C \(s^{-1}\)

  • Plate: LightCycler® 480 multi-well plate 96, white (Roche) with sealing foil

The fluorescence measured at 580 nm after excitation at 465 nm as a function of temperature (from 20 to 85°C) is in A1 to D4. The figure below explains the 96-well plate lay-out:

Plate set-up for the thermal shift assay

Import the libraries needed#


import numpy as np
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
import pandas as pd
from scipy.optimize import curve_fit
from scipy.ndimage import uniform_filter1d # to smoothen data, see the tip below
from scipy.signal import savgol_filter # to smoothen data, see the tip below

For well A1#


Read the data from the file and select well A1#

The data file contains a header with the experiment name, and 8 columns. We only read in columns 1, 2, 7 and 8, i.e. the sample position, the sample name, the temperature and the fluorescence signal. This is demonstrated in the figure below:

Principle behind thermal shift assay
df = pd.read_csv('../data/ThermalShiftAssay.txt', skiprows=1, sep='\t', usecols=[0, 1, 6, 7])
# We use pd.read_csv to read in the file and store the information in a new dataframe, i.e. df.
# We use skiprows=1 to skip the first row.
# We use sep='\t' to specify that we have a tab-delimited text format.
# We use usecols=[0, 1, 6, 7] to only read in columns 1, 2, 7, and 8.
print(df)
      SamplePos  SampleName   Temp  465-580
0            A1  T4L wt 8uM  20.01     6.94
1            A1  T4L wt 8uM  20.01     6.99
2            A1  T4L wt 8uM  20.16     6.97
3            A1  T4L wt 8uM  20.32     7.00
4            A1  T4L wt 8uM  20.40     6.96
...         ...         ...    ...      ...
61915       H12       Empty  84.47     4.32
61916       H12       Empty  84.59     4.35
61917       H12       Empty  84.67     4.34
61918       H12       Empty  84.76     4.35
61919       H12       Empty  84.88     4.33

[61920 rows x 4 columns]
dfa1 = df[df['SamplePos']=='A1']
# We select all rows that contain A1 as sample position and store them in a new dataframe, i.e. dfa1.
print(dfa1)
    SamplePos  SampleName   Temp  465-580
0          A1  T4L wt 8uM  20.01     6.94
1          A1  T4L wt 8uM  20.01     6.99
2          A1  T4L wt 8uM  20.16     6.97
3          A1  T4L wt 8uM  20.32     7.00
4          A1  T4L wt 8uM  20.40     6.96
..        ...         ...    ...      ...
640        A1  T4L wt 8uM  84.47    78.21
641        A1  T4L wt 8uM  84.59    77.87
642        A1  T4L wt 8uM  84.67    77.57
643        A1  T4L wt 8uM  84.76    77.29
644        A1  T4L wt 8uM  84.88    76.92

[645 rows x 4 columns]

Plot “fluorescence (= \(y\)) versus temperature (= \(x\))” data from well A1#

We plot fluorescence versus temperature. We need to convert the temperature from °C to °K.

xdfa1=dfa1['Temp'] + 273.15
# We select the temperature = x and convert it from °C to °K, the result is stored in a new dataframe, i.e. xdfa1.

ydfa1=dfa1['465-580']
# We select the fluorescence signal = y, the result is stored in a new dataframe, i.e. ydfa1.

# We now plot the graph "fluorescence signal" versus "temperature".
plt.figure(figsize=(7,5))
plt.plot(xdfa1, ydfa1, 'o', color='gray', markersize=8)
plt.title('Thermal Shift Assay', fontsize=18)
plt.xlabel('T (°K)', fontsize=14)
plt.ylabel('Fluorescence (AU)', fontsize=14)
plt.show()
../_images/6c7bc8e3a7a43474647de222457b1ca69f8c430b426ac3e6a436e80274abaa54.png

We see the typical sigmoidal transition.

There are multiple ways to extract \(T_m\) (= the midpoint of the transition = the inflection point of the sigmoidal curve):

  • The first derivative method

  • Curve-fitting methods. A sigmoidal function is used to fit the protein melting curve. Curve-fitting methods are known to be more robust and less sensitive to random noise than the first-derivative method. Multiple functions are used:

    • A Boltzmann model

    • The equation describing the unfolding of a monomer via a two-state mechanism

The difference between both methods is demonstrated in the figure below:

Analysing the thermal shift assay

Analysis: 1. First derivative method#

The first derivative of a function is the slope of the tangent line for any point on the function. It informs us when the function is increasing, decreasing, or constant.

A sigmoidal function has a bell-shaped first derivative. At the inflection point of the sigmoidal curve, the tangent has the steepest slope and the first derivative has its maximum.

The first-derivative method determines the midpoint of the transition (= the inflection point of the sigmoidal curve = \(T_m\)) by searching for the peak of the first-derivative curve.

In the following calculations, we work with Numpy arrays. To see why, try the following command and look at both outputs:

print(np.array(xdfa1))
print(xdfa1)
[293.16 293.16 293.31 293.47 293.55 293.69 293.84 293.92 294.08 294.08
 294.23 294.31 294.38 294.52 294.6  294.68 294.83 294.91 295.05 295.12
 295.19 295.34 295.41 295.49 295.56 295.7  295.84 295.91 295.98 296.05
 296.2  296.27 296.34 296.49 296.56 296.68 296.75 296.83 296.96 297.03
 297.18 297.24 297.31 297.44 297.51 297.58 297.71 297.78 297.92 298.05
 298.11 298.18 298.38 298.44 298.51 298.64 298.71 298.83 298.9  299.02
 299.16 299.22 299.35 299.48 299.55 299.6  299.79 299.92 299.98 300.1
 300.17 300.3  300.41 300.48 300.54 300.66 300.78 300.91 301.03 301.09
 301.2  301.32 301.45 301.51 301.63 301.68 301.8  301.92 302.03 302.1
 302.15 302.33 302.45 302.51 302.55 302.68 302.85 302.91 303.03 303.08
 303.2  303.36 303.47 303.59 303.59 303.7  303.81 303.92 304.02 304.14
 304.25 304.36 304.42 304.53 304.64 304.74 304.85 304.96 305.07 305.12
 305.28 305.39 305.45 305.54 305.65 305.76 305.87 305.92 306.02 306.13
 306.22 306.34 306.44 306.54 306.64 306.75 306.85 306.94 307.05 307.15
 307.25 307.36 307.46 307.56 307.62 307.71 307.85 307.96 308.06 308.16
 308.26 308.36 308.49 308.55 308.65 308.74 308.85 308.99 309.04 309.14
 309.23 309.32 309.47 309.56 309.66 309.76 309.85 309.98 310.08 310.17
 310.27 310.37 310.5  310.6  310.64 310.78 310.87 310.97 311.1  311.2
 311.29 311.37 311.47 311.6  311.69 311.79 311.88 311.96 312.06 312.14
 312.27 312.41 312.5  312.59 312.68 312.81 312.89 312.98 313.11 313.2
 313.29 313.37 313.47 313.59 313.67 313.81 313.89 313.98 314.11 314.2
 314.28 314.4  314.53 314.61 314.7  314.79 314.91 315.   315.12 315.2
 315.32 315.41 315.54 315.62 315.71 315.78 315.9  315.99 316.11 316.19
 316.32 316.4  316.48 316.64 316.72 316.84 316.92 317.   317.12 317.24
 317.32 317.44 317.51 317.64 317.76 317.83 317.92 318.03 318.14 318.23
 318.34 318.42 318.47 318.62 318.72 318.81 318.92 319.   319.16 319.23
 319.31 319.43 319.53 319.65 319.73 319.84 319.96 320.04 320.15 320.21
 320.33 320.44 320.52 320.67 320.74 320.83 320.93 321.04 321.15 321.26
 321.37 321.49 321.56 321.66 321.74 321.85 321.95 322.03 322.14 322.25
 322.37 322.46 322.57 322.64 322.75 322.87 322.97 323.04 323.15 323.25
 323.36 323.47 323.58 323.69 323.79 323.89 323.96 324.07 324.17 324.28
 324.35 324.49 324.57 324.66 324.77 324.87 324.98 325.08 325.19 325.26
 325.39 325.49 325.6  325.7  325.81 325.91 325.98 326.11 326.18 326.31
 326.39 326.49 326.59 326.7  326.79 326.92 327.02 327.13 327.19 327.33
 327.37 327.5  327.59 327.73 327.79 327.93 328.03 328.13 328.2  328.29
 328.39 328.49 328.59 328.72 328.79 328.92 329.02 329.11 329.21 329.31
 329.41 329.54 329.64 329.73 329.83 329.92 330.05 330.12 330.22 330.32
 330.41 330.51 330.6  330.73 330.83 330.93 331.02 331.12 331.22 331.3
 331.41 331.53 331.62 331.73 331.82 331.95 332.03 332.16 332.23 332.35
 332.42 332.54 332.64 332.73 332.85 332.95 333.05 333.14 333.23 333.32
 333.43 333.54 333.63 333.76 333.85 333.98 334.08 334.17 334.25 334.35
 334.44 334.56 334.66 334.75 334.87 334.96 335.06 335.18 335.24 335.34
 335.46 335.55 335.65 335.76 335.85 335.98 336.07 336.16 336.22 336.34
 336.45 336.55 336.67 336.76 336.86 336.98 337.04 337.16 337.25 337.36
 337.49 337.58 337.67 337.8  337.88 337.96 338.08 338.18 338.27 338.39
 338.45 338.57 338.68 338.78 338.89 338.98 339.08 339.2  339.28 339.4
 339.49 339.61 339.7  339.79 339.88 339.97 340.06 340.2  340.29 340.41
 340.5  340.59 340.68 340.8  340.88 341.   341.12 341.21 341.3  341.42
 341.51 341.59 341.7  341.8  341.92 342.   342.13 342.21 342.29 342.41
 342.53 342.62 342.71 342.83 342.91 343.03 343.11 343.23 343.32 343.44
 343.53 343.59 343.71 343.81 343.94 344.02 344.14 344.23 344.32 344.43
 344.49 344.6  344.75 344.84 344.93 345.07 345.14 345.24 345.33 345.42
 345.54 345.65 345.75 345.86 345.95 346.03 346.15 346.23 346.33 346.44
 346.53 346.65 346.72 346.84 346.96 347.05 347.16 347.23 347.37 347.45
 347.57 347.66 347.77 347.84 347.95 348.04 348.13 348.24 348.35 348.47
 348.56 348.67 348.77 348.88 348.96 349.05 349.17 349.28 349.4  349.46
 349.58 349.66 349.77 349.86 349.98 350.07 350.15 350.28 350.36 350.47
 350.59 350.68 350.76 350.86 350.97 351.1  351.17 351.29 351.4  351.5
 351.58 351.7  351.79 351.87 351.95 352.11 352.19 352.31 352.4  352.49
 352.57 352.66 352.8  352.93 353.01 353.13 353.22 353.31 353.42 353.51
 353.6  353.71 353.81 353.92 354.01 354.12 354.21 354.3  354.41 354.51
 354.6  354.71 354.8  354.91 355.03 355.1  355.21 355.3  355.4  355.51
 355.59 355.71 355.8  355.92 356.01 356.1  356.22 356.31 356.42 356.51
 356.63 356.72 356.81 356.94 357.01 357.13 357.2  357.32 357.43 357.53
 357.62 357.74 357.82 357.91 358.03]
0      293.16
1      293.16
2      293.31
3      293.47
4      293.55
        ...  
640    357.62
641    357.74
642    357.82
643    357.91
644    358.03
Name: Temp, Length: 645, dtype: float64

The essential difference is the presence of the index: while the Numpy array has an implicitly defined integer index used to access the values, the Pandas series has an explicitly defined index associated with the values.

To calculate the derivative of our fluorescence (= \(y\)) versus temperature (= \(x\)) data, we subtract two adjacent elements in \(y\), and divide by the difference in the two corresponding elements in \(x\). This is represented with the following formula:

\[ \frac{dy}{dx} = \frac{y_2 - y_1}{x_2 - x_1} . \]

Note that this approximated derivative has size \(n-1\) with \(n\) being our amount of data points.

We use the numpy.diff and numpy.divide functions.

outa1 = np.ones( (len(np.array(ydfa1)) -1) )
derya1 = np.divide(np.diff(np.array(ydfa1)), np.diff(np.array(xdfa1)), out=outa1, where=np.diff(np.array(xdfa1))!=0)
# The np.diff function calculates the n-th discrete difference. When n = 1 (default), np.diff calculates the difference between subsequent elements in our array, and returns an array that is one element shorter. 
# The np.divide function returns a division of the inputs. To prevent division by zero, we can take advantage of the "where" option.
# We pre-initialize the output 'outa1' that we will use when the "divide by zero encountered" error happens. The input of 'out=' needs to be an array.
# To create the array 'outa1', we use the np.ones function which returns an array of given shape (i.e. n-1 data points, the 'len()' function gives us n) and type, filled with ones.

derxa1 = (np.array(xdfa1)[:-1] + np.array(xdfa1)[1:]) / 2
# The derivative is of size n-1, and is evaluated at the midpoints. The x data for the derivative can be calculated via (all but the last elements of x (represented by x[:-1]) + all but the first element of x (represented by x[1:])) / 2.

# We now plot the graph "fluorescence signal" versus "temperature" and add the calculated first derivative to it.
plt.figure(figsize=(7,5))
plt.plot(xdfa1, ydfa1, color='gray')
plt.plot(derxa1, derya1, color='red')
plt.title('Thermal Shift Assay', fontsize=18)
plt.xlabel('T (°K)', fontsize=14)
plt.ylabel('Fluorescence (AU)', fontsize=14)
plt.show()
../_images/586a27c089b390dd25a8b719ba218afe82d536dfe6740a90a89054a54d9b6c59.png

Ok, but I want to pimp my graph by (1) using a secondary Y-axis and (2) smoothing the first derivative curve.

Tip: How to make a plot with a secondary Y-axis?#

A secondary Y-axis is a Y-axis drawn on the right-hand side of the graph. The primary Y-axis is on the left-hand side of the graph. You can use a secondary Y-axis with a different scale than the primary Y-axis to plot a series of data on a different scale. This lets you compare two series of data more easily on the same graph.

Use the matplotlib.pyplot.subplots and the matplotlib.axes.Axes.twinx functions to create a secondary Y-axis.

fig,ax = plt.subplots()
# create figure and axis objects with subplots()

ax.plot(xdfa1, ydfa1, color='gray')
# make a plot

ax.set_xlabel('T (°K)', fontsize=14)
ax.set_ylabel('Fluorescence (AU)',color="gray",fontsize=14)
# set x- and y-axis labels

ax2=ax.twinx()
# instantiate a second axes that shares the same x-axis

ax2.plot(derxa1, derya1, color='red')
# make a plot with different y-axis using second axis object

ax2.set_ylabel('First derivative',color="red",fontsize=14)
# set y-axis label for the second axis object

plt.show()
../_images/f33f2d11f6c4d659627d330df1de5ead41fed18c157630d32f17f3ae10b6e504.png

Tip: How to smoothen a curve?#

Smoothing is usually done to help us see patterns in data series. We smooth out the roughness to see a clearer signal. How? The data points are modified so that points higher than the adjacent points (presumably because of noise) are reduced, and points lower than the adjacent points (presumably because of noise) are increased.

You can smooth data several ways in Python. Have a look at the scipy.ndimage.uniform_filter1d function for a moving average filter and the scipy.signal.savgol_filter function for a Savitzky-Golay filter.

A moving average filter is the simplest filter to understand and use. It is commonly used to smooth out short-term fluctuations. For example, using a filer of length 3, the new, smoothed point \(x\) is the average of the old points \(x-1\), \(x\), and \(x+1\).

A Savitzky-Golay filter uses least squares to regress a small window of the data onto a polynomial, then uses the polynomial to estimate the point in the center of the window. Finally the window is shifted forward by one data point and the process repeats. This continues until every point has been optimally adjusted relative to its neighbours.

The example below shows the difference between both methods:

xtestsmooth = [0,1,2,3,4,5,6,7,8]
ytestsmooth = [2, 2, 5, 2, 1, 0, 1, 4, 9]
plt.figure(figsize=(7,5))
plt.plot(xtestsmooth, ytestsmooth, '-o', color='gray', markersize=8, label='Original')
plt.plot(xtestsmooth, uniform_filter1d(ytestsmooth, size=3), '-o', color='red', markersize=8, label='Moving average') # length of filter is 3
plt.plot(xtestsmooth, savgol_filter(ytestsmooth, 5, 3), '-o', color='blue', markersize=8, label='Savitzky-Golay') # window size is 5, polynomial order is 3
plt.title('Smoothing', fontsize=18)
plt.xlabel('Index', fontsize=14)
plt.ylabel('Value', fontsize=14)
plt.legend(loc='upper left')
plt.show()
../_images/8bd39d70de210e9ff96dd79d3a8330b384c71f305a41702bc5b7eccfac2f2d94.png

A Saviztky-Golay filter is often better than a moving average filter because it tends to preserve features of the data which are usually attenuated by a moving average filter, i.e. area, position and width of peaks. A moving average filter can produce significant distortions and reduce the signal intensity, with the subsequent loss of adjacent small signals. Off course, all depends on the filter size, window size and polynomial order used.

Back to our data, now with a secondary Y-axis and a smooth first derivative:

fig,ax = plt.subplots()
ax.plot(xdfa1, ydfa1, color='gray')
ax.set_xlabel('T (°K)', fontsize=14)
ax.set_ylabel('Fluorescence (AU)',color="gray",fontsize=14)
ax2=ax.twinx()
ax2.plot(derxa1, savgol_filter(derya1, 21, 3), color='red')
ax2.set_ylabel('First derivative',color="red",fontsize=14)
plt.show()
../_images/fb5681d501619d2f7f80560956b323dad1c1ac6338e2f00497af20ba22666da6.png

That looks much better!

We now need to find the y-value for the peak in the first derivative signal (i.e. the maximum value) and its corresponding x-value, which is the \(T_m\) we are looking for.

max_derya1 = np.max(derya1)
# find the maximum y value

max_derxa1 = derxa1[derya1.argmax()] 
# find the x value corresponding to the maximum y value

print(max_derxa1, max_derya1)
334.21 36.62499999998117

The \(T_m\) is 334 °K.

Analysis: 2. Curve-fitting using a Boltzmann model#

Using the Boltzmann equation:

\[ Y = Y_{min} + \frac{(Y_{max} - Y_{min})}{1 + exp (\frac{T_m - T}{a})} \]

where \(Y\) is the observed fluorescence intensity, \(Y_{min}\) and \(Y_{max}\) are pretransitional and posttransitional fluorescence intensities, and \(a\) is a slope factor. \(T\) is the temperature and \(T_m\) is the midpoint of the thermal unfolding curve.

# We define the function to fit the data.
def funcBoltzmann(x, Ymin, Ymax, Tm, a):
    
    return Ymin + ((Ymax) - Ymin)/(1 + np.exp((Tm-x)/a))

We test input parameters for scipy.optimize.curve_fit based on visual inspection (see figure below), this involves trial and error.

Analysing the thermal shift assay
# We plot our curve with initial guesses for the parameters onto the data. Change these guesses if needed.
# Note that we first create a list of temperatures as input for our function using the numpy.linspace command.

xin = np.linspace(290, 360, 200)

plt.figure(figsize=(7,5))
plt.plot(xdfa1, ydfa1, 'o', color='gray', markersize=8)
plt.plot(xin, funcBoltzmann(xin, 10, 150, 333, 5), color="red",label='Guess')
plt.title('Thermal Shift Assay', fontsize=18)
plt.xlabel('T (°K)', fontsize=14)
plt.ylabel('Fluorescence (AU)', fontsize=14)
plt.show()
../_images/75c3733cfe20313ddda20d8d4f40abc979d093f18ec7c82fb06798adf9ea6e06.png

Looks ok. We can now run scipy.optimize.curve_fit and plot the resulting curve on the data.

# We fit the data.
paramsBoltzmann, params_covarianceBoltzmann = curve_fit(funcBoltzmann, xdfa1, ydfa1,
                                               [ 10, 150, 333, 5], maxfev=10000)

# We print the fitted parameters.
print(paramsBoltzmann)
print(np.sqrt(np.diag(params_covarianceBoltzmann)))

# We plot the fitted curve onto the data.
plt.figure(figsize=(7,5))
plt.plot(xdfa1, ydfa1, 'o', color='gray', markersize=8)
plt.plot(xin, funcBoltzmann(xin, *paramsBoltzmann), color="red",label='Fit')
plt.title('Thermal Shift Assay', fontsize=18)
plt.xlabel('T (°K)', fontsize=14)
plt.ylabel('Fluorescence (AU)', fontsize=14)
plt.show()
[  8.46641251 117.38342176 332.50319245   0.96940869]
[0.72752489 0.92834356 0.10142863 0.08840673]
../_images/4fd298817d1848144c5201637bbb82efdf5bd4ccf833c4c53dbace5c0c988cdb.png

This does not look good! The Boltzmann function does not take post-peak fluorescence into account, often observed in TSAs due to protein aggregation and dye dissociation at higher temperatures. We can include an empirical term to model fluorescence decrease with temperature after peak fluorescence:

\[ Y = Y_{min} + \frac{(Y_{max} - b(T - T_m) - Y_{min})}{1 + exp (\frac{T_m - T}{a})} \]

where \(Y\) is the observed fluorescence intensity, \(Y_{min}\) and \(Y_{max}\) are pretransitional and posttransitional fluorescence intensities, \(a\) is a slope factor for the transition, and \(b\) accounts for the decrease in \(Y\) after peak fluorescence. \(T\) is the temperature and \(T_m\) is the midpoint of the thermal unfolding curve.

As this is an empirical model, multiple options to include fluorescence decrease with temperature after peak fluorescence are possible!

Let’s see if this works:

# We define the new function.
def funcBoltzmannEmpirical(x, Ymin, Ymax, Tm, a, b):
    
    return Ymin + ((Ymax - b*(x - Tm) - Ymin)/(1 + np.exp((Tm-x)/a)))

# We fit the data.
paramsBoltzmannEmpirical, params_covarianceBoltzmannEmpirical = curve_fit(funcBoltzmannEmpirical, xdfa1, ydfa1,
                                               [10, 150, 333, 5, 2], maxfev=10000)
# We print the fitted parameters.
print(paramsBoltzmannEmpirical)
print(np.sqrt(np.diag(params_covarianceBoltzmannEmpirical)))

# We plot the fitted curve onto the data.
plt.figure(figsize=(7,5))
plt.plot(xdfa1, ydfa1, 'o', color='gray', markersize=8)
plt.plot(xin, funcBoltzmannEmpirical(xin, *paramsBoltzmannEmpirical), color="blue",label='Fit')
plt.title('Thermal Shift Assay', fontsize=18)
plt.xlabel('T (°K)', fontsize=14)
plt.ylabel('Fluorescence (AU)', fontsize=14)
plt.show()
[  7.85990258 171.68481688 333.74524363   1.52565204   3.97356596]
[0.09701873 0.33837075 0.01447148 0.0111816  0.0236133 ]
../_images/184039ce196a6ce2511466912f4d4daa3bbc663c4397b239975f2c8f3af60bca.png

The \(T_m\) is 333.75 \(\pm\) 0.01 °K.

Analysis: 3. Curve-fitting using the equation describing the unfolding of a monomer via a two-state mechanism#

Using the equation describing the unfolding of a monomer via a two-state mechanism:

\[ Y = \frac{(Y_{n'} + m_n T) + (Y_{u'} + m_u T) \exp (\frac{\Delta H_m (\frac{T}{T_m} - 1) + \Delta C_p (T_m - T + T ln (\frac{T}{T_m}))}{RT})} {1 + \exp (\frac{\Delta H_m (\frac{T}{T_m} - 1) + \Delta C_p (T_m - T + T ln (\frac{T}{T_m}))}{RT})} . \]

where \(Y\) is the observed fluorescence intensity, \(m_n\) and \(m_u\) account for changes in the signals of the pre- and post-transition regions with changes in temperature and \(Y_{n'}\) and \(Y_{u'}\) are the signal of the native and unfolded states. \(T\) is the temperature, \(T_m\) is the midpoint of the thermal unfolding curve, \(\Delta H_m\) is the enthalpy change for protein unfolding at \(T_m\) and \(\Delta C_p\) is the change in heat capacity.

def funcUF(x, yn, mn, yu, mu, DHm, Tm, DCp):
    
    return ((yn + mn * x) + (yu + mu * x) * np.exp((DHm * ((x / Tm) - 1) + DCp * (Tm - x + x * np.log(x / Tm))) / (8.314 * x))) / (1 + np.exp((DHm * ((x / Tm) - 1) + DCp * (Tm - x + x * np.log(x / Tm))) / (8.314 * x)))

First, test input parameters for scipy.optimize.curve_fit based on visual inspection. I usually start with a \(\Delta H_m\)-value around 300 kJ mol\(^{-1}\) and a \(\Delta C_p\)-value around 10 kJ mol\(^{−1}\) K\(^{-1}\). Finding good guesses involves trial and error, I included my final result.

plt.figure(figsize=(7,5))
plt.plot(xdfa1, ydfa1, 'o', color='gray', markersize=8)
plt.plot(xin, funcUF(xin, 6, -0.01, 150, 0.02, 402000, 330, 6000), color="red",label='Fit')
plt.title('Thermal Shift Assay', fontsize=18)
plt.xlabel('T (°K)', fontsize=14)
plt.ylabel('Fluorescence (AU)', fontsize=14)
plt.show()
../_images/bf413d79b83cb1ce45ab920f57bed75187b98ee428351079a9576b83ebb0d9e9.png

Second, run scipy.optimize.curve_fit and plot the resulting curve on the data.

paramsUF, params_covarianceUF = curve_fit(funcUF, xdfa1, ydfa1,
                                               [6, -0.01, 150, 0.02, 402000, 330, 6000], maxfev=10000)

print(paramsUF)
print(np.sqrt(np.diag(params_covarianceUF)))

plt.figure(figsize=(7,5))
plt.plot(xdfa1, ydfa1, 'o', color='gray', markersize=8)
plt.plot(xin, funcUF(xin, *paramsUF), color="red",label='Fit')
plt.title('Thermal Shift Assay', fontsize=18)
plt.xlabel('T (°K)', fontsize=14)
plt.ylabel('Fluorescence (AU)', fontsize=14)
plt.show()
[-3.60741800e+01  1.40218168e-01  1.46004700e+03 -3.86614730e+00
  6.48921008e+05  3.33813581e+02  2.63591358e+04]
[2.16781537e+00 6.94593293e-03 4.86727186e+00 1.39736487e-02
 3.32159245e+03 9.06504468e-03 2.19021576e+02]
../_images/8d1ce15933bac366bc42582c86756e43b037609f0c1c461dd9446df7a650c23b.png

From this fit, we can conclude that \(\Delta H_m\) is 649 \(\pm\) 3 kJ mol\(^{-1}\) K\(^{-1}\), \(\Delta C_p\) 26.4 \(\pm\) 0.2 kJ mol\(^{−1}\) K\(^{-1}\) and that \(T_m\) is 333.81 \(\pm\) 0.01 K.

Advice: Overfitting#

Overfitting happens when the model is too complex for the data. In our case, can we justify the use of all parameters?

When the enthalpy and entropy are temperature independent, we can write:

\[ Y = \frac{(Y_{n'} + m_n T) + (Y_{u'} + m_u T) \exp(\frac{\Delta H_m}{R} (\frac{1}{T_m} - \frac{1}{T}))} {1 + \exp(\frac{\Delta H_m}{R} (\frac{1}{T_m} - \frac{1}{T}))} , \]

Now we only have 6 variables… Let us see if that works:

def funcUFnoDCp(x, yn, mn, yu, mu, DHm, Tm):
    
    return ((yn + mn * x) + (yu + mu * x) * np.exp((DHm / 8.314) * ((1 / Tm) - (1 / x)))) / (1 + np.exp((DHm / 8.314) * ((1 / Tm) - (1 / x))))
paramsUFnoDCp, params_covarianceUFnoDCp = curve_fit(funcUFnoDCp, xdfa1, ydfa1,
                                               [6, -0.01, 150, 0.02, 402000, 330], maxfev=10000)

print(paramsUFnoDCp)
print(np.sqrt(np.diag(params_covarianceUFnoDCp)))

plt.figure(figsize=(7,5))
plt.plot(xdfa1, ydfa1, 'o', color='gray', markersize=8)
plt.plot(xin, funcUF(xin, *paramsUF), color="red",label='Change in heat capacity')
plt.plot(xin, funcUFnoDCp(xin, *paramsUFnoDCp), color="blue",label='Change in heat capacity = 0')
plt.title('Unfolding', fontsize=18)
plt.xlabel('T (°K)', fontsize=14)
plt.ylabel('$\Delta$$A_{286nm}$ (AU) x 100', fontsize=14)
plt.legend(loc='upper left')
plt.show()
[-3.87419869e+01  1.50303538e-01  1.48440857e+03 -3.93535895e+00
  6.41886743e+05  3.33812832e+02]
[2.47012998e+00 7.94675118e-03 6.88836674e+00 1.97610448e-02
 4.46184075e+03 1.24515726e-02]
../_images/7df068d184553be7abfbe7d8674f516e725b7836a1ea94ee723e54241318a025.png

From this fit, we can conclude that \(\Delta H_m\) is 642 \(\pm\) 4 kJ mol\(^{-1}\) K\(^{-1}\) and that \(T_m\) is 333.81 \(\pm\) 0.01 K. Very similar to the previous fit…

And now for each well…#


Let’s have a look at all wells. We first group by SamplePos column and convert its result into a dictionary of DataFrames. More information on dictionaries and tuples in Python is available here.

dict_of_wells = dict(tuple(df.groupby("SamplePos")))
# We group by SamplePos column and convert its result into a dictionary of DataFrames.
print(dict_of_wells)
{'A1':     SamplePos  SampleName   Temp  465-580
0          A1  T4L wt 8uM  20.01     6.94
1          A1  T4L wt 8uM  20.01     6.99
2          A1  T4L wt 8uM  20.16     6.97
3          A1  T4L wt 8uM  20.32     7.00
4          A1  T4L wt 8uM  20.40     6.96
..        ...         ...    ...      ...
640        A1  T4L wt 8uM  84.47    78.21
641        A1  T4L wt 8uM  84.59    77.87
642        A1  T4L wt 8uM  84.67    77.57
643        A1  T4L wt 8uM  84.76    77.29
644        A1  T4L wt 8uM  84.88    76.92

[645 rows x 4 columns], 'A10':      SamplePos SampleName   Temp  465-580
5805       A10      Empty  20.01     5.22
5806       A10      Empty  20.01     5.23
5807       A10      Empty  20.16     5.20
5808       A10      Empty  20.32     5.19
5809       A10      Empty  20.40     5.20
...        ...        ...    ...      ...
6445       A10      Empty  84.47     3.11
6446       A10      Empty  84.59     3.13
6447       A10      Empty  84.67     3.12
6448       A10      Empty  84.76     3.09
6449       A10      Empty  84.88     3.11

[645 rows x 4 columns], 'A11':      SamplePos SampleName   Temp  465-580
6450       A11      Empty  20.01     6.95
6451       A11      Empty  20.01     6.93
6452       A11      Empty  20.16     6.91
6453       A11      Empty  20.32     6.91
6454       A11      Empty  20.40     6.88
...        ...        ...    ...      ...
7090       A11      Empty  84.47     4.02
7091       A11      Empty  84.59     4.02
7092       A11      Empty  84.67     4.03
7093       A11      Empty  84.76     4.04
7094       A11      Empty  84.88     4.01

[645 rows x 4 columns], 'A12':      SamplePos SampleName   Temp  465-580
7095       A12      Empty  20.01     7.11
7096       A12      Empty  20.01     7.06
7097       A12      Empty  20.16     7.08
7098       A12      Empty  20.32     7.09
7099       A12      Empty  20.40     7.05
...        ...        ...    ...      ...
7735       A12      Empty  84.47     4.14
7736       A12      Empty  84.59     4.11
7737       A12      Empty  84.67     4.10
7738       A12      Empty  84.76     4.11
7739       A12      Empty  84.88     4.11

[645 rows x 4 columns], 'A2':      SamplePos  SampleName   Temp  465-580
645         A2  T4L wt 8uM  20.01     7.15
646         A2  T4L wt 8uM  20.01     7.12
647         A2  T4L wt 8uM  20.16     7.15
648         A2  T4L wt 8uM  20.32     7.12
649         A2  T4L wt 8uM  20.40     7.16
...        ...         ...    ...      ...
1285        A2  T4L wt 8uM  84.47    73.00
1286        A2  T4L wt 8uM  84.59    72.65
1287        A2  T4L wt 8uM  84.67    72.36
1288        A2  T4L wt 8uM  84.76    72.08
1289        A2  T4L wt 8uM  84.88    71.80

[645 rows x 4 columns], 'A3':      SamplePos  SampleName   Temp  465-580
1290        A3  T4L wt 8uM  20.01     8.77
1291        A3  T4L wt 8uM  20.01     8.78
1292        A3  T4L wt 8uM  20.16     8.78
1293        A3  T4L wt 8uM  20.32     8.80
1294        A3  T4L wt 8uM  20.40     8.82
...        ...         ...    ...      ...
1930        A3  T4L wt 8uM  84.47    49.05
1931        A3  T4L wt 8uM  84.59    48.96
1932        A3  T4L wt 8uM  84.67    48.80
1933        A3  T4L wt 8uM  84.76    48.57
1934        A3  T4L wt 8uM  84.88    48.41

[645 rows x 4 columns], 'A4':      SamplePos  SampleName   Temp  465-580
1935        A4  T4L wt 8uM  20.01     7.77
1936        A4  T4L wt 8uM  20.01     7.80
1937        A4  T4L wt 8uM  20.16     7.76
1938        A4  T4L wt 8uM  20.32     7.83
1939        A4  T4L wt 8uM  20.40     7.82
...        ...         ...    ...      ...
2575        A4  T4L wt 8uM  84.47    24.66
2576        A4  T4L wt 8uM  84.59    24.58
2577        A4  T4L wt 8uM  84.67    24.51
2578        A4  T4L wt 8uM  84.76    24.47
2579        A4  T4L wt 8uM  84.88    24.36

[645 rows x 4 columns], 'A5':      SamplePos SampleName   Temp  465-580
2580        A5      Empty  20.01     7.61
2581        A5      Empty  20.01     7.59
2582        A5      Empty  20.16     7.55
2583        A5      Empty  20.32     7.59
2584        A5      Empty  20.40     7.55
...        ...        ...    ...      ...
3220        A5      Empty  84.47     4.32
3221        A5      Empty  84.59     4.35
3222        A5      Empty  84.67     4.34
3223        A5      Empty  84.76     4.35
3224        A5      Empty  84.88     4.33

[645 rows x 4 columns], 'A6':      SamplePos SampleName   Temp  465-580
3225        A6      Empty  20.01     7.61
3226        A6      Empty  20.01     7.59
3227        A6      Empty  20.16     7.55
3228        A6      Empty  20.32     7.59
3229        A6      Empty  20.40     7.55
...        ...        ...    ...      ...
3865        A6      Empty  84.47     4.32
3866        A6      Empty  84.59     4.35
3867        A6      Empty  84.67     4.34
3868        A6      Empty  84.76     4.35
3869        A6      Empty  84.88     4.33

[645 rows x 4 columns], 'A7':      SamplePos SampleName   Temp  465-580
3870        A7      Empty  20.01     7.61
3871        A7      Empty  20.01     7.59
3872        A7      Empty  20.16     7.55
3873        A7      Empty  20.32     7.59
3874        A7      Empty  20.40     7.55
...        ...        ...    ...      ...
4510        A7      Empty  84.47     4.32
4511        A7      Empty  84.59     4.35
4512        A7      Empty  84.67     4.34
4513        A7      Empty  84.76     4.35
4514        A7      Empty  84.88     4.33

[645 rows x 4 columns], 'A8':      SamplePos SampleName   Temp  465-580
4515        A8      Empty  20.01     7.61
4516        A8      Empty  20.01     7.59
4517        A8      Empty  20.16     7.55
4518        A8      Empty  20.32     7.59
4519        A8      Empty  20.40     7.55
...        ...        ...    ...      ...
5155        A8      Empty  84.47     4.32
5156        A8      Empty  84.59     4.35
5157        A8      Empty  84.67     4.34
5158        A8      Empty  84.76     4.35
5159        A8      Empty  84.88     4.33

[645 rows x 4 columns], 'A9':      SamplePos SampleName   Temp  465-580
5160        A9      Empty  20.01     6.45
5161        A9      Empty  20.01     6.44
5162        A9      Empty  20.16     6.41
5163        A9      Empty  20.32     6.39
5164        A9      Empty  20.40     6.41
...        ...        ...    ...      ...
5800        A9      Empty  84.47     3.73
5801        A9      Empty  84.59     3.74
5802        A9      Empty  84.67     3.75
5803        A9      Empty  84.76     3.75
5804        A9      Empty  84.88     3.72

[645 rows x 4 columns], 'B1':      SamplePos   SampleName   Temp  465-580
7740        B1  T4L wt 4 uM  20.01     5.48
7741        B1  T4L wt 4 uM  20.01     5.47
7742        B1  T4L wt 4 uM  20.16     5.46
7743        B1  T4L wt 4 uM  20.32     5.47
7744        B1  T4L wt 4 uM  20.40     5.48
...        ...          ...    ...      ...
8380        B1  T4L wt 4 uM  84.47    37.90
8381        B1  T4L wt 4 uM  84.59    37.86
8382        B1  T4L wt 4 uM  84.67    37.63
8383        B1  T4L wt 4 uM  84.76    37.48
8384        B1  T4L wt 4 uM  84.88    37.29

[645 rows x 4 columns], 'B10':       SamplePos SampleName   Temp  465-580
13545       B10      Empty  20.01     7.45
13546       B10      Empty  20.01     7.43
13547       B10      Empty  20.16     7.44
13548       B10      Empty  20.32     7.40
13549       B10      Empty  20.40     7.41
...         ...        ...    ...      ...
14185       B10      Empty  84.47     4.24
14186       B10      Empty  84.59     4.25
14187       B10      Empty  84.67     4.26
14188       B10      Empty  84.76     4.28
14189       B10      Empty  84.88     4.26

[645 rows x 4 columns], 'B11':       SamplePos SampleName   Temp  465-580
14190       B11      Empty  20.01     7.87
14191       B11      Empty  20.01     7.89
14192       B11      Empty  20.16     7.86
14193       B11      Empty  20.32     7.84
14194       B11      Empty  20.40     7.82
...         ...        ...    ...      ...
14830       B11      Empty  84.47     4.50
14831       B11      Empty  84.59     4.49
14832       B11      Empty  84.67     4.50
14833       B11      Empty  84.76     4.50
14834       B11      Empty  84.88     4.50

[645 rows x 4 columns], 'B12':       SamplePos SampleName   Temp  465-580
14835       B12      Empty  20.01     6.61
14836       B12      Empty  20.01     6.60
14837       B12      Empty  20.16     6.59
14838       B12      Empty  20.32     6.56
14839       B12      Empty  20.40     6.60
...         ...        ...    ...      ...
15475       B12      Empty  84.47     3.82
15476       B12      Empty  84.59     3.81
15477       B12      Empty  84.67     3.80
15478       B12      Empty  84.76     3.84
15479       B12      Empty  84.88     3.80

[645 rows x 4 columns], 'B2':      SamplePos   SampleName   Temp  465-580
8385        B2  T4L wt 4 uM  20.01     7.09
8386        B2  T4L wt 4 uM  20.01     7.09
8387        B2  T4L wt 4 uM  20.16     7.07
8388        B2  T4L wt 4 uM  20.32     7.10
8389        B2  T4L wt 4 uM  20.40     7.09
...        ...          ...    ...      ...
9025        B2  T4L wt 4 uM  84.47    35.78
9026        B2  T4L wt 4 uM  84.59    35.55
9027        B2  T4L wt 4 uM  84.67    35.58
9028        B2  T4L wt 4 uM  84.76    35.45
9029        B2  T4L wt 4 uM  84.88    35.30

[645 rows x 4 columns], 'B3':      SamplePos   SampleName   Temp  465-580
9030        B3  T4L wt 4 uM  20.01     7.55
9031        B3  T4L wt 4 uM  20.01     7.60
9032        B3  T4L wt 4 uM  20.16     7.61
9033        B3  T4L wt 4 uM  20.32     7.60
9034        B3  T4L wt 4 uM  20.40     7.60
...        ...          ...    ...      ...
9670        B3  T4L wt 4 uM  84.47    20.66
9671        B3  T4L wt 4 uM  84.59    20.57
9672        B3  T4L wt 4 uM  84.67    20.52
9673        B3  T4L wt 4 uM  84.76    20.52
9674        B3  T4L wt 4 uM  84.88    20.48

[645 rows x 4 columns], 'B4':       SamplePos   SampleName   Temp  465-580
9675         B4  T4L wt 4 uM  20.01     7.04
9676         B4  T4L wt 4 uM  20.01     7.05
9677         B4  T4L wt 4 uM  20.16     7.07
9678         B4  T4L wt 4 uM  20.32     7.04
9679         B4  T4L wt 4 uM  20.40     7.08
...         ...          ...    ...      ...
10315        B4  T4L wt 4 uM  84.47    11.98
10316        B4  T4L wt 4 uM  84.59    11.97
10317        B4  T4L wt 4 uM  84.67    11.96
10318        B4  T4L wt 4 uM  84.76    11.91
10319        B4  T4L wt 4 uM  84.88    11.86

[645 rows x 4 columns], 'B5':       SamplePos SampleName   Temp  465-580
10320        B5      Empty  20.01     7.61
10321        B5      Empty  20.01     7.59
10322        B5      Empty  20.16     7.55
10323        B5      Empty  20.32     7.59
10324        B5      Empty  20.40     7.55
...         ...        ...    ...      ...
10960        B5      Empty  84.47     4.32
10961        B5      Empty  84.59     4.35
10962        B5      Empty  84.67     4.34
10963        B5      Empty  84.76     4.35
10964        B5      Empty  84.88     4.33

[645 rows x 4 columns], 'B6':       SamplePos SampleName   Temp  465-580
10965        B6      Empty  20.01     7.61
10966        B6      Empty  20.01     7.59
10967        B6      Empty  20.16     7.55
10968        B6      Empty  20.32     7.59
10969        B6      Empty  20.40     7.55
...         ...        ...    ...      ...
11605        B6      Empty  84.47     4.32
11606        B6      Empty  84.59     4.35
11607        B6      Empty  84.67     4.34
11608        B6      Empty  84.76     4.35
11609        B6      Empty  84.88     4.33

[645 rows x 4 columns], 'B7':       SamplePos SampleName   Temp  465-580
11610        B7      Empty  20.01     7.61
11611        B7      Empty  20.01     7.59
11612        B7      Empty  20.16     7.55
11613        B7      Empty  20.32     7.59
11614        B7      Empty  20.40     7.55
...         ...        ...    ...      ...
12250        B7      Empty  84.47     4.32
12251        B7      Empty  84.59     4.35
12252        B7      Empty  84.67     4.34
12253        B7      Empty  84.76     4.35
12254        B7      Empty  84.88     4.33

[645 rows x 4 columns], 'B8':       SamplePos SampleName   Temp  465-580
12255        B8      Empty  20.01     7.61
12256        B8      Empty  20.01     7.59
12257        B8      Empty  20.16     7.55
12258        B8      Empty  20.32     7.59
12259        B8      Empty  20.40     7.55
...         ...        ...    ...      ...
12895        B8      Empty  84.47     4.32
12896        B8      Empty  84.59     4.35
12897        B8      Empty  84.67     4.34
12898        B8      Empty  84.76     4.35
12899        B8      Empty  84.88     4.33

[645 rows x 4 columns], 'B9':       SamplePos SampleName   Temp  465-580
12900        B9      Empty  20.01     6.97
12901        B9      Empty  20.01     6.95
12902        B9      Empty  20.16     6.95
12903        B9      Empty  20.32     6.96
12904        B9      Empty  20.40     6.94
...         ...        ...    ...      ...
13540        B9      Empty  84.47     4.01
13541        B9      Empty  84.59     4.01
13542        B9      Empty  84.67     4.04
13543        B9      Empty  84.76     4.01
13544        B9      Empty  84.88     3.99

[645 rows x 4 columns], 'C1':       SamplePos   SampleName   Temp  465-580
15480        C1  T4L wt 2 uM  20.01     4.71
15481        C1  T4L wt 2 uM  20.01     4.71
15482        C1  T4L wt 2 uM  20.16     4.70
15483        C1  T4L wt 2 uM  20.32     4.70
15484        C1  T4L wt 2 uM  20.40     4.72
...         ...          ...    ...      ...
16120        C1  T4L wt 2 uM  84.47    19.52
16121        C1  T4L wt 2 uM  84.59    19.46
16122        C1  T4L wt 2 uM  84.67    19.37
16123        C1  T4L wt 2 uM  84.76    19.31
16124        C1  T4L wt 2 uM  84.88    19.23

[645 rows x 4 columns], 'C10':       SamplePos SampleName   Temp  465-580
21285       C10      Empty  20.01     7.36
21286       C10      Empty  20.01     7.35
21287       C10      Empty  20.16     7.35
21288       C10      Empty  20.32     7.33
21289       C10      Empty  20.40     7.31
...         ...        ...    ...      ...
21925       C10      Empty  84.47     4.23
21926       C10      Empty  84.59     4.20
21927       C10      Empty  84.67     4.19
21928       C10      Empty  84.76     4.20
21929       C10      Empty  84.88     4.19

[645 rows x 4 columns], 'C11':       SamplePos SampleName   Temp  465-580
21930       C11      Empty  20.01     7.01
21931       C11      Empty  20.01     7.01
21932       C11      Empty  20.16     7.00
21933       C11      Empty  20.32     6.98
21934       C11      Empty  20.40     7.01
...         ...        ...    ...      ...
22570       C11      Empty  84.47     4.07
22571       C11      Empty  84.59     4.07
22572       C11      Empty  84.67     4.07
22573       C11      Empty  84.76     4.04
22574       C11      Empty  84.88     4.05

[645 rows x 4 columns], 'C12':       SamplePos SampleName   Temp  465-580
22575       C12      Empty  20.01     4.76
22576       C12      Empty  20.01     4.74
22577       C12      Empty  20.16     4.75
22578       C12      Empty  20.32     4.74
22579       C12      Empty  20.40     4.71
...         ...        ...    ...      ...
23215       C12      Empty  84.47     2.74
23216       C12      Empty  84.59     2.77
23217       C12      Empty  84.67     2.74
23218       C12      Empty  84.76     2.71
23219       C12      Empty  84.88     2.71

[645 rows x 4 columns], 'C2':       SamplePos   SampleName   Temp  465-580
16125        C2  T4L wt 2 uM  20.01     5.72
16126        C2  T4L wt 2 uM  20.01     5.70
16127        C2  T4L wt 2 uM  20.16     5.71
16128        C2  T4L wt 2 uM  20.32     5.70
16129        C2  T4L wt 2 uM  20.40     5.72
...         ...          ...    ...      ...
16765        C2  T4L wt 2 uM  84.47    17.49
16766        C2  T4L wt 2 uM  84.59    17.48
16767        C2  T4L wt 2 uM  84.67    17.38
16768        C2  T4L wt 2 uM  84.76    17.31
16769        C2  T4L wt 2 uM  84.88    17.27

[645 rows x 4 columns], 'C3':       SamplePos   SampleName   Temp  465-580
16770        C3  T4L wt 2 uM  20.01     6.25
16771        C3  T4L wt 2 uM  20.01     6.29
16772        C3  T4L wt 2 uM  20.16     6.32
16773        C3  T4L wt 2 uM  20.32     6.30
16774        C3  T4L wt 2 uM  20.40     6.33
...         ...          ...    ...      ...
17410        C3  T4L wt 2 uM  84.47    10.23
17411        C3  T4L wt 2 uM  84.59    10.23
17412        C3  T4L wt 2 uM  84.67    10.18
17413        C3  T4L wt 2 uM  84.76    10.17
17414        C3  T4L wt 2 uM  84.88    10.18

[645 rows x 4 columns], 'C4':       SamplePos   SampleName   Temp  465-580
17415        C4  T4L wt 2 uM  20.01     6.07
17416        C4  T4L wt 2 uM  20.01     6.09
17417        C4  T4L wt 2 uM  20.16     6.05
17418        C4  T4L wt 2 uM  20.32     6.07
17419        C4  T4L wt 2 uM  20.40     6.09
...         ...          ...    ...      ...
18055        C4  T4L wt 2 uM  84.47     7.37
18056        C4  T4L wt 2 uM  84.59     7.36
18057        C4  T4L wt 2 uM  84.67     7.34
18058        C4  T4L wt 2 uM  84.76     7.34
18059        C4  T4L wt 2 uM  84.88     7.32

[645 rows x 4 columns], 'C5':       SamplePos SampleName   Temp  465-580
18060        C5      Empty  20.01     7.61
18061        C5      Empty  20.01     7.59
18062        C5      Empty  20.16     7.55
18063        C5      Empty  20.32     7.59
18064        C5      Empty  20.40     7.55
...         ...        ...    ...      ...
18700        C5      Empty  84.47     4.32
18701        C5      Empty  84.59     4.35
18702        C5      Empty  84.67     4.34
18703        C5      Empty  84.76     4.35
18704        C5      Empty  84.88     4.33

[645 rows x 4 columns], 'C6':       SamplePos SampleName   Temp  465-580
18705        C6      Empty  20.01     7.61
18706        C6      Empty  20.01     7.59
18707        C6      Empty  20.16     7.55
18708        C6      Empty  20.32     7.59
18709        C6      Empty  20.40     7.55
...         ...        ...    ...      ...
19345        C6      Empty  84.47     4.32
19346        C6      Empty  84.59     4.35
19347        C6      Empty  84.67     4.34
19348        C6      Empty  84.76     4.35
19349        C6      Empty  84.88     4.33

[645 rows x 4 columns], 'C7':       SamplePos SampleName   Temp  465-580
19350        C7      Empty  20.01     7.61
19351        C7      Empty  20.01     7.59
19352        C7      Empty  20.16     7.55
19353        C7      Empty  20.32     7.59
19354        C7      Empty  20.40     7.55
...         ...        ...    ...      ...
19990        C7      Empty  84.47     4.32
19991        C7      Empty  84.59     4.35
19992        C7      Empty  84.67     4.34
19993        C7      Empty  84.76     4.35
19994        C7      Empty  84.88     4.33

[645 rows x 4 columns], 'C8':       SamplePos SampleName   Temp  465-580
19995        C8      Empty  20.01     7.61
19996        C8      Empty  20.01     7.59
19997        C8      Empty  20.16     7.55
19998        C8      Empty  20.32     7.59
19999        C8      Empty  20.40     7.55
...         ...        ...    ...      ...
20635        C8      Empty  84.47     4.32
20636        C8      Empty  84.59     4.35
20637        C8      Empty  84.67     4.34
20638        C8      Empty  84.76     4.35
20639        C8      Empty  84.88     4.33

[645 rows x 4 columns], 'C9':       SamplePos SampleName   Temp  465-580
20640        C9      Empty  20.01     7.19
20641        C9      Empty  20.01     7.14
20642        C9      Empty  20.16     7.16
20643        C9      Empty  20.32     7.12
20644        C9      Empty  20.40     7.12
...         ...        ...    ...      ...
21280        C9      Empty  84.47     4.12
21281        C9      Empty  84.59     4.12
21282        C9      Empty  84.67     4.12
21283        C9      Empty  84.76     4.10
21284        C9      Empty  84.88     4.09

[645 rows x 4 columns], 'D1':       SamplePos   SampleName   Temp  465-580
23220        D1  T4L wt 1 uM  20.01     4.53
23221        D1  T4L wt 1 uM  20.01     4.57
23222        D1  T4L wt 1 uM  20.16     4.55
23223        D1  T4L wt 1 uM  20.32     4.55
23224        D1  T4L wt 1 uM  20.40     4.57
...         ...          ...    ...      ...
23860        D1  T4L wt 1 uM  84.47    10.43
23861        D1  T4L wt 1 uM  84.59    10.41
23862        D1  T4L wt 1 uM  84.67    10.37
23863        D1  T4L wt 1 uM  84.76    10.32
23864        D1  T4L wt 1 uM  84.88    10.32

[645 rows x 4 columns], 'D10':       SamplePos SampleName   Temp  465-580
29025       D10      Empty  20.01     6.80
29026       D10      Empty  20.01     6.80
29027       D10      Empty  20.16     6.79
29028       D10      Empty  20.32     6.74
29029       D10      Empty  20.40     6.75
...         ...        ...    ...      ...
29665       D10      Empty  84.47     3.94
29666       D10      Empty  84.59     3.94
29667       D10      Empty  84.67     3.91
29668       D10      Empty  84.76     3.92
29669       D10      Empty  84.88     3.94

[645 rows x 4 columns], 'D11':       SamplePos SampleName   Temp  465-580
29670       D11      Empty  20.01     6.91
29671       D11      Empty  20.01     6.88
29672       D11      Empty  20.16     6.91
29673       D11      Empty  20.32     6.88
29674       D11      Empty  20.40     6.85
...         ...        ...    ...      ...
30310       D11      Empty  84.47     3.97
30311       D11      Empty  84.59     3.99
30312       D11      Empty  84.67     3.97
30313       D11      Empty  84.76     3.99
30314       D11      Empty  84.88     4.01

[645 rows x 4 columns], 'D12':       SamplePos SampleName   Temp  465-580
30315       D12      Empty  20.01     6.67
30316       D12      Empty  20.01     6.62
30317       D12      Empty  20.16     6.62
30318       D12      Empty  20.32     6.60
30319       D12      Empty  20.40     6.58
...         ...        ...    ...      ...
30955       D12      Empty  84.47     3.86
30956       D12      Empty  84.59     3.85
30957       D12      Empty  84.67     3.86
30958       D12      Empty  84.76     3.87
30959       D12      Empty  84.88     3.85

[645 rows x 4 columns], 'D2':       SamplePos   SampleName   Temp  465-580
23865        D2  T4L wt 1 uM  20.01     4.97
23866        D2  T4L wt 1 uM  20.01     4.99
23867        D2  T4L wt 1 uM  20.16     4.99
23868        D2  T4L wt 1 uM  20.32     4.96
23869        D2  T4L wt 1 uM  20.40     4.98
...         ...          ...    ...      ...
24505        D2  T4L wt 1 uM  84.47    11.06
24506        D2  T4L wt 1 uM  84.59    11.03
24507        D2  T4L wt 1 uM  84.67    10.96
24508        D2  T4L wt 1 uM  84.76    10.98
24509        D2  T4L wt 1 uM  84.88    10.93

[645 rows x 4 columns], 'D3':       SamplePos   SampleName   Temp  465-580
24510        D3  T4L wt 1 uM  20.01     5.14
24511        D3  T4L wt 1 uM  20.01     5.17
24512        D3  T4L wt 1 uM  20.16     5.22
24513        D3  T4L wt 1 uM  20.32     5.15
24514        D3  T4L wt 1 uM  20.40     5.16
...         ...          ...    ...      ...
25150        D3  T4L wt 1 uM  84.47     7.46
25151        D3  T4L wt 1 uM  84.59     7.43
25152        D3  T4L wt 1 uM  84.67     7.43
25153        D3  T4L wt 1 uM  84.76     7.42
25154        D3  T4L wt 1 uM  84.88     7.41

[645 rows x 4 columns], 'D4':       SamplePos   SampleName   Temp  465-580
25155        D4  T4L wt 1 uM  20.01     5.53
25156        D4  T4L wt 1 uM  20.01     5.54
25157        D4  T4L wt 1 uM  20.16     5.54
25158        D4  T4L wt 1 uM  20.32     5.54
25159        D4  T4L wt 1 uM  20.40     5.53
...         ...          ...    ...      ...
25795        D4  T4L wt 1 uM  84.47     4.93
25796        D4  T4L wt 1 uM  84.59     4.93
25797        D4  T4L wt 1 uM  84.67     4.95
25798        D4  T4L wt 1 uM  84.76     4.94
25799        D4  T4L wt 1 uM  84.88     4.94

[645 rows x 4 columns], 'D5':       SamplePos SampleName   Temp  465-580
25800        D5      Empty  20.01     7.61
25801        D5      Empty  20.01     7.59
25802        D5      Empty  20.16     7.55
25803        D5      Empty  20.32     7.59
25804        D5      Empty  20.40     7.55
...         ...        ...    ...      ...
26440        D5      Empty  84.47     4.32
26441        D5      Empty  84.59     4.35
26442        D5      Empty  84.67     4.34
26443        D5      Empty  84.76     4.35
26444        D5      Empty  84.88     4.33

[645 rows x 4 columns], 'D6':       SamplePos SampleName   Temp  465-580
26445        D6      Empty  20.01     7.61
26446        D6      Empty  20.01     7.59
26447        D6      Empty  20.16     7.55
26448        D6      Empty  20.32     7.59
26449        D6      Empty  20.40     7.55
...         ...        ...    ...      ...
27085        D6      Empty  84.47     4.32
27086        D6      Empty  84.59     4.35
27087        D6      Empty  84.67     4.34
27088        D6      Empty  84.76     4.35
27089        D6      Empty  84.88     4.33

[645 rows x 4 columns], 'D7':       SamplePos SampleName   Temp  465-580
27090        D7      Empty  20.01     7.61
27091        D7      Empty  20.01     7.59
27092        D7      Empty  20.16     7.55
27093        D7      Empty  20.32     7.59
27094        D7      Empty  20.40     7.55
...         ...        ...    ...      ...
27730        D7      Empty  84.47     4.32
27731        D7      Empty  84.59     4.35
27732        D7      Empty  84.67     4.34
27733        D7      Empty  84.76     4.35
27734        D7      Empty  84.88     4.33

[645 rows x 4 columns], 'D8':       SamplePos SampleName   Temp  465-580
27735        D8      Empty  20.01     7.61
27736        D8      Empty  20.01     7.59
27737        D8      Empty  20.16     7.55
27738        D8      Empty  20.32     7.59
27739        D8      Empty  20.40     7.55
...         ...        ...    ...      ...
28375        D8      Empty  84.47     4.32
28376        D8      Empty  84.59     4.35
28377        D8      Empty  84.67     4.34
28378        D8      Empty  84.76     4.35
28379        D8      Empty  84.88     4.33

[645 rows x 4 columns], 'D9':       SamplePos SampleName   Temp  465-580
28380        D9      Empty  20.01     7.51
28381        D9      Empty  20.01     7.49
28382        D9      Empty  20.16     7.51
28383        D9      Empty  20.32     7.49
28384        D9      Empty  20.40     7.45
...         ...        ...    ...      ...
29020        D9      Empty  84.47     4.32
29021        D9      Empty  84.59     4.30
29022        D9      Empty  84.67     4.30
29023        D9      Empty  84.76     4.32
29024        D9      Empty  84.88     4.31

[645 rows x 4 columns], 'E1':       SamplePos SampleName   Temp  465-580
30960        E1      Empty  20.01     6.56
30961        E1      Empty  20.01     6.53
30962        E1      Empty  20.16     6.56
30963        E1      Empty  20.32     6.56
30964        E1      Empty  20.40     6.48
...         ...        ...    ...      ...
31600        E1      Empty  84.47     3.79
31601        E1      Empty  84.59     3.79
31602        E1      Empty  84.67     3.79
31603        E1      Empty  84.76     3.80
31604        E1      Empty  84.88     3.77

[645 rows x 4 columns], 'E10':       SamplePos SampleName   Temp  465-580
36765       E10      Empty  20.01     7.19
36766       E10      Empty  20.01     7.20
36767       E10      Empty  20.16     7.20
36768       E10      Empty  20.32     7.15
36769       E10      Empty  20.40     7.15
...         ...        ...    ...      ...
37405       E10      Empty  84.47     4.16
37406       E10      Empty  84.59     4.16
37407       E10      Empty  84.67     4.16
37408       E10      Empty  84.76     4.18
37409       E10      Empty  84.88     4.15

[645 rows x 4 columns], 'E11':       SamplePos SampleName   Temp  465-580
37410       E11      Empty  20.01     7.18
37411       E11      Empty  20.01     7.13
37412       E11      Empty  20.16     7.12
37413       E11      Empty  20.32     7.11
37414       E11      Empty  20.40     7.12
...         ...        ...    ...      ...
38050       E11      Empty  84.47     4.12
38051       E11      Empty  84.59     4.13
38052       E11      Empty  84.67     4.14
38053       E11      Empty  84.76     4.12
38054       E11      Empty  84.88     4.09

[645 rows x 4 columns], 'E12':       SamplePos SampleName   Temp  465-580
38055       E12      Empty  20.01     6.73
38056       E12      Empty  20.01     6.75
38057       E12      Empty  20.16     6.75
38058       E12      Empty  20.32     6.72
38059       E12      Empty  20.40     6.68
...         ...        ...    ...      ...
38695       E12      Empty  84.47     3.90
38696       E12      Empty  84.59     3.91
38697       E12      Empty  84.67     3.91
38698       E12      Empty  84.76     3.91
38699       E12      Empty  84.88     3.89

[645 rows x 4 columns], 'E2':       SamplePos SampleName   Temp  465-580
31605        E2      Empty  20.01     6.79
31606        E2      Empty  20.01     6.79
31607        E2      Empty  20.16     6.77
31608        E2      Empty  20.32     6.77
31609        E2      Empty  20.40     6.77
...         ...        ...    ...      ...
32245        E2      Empty  84.47     3.91
32246        E2      Empty  84.59     3.93
32247        E2      Empty  84.67     3.93
32248        E2      Empty  84.76     3.95
32249        E2      Empty  84.88     3.92

[645 rows x 4 columns], 'E3':       SamplePos SampleName   Temp  465-580
32250        E3      Empty  20.01     7.01
32251        E3      Empty  20.01     6.98
32252        E3      Empty  20.16     6.96
32253        E3      Empty  20.32     6.95
32254        E3      Empty  20.40     6.94
...         ...        ...    ...      ...
32890        E3      Empty  84.47     4.02
32891        E3      Empty  84.59     4.02
32892        E3      Empty  84.67     4.03
32893        E3      Empty  84.76     4.02
32894        E3      Empty  84.88     4.03

[645 rows x 4 columns], 'E4':       SamplePos SampleName   Temp  465-580
32895        E4      Empty  20.01     7.12
32896        E4      Empty  20.01     7.09
32897        E4      Empty  20.16     7.05
32898        E4      Empty  20.32     7.06
32899        E4      Empty  20.40     7.04
...         ...        ...    ...      ...
33535        E4      Empty  84.47     4.08
33536        E4      Empty  84.59     4.05
33537        E4      Empty  84.67     4.08
33538        E4      Empty  84.76     4.09
33539        E4      Empty  84.88     4.05

[645 rows x 4 columns], 'E5':       SamplePos SampleName   Temp  465-580
33540        E5      Empty  20.01     7.24
33541        E5      Empty  20.01     7.22
33542        E5      Empty  20.16     7.20
33543        E5      Empty  20.32     7.21
33544        E5      Empty  20.40     7.18
...         ...        ...    ...      ...
34180        E5      Empty  84.47     4.13
34181        E5      Empty  84.59     4.14
34182        E5      Empty  84.67     4.16
34183        E5      Empty  84.76     4.15
34184        E5      Empty  84.88     4.12

[645 rows x 4 columns], 'E6':       SamplePos SampleName   Temp  465-580
34185        E6      Empty  20.01     7.07
34186        E6      Empty  20.01     7.06
34187        E6      Empty  20.16     7.06
34188        E6      Empty  20.32     7.03
34189        E6      Empty  20.40     7.00
...         ...        ...    ...      ...
34825        E6      Empty  84.47     4.03
34826        E6      Empty  84.59     4.07
34827        E6      Empty  84.67     4.06
34828        E6      Empty  84.76     4.05
34829        E6      Empty  84.88     4.02

[645 rows x 4 columns], 'E7':       SamplePos SampleName   Temp  465-580
34830        E7      Empty  20.01     7.17
34831        E7      Empty  20.01     7.14
34832        E7      Empty  20.16     7.09
34833        E7      Empty  20.32     7.07
34834        E7      Empty  20.40     7.06
...         ...        ...    ...      ...
35470        E7      Empty  84.47     4.09
35471        E7      Empty  84.59     4.08
35472        E7      Empty  84.67     4.09
35473        E7      Empty  84.76     4.07
35474        E7      Empty  84.88     4.06

[645 rows x 4 columns], 'E8':       SamplePos SampleName   Temp  465-580
35475        E8      Empty  20.01     7.38
35476        E8      Empty  20.01     7.35
35477        E8      Empty  20.16     7.37
35478        E8      Empty  20.32     7.36
35479        E8      Empty  20.40     7.34
...         ...        ...    ...      ...
36115        E8      Empty  84.47     4.22
36116        E8      Empty  84.59     4.22
36117        E8      Empty  84.67     4.24
36118        E8      Empty  84.76     4.24
36119        E8      Empty  84.88     4.21

[645 rows x 4 columns], 'E9':       SamplePos SampleName   Temp  465-580
36120        E9      Empty  20.01     7.26
36121        E9      Empty  20.01     7.23
36122        E9      Empty  20.16     7.24
36123        E9      Empty  20.32     7.19
36124        E9      Empty  20.40     7.18
...         ...        ...    ...      ...
36760        E9      Empty  84.47     4.17
36761        E9      Empty  84.59     4.18
36762        E9      Empty  84.67     4.16
36763        E9      Empty  84.76     4.17
36764        E9      Empty  84.88     4.15

[645 rows x 4 columns], 'F1':       SamplePos SampleName   Temp  465-580
38700        F1      Empty  20.01     6.68
38701        F1      Empty  20.01     6.67
38702        F1      Empty  20.16     6.66
38703        F1      Empty  20.32     6.66
38704        F1      Empty  20.40     6.64
...         ...        ...    ...      ...
39340        F1      Empty  84.47     3.81
39341        F1      Empty  84.59     3.84
39342        F1      Empty  84.67     3.81
39343        F1      Empty  84.76     3.83
39344        F1      Empty  84.88     3.80

[645 rows x 4 columns], 'F10':       SamplePos SampleName   Temp  465-580
44505       F10      Empty  20.01     8.51
44506       F10      Empty  20.01     8.46
44507       F10      Empty  20.16     8.47
44508       F10      Empty  20.32     8.45
44509       F10      Empty  20.40     8.45
...         ...        ...    ...      ...
45145       F10      Empty  84.47     4.79
45146       F10      Empty  84.59     4.81
45147       F10      Empty  84.67     4.79
45148       F10      Empty  84.76     4.77
45149       F10      Empty  84.88     4.77

[645 rows x 4 columns], 'F11':       SamplePos SampleName   Temp  465-580
45150       F11      Empty  20.01     7.14
45151       F11      Empty  20.01     7.10
45152       F11      Empty  20.16     7.11
45153       F11      Empty  20.32     7.10
45154       F11      Empty  20.40     7.11
...         ...        ...    ...      ...
45790       F11      Empty  84.47     4.10
45791       F11      Empty  84.59     4.13
45792       F11      Empty  84.67     4.11
45793       F11      Empty  84.76     4.12
45794       F11      Empty  84.88     4.11

[645 rows x 4 columns], 'F12':       SamplePos SampleName   Temp  465-580
45795       F12      Empty  20.01     6.92
45796       F12      Empty  20.01     6.87
45797       F12      Empty  20.16     6.87
45798       F12      Empty  20.32     6.89
45799       F12      Empty  20.40     6.84
...         ...        ...    ...      ...
46435       F12      Empty  84.47     3.97
46436       F12      Empty  84.59     4.01
46437       F12      Empty  84.67     3.95
46438       F12      Empty  84.76     4.00
46439       F12      Empty  84.88     3.99

[645 rows x 4 columns], 'F2':       SamplePos SampleName   Temp  465-580
39345        F2      Empty  20.01     7.08
39346        F2      Empty  20.01     7.04
39347        F2      Empty  20.16     7.08
39348        F2      Empty  20.32     7.05
39349        F2      Empty  20.40     7.05
...         ...        ...    ...      ...
39985        F2      Empty  84.47     4.02
39986        F2      Empty  84.59     4.03
39987        F2      Empty  84.67     4.03
39988        F2      Empty  84.76     4.04
39989        F2      Empty  84.88     4.04

[645 rows x 4 columns], 'F3':       SamplePos SampleName   Temp  465-580
39990        F3      Empty  20.01     7.67
39991        F3      Empty  20.01     7.69
39992        F3      Empty  20.16     7.67
39993        F3      Empty  20.32     7.66
39994        F3      Empty  20.40     7.64
...         ...        ...    ...      ...
40630        F3      Empty  84.47     4.34
40631        F3      Empty  84.59     4.32
40632        F3      Empty  84.67     4.35
40633        F3      Empty  84.76     4.37
40634        F3      Empty  84.88     4.35

[645 rows x 4 columns], 'F4':       SamplePos SampleName   Temp  465-580
40635        F4      Empty  20.01     7.32
40636        F4      Empty  20.01     7.33
40637        F4      Empty  20.16     7.30
40638        F4      Empty  20.32     7.29
40639        F4      Empty  20.40     7.27
...         ...        ...    ...      ...
41275        F4      Empty  84.47     4.17
41276        F4      Empty  84.59     4.20
41277        F4      Empty  84.67     4.18
41278        F4      Empty  84.76     4.21
41279        F4      Empty  84.88     4.16

[645 rows x 4 columns], 'F5':       SamplePos SampleName   Temp  465-580
41280        F5      Empty  20.01     7.22
41281        F5      Empty  20.01     7.22
41282        F5      Empty  20.16     7.20
41283        F5      Empty  20.32     7.21
41284        F5      Empty  20.40     7.19
...         ...        ...    ...      ...
41920        F5      Empty  84.47     4.12
41921        F5      Empty  84.59     4.14
41922        F5      Empty  84.67     4.13
41923        F5      Empty  84.76     4.13
41924        F5      Empty  84.88     4.13

[645 rows x 4 columns], 'F6':       SamplePos SampleName   Temp  465-580
41925        F6      Empty  20.01     8.07
41926        F6      Empty  20.01     8.08
41927        F6      Empty  20.16     8.04
41928        F6      Empty  20.32     8.03
41929        F6      Empty  20.40     8.04
...         ...        ...    ...      ...
42565        F6      Empty  84.47     4.53
42566        F6      Empty  84.59     4.53
42567        F6      Empty  84.67     4.53
42568        F6      Empty  84.76     4.56
42569        F6      Empty  84.88     4.56

[645 rows x 4 columns], 'F7':       SamplePos SampleName   Temp  465-580
42570        F7      Empty  20.01     8.21
42571        F7      Empty  20.01     8.16
42572        F7      Empty  20.16     8.17
42573        F7      Empty  20.32     8.15
42574        F7      Empty  20.40     8.12
...         ...        ...    ...      ...
43210        F7      Empty  84.47     4.61
43211        F7      Empty  84.59     4.62
43212        F7      Empty  84.67     4.61
43213        F7      Empty  84.76     4.64
43214        F7      Empty  84.88     4.59

[645 rows x 4 columns], 'F8':       SamplePos SampleName   Temp  465-580
43215        F8      Empty  20.01     7.34
43216        F8      Empty  20.01     7.30
43217        F8      Empty  20.16     7.32
43218        F8      Empty  20.32     7.32
43219        F8      Empty  20.40     7.30
...         ...        ...    ...      ...
43855        F8      Empty  84.47     4.20
43856        F8      Empty  84.59     4.25
43857        F8      Empty  84.67     4.21
43858        F8      Empty  84.76     4.21
43859        F8      Empty  84.88     4.20

[645 rows x 4 columns], 'F9':       SamplePos SampleName   Temp  465-580
43860        F9      Empty  20.01     7.08
43861        F9      Empty  20.01     7.11
43862        F9      Empty  20.16     7.06
43863        F9      Empty  20.32     7.06
43864        F9      Empty  20.40     7.08
...         ...        ...    ...      ...
44500        F9      Empty  84.47     4.05
44501        F9      Empty  84.59     4.08
44502        F9      Empty  84.67     4.04
44503        F9      Empty  84.76     4.05
44504        F9      Empty  84.88     4.03

[645 rows x 4 columns], 'G1':       SamplePos SampleName   Temp  465-580
46440        G1      Empty  20.01     6.72
46441        G1      Empty  20.01     6.67
46442        G1      Empty  20.16     6.69
46443        G1      Empty  20.32     6.66
46444        G1      Empty  20.40     6.63
...         ...        ...    ...      ...
47080        G1      Empty  84.47     3.83
47081        G1      Empty  84.59     3.81
47082        G1      Empty  84.67     3.82
47083        G1      Empty  84.76     3.81
47084        G1      Empty  84.88     3.82

[645 rows x 4 columns], 'G10':       SamplePos SampleName   Temp  465-580
52245       G10      Empty  20.01     7.85
52246       G10      Empty  20.01     7.85
52247       G10      Empty  20.16     7.78
52248       G10      Empty  20.32     7.79
52249       G10      Empty  20.40     7.77
...         ...        ...    ...      ...
52885       G10      Empty  84.47     4.49
52886       G10      Empty  84.59     4.47
52887       G10      Empty  84.67     4.46
52888       G10      Empty  84.76     4.45
52889       G10      Empty  84.88     4.43

[645 rows x 4 columns], 'G11':       SamplePos SampleName   Temp  465-580
52890       G11      Empty  20.01     7.99
52891       G11      Empty  20.01     7.98
52892       G11      Empty  20.16     7.95
52893       G11      Empty  20.32     7.97
52894       G11      Empty  20.40     7.98
...         ...        ...    ...      ...
53530       G11      Empty  84.47     4.61
53531       G11      Empty  84.59     4.59
53532       G11      Empty  84.67     4.59
53533       G11      Empty  84.76     4.60
53534       G11      Empty  84.88     4.57

[645 rows x 4 columns], 'G12':       SamplePos SampleName   Temp  465-580
53535       G12      Empty  20.01     6.92
53536       G12      Empty  20.01     6.92
53537       G12      Empty  20.16     6.86
53538       G12      Empty  20.32     6.87
53539       G12      Empty  20.40     6.85
...         ...        ...    ...      ...
54175       G12      Empty  84.47     4.04
54176       G12      Empty  84.59     4.02
54177       G12      Empty  84.67     4.00
54178       G12      Empty  84.76     4.00
54179       G12      Empty  84.88     4.01

[645 rows x 4 columns], 'G2':       SamplePos SampleName   Temp  465-580
47085        G2      Empty  20.01     7.21
47086        G2      Empty  20.01     7.17
47087        G2      Empty  20.16     7.17
47088        G2      Empty  20.32     7.14
47089        G2      Empty  20.40     7.14
...         ...        ...    ...      ...
47725        G2      Empty  84.47     4.07
47726        G2      Empty  84.59     4.10
47727        G2      Empty  84.67     4.12
47728        G2      Empty  84.76     4.10
47729        G2      Empty  84.88     4.09

[645 rows x 4 columns], 'G3':       SamplePos SampleName   Temp  465-580
47730        G3      Empty  20.01     7.34
47731        G3      Empty  20.01     7.32
47732        G3      Empty  20.16     7.31
47733        G3      Empty  20.32     7.29
47734        G3      Empty  20.40     7.28
...         ...        ...    ...      ...
48370        G3      Empty  84.47     4.19
48371        G3      Empty  84.59     4.18
48372        G3      Empty  84.67     4.18
48373        G3      Empty  84.76     4.17
48374        G3      Empty  84.88     4.19

[645 rows x 4 columns], 'G4':       SamplePos SampleName   Temp  465-580
48375        G4      Empty  20.01     6.96
48376        G4      Empty  20.01     6.97
48377        G4      Empty  20.16     6.99
48378        G4      Empty  20.32     6.98
48379        G4      Empty  20.40     6.92
...         ...        ...    ...      ...
49015        G4      Empty  84.47     3.98
49016        G4      Empty  84.59     3.99
49017        G4      Empty  84.67     3.99
49018        G4      Empty  84.76     3.99
49019        G4      Empty  84.88     3.99

[645 rows x 4 columns], 'G5':       SamplePos SampleName   Temp  465-580
49020        G5      Empty  20.01     7.50
49021        G5      Empty  20.01     7.47
49022        G5      Empty  20.16     7.49
49023        G5      Empty  20.32     7.49
49024        G5      Empty  20.40     7.47
...         ...        ...    ...      ...
49660        G5      Empty  84.47     4.31
49661        G5      Empty  84.59     4.32
49662        G5      Empty  84.67     4.31
49663        G5      Empty  84.76     4.29
49664        G5      Empty  84.88     4.31

[645 rows x 4 columns], 'G6':       SamplePos SampleName   Temp  465-580
49665        G6      Empty  20.01     7.44
49666        G6      Empty  20.01     7.45
49667        G6      Empty  20.16     7.44
49668        G6      Empty  20.32     7.42
49669        G6      Empty  20.40     7.41
...         ...        ...    ...      ...
50305        G6      Empty  84.47     4.27
50306        G6      Empty  84.59     4.28
50307        G6      Empty  84.67     4.27
50308        G6      Empty  84.76     4.26
50309        G6      Empty  84.88     4.28

[645 rows x 4 columns], 'G7':       SamplePos SampleName   Temp  465-580
50310        G7      Empty  20.01     7.65
50311        G7      Empty  20.01     7.64
50312        G7      Empty  20.16     7.63
50313        G7      Empty  20.32     7.61
50314        G7      Empty  20.40     7.59
...         ...        ...    ...      ...
50950        G7      Empty  84.47     4.35
50951        G7      Empty  84.59     4.37
50952        G7      Empty  84.67     4.36
50953        G7      Empty  84.76     4.34
50954        G7      Empty  84.88     4.36

[645 rows x 4 columns], 'G8':       SamplePos SampleName   Temp  465-580
50955        G8      Empty  20.01     7.64
50956        G8      Empty  20.01     7.62
50957        G8      Empty  20.16     7.61
50958        G8      Empty  20.32     7.61
50959        G8      Empty  20.40     7.60
...         ...        ...    ...      ...
51595        G8      Empty  84.47     4.39
51596        G8      Empty  84.59     4.40
51597        G8      Empty  84.67     4.39
51598        G8      Empty  84.76     4.38
51599        G8      Empty  84.88     4.36

[645 rows x 4 columns], 'G9':       SamplePos SampleName   Temp  465-580
51600        G9      Empty  20.01     7.41
51601        G9      Empty  20.01     7.43
51602        G9      Empty  20.16     7.41
51603        G9      Empty  20.32     7.37
51604        G9      Empty  20.40     7.38
...         ...        ...    ...      ...
52240        G9      Empty  84.47     4.27
52241        G9      Empty  84.59     4.25
52242        G9      Empty  84.67     4.26
52243        G9      Empty  84.76     4.23
52244        G9      Empty  84.88     4.25

[645 rows x 4 columns], 'H1':       SamplePos SampleName   Temp  465-580
54180        H1      Empty  20.01     7.14
54181        H1      Empty  20.01     7.08
54182        H1      Empty  20.16     7.06
54183        H1      Empty  20.32     7.03
54184        H1      Empty  20.40     7.07
...         ...        ...    ...      ...
54820        H1      Empty  84.47     4.04
54821        H1      Empty  84.59     4.03
54822        H1      Empty  84.67     4.07
54823        H1      Empty  84.76     4.02
54824        H1      Empty  84.88     4.04

[645 rows x 4 columns], 'H10':       SamplePos SampleName   Temp  465-580
59985       H10      Empty  20.01     7.59
59986       H10      Empty  20.01     7.62
59987       H10      Empty  20.16     7.56
59988       H10      Empty  20.32     7.52
59989       H10      Empty  20.40     7.58
...         ...        ...    ...      ...
60625       H10      Empty  84.47     4.36
60626       H10      Empty  84.59     4.40
60627       H10      Empty  84.67     4.37
60628       H10      Empty  84.76     4.37
60629       H10      Empty  84.88     4.36

[645 rows x 4 columns], 'H11':       SamplePos SampleName   Temp  465-580
60630       H11      Empty  20.01     7.46
60631       H11      Empty  20.01     7.45
60632       H11      Empty  20.16     7.39
60633       H11      Empty  20.32     7.39
60634       H11      Empty  20.40     7.39
...         ...        ...    ...      ...
61270       H11      Empty  84.47     4.29
61271       H11      Empty  84.59     4.33
61272       H11      Empty  84.67     4.29
61273       H11      Empty  84.76     4.29
61274       H11      Empty  84.88     4.28

[645 rows x 4 columns], 'H12':       SamplePos SampleName   Temp  465-580
61275       H12      Empty  20.01     7.61
61276       H12      Empty  20.01     7.59
61277       H12      Empty  20.16     7.55
61278       H12      Empty  20.32     7.59
61279       H12      Empty  20.40     7.55
...         ...        ...    ...      ...
61915       H12      Empty  84.47     4.32
61916       H12      Empty  84.59     4.35
61917       H12      Empty  84.67     4.34
61918       H12      Empty  84.76     4.35
61919       H12      Empty  84.88     4.33

[645 rows x 4 columns], 'H2':       SamplePos SampleName   Temp  465-580
54825        H2      Empty  20.01     7.01
54826        H2      Empty  20.01     7.02
54827        H2      Empty  20.16     6.97
54828        H2      Empty  20.32     6.97
54829        H2      Empty  20.40     6.96
...         ...        ...    ...      ...
55465        H2      Empty  84.47     4.01
55466        H2      Empty  84.59     4.01
55467        H2      Empty  84.67     4.02
55468        H2      Empty  84.76     3.99
55469        H2      Empty  84.88     3.99

[645 rows x 4 columns], 'H3':       SamplePos SampleName   Temp  465-580
55470        H3      Empty  20.01     7.24
55471        H3      Empty  20.01     7.25
55472        H3      Empty  20.16     7.22
55473        H3      Empty  20.32     7.20
55474        H3      Empty  20.40     7.18
...         ...        ...    ...      ...
56110        H3      Empty  84.47     4.12
56111        H3      Empty  84.59     4.12
56112        H3      Empty  84.67     4.12
56113        H3      Empty  84.76     4.12
56114        H3      Empty  84.88     4.11

[645 rows x 4 columns], 'H4':       SamplePos SampleName   Temp  465-580
56115        H4      Empty  20.01     7.27
56116        H4      Empty  20.01     7.25
56117        H4      Empty  20.16     7.20
56118        H4      Empty  20.32     7.23
56119        H4      Empty  20.40     7.24
...         ...        ...    ...      ...
56755        H4      Empty  84.47     4.14
56756        H4      Empty  84.59     4.17
56757        H4      Empty  84.67     4.11
56758        H4      Empty  84.76     4.12
56759        H4      Empty  84.88     4.12

[645 rows x 4 columns], 'H5':       SamplePos SampleName   Temp  465-580
56760        H5      Empty  20.01     6.72
56761        H5      Empty  20.01     6.72
56762        H5      Empty  20.16     6.69
56763        H5      Empty  20.32     6.70
56764        H5      Empty  20.40     6.69
...         ...        ...    ...      ...
57400        H5      Empty  84.47     3.83
57401        H5      Empty  84.59     3.83
57402        H5      Empty  84.67     3.84
57403        H5      Empty  84.76     3.84
57404        H5      Empty  84.88     3.82

[645 rows x 4 columns], 'H6':       SamplePos SampleName   Temp  465-580
57405        H6      Empty  20.01     6.96
57406        H6      Empty  20.01     6.98
57407        H6      Empty  20.16     6.94
57408        H6      Empty  20.32     6.93
57409        H6      Empty  20.40     6.90
...         ...        ...    ...      ...
58045        H6      Empty  84.47     3.97
58046        H6      Empty  84.59     4.00
58047        H6      Empty  84.67     3.95
58048        H6      Empty  84.76     3.99
58049        H6      Empty  84.88     3.95

[645 rows x 4 columns], 'H7':       SamplePos SampleName   Temp  465-580
58050        H7      Empty  20.01     7.49
58051        H7      Empty  20.01     7.45
58052        H7      Empty  20.16     7.40
58053        H7      Empty  20.32     7.41
58054        H7      Empty  20.40     7.40
...         ...        ...    ...      ...
58690        H7      Empty  84.47     4.24
58691        H7      Empty  84.59     4.27
58692        H7      Empty  84.67     4.24
58693        H7      Empty  84.76     4.22
58694        H7      Empty  84.88     4.23

[645 rows x 4 columns], 'H8':       SamplePos SampleName   Temp  465-580
58695        H8      Empty  20.01     6.75
58696        H8      Empty  20.01     6.75
58697        H8      Empty  20.16     6.74
58698        H8      Empty  20.32     6.68
58699        H8      Empty  20.40     6.73
...         ...        ...    ...      ...
59335        H8      Empty  84.47     3.90
59336        H8      Empty  84.59     3.89
59337        H8      Empty  84.67     3.90
59338        H8      Empty  84.76     3.89
59339        H8      Empty  84.88     3.89

[645 rows x 4 columns], 'H9':       SamplePos SampleName   Temp  465-580
59340        H9      Empty  20.01     7.15
59341        H9      Empty  20.01     7.13
59342        H9      Empty  20.16     7.12
59343        H9      Empty  20.32     7.12
59344        H9      Empty  20.40     7.08
...         ...        ...    ...      ...
59980        H9      Empty  84.47     4.11
59981        H9      Empty  84.59     4.13
59982        H9      Empty  84.67     4.10
59983        H9      Empty  84.76     4.08
59984        H9      Empty  84.88     4.14

[645 rows x 4 columns]}

We now plot the raw data for each well of the plate. We use the matplotlib.gridspec.GridSpec function to make a grid of plots. This takes a while.

WellsAll96=['A1','A2','A3','A4','A5','A6','A7','A8','A9','A10','A11','A12','B1','B2','B3','B4','B5','B6','B7','B8','B9','B10','B11','B12','C1','C2','C3','C4','C5','C6','C7','C8','C9','C10','C11','C12','D1','D2','D3','D4','D5','D6','D7','D8','D9','D10','D11','D12','E1','E2','E3','E4','E5','E6','E7','E8','E9','E10','E11','E12','F1','F2','F3','F4','F5','F6','F7','F8','F9','F10','F11','F12','G1','G2','G3','G4','G5','G6','G7','G8','G9','G10','G11','G12','H1','H2','H3','H4','H5','H6','H7','H8','H9','H10','H11','H12']

fig = plt.figure(figsize=(14,10), constrained_layout=True)
# We create a figure object. If we don't use constrained_layout, then labels overlap the axes.

gs1 = fig.add_gridspec(8, 12)
# We use gridspec to create grid-shaped combinations of graphs. P.S. an alternative is to use subplots.
# The number of rows (in our case 8) and number of columns (in our case 12) of the grid need to be set.

axs = []

for i, num in zip(WellsAll96, range(1,97)):
    axs.append(fig.add_subplot(gs1[num - 1]))
    axs[-1].plot(dict_of_wells[i]['Temp'] + 273.15, dict_of_wells[i]['465-580'])
    axs[-1].set_title(i)
    # We loop over all wells i using for. We have 96 wells, hence range(1,97).
    # We append each plot to the grid previously created. The title of each plot is the name of the well, e.g. A1, A2.
   
plt.show()
../_images/981ec301ceb604eac59ded79f625cd65d62a1da85363090a67758257e381f0a0.png

Let’s now fit all data corresponding to T4 Lysozyme WT* (i.e. A1 to D4, the other wells are empty) using the equation describing the unfolding of a monomer via a two-state mechanism but with temperature-independent enthalpy and entropy. We do first create an empty DataFrame with only column names, we will store the fitted melting temperatures in this DataFrame. We use the pandas.concat function in the loop to add rows to it.

dfObj = pd.DataFrame(columns=['SamplePos', 'Tm', 'Error'])

fig = plt.figure(figsize=(14,10), constrained_layout=True)
gs1 = fig.add_gridspec(4, 4)
axs = []

for i, num in zip(['A1','A2','A3','A4','B1','B2','B3','B4','C1','C2','C3','C4','D1','D2','D3','D4'], range(1,17)):
    
    x=dict_of_wells[i]['Temp'] + 273.15 # convert from °C to °K 
    y=dict_of_wells[i]['465-580']
    
    params, params_covariance = curve_fit(funcUFnoDCp, x, y,[6, -0.01, 150, 0.02, 402000, 330], maxfev=10000) # initial guess for curve_fit - this might not be a good estimate for each condition!
    
    dfAdd = pd.DataFrame({'SamplePos': [i], 'Tm': [params[5]], 'Error': [np.sqrt(np.diag(params_covariance))[5]]})
    
    dfObj = pd.concat((dfObj, dfAdd), axis = 0)
        
    axs.append(fig.add_subplot(gs1[num - 1]))
    axs[-1].plot(dict_of_wells[i]['Temp'] + 273.15, dict_of_wells[i]['465-580'])
    axs[-1].plot(x, funcUFnoDCp(x, *params), color="red",label='Fit')
    axs[-1].set_title(i)

plt.show()
print(dfObj)
../_images/62787d69da24b8c8d174309e45332524dee6d715675d24f62e17b83f9e66685f.png
  SamplePos          Tm     Error
0        A1  333.812832  0.012452
0        A2  333.365094  0.014226
0        A3  332.896370  0.021205
0        A4  331.564137  0.018647
0        B1  333.540712  0.021271
0        B2  333.053548  0.022692
0        B3  331.686003  0.015675
0        B4  329.483934  0.013724
0        C1  332.858759  0.024700
0        C2  332.166180  0.018651
0        C3  329.744508  0.014210
0        C4  327.951536  0.032072
0        D1  332.359852  0.021023
0        D2  331.910076  0.017261
0        D3  328.908492  0.023433
0        D4  326.209046  0.099373

We can see that wells C4, D3, and D4 - those wells with low amounts of protein and high amount of dye - do not give the expected, characteristic signal and, consequently, cannot be fitted nicely.

We can see that wells A4, B3, B4, C1, C2, C3, D1, and D2 do give the expected characteristic signal, but the overall fluorescence change is small (from 0 to <50).

We can conclude that the experimental conditions in wells A1, A2, A3, B1, and B2 are suitable. However, based on the overall fluorescence change, I am more inclined to choose the conditions of A1.