Transformation efficiency


Transformation efficiency calculations are not designed for high throughput, nor automated setups. This is how I handle transformation efficiency in my own lab.

TE formula

The classic transformation efficiency formula is:

TE = Colonies/ug/Dilution
. For example, lets say I transform 100pg of pUC19 into 10uL of cells, and outgrow with 50uL of media. Then, 30uL (or half) is plated, and 100 colonies are counted. The formula works out like this:

colonies = 100
dna = 0.0001ug (100pg)
dilution = 0.5
TE = 100 / 0.0001 / 0.5 = 2x10^6

While this works for simple manual protocols, more information is needed in order to optimize transformation protocols robotically. I have 3 numbers I calculate for every protocol:

Let's use data from a real experiment that I just ran with a very unoptimized protocol:

import statistics
from typing import List

def te(colonies: int, fmol: float, dilution: float) -> float:
    return colonies/fmol/dilution

def adjust_colonies(colonies: List[int], fmol: float, dilution: List[float]) -> List[float]:
    l = []
    for idx, count in enumerate(colonies):
        l.append(te(count, fmol, dilution[idx]))
    return l

def tte(colonies: List[int], fmol: float, dilution: List[float]) -> float:
    return statistics.mean(adjust_colonies(colonies, fmol, dilution))

def intra_deviation(colonies: List[int], fmol: float, dilution: List[float]) -> float:
    return statistics.stdev(adjust_colonies(colonies, fmol, dilution))

def inter_deviation(ttes: List[float]) -> float:
    return statistics.stdev(ttes)

# Real data
# Dilutions: I plate 5uL, but dilute by 7.5uL for an initial 20uL
dilutions = [0.25, 0.25*0.625, 0.25*0.625*0.625, 0.25*0.625*0.625*0.625]
fmol = 1
a5_a8_colonies = [9,14,0,1]
a9_a12_colonies = [5,5,1,1]

# tte
print("{:.2f}".format(tte(a5_a8_colonies, fmol, dilutions)))
print("{:.2f}".format(tte(a9_a12_colonies, fmol, dilutions)))

# intra
print("{:.2f}".format(intra_deviation(a5_a8_colonies, fmol, dilutions)))
print("{:.2f}".format(intra_deviation(a9_a12_colonies, fmol, dilutions)))

# inter
print("{:.2f}".format(inter_deviation([tte(a5_a8_colonies, fmol, dilutions), tte(a9_a12_colonies, fmol, dilutions)])))

And the results:


That there is some deviation! Visually, this is very apparent, but it is good to put numbers to it. I'll be updating this page as I get more real data and experience.