Files
gh-k-dense-ai-claude-scient…/skills/opentrons-integration/scripts/serial_dilution_template.py
2025-11-30 08:30:10 +08:00

97 lines
3.1 KiB
Python

#!/usr/bin/env python3
"""
Serial Dilution Protocol Template
This template demonstrates how to perform a serial dilution across a plate row.
Useful for creating concentration gradients for assays.
"""
from opentrons import protocol_api
metadata = {
'protocolName': 'Serial Dilution Template',
'author': 'Opentrons',
'description': 'Serial dilution protocol for creating concentration gradients',
'apiLevel': '2.19'
}
requirements = {
'robotType': 'Flex',
'apiLevel': '2.19'
}
def run(protocol: protocol_api.ProtocolContext):
"""
Performs a serial dilution across plate rows.
Protocol performs:
1. Adds diluent to all wells except the first column
2. Transfers stock solution to first column
3. Performs serial dilutions across rows
"""
# Load labware
tips = protocol.load_labware('opentrons_flex_96_tiprack_200ul', 'D1')
reservoir = protocol.load_labware('nest_12_reservoir_15ml', 'D2', label='Reservoir')
plate = protocol.load_labware('corning_96_wellplate_360ul_flat', 'D3', label='Dilution Plate')
# Load pipette
p300 = protocol.load_instrument('p300_single_flex', 'left', tip_racks=[tips])
# Define liquids (optional, for visualization)
diluent = protocol.define_liquid(
name='Diluent',
description='Buffer or growth media',
display_color='#B0E0E6'
)
stock = protocol.define_liquid(
name='Stock Solution',
description='Concentrated stock',
display_color='#FF6347'
)
# Load liquids into wells
reservoir['A1'].load_liquid(liquid=diluent, volume=15000)
reservoir['A2'].load_liquid(liquid=stock, volume=5000)
# Protocol parameters
dilution_factor = 2 # 1:2 dilution
transfer_volume = 100 # µL
num_dilutions = 11 # Number of dilution steps
protocol.comment('Starting serial dilution protocol')
# Step 1: Add diluent to all wells except first column
protocol.comment('Adding diluent to wells...')
for row in plate.rows()[:8]: # For each row (A-H)
p300.transfer(
transfer_volume,
reservoir['A1'], # Diluent source
row[1:], # All wells except first (columns 2-12)
new_tip='once'
)
# Step 2: Add stock solution to first column
protocol.comment('Adding stock solution to first column...')
p300.transfer(
transfer_volume * 2, # Double volume for first well
reservoir['A2'], # Stock source
[row[0] for row in plate.rows()[:8]], # First column (wells A1-H1)
new_tip='always'
)
# Step 3: Perform serial dilution
protocol.comment('Performing serial dilutions...')
for row in plate.rows()[:8]: # For each row
p300.transfer(
transfer_volume,
row[:num_dilutions], # Source wells (1-11)
row[1:num_dilutions + 1], # Destination wells (2-12)
mix_after=(3, 50), # Mix 3x with 50µL after each transfer
new_tip='always'
)
protocol.comment('Serial dilution complete!')
protocol.comment(f'Created {num_dilutions} dilutions with {dilution_factor}x dilution factor')