Mercurial > repos > tduigou > dnabot
view test-data/dnabot_scripts/output/2_purification_ot2_APIv1.py @ 0:ed297a952c06 draft
"planemo upload commit 84e1d541403efed25838475a7bb0e08d9c7d3cf3-dirty"
author | tduigou |
---|---|
date | Tue, 14 Dec 2021 14:46:38 +0000 |
parents | |
children |
line wrap: on
line source
from opentrons import labware, instruments, modules, robot sample_number=13 ethanol_well='A11' def magbead( sample_number, ethanol_well, elution_buffer_well, sample_volume=30, bead_ratio=1.8, elution_buffer_volume=40, incubation_time=5, settling_time=2, drying_time=5, elution_time=2, sample_offset=0, tiprack_type="opentrons_96_tiprack_300ul"): """Implements magbead purification reactions for BASIC assembly using an opentrons OT-2. Selected args: ethanol_well (str): well in reagent container containing ethanol. elution_buffer_well (str): well in reagent container containing elution buffer. sample_offset (int): offset the intial sample column by the specified value. """ # Constants PIPETTE_ASPIRATE_RATE = 25 PIPETTE_DISPENSE_RATE = 150 TIPS_PER_SAMPLE = 9 CANDIDATE_TIPRACK_SLOTS = ['3', '6', '9', '2', '5'] MAGDECK_POSITION = '1' MIX_PLATE_TYPE = '4ti-0960_FrameStar' MIX_PLATE_POSITION = '4' REAGENT_CONTAINER_TYPE = '4ti0131_trough-12' REAGENT_CONTAINER_POSITION = '7' BEAD_CONTAINER_TYPE = '4ti0136_96_deep-well' BEAD_CONTAINER_POSITION = '8' LIQUID_WASTE_WELL = 'A12' BEADS_WELL = 'A1' DEAD_TOTAL_VOL = 5 SLOW_HEAD_SPEEDS = {'x': 600 // 4, 'y': 400 // 4, 'z': 125 // 10, 'a': 125 // 10} DEFAULT_HEAD_SPEEDS = {'x': 400, 'y': 400, 'z': 125, 'a': 100} IMMOBILISE_MIX_REPS = 10 MAGDECK_HEIGHT = 20 AIR_VOL_COEFF = 0.1 ETHANOL_VOL = 150 WASH_TIME = 0.5 ETHANOL_DEAD_VOL = 50 ELUTION_MIX_REPS = 20 ELUTANT_SEP_TIME = 1 ELUTION_DEAD_VOL = 2 # Errors if sample_number > 48: raise ValueError('sample number cannot exceed 48') # Tips and pipette total_tips = sample_number * TIPS_PER_SAMPLE tiprack_num = total_tips // 96 + (1 if total_tips % 96 > 0 else 0) slots = CANDIDATE_TIPRACK_SLOTS[:tiprack_num] tipracks = [labware.load(tiprack_type, slot) for slot in slots] pipette = instruments.P300_Multi( mount="left", tip_racks=tipracks, aspirate_flow_rate=PIPETTE_ASPIRATE_RATE, dispense_flow_rate=PIPETTE_DISPENSE_RATE) # Define labware MAGDECK = modules.load('magdeck', MAGDECK_POSITION) MAGDECK.disengage() mag_plate = labware.load(MIX_PLATE_TYPE, MAGDECK_POSITION, share=True) mix_plate = labware.load(MIX_PLATE_TYPE, MIX_PLATE_POSITION) reagent_container = labware.load( REAGENT_CONTAINER_TYPE, REAGENT_CONTAINER_POSITION) bead_container = labware.load(BEAD_CONTAINER_TYPE, BEAD_CONTAINER_POSITION) col_num = sample_number // 8 + (1 if sample_number % 8 > 0 else 0) samples = [col for col in mag_plate.cols( )[0 + sample_offset:col_num + sample_offset]] output = [col for col in mag_plate.cols( )[6 + sample_offset:col_num + 6 + sample_offset]] mixing = [col for col in mix_plate.cols( )[0 + sample_offset:col_num + sample_offset]] # Define reagents and liquid waste liquid_waste = reagent_container.wells(LIQUID_WASTE_WELL) beads = bead_container.wells(BEADS_WELL) ethanol = reagent_container.wells(ethanol_well) elution_buffer = reagent_container.wells(elution_buffer_well) # Define bead and mix volume bead_volume = sample_volume * bead_ratio if bead_volume / 2 > pipette.max_volume: mix_vol = pipette.max_volume else: mix_vol = bead_volume / 2 total_vol = bead_volume + sample_volume + DEAD_TOTAL_VOL # Mix beads and PCR samples and incubate for target in range(int(len(samples))): # Aspirate beads pipette.pick_up_tip() pipette.aspirate(bead_volume, beads) robot.head_speed(**SLOW_HEAD_SPEEDS, combined_speed=max(SLOW_HEAD_SPEEDS.values())) # Transfer and mix on mix_plate pipette.aspirate(sample_volume + DEAD_TOTAL_VOL, samples[target]) pipette.dispense(total_vol, mixing[target]) pipette.mix(IMMOBILISE_MIX_REPS, mix_vol, mixing[target]) pipette.blow_out() # Dispose of tip robot.head_speed(**DEFAULT_HEAD_SPEEDS, combined_speed=max(DEFAULT_HEAD_SPEEDS.values())) pipette.drop_tip() # Immobilise sample pipette.delay(minutes=incubation_time) # Transfer sample back to magdeck for target in range(int(len(samples))): pipette.transfer(total_vol, mixing[target], samples[target], blow_out=True) # Engagae MagDeck and incubate MAGDECK.engage(height=MAGDECK_HEIGHT) pipette.delay(minutes=settling_time) # Remove supernatant from magnetic beads for target in samples: pipette.transfer(total_vol, target, liquid_waste, blow_out=True) # Wash beads twice with 70% ethanol air_vol = pipette.max_volume * AIR_VOL_COEFF for cycle in range(2): for target in samples: pipette.transfer(ETHANOL_VOL, ethanol, target, air_gap=air_vol) pipette.delay(minutes=WASH_TIME) for target in samples: pipette.transfer(ETHANOL_VOL + ETHANOL_DEAD_VOL, target, liquid_waste, air_gap=air_vol) # Dry at RT pipette.delay(minutes=drying_time) # Disengage MagDeck MAGDECK.disengage() # Mix beads with elution buffer if elution_buffer_volume / 2 > pipette.max_volume: mix_vol = pipette.max_volume else: mix_vol = elution_buffer_volume / 2 for target in samples: pipette.transfer(elution_buffer_volume, elution_buffer, target, mix_after=(ELUTION_MIX_REPS, mix_vol)) # Incubate at RT for "elution_time" minutes pipette.delay(minutes=elution_time) # Engagae MagDeck for 1 minute and remain engaged for DNA elution MAGDECK.engage(height=MAGDECK_HEIGHT) pipette.delay(minutes=ELUTANT_SEP_TIME) # Transfer clean PCR product to a new well for target, dest in zip(samples, output): pipette.transfer(elution_buffer_volume - ELUTION_DEAD_VOL, target, dest, blow_out=False) # Disengage MagDeck MAGDECK.disengage() magbead(sample_number=sample_number, ethanol_well=ethanol_well, elution_buffer_well='A1') for c in robot.commands(): print(c)