!pip install nucleus-cdk==0.5.0rc2 | tail -n2

# Surface a failed install here, rather than as a confusing ModuleNotFoundError
# in the import cell below.
import importlib.metadata as md
assert md.version("nucleus-cdk") == "0.5.0rc2", f"got {md.version('nucleus-cdk')}"
print("nucleus-cdk", md.version("nucleus-cdk"))
Requirement already satisfied: asttokens in /opt/homebrew/anaconda3/lib/python3.12/site-packages (from stack-data->ipython>=6.1.0->ipywidgets==8.*->jupyter-bokeh<5.0.0,>=4.0.5->nucleus-cdk==0.5.0rc2) (2.0.5)
Requirement already satisfied: pure-eval in /opt/homebrew/anaconda3/lib/python3.12/site-packages (from stack-data->ipython>=6.1.0->ipywidgets==8.*->jupyter-bokeh<5.0.0,>=4.0.5->nucleus-cdk==0.5.0rc2) (0.2.2)
nucleus-cdk 0.5.0rc2
import pandas as pd

import matplotlib.pyplot as plt
import seaborn as sns

from cdk.analysis.cytosol import platereader as pr
data, platemap = pr.load_platereader_data(
    data_file='data/20260330-123133-cytation5-pure-timecourse-gfp-MFG-196,MFG-194,MFG-193-QC-biotek-cdk.txt',
    platemap_file='data/platemap.tsv',
    platereader="biotek-cdk"
)
data['Time_h'] = data['Time'].dt.total_seconds()/3600
platemap[platemap.Type == 'Standard'].Name.value_counts(dropna=False)
Name 1 uM Fluorescein 3 Name: count, dtype: int64
data = pr.normalize_data_to_controls(data, '1 uM Fluorescein')
Data Normalized to 1 uM Fluorescein in col data_normalized. The active column for subsequent operations is: data_normalized
sns.relplot(data, x='Time_h', y='data_normalized', hue="tRNA ID")
ax = plt.gca()
ax.set_xlabel('Time (h)')
ax.set_ylabel('Normalized fluorescence')
<Figure size 610.438x500 with 1 Axes>