Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

This tutorial guides you through analyzing time-series fluorescence data from PURE (Protein synthesis Using Recombinant Elements) cell-free expression experiments. We’ll cover data loading, normalization, visualization, kinetic parameter fitting, and summary statistics.

1. Setup

First, import the necessary libraries and set up the plotting environment.

The custom platereader module that contains specialized functions for loading plate reader data, performing kinetic analysis, and visualization. The plot_setup() function configures matplotlib for time-series plots.

%load_ext autoreload
%autoreload 2
    
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

# Import the cdk platereader module
from cdk.analysis.cytosol import platereader as pr

# Set up plotting
pr.plot_setup()

2. Load Data

Load your plate reader data and merge it with the platemap that describes experimental conditions.

# Specify file paths
data_file = "sample-data/20251111-122213-cytation5-pure-timecourse-gfp-MFG-98-tRNA-QC-biotek-cdk.txt"
platemap_file = "sample-data/platemap.csv"


# Load data
data, platemap = pr.load_platereader_data(
    data_file=data_file,
    platemap_file=platemap_file,
    platereader="biotek-cdk"  # Options: "cytation", "envision", "biotek-cdk"
)

# Checkout first few rows
data.head()
TimeWellDataRowColumnReadPlateClock TimeDateExperiment Name...DNA ID[DNA] (ng/uL)PMix Vol (uL)Ribosome Vol (uL)SMS Vol (uL)tRNA Vol (uL)DNA Vol (uL)RNase Inhib Vol (uL)Water vol (uL)Rxn Volume (uL)
00 days 00:00:33B2245B2GFP-GextPlate 12025-11-11 12:24:3711/11/2025MFG-98-tRNA-QC...AR-805120.003.00NaN3.001.000.500.502.0010.00
10 days 00:05:33B2254B2GFP-GextPlate 12025-11-11 12:29:3711/11/2025MFG-98-tRNA-QC...AR-805120.003.00NaN3.001.000.500.502.0010.00
20 days 00:10:33B2249B2GFP-GextPlate 12025-11-11 12:34:3711/11/2025MFG-98-tRNA-QC...AR-805120.003.00NaN3.001.000.500.502.0010.00
30 days 00:15:33B2230B2GFP-GextPlate 12025-11-11 12:39:3711/11/2025MFG-98-tRNA-QC...AR-805120.003.00NaN3.001.000.500.502.0010.00
40 days 00:20:33B2265B2GFP-GextPlate 12025-11-11 12:44:3711/11/2025MFG-98-tRNA-QC...AR-805120.003.00NaN3.001.000.500.502.0010.00

5 rows × 29 columns

4. Plot Raw Curves

Visualize the time-series fluorescence data to inspect curve shapes and identify any issues.

g = pr.plot_curves(data=data)
png

3. Normalize Data

Normalize your data to an internal fluorescence sample so that you have relative fluorescence to compare to other experiments.

data = pr.normalize_data_to_controls(data, ctrl_name = '10 uM HPTS')
Data Normalized to 10 uM HPTS in col data_normalized. The active column for subsequent operations is: data_normalized

Now replot your curves to see them normalized

g = pr.plot_curves(data=data)
png

5. Kinetic Analysis

Fit sigmoid curves to the data to extract kinetic parameters: maximum velocity (Vmax), lag time, steady-state level, and drift.

# Perform kinetic analysis using sigmoid_drift model
kinetics = pr.kinetic_analysis(
    data=data,
    group_by=['Name'],  # Group by experimental condition
)

kinetics.head()
PROVIDING AVERAGED KINETICS
VelocityLagSteady StateFit
Timedata_normalizedMaxTimedata_normalizedTimedata_normalizedparamsR^2drift
Name
NEB Positive Control0 days 01:34:45.6167156962.252.690 days 00:44:28.6887047780.300 days 02:48:47.1969315044.28[4.501773951041968, 2.3866385500131293, 1.5793...1.000.08
tRNA AR-730 (Rxn Control)0 days 01:29:01.5401933082.192.340 days 00:32:45.1127641550.190 days 02:51:52.3824592174.17[4.384380953592719, 2.1324521783287356, 1.4837...1.000.07
tRNA AR-8360 days 01:31:43.7993204282.522.560 days 00:32:30.3339695220.210 days 02:58:55.2802649604.79[5.0426505851597225, 2.0266336639016616, 1.528...1.000.07
tRNA AR-8370 days 01:32:27.2737083342.582.660 days 00:34:09.1469832460.240 days 02:58:17.2840495504.90[5.161645765443068, 2.0583942112412883, 1.5409...1.000.07
tRNA AR-8380 days 01:31:47.9217835142.312.410 days 00:34:09.1561255970.220 days 02:56:39.9839942404.39[4.622649794838434, 2.081776126751595, 1.52997...1.000.06

Visualize Fits on Individual Wells

What’s happening:

# Plot kinetic fits 
g, kinetics = pr.plot_kinetics(data, kinetics=kinetics, group_by=["Name"])
png

6. Summary Plots

Compare kinetic parameters across experimental conditions.

pr.plot_summary(data)
png

Key Metrics Explained

1. Steady-State Level (Steady State, Data)

2. Maximum Velocity (Velocity, Max)

3. Lag Time (Lag, Time)

4. Drift (Fit, drift)

5. R² Value (Fit, R^2)

Tips and Troubleshooting

Next Steps