Many platereader workflows for E. coli start with growing overnight cultures of certain samples, measuring the OD600 and dilute all samples in a 96 well plate to a defined OD600 (e.g. 0.05). Depending on the number of samples, pipetting the test plate can easily take up to 45 minutes.
When first following this approach with V. natriegens, we realized that a different workflow is needed for the worlds fastest growing organism. We tested how much V. natriegens grows during the preparation of a full 96 well plate. We set up an experiment using a stationary culture of V. natriegens with a plasmid weakly expressing lux - to achieve realistic conditions - and diluted this culture 1 : 100 in a 96 well plate with one pipetting step taking 30 seconds. The result of this experiment can be seen in figure 1.
The data show an obvious trend towards higher OD for wells that were pipetted firstl. Seemingly, V. natriegens is able to recover from stationary phase and undergo almost one cell division in 45 minutes at room temperature. Please note that performing this experiment with a culture in the exponential phase, as described in some E. coli protocols, would most likely result in an even stronger trend.
With this in mind, we tried to establish a workflow that omits measuring and independently diluting individual wells. We tested to cultivate our precultures - inoculated from glycerol stocks - directly in 96 well plates and incubated this plate for five to six hours in a platereader or shaking incubator. For V. natriegens, this time frame is sufficient for all cultures to reliably reach stationary phase which equals an overnight culture for E. coli. The cultures are then diluted in two steps: 1:50 and 1:40, finally resulting in a 1:2000 dilution of the preculture. Compared to the commonly used workflows for E. coli, our approach does not consider the OD600 of individual wells but instead dilutes all cultures by the same factor.
The OD600 after 1:50 dilution of the 96 well plate is shown in figure 2. Despite not calculating dilutions for individual wells, the range of values is explicitly smaller and additionally no positional bias can be observed.
Moreover, we realized that inoculating with a low cell number is advantageous when working with V. natriegens. This prolongs the exponential phase, the period in which most relevant data are acquired. A 1:2000 dilution results in a cell density much lower than the inoculum used in most E. coli experiments.The subsequent, kinetic measurement can be completed in as less as five to six hours. Besides the experimental workflow, we established an approach for fast and accurate data analysis. From a mathematical point of view, constant expression and constant degradation result in a steady state level of a molecule. In the context of bacterial reporter experiments, the molecule is a reporter protein or enzyme and the steady state level. That represents a constant signal to OD600 ratio, meaning a constant reporter concentration in the growing cells. For a stable reporter, constant degradation is actually due to dilution by cell division. Thus, the degradation rate mainly depends on the growth rate.
To conclude, we assumed that a constant signal to OD600 ratio is achieved throughout the exponential phase since the growth rate, as well as the expression from constitutive or constantly induced promoters remains stable.
With this in mind, we aimed to create an algorithm identifying the exponential growth phase and calculating the signal to OD600 ratio. In our first experiments we tried to identify a point in time at which all cultures grow exponentially, and failed. We were not able to obtain reproducible data for two reasons. Firstly, cultures grow differently, depending on the starting concentration and fitness differences caused by varying test constructs and expression strengths. Secondly, individual measurements are highly variable (we saw this especially for OD600 measurements). Therefore performing calculations with a single value is highly susceptible to outliers.
We solved both issues by developing a Matlab script that identifies the exponential phase and includes a range of seven measuring points for each individual well. The culture is assumed to be in the mid exponential phase at an OD600 of 0.2. Three timepoints (5 min intervals), each before and after the culture has first reached 0.2, are taken. Then the mean of all signal to OD600 ratios is calculated. Through this calculation, a single value is assigned to each well representing the strength of reporter expression in the exponential phase. All samples were measured in four technical replicates in three subsequent independent experiments.
Consequently, every result (e.g. promoter strength) is, in total, the mean of 84 measurements. This high number of raw data leads to a high degree of reproducibility and, as we believe, to highly accurate characterization data.
clear all close all %% Import Platereader raw data Lux_Data_raw_Day1 = xlsread('Connector_Lux_071018.xlsx','All Cycles'); OD_Data_raw_Day1 = xlsread('Connector_OD_071018.xlsx','All Cycles'); Lux_Data_raw_Day2 = xlsread('Connector_Lux_071018_2.xlsx','All Cycles'); OD_Data_raw_Day2 = xlsread('Connector_OD_071018_2.xlsx','All Cycles'); Lux_Data_raw_Day3 = xlsread('Connector_Lux_081018.xlsx','All Cycles'); OD_Data_raw_Day3 = xlsread('Connector_OD_081018.xlsx','All Cycles'); %% Merge all data in two matrices OD_Data(:,:,1) = OD_Data_raw_Day1; OD_Data(:,:,2) = OD_Data_raw_Day2; OD_Data(:,:,3) = OD_Data_raw_Day3; Lux_Data(:,:,1) = Lux_Data_raw_Day1; Lux_Data(:,:,2) = Lux_Data_raw_Day2; Lux_Data(:,:,3) = Lux_Data_raw_Day3; %% Blank substraction and cut off for h = 1:size(Lux_Data,3) for k = 1:size(Lux_Data,2) Blank = mean(Lux_Data([60,72,84,96],k,h)); for j = 1:size(Lux_Data,1) Lux_Data(j,k,h) = Lux_Data(j,k,h)-Blank; if Lux_Data(j,k,h) < 50 Lux_Data(j,k,h) = 50; % Cut off for Lux signal end end end end for h = 1:size(OD_Data,3) for k = 1:size(OD_Data,2) Blank = mean(OD_Data([60,72,84,96],k,h)); for j = 1:size(OD_Data,1) OD_Data(j,k,h) = OD_Data(j,k,h)-Blank; if OD_Data(j,k,h) < 0.01 OD_Data(j,k,h) = 0.01; % Cut off for OD end end end end %% Calculating ratio around OD 0.2 Ratios = zeros(size(OD_Data,1),1,3); for q = 1:size(OD_Data,3) % looping over days for o = 1:size(OD_Data,1) % looping over samples for p = 1:size(OD_Data,2)-3 % looping through time points if OD_Data(o,p,q) > 0.2 && OD_Data(o,p+1,q) > 0.2 && Ratios(o,q) == 0 Ratios(o,q) = mean(Lux_Data(o,p-3:p+3,q)./OD_Data(o,p-3:p+3,q)); end end end end %% Calculating mean and std of individial samples for k = 1:12 Samples(k,1,1:3) = mean(Ratios([k,k+12,k+24,k+36],:)); % calculate mean of technical triplicates Samples(k,2,1:3) = std(Ratios([k,k+12,k+24,k+36],:)); % calculate std of technical triplicates end for k = 13:24 Samples(k,1,1:3) = mean(Ratios([k+36,k+48,k+60,k+72],:)); % calculate mean of technical triplicates Samples(k,2,1:3) = std(Ratios([k+36,k+48,k+60,k+72],:)); % calculate std of technical triplicates end %% Sort samples for top and bottom row Names = {'J23100', '5Con1 long','5Con2 long','5Con3 long','5Con4 long',... '5Con5 long','5Con1 short','5Con2 short','5Con3 short',... '5Con4 short','5Con5 short','5Con1 long','5Con2 long','5Con3 long',... '5Con4 long','5Con5 long','5Con1 short','5Con2 short','5Con3 short',... '5Con4 short','5Con5 short', 'Promoter Dummy'}; Top_row = Samples(1:11,:,:); Bot_row = Samples(13:23,:,:); SortedValues = []; for k = 1:size(Top_row,1) SortedValues = [SortedValues; Top_row(k,:,:); Bot_row(k,:,:)]; end SortedValues = [SortedValues;Samples(12,:,:)]; SortedValues(22,:,:) = []; %% Calculate relativ strength Relative_strength = SortedValues; for h = 1:size(SortedValues,3) for k = 1:size(SortedValues,1) Relative_strength(size(SortedValues,1)-k+1,2,h) = ... Relative_strength(size(SortedValues,1)-k+1,2,h)/Relative_strength(1,1,h); Relative_strength(size(SortedValues,1)-k+1,1,h) = ... Relative_strength(size(SortedValues,1)-k+1,1,h)/Relative_strength(1,1,h); end end %% plot relative strenths figure(1) % constructs with J23100 hold on bar(mean(Relative_strength([1:11,22],1,1:3),3),'facecolor',[125/255,202/255,97/255]) errorbar((mean(Relative_strength([1:11,22],1,1:3),3)),... std(Relative_strength([1:11,22],1,1:3),1,3),'linestyle','none','color','k') set(gca, 'YScale', 'log') ylabel('normalized Luminescence/OD_6_0_0') set(gca,'Color','w') xticks([1:12]) xticklabels(Names([1:11,22])) xtickangle(45) ylim([0.001 3]) yticks([0.001,0.01,0.05, 0.1, 0.5, 1.0, 2.0 ]) yticklabels([0.001,0.01,0.05, 0.1, 0.5, 1.0, 2.0]) figure(2) % constructs with promoter dummy hold on bar(mean(Relative_strength([1,12:22],1,1:3),3),'facecolor',[125/255,202/255,97/255]) errorbar((mean(Relative_strength([1,12:22],1,1:3),3)),... std(Relative_strength([1,12:22],1,1:3),1,3),'linestyle','none','color','k') set(gca, 'YScale', 'log') ylabel('normalized Luminescence/OD_6_0_0') set(gca,'Color','w') xticks([1:12]) xticklabels(Names([1,12:22])) xtickangle(45) ylim([0.001 3]) yticks([0.001,0.01,0.05, 0.1, 0.5, 1.0, 2.0 ]) yticklabels([0.001,0.01,0.05, 0.1, 0.5, 1.0, 2.0])