Calculate DNA, RNA, and oligonucleotide concentration from spectrophotometer A260 absorbance values. Analyze A260/A280 and A260/A230 purity ratios, correct for NanoDrop pathlengths, and convert directly to molarity—100% locally in your browser with zero server uploads.
Optimal dsDNA purity. Minimal protein or phenol contamination.
Clean sample. Free of chaotropic salts, Trizol, and carbohydrates.
Convert DNA mass concentration (ng/µL) to molar concentration (nM, µM) and molecular copy numbers per microliter using construct length or molecular weight.
Quantify and calculate purity across multiple tubes simultaneously with CSV export.
| Sample Name | Type | A260 | A280 | A230 | Dil. | Vol (µL) | Conc (ng/µL) | A260/280 | A260/230 | Yield (µg) | Action |
|---|
Spectrophotometric quantification of nucleic acids relies on the fundamental physical principle known as the Beer-Lambert Law. When monochromatic ultraviolet light at a wavelength of 260 nm passes through a quartz cuvette or microvolume liquid pedestal, the purine (adenine, guanine) and pyrimidine (cytosine, thymine, uracil) aromatic rings absorb photons through resonance transitions of their conjugated \(\pi\)-electron systems.
Where:
Rearranging the equation to solve directly for concentration \(c\) yields our core calculator formula:
Different nucleic acid structures possess varying degrees of base stacking and hydrogen bonding, leading to the phenomenon known as hypochromicity. In double-stranded duplex DNA, close stacking of aromatic base pairs diminishes light absorbance. When duplex DNA denatures into single strands, base exposure increases, causing hyperchromicity (an increase in A260 absorbance).
| Nucleic Acid Molecule | Standard Factor (\(1.0\text{ OD}_{260}\)) | Extinction Coefficient \(\epsilon_{260}\) | Typical Application |
|---|---|---|---|
| Double-Stranded DNA (dsDNA) | 50.0 µg/mL (ng/µL) | 0.020 (µg/mL)⁻¹ cm⁻¹ | Plasmids, Genomic DNA, PCR Amplicons, Cosmid libraries |
| Single-Stranded DNA (ssDNA) | 33.0 µg/mL (ng/µL) | 0.030 (µg/mL)⁻¹ cm⁻¹ | M13 phage DNA, Denatured templates, Viral ssDNA genomes |
| Single-Stranded RNA (ssRNA) | 40.0 µg/mL (ng/µL) | 0.025 (µg/mL)⁻¹ cm⁻¹ | Total RNA, mRNA transcripts, in vitro transcribed RNA, viral RNA |
| Synthetic Oligonucleotides / Primers | 33.0 µg/mL (ng/µL) | 0.030 (µg/mL)⁻¹ cm⁻¹ | PCR primers, qPCR hydrolysis probes, sequencing adaptors |
Optical density measurements at isolated wavelengths provide valuable quality control metrics before embarking on costly downstream sequencing or transfection experiments:
Aromatic amino acids in proteins—predominantly tryptophan and tyrosine—have an absorbance peak at \(280\text{ nm}\).
Many extraction reagents absorb strongly at \(230\text{ nm}\), including chaotropic binding salts, detergents, and polysaccharides.
Understanding your instrument's optical configuration prevents systematic quantification errors:
NanoDrop instruments utilize surface tension to draw a \(1\text{ to }2\text{ \mu L}\) liquid column between two optical fibers. The instrument dynamically shifts physical path lengths between \(1.0\text{ mm}\), \(0.2\text{ mm}\), and \(0.05\text{ mm}\) to maintain the linear Beer-Lambert range without manual dilution.
✓ Crucial Tip: NanoDrop software automatically normalizes and displays all absorbance values as standard 10 mm (1.0 cm) equivalents. Enter displayed values directly with path length set to 10 mm.
Traditional UV-Vis spectrophotometers require \(50\text{ to }1000\text{ \mu L}\) in a specialized UV-transparent quartz or cyclic olefin cuvette with a fixed \(1.0\text{ cm}\) (\(10\text{ mm}\)) path. Plastic standard cuvettes absorb UV light below \(300\text{ nm}\) and will produce completely invalid high absorbance readings.
✓ Crucial Tip: Ensure your sample A260 reading falls strictly between 0.100 and 1.000 OD units to remain in the photodetector's linear dynamic range.
For high-throughput lab automation and processing multi-well plate reader export files, use this Python script:
import numpy as np
import pandas as pd
def calculate_dna_concentration(
a260: float,
a280: float = None,
a230: float = None,
a320: float = 0.0,
factor: float = 50.0, # dsDNA = 50.0, ssDNA = 33.0, RNA = 40.0
dilution_factor: float = 1.0,
path_length_cm: float = 1.0,
volume_ul: float = None,
length_bp: int = None
):
# Correct for turbidity baseline drift
a260_corr = max(0.0, a260 - a320)
# Calculate Concentration in ng/µL (identical to µg/mL)
conc_ng_ul = (a260_corr * factor * dilution_factor) / path_length_cm
# Calculate Purity Ratios
r260_280 = None
if a280 is not None and (a280 - a320) > 0:
r260_280 = round(a260_corr / (a280 - a320), 2)
r260_230 = None
if a230 is not None and (a230 - a320) > 0:
r260_230 = round(a260_corr / (a230 - a320), 2)
# Total Yield in micrograms
yield_ug = round((conc_ng_ul * volume_ul) / 1000.0, 2) if volume_ul else None
# Molarity & Copy Number
molarity_nm = None
copies_per_ul = None
if length_bp and length_bp > 0 and conc_ng_ul > 0:
mw = length_bp * 660.0 # dsDNA average molecular weight (g/mol)
molarity_nm = round((conc_ng_ul * 1e6) / mw, 2)
copies_per_ul = (conc_ng_ul * 1e-9 * 6.02214076e23) / mw
return {
"concentration_ng_ul": round(conc_ng_ul, 2),
"ratio_260_280": r260_280,
"ratio_260_230": r260_230,
"yield_ug": yield_ug,
"molarity_nm": molarity_nm,
"copies_per_ul": f"{copies_per_ul:.2e}" if copies_per_ul else None
}
# Example Usage: Plasmid DNA Miniprep
sample = calculate_dna_concentration(
a260=1.650, a280=0.890, a230=0.780, a320=0.002,
factor=50.0, volume_ul=50, length_bp=3000
)
print("DNA Quantification Report:", sample)
# Output: {'concentration_ng_ul': 82.4, 'ratio_260_280': 1.86, 'ratio_260_230': 2.12, 'yield_ug': 4.12, 'molarity_nm': 41.62, 'copies_per_ul': '2.51e+10'}
Authoritative answers to common questions about spectrophotometric DNA quantification, purity ratios, and laboratory protocol standards.
def calc_dna(a260, a280=None, a230=None, a320=0.0, factor=50.0, dilution=1.0, path_cm=1.0, vol_ul=None): a260_corr = max(0.0, a260 - a320); conc = (a260_corr * factor * dilution) / path_cm; r260_280 = (a260_corr / (a280 - a320)) if a280 and (a280 - a320) > 0 else None; r260_230 = (a260_corr / (a230 - a320)) if a230 and (a230 - a320) > 0 else None; yield_ug = (conc * vol_ul / 1000.0) if vol_ul else None; return {'conc_ng_ul': conc, 'ratio_260_280': r260_280, 'ratio_260_230': r260_230, 'yield_ug': yield_ug}.