Analysis (20250220)

!pip install nucleus-cdk | tail -n2
%load_ext autoreload
%autoreload 2

from cdk.analysis.cytosol import platereader as pr
import matplotlib.pyplot as plt
import seaborn as sns
import warnings

warnings.filterwarnings('ignore')
pr.plot_setup()
data, platemap = pr.load_platereader_data(
    data_file="../02-data/20250220-MTHFS-02.txt", 
    platemap_file="../01-design/platemap.tsv", 
    platereader="biotek"
)
data
pr.plot_plate(data)
<seaborn.axisgrid.FacetGrid at 0x6ffcdf959d60>
<Figure size 5151.38x500 with 10 Axes>
names_to_remove = ['5,10-methenyl-THF', 
                   'folinic + BE MTHFS (1 uL)', 
                   'folinic + BE MTHFS (1.61 uL)',
                   'NEB ribosome control']

replace_dict = {'no folinic acid':'no Folinic Acid',
                'no folinic + 5,10-methenyl-THF':'5,10-methenyl-THF',
                'folinic':'Folinic Acid',
                'folinic + MTHFS (0.5 uL)':'Folinic Acid + MTHFS'}

custom_order = ['no Folinic Acid', 
                'Folinic Acid', 
                'Folinic Acid + MTHFS', 
                '5,10-methenyl-THF', 
                'Positive', 
                'Negative']

data_drop = data.drop(data[data['Name'].isin(names_to_remove)].index)
data_drop['Name'] = data_drop['Name'].replace(replace_dict)
# Generate the plot (assuming `pr.plot_curves` returns a FacetGrid object)
sns.set_palette('colorblind')
g = pr.plot_curves(data_drop, hue_order=custom_order)
g.set_xticklabels(rotation=30)
plt.xlim([0,0.35])

plt.savefig("MTHFS_kinetics.png");
<Figure size 695.75x500 with 1 Axes>
pr.plot_steadystate(data_drop, order=custom_order, palette='colorblind')

plt.savefig("MTHFS_endpoint.png");
<Figure size 600x400 with 1 Axes>
kinetics = pr.kinetic_analysis(data_drop)
kinetics = pr.kinetic_analysis(data)
pr.plot_kinetics(data, kinetics)
<Figure size 1800x1600 with 10 Axes>
ax = sns.barplot(data=kinetics["Steady State"], y="Name", x="Time", orient="y")
ax.set_title("Time to Steady State")
pr._plot_timedelta(ax)
<Figure size 640x480 with 1 Axes>
ax = sns.barplot(data=kinetics["Velocity"], y="Name", x="Max", orient="y")
ax.set_title("Maximum velocity")
ax.set_xlabel("$V_{max}$ (u/s)")
<Figure size 640x480 with 1 Axes>

Annotate plots

Format time

import pandas as pd

def format_timedelta(td):
    if pd.isna(td):
        return ''
    
    # Convert to seconds
    total_seconds = td.total_seconds()
    
    # Calculate hours, minutes, seconds
    hours = int(total_seconds // 3600)
    minutes = int((total_seconds % 3600) // 60)
    seconds = int(total_seconds % 60)
    
    # Format as HH:MM:SS
    return f"{hours:02d}:{minutes:02d}:{seconds:02d}"
    
bonk = kinetics.xs("Time", level=1, axis=1).map(format_timedelta)
bonk.to_excel("bonk-time.xlsx")
kinetics