| name | opentrons-thermocycler |
| description | Opentrons Thermocycler Module - automated PCR thermal cycling with independent block (4-99°C) and lid (37-110°C) temperature control, profile execution, and auto-sealing lid support (GEN2) for high-throughput molecular biology workflows |
| allowed-tools | ["*"] |
Opentrons Thermocycler Module
Overview
The Opentrons Thermocycler Module automates PCR thermal cycling with precise, independent control of block temperature (4-99°C) and heated lid (37-110°C). Execute complex temperature profiles with automatic cycling, integrate with liquid handling for complete PCR setup automation, and use auto-sealing lids (GEN2) for walk-away workflows.
Core value: Fully automate PCR setup and cycling. Load samples, dispense reagents, seal plates (GEN2), run thermal profiles, and collect products—all without manual intervention.
When to Use
Use the Thermocycler skill when:
- Running PCR amplification protocols
- Performing qPCR or RT-PCR reactions
- Automating DNA/RNA thermal cycling workflows
- Executing multi-step temperature incubations
- Integrating thermal cycling with automated liquid handling
- Setting up high-throughput PCR screening
Don't use when:
- Simple temperature control needed (use Temperature Module for 4-95°C range)
- Shaking/mixing required during incubation (use Heater-Shaker Module)
- Temperature outside 4-99°C range (block) or 37-110°C (lid)
Quick Reference
| Operation | Method | Key Parameters |
|---|
| Load module | protocol.load_module() | "thermocyclerModuleV2" or "thermocyclerModuleV1" |
| Open lid | open_lid() | - |
| Close lid | close_lid() | - |
| Set lid temperature | set_lid_temperature() | celsius (37-110) |
| Deactivate lid | deactivate_lid() | - |
| Set block temperature | set_block_temperature() | celsius (4-99), hold_time, block_max_volume |
| Execute profile | execute_profile() | steps, repetitions, block_max_volume |
| Deactivate block | deactivate_block() | - |
Platform Compatibility
Both Opentrons Flex and OT-2
Module Generations
- GEN1 - Original thermocycler, OT-2 only
- GEN2 - Improved plate lift mechanism, auto-sealing lid support
API compatibility: Both generations support identical API methods
Deck Position
OT-2: Spans multiple deck slots (typically slots 7, 8, 10, 11)
Flex: Dedicated thermocycler position
Loading:
tc_mod = protocol.load_module("thermocyclerModuleV2")
Loading the Module
from opentrons import protocol_api
metadata = {'apiLevel': '2.19'}
def run(protocol: protocol_api.ProtocolContext):
tc_mod = protocol.load_module("thermocyclerModuleV2")
pcr_plate = tc_mod.load_labware("opentrons_96_wellplate_200ul_pcr_full_skirt")
Module versions:
"thermocyclerModuleV1" - GEN1
"thermocyclerModuleV2" - GEN2 (recommended)
Lid Control
Basic Lid Operations
tc_mod.open_lid()
tc_mod.close_lid()
Important for gripper (Flex):
- Always open lid before gripper operations
- Close lid only after plate is seated on thermocycler
Heated Lid
The heated lid prevents condensation during thermal cycling:
tc_mod.set_lid_temperature(celsius=105)
tc_mod.deactivate_lid()
Lid temperature range: 37-110°C
Typical settings:
- Standard PCR: 105°C
- RT-PCR: 100-105°C
- Custom protocols: Match or exceed highest block temperature + 5-10°C
Note: Lid temperature is independent of block temperature and profiles.
Block Temperature Control
Basic Block Temperature
tc_mod.set_block_temperature(
temperature=95,
hold_time_seconds=180,
block_max_volume=50
)
Block temperature range: 4-99°C
Parameters:
temperature - Target temperature in °C (required)
hold_time_seconds - Duration to hold at temperature
hold_time_minutes - Alternative duration in minutes
block_max_volume - Sample volume in µL (default: 25µL)
Hold Time Behavior
With hold_time: Protocol waits at temperature for specified duration
tc_mod.set_block_temperature(
temperature=95,
hold_time_minutes=5,
block_max_volume=50
)
Without hold_time: Set temperature and continue immediately
tc_mod.set_block_temperature(temperature=4)
Block Max Volume
Specify sample volume for improved temperature accuracy:
tc_mod.set_block_temperature(
temperature=72,
hold_time_minutes=10,
block_max_volume=50
)
Default: 25µL if not specified
Why it matters: Algorithm adjusts for thermal mass of liquid to ensure accurate sample temperature.
Temperature Profiles
Automate repeated temperature cycles for PCR:
Defining a Profile
pcr_profile = [
{"temperature": 95, "hold_time_seconds": 30},
{"temperature": 57, "hold_time_seconds": 30},
{"temperature": 72, "hold_time_seconds": 60}
]
Profile structure: List of dictionaries with temperature and hold_time_seconds
Executing a Profile
tc_mod.execute_profile(
steps=pcr_profile,
repetitions=30,
block_max_volume=50
)
Parameters:
steps - List of temperature steps (required)
repetitions - Number of times to repeat profile (required)
block_max_volume - Sample volume in µL
Complete PCR Protocol
tc_mod = protocol.load_module("thermocyclerModuleV2")
pcr_plate = tc_mod.load_labware("opentrons_96_wellplate_200ul_pcr_full_skirt")
tc_mod.open_lid()
tc_mod.close_lid()
tc_mod.set_lid_temperature(105)
tc_mod.set_block_temperature(
temperature=95,
hold_time_seconds=180,
block_max_volume=50
)
pcr_profile = [
{"temperature": 95, "hold_time_seconds": 30},
{"temperature": 57, "hold_time_seconds": 30},
{"temperature": 72, "hold_time_seconds": 60}
]
tc_mod.execute_profile(steps=pcr_profile, repetitions=30, block_max_volume=50)
tc_mod.set_block_temperature(
temperature=72,
hold_time_minutes=5,
block_max_volume=50
)
tc_mod.set_block_temperature(temperature=4)
tc_mod.deactivate_lid()
tc_mod.deactivate_block()
tc_mod.open_lid()
Auto-Sealing Lids (GEN2)
Opentrons Flex GEN2 Thermocycler supports auto-sealing lids for walk-away protocols:
Auto-Sealing Lid Labware
auto_seal_lid = protocol.load_labware(
"opentrons_tough_pcr_auto_sealing_lid",
location="lid_stack_location"
)
riser = protocol.load_labware(
"opentrons_flex_deck_riser",
location="deck_location"
)
Lid Stack Management
lid_on_riser = protocol.load_labware(
"opentrons_tough_pcr_auto_sealing_lid",
"D2",
adapter="opentrons_flex_deck_riser"
)
lid_2 = lid_on_riser.load_labware("opentrons_tough_pcr_auto_sealing_lid")
protocol.move_labware(lid_on_riser, pcr_plate, use_gripper=True)
Important: Do not affix rubber seal to internal Thermocycler lid when using auto-sealing lids.
Complete Workflow with Auto-Sealing
tc_mod = protocol.load_module("thermocyclerModuleV2")
pcr_plate = tc_mod.load_labware("opentrons_96_wellplate_200ul_pcr_full_skirt")
seal_lid = protocol.load_labware(
"opentrons_tough_pcr_auto_sealing_lid",
"D2",
adapter="opentrons_flex_deck_riser"
)
tc_mod.open_lid()
protocol.move_labware(seal_lid, pcr_plate, use_gripper=True)
tc_mod.close_lid()
tc_mod.open_lid()
Common Patterns
Standard PCR
tc_mod.close_lid()
tc_mod.set_lid_temperature(105)
tc_mod.set_block_temperature(95, hold_time_minutes=3, block_max_volume=50)
standard_pcr = [
{"temperature": 95, "hold_time_seconds": 30},
{"temperature": 55, "hold_time_seconds": 30},
{"temperature": 72, "hold_time_seconds": 60}
]
tc_mod.execute_profile(steps=standard_pcr, repetitions=35, block_max_volume=50)
tc_mod.set_block_temperature(72, hold_time_minutes=10, block_max_volume=50)
tc_mod.set_block_temperature(4)
tc_mod.deactivate_lid()
tc_mod.deactivate_block()
tc_mod.open_lid()
Gradient PCR (Multiple Annealing Temperatures)
annealing_temps = [52, 54, 56, 58, 60, 62, 64, 66]
for i, temp in enumerate(annealing_temps):
protocol.comment(f"Column {i+1}: {temp}°C annealing")
gradient_profile = [
{"temperature": 95, "hold_time_seconds": 30},
{"temperature": temp, "hold_time_seconds": 30},
{"temperature": 72, "hold_time_seconds": 60}
]
tc_mod.execute_profile(steps=gradient_profile, repetitions=30, block_max_volume=50)
Note: This example is simplified. True gradient PCR requires hardware that supports simultaneous temperature gradients across the block.
Two-Step PCR (No Extension)
tc_mod.close_lid()
tc_mod.set_lid_temperature(105)
tc_mod.set_block_temperature(95, hold_time_minutes=3, block_max_volume=25)
two_step = [
{"temperature": 95, "hold_time_seconds": 15},
{"temperature": 60, "hold_time_seconds": 60}
]
tc_mod.execute_profile(steps=two_step, repetitions=40, block_max_volume=25)
tc_mod.set_block_temperature(4)
tc_mod.deactivate_lid()
tc_mod.deactivate_block()
tc_mod.open_lid()
RT-PCR (Reverse Transcription + PCR)
tc_mod.close_lid()
tc_mod.set_lid_temperature(100)
tc_mod.set_block_temperature(42, hold_time_minutes=30, block_max_volume=20)
tc_mod.set_block_temperature(85, hold_time_minutes=5, block_max_volume=20)
tc_mod.set_block_temperature(4)
tc_mod.open_lid()
tc_mod.close_lid()
tc_mod.set_lid_temperature(105)
tc_mod.set_block_temperature(95, hold_time_minutes=2, block_max_volume=25)
rt_pcr_profile = [
{"temperature": 95, "hold_time_seconds": 15},
{"temperature": 60, "hold_time_seconds": 30},
{"temperature": 72, "hold_time_seconds": 30}
]
tc_mod.execute_profile(steps=rt_pcr_profile, repetitions=40, block_max_volume=25)
tc_mod.set_block_temperature(4)
tc_mod.deactivate_lid()
tc_mod.deactivate_block()
tc_mod.open_lid()
Touchdown PCR
tc_mod.close_lid()
tc_mod.set_lid_temperature(105)
tc_mod.set_block_temperature(95, hold_time_minutes=3, block_max_volume=50)
for temp in range(65, 54, -1):
touchdown_profile = [
{"temperature": 95, "hold_time_seconds": 30},
{"temperature": temp, "hold_time_seconds": 30},
{"temperature": 72, "hold_time_seconds": 60}
]
tc_mod.execute_profile(steps=touchdown_profile, repetitions=1, block_max_volume=50)
standard_profile = [
{"temperature": 95, "hold_time_seconds": 30},
{"temperature": 55, "hold_time_seconds": 30},
{"temperature": 72, "hold_time_seconds": 60}
]
tc_mod.execute_profile(steps=standard_profile, repetitions=25, block_max_volume=50)
tc_mod.set_block_temperature(72, hold_time_minutes=10, block_max_volume=50)
tc_mod.set_block_temperature(4)
tc_mod.deactivate_lid()
tc_mod.deactivate_block()
tc_mod.open_lid()
Integration with Liquid Handling
Automated PCR Setup
tc_mod = protocol.load_module("thermocyclerModuleV2")
pcr_plate = tc_mod.load_labware("opentrons_96_wellplate_200ul_pcr_full_skirt")
pipette = protocol.load_instrument("flex_1channel_1000", "left")
master_mix = protocol.load_labware("opentrons_24_tuberack_nest_1.5ml_snapcap", "C1")
template_plate = protocol.load_labware("biorad_96_wellplate_200ul_pcr", "C2")
tc_mod.open_lid()
pipette.distribute(
volume=45,
source=master_mix["A1"],
dest=pcr_plate.wells(),
new_tip="once"
)
pipette.transfer(
volume=5,
source=template_plate.wells(),
dest=pcr_plate.wells(),
mix_after=(3, 25),
new_tip="always"
)
tc_mod.close_lid()
tc_mod.set_lid_temperature(105)
tc_mod.set_block_temperature(95, hold_time_minutes=3, block_max_volume=50)
pcr_profile = [
{"temperature": 95, "hold_time_seconds": 30},
{"temperature": 58, "hold_time_seconds": 30},
{"temperature": 72, "hold_time_seconds": 60}
]
tc_mod.execute_profile(steps=pcr_profile, repetitions=30, block_max_volume=50)
tc_mod.set_block_temperature(72, hold_time_minutes=5, block_max_volume=50)
tc_mod.set_block_temperature(4)
tc_mod.deactivate_lid()
tc_mod.deactivate_block()
tc_mod.open_lid()
Integration with Gripper (Flex)
sample_plate = protocol.load_labware("opentrons_96_wellplate_200ul_pcr_full_skirt", "C2")
tc_mod.open_lid()
protocol.move_labware(sample_plate, tc_mod, use_gripper=True)
tc_mod.close_lid()
tc_mod.open_lid()
protocol.move_labware(sample_plate, "C2", use_gripper=True)
GEN2 Improvements
Plate lift mechanism:
- Press button for 3 seconds with lid open to activate
- Raises plate for easier manual or gripper removal
- Improves plate access and prevents damage
Auto-sealing lid support:
- Use Opentrons Tough PCR Auto-sealing Lids
- Stack up to 5 lids
- Automated lid placement with gripper
Best Practices
- Set lid temperature before cycling - Prevents condensation
- Use block_max_volume parameter - Improves temperature accuracy
- Deactivate block and lid at protocol end - Prevents equipment running indefinitely
- Open lid before gripper operations - Required for plate movement
- Use profiles for repeated cycles - More efficient than individual set_block_temperature calls
- Cool to 4°C at end - Preserves samples until retrieval
- Plan for thermal equilibration - Allow extra time for large temperature changes
- Test profiles with simulation - Verify timing before running on hardware
- Document profile parameters - Include reasoning in protocol comments
- Consider enzyme specifications - Match temperatures to polymerase requirements
Common Mistakes
❌ Not setting lid temperature:
tc_mod.close_lid()
tc_mod.execute_profile(...)
✅ Correct:
tc_mod.close_lid()
tc_mod.set_lid_temperature(105)
tc_mod.execute_profile(...)
❌ Gripper movement with closed lid:
protocol.move_labware(plate, tc_mod, use_gripper=True)
✅ Correct:
tc_mod.open_lid()
protocol.move_labware(plate, tc_mod, use_gripper=True)
❌ Not deactivating modules:
tc_mod.execute_profile(...)
✅ Correct:
tc_mod.execute_profile(...)
tc_mod.deactivate_lid()
tc_mod.deactivate_block()
❌ Wrong profile structure:
bad_profile = [
{"temperature": 95},
{"temperature": 55}
]
tc_mod.execute_profile(steps=bad_profile, repetitions=30)
✅ Correct:
good_profile = [
{"temperature": 95, "hold_time_seconds": 30},
{"temperature": 55, "hold_time_seconds": 30}
]
tc_mod.execute_profile(steps=good_profile, repetitions=30)
Troubleshooting
Module not reaching temperature:
- Verify temperature is within range (4-99°C block, 37-110°C lid)
- Check ambient temperature for low-temp targets
- Allow sufficient time for thermal equilibration
Condensation in wells:
- Ensure lid temperature is set and reached before cycling
- Set lid temperature ≥ highest block temperature + 5-10°C
- Verify lid is properly closed
Profile not executing:
- Check profile structure (list of dicts with temperature and hold_time_seconds)
- Verify repetitions parameter is provided
- Ensure block_max_volume matches sample volume
Plate removal difficulty (GEN1):
- Wait for block to cool below 60°C
- Use plate lift mechanism (GEN2)
- Ensure lid is fully open
Gripper errors:
- Verify lid is open before movement
- Check plate is compatible PCR labware
- Ensure thermocycler position is clear
Integration with Other Modules
With Temperature Module (Pre-cooling)
temp_mod = protocol.load_module("temperature module gen2", "D1")
tc_mod = protocol.load_module("thermocyclerModuleV2")
temp_mod.set_temperature(4)
protocol.move_labware(sample_plate, temp_mod, use_gripper=True)
protocol.delay(minutes=5)
tc_mod.open_lid()
protocol.move_labware(sample_plate, tc_mod, use_gripper=True)
tc_mod.close_lid()
With Magnetic Module (PCR Cleanup)
tc_mod.set_block_temperature(4)
tc_mod.open_lid()
mag_block = protocol.load_module("magneticBlockV1", "D2")
protocol.move_labware(pcr_plate, mag_block, use_gripper=True)
API Version Requirements
- Minimum API version: 2.0 (thermocycler support)
- GEN2 features: API 2.13+
- Auto-sealing lids: API 2.15+
- Recommended: 2.19+ for full feature support
Additional Resources
Related Skills
opentrons - Main Opentrons Python API skill
opentrons-temperature-module - Simple temperature control (4-95°C)
opentrons-gripper - Automated labware movement (Flex)
opentrons-magnetic-block - Magnetic bead separation for PCR cleanup