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.

Table of Contents

  1. Setup and Import

  2. Load Data

  3. Normalize Data

  4. Plot Raw Curves

  5. Kinetic Analysis

  6. Summary Plots

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.

  • data_file is the location of your platereader data (ideally in biotek-cdk format)

  • platemap_file: location of your platemap CSV with Well and experimental conditions

  • load_platereader_data() reads your plate reader output file and parses it into a standardized format with the platemap integrated

  • The resulting DataFrame contains columns: Well, Row, Column, Time, Seconds, Temperature (C), Read, Data, plus any columns from your platemap

  • Data column contains fluorescence measurements (RFU - Relative Fluorescence Units)

  • Time representing elapsed time

# 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()
Loading...

4. Plot Raw Curves

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

  • plot_curves_by_name() creates line plots with time on x-axis and fluorescence (Data) on y-axis

  • Each line represents one well, colored by the Name column (experimental condition)

  • If you have multiple gain data, they’ll be plotted in separate subplots (but you should choose one to move forward with)

  • This visualization helps you spot outliers, failed reactions, or unexpected kinetics before fitting

g = pr.plot_curves(data=data)
<Figure size 735.75x500 with 1 Axes>

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)
<Figure size 735.75x500 with 1 Axes>

5. Kinetic Analysis

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

  • kinetic_analysis() fits a sigmoid curve (with optional drift term) to each replicate well

  • The model: y(t)=L1+ek(tt0)+b(tτ)y(t) = \frac{L}{1 + e^{-k(t - t_0)}} + b(t - \tau)

    • LL: Steady-state level (asymptote)

    • kk: Growth rate (steepness)

    • t0t_0: Inflection point (time of max velocity)

    • bb: Drift rate (fluorescence change after steady-state)

    • τ\tau: Drift onset time

  • Metrics extracted:

    • Vmax (Velocity Max): Maximum rate of fluorescence increase (slope at inflection point)

    • Lag time: Time to reach the exponential phase

    • Steady-state: Final fluorescence level and time to reach 95% of asymptote

    • Drift: Rate of signal decay or increase after steady-state

    • : Goodness of fit

# 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
Loading...

Visualize Fits on Individual Wells

What’s happening:

  • plot_kinetics_by_well() overlays fitted curves and kinetic parameters on raw data

  • Visual inspection ensures fits are reasonable (high R², smooth curves)

  • Annotations show where Vmax, lag time, and steady-state occur

# Plot kinetic fits 
g, kinetics = pr.plot_kinetics(data, kinetics=kinetics, group_by=["Name"])
<Figure size 1800x800 with 6 Axes>

6. Summary Plots

Compare kinetic parameters across experimental conditions.

  • The plot_kinetics_summary() function creates a comprehensive multi-panel figure with raw curves, steady-state, Vmax, and drift

  • Bar plots compare kinetic metrics across conditions

  • Steady-state: Final protein expression level (proxy for yield)

  • Vmax: Maximum rate of protein synthesis

  • Drift: Signal stability (photobleaching, aggregation, continued synthesis...etc)

  • Error bars show std across technical replicates

pr.plot_summary(data)
<Figure size 1500x500 with 4 Axes>

Key Metrics Explained

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

  • The final fluorescence value reached by the reaction

  • Represents the total amount of protein produced

  • Higher values indicate greater expression yield

2. Maximum Velocity (Velocity, Max)

  • The steepest slope of the fluorescence curve (at the inflection point)

  • Units: RFU per second

  • Reflects the peak rate of protein synthesis

  • Sensitive to enzyme activity, substrate availability, and reaction conditions

3. Lag Time (Lag, Time)

  • Time before exponential fluorescence increase begins

  • May reflect time for ribosome assembly or initial translation steps

  • Shorter lag times suggest faster reaction initiation

4. Drift (Fit, drift)

  • Rate of fluorescence change after reaching steady-state

  • Positive drift: continued synthesis or aggregation

  • Negative drift: photobleaching, protein degradation, or quenching

  • Units: RFU per second

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

  • Goodness of fit (0 to 1, higher is better)

  • R² > 0.98 indicates excellent fit

  • Poor fits may indicate noisy data, overflow errors, or non-sigmoid kinetics

Tips and Troubleshooting

  • Overflow errors: Wells with OVRFLW or NaN values are automatically excluded from fitting

  • Poor fits (low R²): Inspect raw curves for anomalies (bubbles, evaporation, pipetting errors)

  • Drift: Sometimes seen in kinetics curves; use sigmoid_drift model

  • Multiple replicates: Always include technical replicates and report error bars

  • Comparing conditions: Normalize or blank data consistently across all samples

Next Steps

  • Export kinetics results: pr.export_kinetics(kinetics, 'results.csv')

  • Statistical analysis: Use scipy.stats or statsmodels for ANOVA/t-tests

  • Parameter optimization: Vary Mg²⁺, K⁺, or other conditions to maximize Vmax or steady-state

  • Mechanistic modeling: Fit ODE models to extract biological rate constants