changeset 1:c3db8a581ca5 draft

Deleted selected files
author tduigou
date Tue, 14 Dec 2021 14:47:32 +0000
parents ed297a952c06
children e6f30afcf8f8
files test-data/dnabot_scripts/output/1_clip_ot2_APIv1.py test-data/dnabot_scripts/output/1_clip_ot2_APIv2.8.py test-data/dnabot_scripts/output/1_clip_ot2_Thermocycler_APIv2.8.py test-data/dnabot_scripts/output/2_purification_ot2_APIv1.py test-data/dnabot_scripts/output/2_purification_ot2_APIv2.8.py test-data/dnabot_scripts/output/3_assembly_ot2_APIv1.py test-data/dnabot_scripts/output/3_assembly_ot2_APIv2.8.py test-data/dnabot_scripts/output/3_assembly_ot2_Thermocycler_APIv2.8.py test-data/dnabot_scripts/output/4_transformation_ot2_APIv1.py test-data/dnabot_scripts/output/4_transformation_ot2_APIv2.8.py test-data/dnabot_scripts/output/4_transformation_ot2_Thermocycler_APIv2.8.py test-data/dnabot_scripts/output/metainformation/dataset_4472_clip_run_info.csv test-data/dnabot_scripts/output/metainformation/dataset_4472_final_assembly_run_info.csv test-data/dnabot_scripts/output/metainformation/dataset_4472_wells.txt
diffstat 14 files changed, 0 insertions(+), 2378 deletions(-) [+]
line wrap: on
line diff
--- a/test-data/dnabot_scripts/output/1_clip_ot2_APIv1.py	Tue Dec 14 14:46:38 2021 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,90 +0,0 @@
-from opentrons import labware, instruments, modules, robot
-
-
-clips_dict={"prefixes_wells": ["B8", "B7", "C5", "C12", "C7", "B7", "C4", "C9", "C10", "B7", "C8", "C11", "C5"], "prefixes_plates": ["2", "2", "2", "2", "2", "2", "2", "2", "2", "2", "2", "2", "2"], "suffixes_wells": ["A7", "C1", "C3", "C2", "A8", "C1", "C2", "C3", "A8", "C2", "C3", "C1", "A8"], "suffixes_plates": ["2", "2", "2", "2", "2", "2", "2", "2", "2", "2", "2", "2", "2"], "parts_wells": ["A1", "A10", "A3", "A11", "A6", "A9", "A2", "A5", "A7", "A10", "A8", "A4", "A12"], "parts_plates": ["5", "5", "5", "5", "5", "5", "5", "5", "5", "5", "5", "5", "5"], "parts_vols": [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], "water_vols": [7.0, 7.0, 7.0, 7.0, 7.0, 7.0, 7.0, 7.0, 7.0, 7.0, 7.0, 7.0, 7.0]}
-
-
-def clip(
-        prefixes_wells,
-        prefixes_plates,
-        suffixes_wells,
-        suffixes_plates,
-        parts_wells,
-        parts_plates,
-        parts_vols,
-        water_vols,
-        tiprack_type="tiprack-10ul"):
-    """Implements linker ligation reactions using an opentrons OT-2."""
-
-    # Constants
-    INITIAL_TIP = 'A1'
-    CANDIDATE_TIPRACK_SLOTS = ['3', '6', '9']
-    PIPETTE_TYPE = 'P10_Single'
-    PIPETTE_MOUNT = 'right'
-    SOURCE_PLATE_TYPE = '4ti-0960_FrameStar'
-    DESTINATION_PLATE_TYPE = '4ti-0960_FrameStar'
-    DESTINATION_PLATE_POSITION = '1'
-    TUBE_RACK_TYPE = 'tube-rack_E1415-1500'
-    TUBE_RACK_POSITION = '4'
-    MASTER_MIX_WELL = 'A1'
-    WATER_WELL = 'A2'
-    INITIAL_DESTINATION_WELL = 'A1'
-    MASTER_MIX_VOLUME = 20
-    LINKER_MIX_SETTINGS = (1, 3)
-    PART_MIX_SETTINGS = (4, 5)
-
-    # Tiprack slots
-    total_tips = 4 * len(parts_wells)
-    letter_dict = {'A': 0, 'B': 1, 'C': 2,
-                   'D': 3, 'E': 4, 'F': 5, 'G': 6, 'H': 7}
-    tiprack_1_tips = (
-        13 - int(INITIAL_TIP[1:])) * 8 - letter_dict[INITIAL_TIP[0]]
-    if total_tips > tiprack_1_tips:
-        tiprack_num = 1 + (total_tips - tiprack_1_tips) // 96 + \
-            (1 if (total_tips - tiprack_1_tips) % 96 > 0 else 0)
-    else:
-        tiprack_num = 1
-    slots = CANDIDATE_TIPRACK_SLOTS[:tiprack_num]
-
-    # Define source plates
-    source_plates = {}
-    source_plates_keys = list(set((prefixes_plates + suffixes_plates + parts_plates)))
-    for key in source_plates_keys:
-        source_plates[key] = labware.load(SOURCE_PLATE_TYPE, key)
-
-    # Define remaining labware
-    tipracks = [labware.load(tiprack_type, slot) for slot in slots]
-    if PIPETTE_TYPE != 'P10_Single':
-        print('Define labware must be changed to use', PIPETTE_TYPE)
-        exit()
-    pipette = instruments.P10_Single(mount=PIPETTE_MOUNT, tip_racks=tipracks)
-    pipette.start_at_tip(tipracks[0].well(INITIAL_TIP))
-    destination_plate = labware.load(
-        DESTINATION_PLATE_TYPE, DESTINATION_PLATE_POSITION)
-    tube_rack = labware.load(TUBE_RACK_TYPE, TUBE_RACK_POSITION)
-    master_mix = tube_rack.wells(MASTER_MIX_WELL)
-    water = tube_rack.wells(WATER_WELL)
-    destination_wells = destination_plate.wells(
-        INITIAL_DESTINATION_WELL, length=int(len(parts_wells)))
-
-    # Transfers
-    pipette.pick_up_tip()
-    pipette.transfer(MASTER_MIX_VOLUME, master_mix,
-                     destination_wells, new_tip='never')
-    pipette.drop_tip()
-    pipette.transfer(water_vols, water,
-                     destination_wells, new_tip='always')
-    for clip_num in range(len(parts_wells)):
-        pipette.transfer(1, source_plates[prefixes_plates[clip_num]].wells(prefixes_wells[clip_num]),
-                         destination_wells[clip_num], mix_after=LINKER_MIX_SETTINGS)
-        pipette.transfer(1, source_plates[suffixes_plates[clip_num]].wells(suffixes_wells[clip_num]),
-                         destination_wells[clip_num], mix_after=LINKER_MIX_SETTINGS)
-        pipette.transfer(parts_vols[clip_num], source_plates[parts_plates[clip_num]].wells(parts_wells[clip_num]),
-                         destination_wells[clip_num], mix_after=PART_MIX_SETTINGS)
-
-
-clip(**clips_dict)
-
-# Robot comments
-for c in robot.commands():
-    print(c)
\ No newline at end of file
--- a/test-data/dnabot_scripts/output/1_clip_ot2_APIv2.8.py	Tue Dec 14 14:46:38 2021 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,137 +0,0 @@
-from opentrons import protocol_api
-
-# Rename to 'clip_template' and paste into 'template_ot2_scripts' folder in DNA-BOT to use
-# Code has been reordered to better group relevant commands and take the constants out of def clip()
-
-#metadata
-metadata = {
-     'apiLevel': '2.8',
-     'protocolName': 'CLIP_No_Thermocycler',
-     'description': 'Implements linker ligation reactions using an opentrons OT-2. This version does not include the Thermocycler module.'}
-
-# example dictionary produced by DNA-BOT for a single construct containing 5 parts, un-comment and run to test the template
-#clips_dict={"prefixes_wells": ["A8", "A7", "C5", "C7", "C10"], "prefixes_plates": ["2", "2", "2", "2", "2"], "suffixes_wells": ["B7", "C1", "C2", "C3", "B8"], "suffixes_plates": ["2", "2", "2", "2", "2"], "parts_wells": ["E2", "F2", "C2", "B2", "D2"], "parts_plates": ["5", "5", "5", "5", "5"], "parts_vols": [1, 1, 1, 1, 1], "water_vols": [7.0, 7.0, 7.0, 7.0, 7.0]}
-
-# __LABWARES is expected to be redefined by "generate_ot2_script" method
-# Test dict
-# __LABWARES={"p20_single": {"id": "p20_single_gen2"}, "p300_multi": {"id": "p300_multi_gen2"}, "mag_deck": {"id": "magdeck"}, "96_tiprack_20ul": {"id": "opentrons_96_tiprack_20ul"}, "96_tiprack_300ul": {"id": "opentrons_96_tiprack_300ul"}, "24_tuberack_1500ul": {"id": "e14151500starlab_24_tuberack_1500ul"}, "96_wellplate_200ul_pcr_step_14": {"id": "4ti0960rig_96_wellplate_200ul"}, "96_wellplate_200ul_pcr_step_23": {"id": "4ti0960rig_96_wellplate_200ul"}, "agar_plate_step_4": {"id": "4ti0960rig_96_wellplate_200ul"}, "12_reservoir_21000ul": {"id": "4ti0131_12_reservoir_21000ul"}, "96_deepwellplate_2ml": {"id": "4ti0136_96_wellplate_2200ul"}}
-
-clips_dict={"prefixes_wells": ["B8", "B7", "C5", "C12", "C7", "B7", "C4", "C9", "C10", "B7", "C8", "C11", "C5"], "prefixes_plates": ["2", "2", "2", "2", "2", "2", "2", "2", "2", "2", "2", "2", "2"], "suffixes_wells": ["A7", "C1", "C3", "C2", "A8", "C1", "C2", "C3", "A8", "C2", "C3", "C1", "A8"], "suffixes_plates": ["2", "2", "2", "2", "2", "2", "2", "2", "2", "2", "2", "2", "2"], "parts_wells": ["A1", "A10", "A3", "A11", "A6", "A9", "A2", "A5", "A7", "A10", "A8", "A4", "A12"], "parts_plates": ["5", "5", "5", "5", "5", "5", "5", "5", "5", "5", "5", "5", "5"], "parts_vols": [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], "water_vols": [7.0, 7.0, 7.0, 7.0, 7.0, 7.0, 7.0, 7.0, 7.0, 7.0, 7.0, 7.0, 7.0]}
-__LABWARES={"p20_single": {"id": "p20_single_gen2"}, "p300_multi": {"id": "p300_multi_gen2"}, "mag_deck": {"id": "magdeck"}, "96_tiprack_20ul": {"id": "opentrons_96_tiprack_20ul"}, "96_tiprack_300ul": {"id": "opentrons_96_tiprack_300ul"}, "24_tuberack_1500ul": {"id": "e14151500starlab_24_tuberack_1500ul"}, "96_wellplate_200ul_pcr_step_14": {"id": "4ti0960rig_96_wellplate_200ul"}, "96_wellplate_200ul_pcr_step_23": {"id": "4ti0960rig_96_wellplate_200ul"}, "agar_plate_step_4": {"id": "4ti0960rig_96_wellplate_200ul"}, "12_reservoir_21000ul": {"id": "4ti0131_12_reservoir_21000ul"}, "96_deepwellplate_2ml": {"id": "4ti0136_96_wellplate_2200ul"}}
-
-
-def run(protocol: protocol_api.ProtocolContext):
-# added run function for API 2.8
-
-    ### Constants - these have been moved out of the def clip() for clarity
-
-    #Tiprack
-    tiprack_type=__LABWARES['96_tiprack_20ul']['id']
-    INITIAL_TIP = 'A1'
-    CANDIDATE_TIPRACK_SLOTS = ['3', '6', '9']
-
-    # Pipettes - pipette instructions in a single location so redefining pipette type is simpler
-    PIPETTE_TYPE = __LABWARES['p20_single']['id']
-             # API 2 supports gen_1 pipettes like the p10_single
-    PIPETTE_MOUNT = 'right'
-        ### Load Pipette
-        # checks if it's a P10 Single pipette
-    if PIPETTE_TYPE != 'p20_single_gen2':
-        print('Define labware must be changed to use', PIPETTE_TYPE)
-        exit()
-
-    # Source Plates
-    SOURCE_PLATE_TYPE = __LABWARES['96_wellplate_200ul_pcr_step_14']['id']
-            # modified from custom labware as API 2 doesn't support labware.create anymore, so the old add_labware script can't be used
-
-    # Destination Plates
-    DESTINATION_PLATE_TYPE = __LABWARES['96_wellplate_200ul_pcr_step_14']['id']
-    DESTINATION_PLATE_POSITION = '1'
-            # INITIAL_DESTINATION_WELL constant removed, as destination_plate.wells() automatically starts from A1
-
-    # Tube Rack
-    TUBE_RACK_TYPE = __LABWARES['24_tuberack_1500ul']['id']
-    TUBE_RACK_POSITION = '4'
-    MASTER_MIX_WELL = 'A1'
-    WATER_WELL = 'A2'
-    MASTER_MIX_VOLUME = 20
-
-    # Mix settings
-    LINKER_MIX_SETTINGS = (1, 3)
-    PART_MIX_SETTINGS = (4, 5)
-
-    def clip(
-            prefixes_wells,
-            prefixes_plates,
-            suffixes_wells,
-            suffixes_plates,
-            parts_wells,
-            parts_plates,
-            parts_vols,
-            water_vols):
-
-        ### Loading Tiprack
-        # Calculates whether one, two, or three tipracks are needed, which are in slots 3, 6, and 9 respectively
-        total_tips = 4 * len(parts_wells)
-        letter_dict = {'A': 0, 'B': 1, 'C': 2,
-                       'D': 3, 'E': 4, 'F': 5, 'G': 6, 'H': 7}
-        tiprack_1_tips = (
-            13 - int(INITIAL_TIP[1:])) * 8 - letter_dict[INITIAL_TIP[0]]
-        if total_tips > tiprack_1_tips:
-            tiprack_num = 1 + (total_tips - tiprack_1_tips) // 96 + \
-            (1 if (total_tips - tiprack_1_tips) % 96 > 0 else 0)
-        else:
-            tiprack_num = 1
-        slots = CANDIDATE_TIPRACK_SLOTS[:tiprack_num]
-
-        # loads the correct number of tipracks
-        tipracks = [protocol.load_labware(tiprack_type, slot) for slot in slots]
-
-        # Loads pipette according to constants assigned above
-        pipette = protocol.load_instrument(PIPETTE_TYPE, mount=PIPETTE_MOUNT, tip_racks=tipracks)
-
-        ### Load Destination Plate
-        # Loads destination plate according to constants assigned above
-        destination_plate = protocol.load_labware(DESTINATION_PLATE_TYPE, DESTINATION_PLATE_POSITION)
-
-        # Defines where the destination wells are within the destination plate
-        destination_wells = destination_plate.wells()[0:len(parts_wells)]
-
-        ### Load Tube Rack
-        # Loads tube rack according to constants assigned above
-        tube_rack = protocol.load_labware(TUBE_RACK_TYPE, TUBE_RACK_POSITION)
-
-        # Defines positions of master mix and water within the tube rack
-        master_mix = tube_rack.wells(MASTER_MIX_WELL)
-        water = tube_rack.wells(WATER_WELL)
-
-         ### Loading Source Plates
-        # Makes a source plate key for where prefixes, suffixes, and parts are located, according to the dictionary generated by the DNA-BOT
-        source_plates = {}
-        source_plates_keys = list(set((prefixes_plates + suffixes_plates + parts_plates)))
-
-        # Loads plates according to the source plate key
-        for key in source_plates_keys:
-            source_plates[key]=protocol.load_labware(SOURCE_PLATE_TYPE, key)
-
-        ### Transfers
-
-        # transfer master mix into destination wells
-            # added blowout into destination wells ('blowout_location' only works for API 2.8 and above)
-        pipette.pick_up_tip()
-        pipette.transfer(MASTER_MIX_VOLUME, master_mix, destination_wells, blow_out=True, blowout_location='destination well', new_tip='never')
-        pipette.drop_tip()
-
-        # transfer water into destination wells
-            # added blowout into destination wells ('blowout_location' only works for API 2.8 and above)
-        pipette.transfer(water_vols, water, destination_wells, blow_out=True, blowout_location='destination well', new_tip='always')
-
-        #transfer prefixes, suffixes, and parts into destination wells
-            # added blowout into destination wells ('blowout_location' only works for API 2.8 and above)
-        for clip_num in range(len(parts_wells)):
-            pipette.transfer(1, source_plates[prefixes_plates[clip_num]].wells(prefixes_wells[clip_num]), destination_wells[clip_num], blow_out=True, blowout_location='destination well', new_tip='always', mix_after=LINKER_MIX_SETTINGS)
-            pipette.transfer(1, source_plates[suffixes_plates[clip_num]].wells(suffixes_wells[clip_num]), destination_wells[clip_num], blow_out=True, blowout_location='destination well', new_tip='always', mix_after=LINKER_MIX_SETTINGS)
-            pipette.transfer(parts_vols[clip_num], source_plates[parts_plates[clip_num]].wells(parts_wells[clip_num]), destination_wells[clip_num], blow_out=True, blowout_location='destination well', new_tip='always', mix_after=PART_MIX_SETTINGS)
-
-    # the run function will first define the CLIP function, and then run the CLIP function with the dictionary produced by DNA-BOT
-    clip(**clips_dict)
--- a/test-data/dnabot_scripts/output/1_clip_ot2_Thermocycler_APIv2.8.py	Tue Dec 14 14:46:38 2021 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,152 +0,0 @@
-from opentrons import protocol_api
-
-# Rename to 'clip_template' and paste into 'template_ot2_scripts' folder in DNA-BOT to use
-
-#metadata
-metadata = {
-     'apiLevel': '2.8',
-     'protocolName': 'CLIP_With_Thermocycler',
-     'description': 'Implements linker ligation reactions using an opentrons OT-2, including the thermocycler module.'}
-
-
-
-# example dictionary produced by DNA-BOT for a single construct containing 5 parts, un-comment and run to test the template
-#clips_dict={"prefixes_wells": ["A8", "A7", "C5", "C7", "C10"], "prefixes_plates": ["2", "2", "2", "2", "2"], "suffixes_wells": ["B7", "C1", "C2", "C3", "B8"], "suffixes_plates": ["2", "2", "2", "2", "2"], "parts_wells": ["E2", "F2", "C2", "B2", "D2"], "parts_plates": ["5", "5", "5", "5", "5"], "parts_vols": [1, 1, 1, 1, 1], "water_vols": [7.0, 7.0, 7.0, 7.0, 7.0]}
-
-# __LABWARES is expected to be redefined by "generate_ot2_script" method
-# Test dict
-# __LABWARES={"p20_single": {"id": "p20_single_gen2"}, "p300_multi": {"id": "p300_multi_gen2"}, "mag_deck": {"id": "magdeck"}, "96_tiprack_20ul": {"id": "opentrons_96_tiprack_20ul"}, "96_tiprack_300ul": {"id": "opentrons_96_tiprack_300ul"}, "24_tuberack_1500ul": {"id": "e14151500starlab_24_tuberack_1500ul"}, "96_wellplate_200ul_pcr_step_14": {"id": "4ti0960rig_96_wellplate_200ul"}, "96_wellplate_200ul_pcr_step_23": {"id": "4ti0960rig_96_wellplate_200ul"}, "agar_plate_step_4": {"id": "4ti0960rig_96_wellplate_200ul"}, "12_reservoir_21000ul": {"id": "4ti0131_12_reservoir_21000ul"}, "96_deepwellplate_2ml": {"id": "4ti0136_96_wellplate_2200ul"}}
-
-clips_dict={"prefixes_wells": ["B8", "B7", "C5", "C12", "C7", "B7", "C4", "C9", "C10", "B7", "C8", "C11", "C5"], "prefixes_plates": ["2", "2", "2", "2", "2", "2", "2", "2", "2", "2", "2", "2", "2"], "suffixes_wells": ["A7", "C1", "C3", "C2", "A8", "C1", "C2", "C3", "A8", "C2", "C3", "C1", "A8"], "suffixes_plates": ["2", "2", "2", "2", "2", "2", "2", "2", "2", "2", "2", "2", "2"], "parts_wells": ["A1", "A10", "A3", "A11", "A6", "A9", "A2", "A5", "A7", "A10", "A8", "A4", "A12"], "parts_plates": ["5", "5", "5", "5", "5", "5", "5", "5", "5", "5", "5", "5", "5"], "parts_vols": [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], "water_vols": [7.0, 7.0, 7.0, 7.0, 7.0, 7.0, 7.0, 7.0, 7.0, 7.0, 7.0, 7.0, 7.0]}
-__LABWARES={"p20_single": {"id": "p20_single_gen2"}, "p300_multi": {"id": "p300_multi_gen2"}, "mag_deck": {"id": "magdeck"}, "96_tiprack_20ul": {"id": "opentrons_96_tiprack_20ul"}, "96_tiprack_300ul": {"id": "opentrons_96_tiprack_300ul"}, "24_tuberack_1500ul": {"id": "e14151500starlab_24_tuberack_1500ul"}, "96_wellplate_200ul_pcr_step_14": {"id": "4ti0960rig_96_wellplate_200ul"}, "96_wellplate_200ul_pcr_step_23": {"id": "4ti0960rig_96_wellplate_200ul"}, "agar_plate_step_4": {"id": "4ti0960rig_96_wellplate_200ul"}, "12_reservoir_21000ul": {"id": "4ti0131_12_reservoir_21000ul"}, "96_deepwellplate_2ml": {"id": "4ti0136_96_wellplate_2200ul"}}
-
-
-def run(protocol: protocol_api.ProtocolContext):
-# added run function for API 2.8
-
-    ### Constants - these have been moved out of the def clip() for clarity
-
-    #Tiprack
-    tiprack_type=__LABWARES['96_tiprack_20ul']['id']
-    INITIAL_TIP = 'A1'
-    CANDIDATE_TIPRACK_SLOTS = ['3', '6', '9']
-
-    # Pipettes - pipette instructions in a single location so redefining pipette type is simpler
-    PIPETTE_TYPE = __LABWARES['p20_single']['id']
-    PIPETTE_MOUNT = 'right'
-        ### Load Pipette
-        # checks if it's a P10 Single pipette
-    if PIPETTE_TYPE != 'p20_single_gen2':
-        print('Define labware must be changed to use', PIPETTE_TYPE)
-        exit()
-#Thermocycler Module
-    tc_mod = protocol.load_module('Thermocycler Module')
-# Destination Plates
-    DESTINATION_PLATE_TYPE = __LABWARES['96_wellplate_200ul_pcr_step_14']['id']
-    # Loads destination plate onto Thermocycler Module
-    destination_plate = tc_mod.load_labware(DESTINATION_PLATE_TYPE)
-
-    # Source Plates
-    SOURCE_PLATE_TYPE = __LABWARES['96_wellplate_200ul_pcr_step_14']['id']
-            # modified from custom labware as API 2 doesn't support labware.create anymore, so the old add_labware script can't be used
-
-    # Tube Rack
-    TUBE_RACK_TYPE = __LABWARES['24_tuberack_1500ul']['id']
-            # modified from custom labware as API 2 doesn't support labware.create anymore, so the old add_labware script can't be used
-    TUBE_RACK_POSITION = '4'
-    MASTER_MIX_WELL = 'A1'
-    WATER_WELL = 'A2'
-    MASTER_MIX_VOLUME = 20
-
-    # Mix settings
-    LINKER_MIX_SETTINGS = (1, 3)
-    PART_MIX_SETTINGS = (4, 5)
-
-    def clip(
-            prefixes_wells,
-            prefixes_plates,
-            suffixes_wells,
-            suffixes_plates,
-            parts_wells,
-            parts_plates,
-            parts_vols,
-            water_vols):
-
-        ### Loading Tiprack
-        # Calculates whether one, two, or three tipracks are needed, which are in slots 3, 6, and 9 respectively
-        total_tips = 4 * len(parts_wells)
-        letter_dict = {'A': 0, 'B': 1, 'C': 2,
-                       'D': 3, 'E': 4, 'F': 5, 'G': 6, 'H': 7}
-        tiprack_1_tips = (
-            13 - int(INITIAL_TIP[1:])) * 8 - letter_dict[INITIAL_TIP[0]]
-        if total_tips > tiprack_1_tips:
-            tiprack_num = 1 + (total_tips - tiprack_1_tips) // 96 + \
-            (1 if (total_tips - tiprack_1_tips) % 96 > 0 else 0)
-        else:
-            tiprack_num = 1
-        slots = CANDIDATE_TIPRACK_SLOTS[:tiprack_num]
-
-        # loads the correct number of tipracks
-        tipracks = [protocol.load_labware(tiprack_type, slot) for slot in slots]
-            # changed to protocol.load_labware for API 2.8
-
-        # Loads pipette according to constants assigned above
-        pipette = protocol.load_instrument(PIPETTE_TYPE, mount=PIPETTE_MOUNT, tip_racks=tipracks)
-
-        # Defines where the destination wells are within the destination plate
-        destination_wells = destination_plate.wells()[0:len(parts_wells)]
-
-        ### Load Tube Rack
-        # Loads tube rack according to constants assigned above
-        tube_rack = protocol.load_labware(TUBE_RACK_TYPE, TUBE_RACK_POSITION)
-
-        # Defines positions of master mix and water within the tube rack
-        master_mix = tube_rack.wells(MASTER_MIX_WELL)
-        water = tube_rack.wells(WATER_WELL)
-
-         ### Loading Source Plates
-        # Makes a source plate key for where prefixes, suffixes, and parts are located, according to the dictionary generated by the DNA-BOT
-        source_plates = {}
-        source_plates_keys = list(set((prefixes_plates + suffixes_plates + parts_plates)))
-
-        # Loads plates according to the source plate key
-        for key in source_plates_keys:
-            source_plates[key]=protocol.load_labware(SOURCE_PLATE_TYPE, key)
-
-        ### Transfers
-
-        # transfer master mix into destination wells
-            # added blowout into destination wells ('blowout_location' only works for API 2.8 and above)
-        pipette.pick_up_tip()
-        pipette.transfer(MASTER_MIX_VOLUME, master_mix, destination_wells, blow_out=True, blowout_location='destination well', new_tip='never')
-        pipette.drop_tip()
-
-        # transfer water into destination wells
-            # added blowout into destination wells ('blowout_location' only works for API 2.8 and above)
-        pipette.transfer(water_vols, water, destination_wells, blow_out=True, blowout_location='destination well', new_tip='always')
-
-        #transfer prefixes, suffixes, and parts into destination wells
-            # added blowout into destination wells ('blowout_location' only works for API 2.8 and above)
-        for clip_num in range(len(parts_wells)):
-            pipette.transfer(1, source_plates[prefixes_plates[clip_num]].wells(prefixes_wells[clip_num]), destination_wells[clip_num], blow_out=True, blowout_location='destination well', new_tip='always', mix_after=LINKER_MIX_SETTINGS)
-            pipette.transfer(1, source_plates[suffixes_plates[clip_num]].wells(suffixes_wells[clip_num]), destination_wells[clip_num], blow_out=True, blowout_location='destination well', new_tip='always', mix_after=LINKER_MIX_SETTINGS)
-            pipette.transfer(parts_vols[clip_num], source_plates[parts_plates[clip_num]].wells(parts_wells[clip_num]), destination_wells[clip_num], blow_out=True, blowout_location='destination well', new_tip='always', mix_after=PART_MIX_SETTINGS)
-
-    # the run function will first define the CLIP function, and then run the CLIP function with the dictionary produced by DNA-BOT
-    clip(**clips_dict)
-    ### PCR Reaction in Thermocycler
-
-    # close lid and set lid temperature, PCR will not start until lid reaches 37C
-    tc_mod.close_lid()
-    tc_mod.set_lid_temperature(105)
-
-    # Runs 20 cycles of 37C for 2 minutes and 20C for 1 minute, then holds for 60C for 10 minutes
-    profile = [
-        {'temperature': 37, 'hold_time_minutes': 2},
-        {'temperature': 20, 'hold_time_minutes': 1}]
-    tc_mod.execute_profile(steps=profile, repetitions=20, block_max_volume=30)
-    tc_mod.set_block_temperature(60, hold_time_minutes=10, block_max_volume=30)
-    tc_mod.set_block_temperature(4, hold_time_minutes=2, block_max_volume=30)
-    #Q Does block_max_volume define total volume in block or individual wells?
-    tc_mod.set_lid_temperature(37)
-    tc_mod.open_lid()
--- a/test-data/dnabot_scripts/output/2_purification_ot2_APIv1.py	Tue Dec 14 14:46:38 2021 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,182 +0,0 @@
-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)
--- a/test-data/dnabot_scripts/output/2_purification_ot2_APIv2.8.py	Tue Dec 14 14:46:38 2021 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,261 +0,0 @@
-from opentrons import protocol_api
-
-# Rename to 'purification_template' and paste into 'template_ot2_scripts' folder in DNA-BOT to use
-
-metadata = {
-     'apiLevel': '2.8',
-     'protocolName': 'purification_template',
-     'description': 'Implements magbead purification reactions for BASIC assembly using an opentrons OT-2'}
-
-
-
-
-# example values produced by DNA-BOT for a single construct containing 5 parts, un-comment and run to test the template:
-#sample_number=8
-#ethanol_well='A3'
-
-# __LABWARES and __PARAMETERS are expected to be redefined by "generate_ot2_script" method
-# Test dict
-# __LABWARES={"p20_single": {"id": "p20_single_gen2"}, "p300_multi": {"id": "p300_multi_gen2"}, "mag_deck": {"id": "magdeck"}, "96_tiprack_20ul": {"id": "opentrons_96_tiprack_20ul"}, "96_tiprack_300ul": {"id": "opentrons_96_tiprack_300ul"}, "24_tuberack_1500ul": {"id": "e14151500starlab_24_tuberack_1500ul"}, "96_wellplate_200ul_pcr_step_14": {"id": "4ti0960rig_96_wellplate_200ul"}, "96_wellplate_200ul_pcr_step_23": {"id": "4ti0960rig_96_wellplate_200ul"}, "agar_plate_step_4": {"id": "4ti0960rig_96_wellplate_200ul"}, "12_reservoir_21000ul": {"id": "4ti0131_12_reservoir_21000ul"}, "96_deepwellplate_2ml": {"id": "4ti0136_96_wellplate_2200ul"}}
-# __PARAMETERS={"purif_magdeck_height": {"value": 20.0}, "purif_wash_time": {"value": 0.5}, "purif_bead_ratio": {"value": 1.8}, "purif_incubation_time": {"value": 5.0}, "purif_settling_time": {"value": 2.0}, "purif_drying_time": {"value": 5.0}, "purif_elution_time": {"value": 2.0}, "transfo_incubation_temp": {"value": 4.0}, "transfo_incubation_time": {"value": 20.0}}
-
-sample_number=13
-ethanol_well='A11'
-__LABWARES={"p20_single": {"id": "p20_single_gen2"}, "p300_multi": {"id": "p300_multi_gen2"}, "mag_deck": {"id": "magdeck"}, "96_tiprack_20ul": {"id": "opentrons_96_tiprack_20ul"}, "96_tiprack_300ul": {"id": "opentrons_96_tiprack_300ul"}, "24_tuberack_1500ul": {"id": "e14151500starlab_24_tuberack_1500ul"}, "96_wellplate_200ul_pcr_step_14": {"id": "4ti0960rig_96_wellplate_200ul"}, "96_wellplate_200ul_pcr_step_23": {"id": "4ti0960rig_96_wellplate_200ul"}, "agar_plate_step_4": {"id": "4ti0960rig_96_wellplate_200ul"}, "12_reservoir_21000ul": {"id": "4ti0131_12_reservoir_21000ul"}, "96_deepwellplate_2ml": {"id": "4ti0136_96_wellplate_2200ul"}}
-__PARAMETERS={"purif_magdeck_height": {"value": 20}, "purif_wash_time": {"value": 0}, "purif_bead_ratio": {"value": 1}, "purif_incubation_time": {"value": 5}, "purif_settling_time": {"value": 2}, "purif_drying_time": {"value": 5}, "purif_elution_time": {"value": 2}, "transfo_incubation_temp": {"value": 4}, "transfo_incubation_time": {"value": 20}}
-
-
-def run(protocol: protocol_api.ProtocolContext):
-# added run function for API verison 2
-
-    def magbead(
-            sample_number,
-            ethanol_well,
-            elution_buffer_well='A1',
-            sample_volume=30,
-            bead_ratio=__PARAMETERS['purif_bead_ratio']['value'],
-            elution_buffer_volume=40,
-            incubation_time=__PARAMETERS['purif_incubation_time']['value'],
-            settling_time=__PARAMETERS['purif_settling_time']['value'],
-                # if using Gen 2 magentic module, need to change time! see: https://docs.opentrons.com/v2/new_modules.html
-                # "The GEN2 Magnetic Module uses smaller magnets than the GEN1 version...this means it will take longer for the GEN2 module to attract beads."
-                # Recommended Magnetic Module GEN2 bead attraction time:
-                    # Total liquid volume <= 50 uL: 5 minutes
-                # this template was written with the Gen 1 magnetic module, as it is compatible with API version 2
-            drying_time=__PARAMETERS['purif_drying_time']['value'],
-            elution_time=__PARAMETERS['purif_elution_time']['value'],
-            sample_offset=0,
-            tiprack_type=__LABWARES['96_tiprack_300ul']['id']):
-
-        """
-
-        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
-
-        # Pipettes
-        PIPETTE_ASPIRATE_RATE = 25
-        PIPETTE_DISPENSE_RATE = 150
-        TIPS_PER_SAMPLE = 9
-        PIPETTE_TYPE = __LABWARES['p300_multi']['id']
-            # new constant for easier swapping between pipette types
-
-        # Tiprack
-        CANDIDATE_TIPRACK_SLOTS = ['3', '6', '9', '2', '5']
-
-        # Magnetic Module
-        MAGDECK_POSITION = '1'
-
-        # Mix Plate
-        MIX_PLATE_TYPE = __LABWARES['96_wellplate_200ul_pcr_step_23']['id']
-            # modified from custom labware as API 2 doesn't support labware.create anymore, so the old add_labware script can't be used
-            # also acts as the type of plate loaded onto the magnetic module
-        MIX_PLATE_POSITION = '4'
-
-        # Reagents
-        REAGENT_CONTAINER_TYPE = __LABWARES['12_reservoir_21000ul']['id']
-        REAGENT_CONTAINER_POSITION = '7'
-
-        # Beads
-        BEAD_CONTAINER_TYPE = __LABWARES['96_deepwellplate_2ml']['id']
-        BEAD_CONTAINER_POSITION = '8'
-
-        # Settings
-        LIQUID_WASTE_WELL = 'A5'
-        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 = __PARAMETERS['purif_magdeck_height']['value']
-        AIR_VOL_COEFF = 0.1
-        ETHANOL_VOL = 150
-        WASH_TIME = __PARAMETERS['purif_wash_time']['value']
-        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')
-
-
-        ### Loading Tiprack
-
-        # Calculates whether one/two/three/four/five tipracks are needed, which are in slots 3, 6, 9, 2, and 5 respectively
-        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 = [protocol.load_labware(tiprack_type, slot) for slot in slots]
-            # changed to protocol.load_labware for API version 2
-
-
-        ### Loading Pipettes
-
-        pipette = protocol.load_instrument(PIPETTE_TYPE, mount="left", tip_racks=tipracks)
-        pipette.aspirate_flow_rate=PIPETTE_ASPIRATE_RATE
-        pipette.dispense_flow_rate=PIPETTE_DISPENSE_RATE
-            # for reference: default aspirate/dispense flow rate for p300_multi_gen2 is 94 ul/s
-
-        ### Define Labware
-
-        # Magnetic Module
-        MAGDECK = protocol.load_module(__LABWARES['mag_deck']['id'], MAGDECK_POSITION)
-            # 'magdeck' is the gen 1 magnetic module, use 'magnetic module gen2' for the gen 2 magentic module
-                # if using gen 2 module, need to change settling time! (see comments under Constants)
-        MAGDECK.disengage()
-            # disengages the magnets when it is turned on
-        mag_plate = MAGDECK.load_labware(MIX_PLATE_TYPE)
-
-        # Mix Plate
-        mix_plate = protocol.load_labware(MIX_PLATE_TYPE, MIX_PLATE_POSITION)
-
-        # Reagents
-        reagent_container = protocol.load_labware(REAGENT_CONTAINER_TYPE, REAGENT_CONTAINER_POSITION)
-
-        # Beads Container
-        bead_container = protocol.load_labware(BEAD_CONTAINER_TYPE, BEAD_CONTAINER_POSITION)
-
-
-        ### Calculating Columns
-
-        # Total number of columns
-        col_num = sample_number // 8 + (1 if sample_number % 8 > 0 else 0)
-
-        # Columns containing samples in location 1 (magentic module)
-            # generates a list of lists: [[A1, B1, C1...], [A2, B2, C2...]...]
-        samples = [col for col in mag_plate.columns()[sample_offset : col_num + sample_offset]]
-
-        # Columns to mix beads and samples in location 4 (mix plate)
-        mixing = [col for col in mix_plate.columns()[sample_offset:col_num + sample_offset]]
-
-        # Columns to dispense output in location 1 (magnetic module)
-            # purified parts are dispensed 6 rows to the right of their initial location
-            # this is why the number of samples cannot exceed 48
-
-        output = [col for col in mag_plate.columns()[6 + sample_offset:col_num + 6 + sample_offset]]
-
-        ### Defining Wells for Reagents, Liquid Waste, and Beads
-
-        liquid_waste = reagent_container.wells(LIQUID_WASTE_WELL)
-        ethanol = reagent_container.wells(ethanol_well)
-        elution_buffer = reagent_container.wells(elution_buffer_well)
-        beads = bead_container[BEADS_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
-
-
-        ### Steps
-
-        # Mix beads and parts
-        for target in range(int(len(samples))):
-
-            # Aspirate beads
-            pipette.pick_up_tip()
-            pipette.aspirate(bead_volume, beads)
-            protocol.max_speeds.update(SLOW_HEAD_SPEEDS)
-
-            # Aspirte samples
-            pipette.aspirate(sample_volume + DEAD_TOTAL_VOL, samples[target][0])
-
-            # Transfer and mix on mix_plate
-            pipette.dispense(total_vol, mixing[target][0])
-                # similar to above, added [0] because samples[target] returned a list of every well in column 1 rather than just one well
-            pipette.mix(IMMOBILISE_MIX_REPS, mix_vol, mixing[target][0])
-                # similar to above, added [0] because samples[target] returned a list of every well in column 1 rather than just one well
-            pipette.blow_out()
-
-            # Dispose of tip
-            protocol.max_speeds.update(DEFAULT_HEAD_SPEEDS)
-            pipette.drop_tip()
-
-        # Immobilise sample
-        protocol.delay(minutes=incubation_time)
-
-        # Transfer beads+samples back to magdeck
-        for target in range(int(len(samples))):
-            pipette.transfer(total_vol, mixing[target], samples[target], blow_out=True, blowout_location='destination well')
-            # added blowout_location=destination well because default location of blowout is waste in API version 2
-
-        # Engagae MagDeck and incubate
-        MAGDECK.engage(height=MAGDECK_HEIGHT)
-        protocol.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)
-            protocol.delay(minutes=WASH_TIME)
-            for target in samples:
-                pipette.transfer(ETHANOL_VOL + ETHANOL_DEAD_VOL, target, liquid_waste, air_gap=air_vol)
-
-        # Dry at room temperature
-        protocol.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 room temperature
-        protocol.delay(minutes=elution_time)
-
-        # Engage MagDeck (remains engaged for DNA elution)
-        MAGDECK.engage(height=MAGDECK_HEIGHT)
-        protocol.delay(minutes=ELUTANT_SEP_TIME)
-
-        # Transfer purified parts 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)
-    # removed elution buffer well='A1', added that to where the function is defined
--- a/test-data/dnabot_scripts/output/3_assembly_ot2_APIv1.py	Tue Dec 14 14:46:38 2021 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,84 +0,0 @@
-from opentrons import labware, instruments, modules, robot
-import numpy as np
-
-
-final_assembly_dict={"A1": ["A7", "B7", "C7", "D7", "E7"], "B1": ["A7", "F7", "G7", "H7", "A8"], "C1": ["A7", "B8", "C8", "D8", "E8"]}
-tiprack_num=1
-
-
-def final_assembly(final_assembly_dict, tiprack_num, tiprack_type="tiprack-10ul"):
-    """Implements final assembly reactions using an opentrons OT-2.
-
-    Args:
-    final_assembly_dict (dict): Dictionary with keys and values corresponding to destination and associated linker-ligated part wells, respectively.
-    tiprack_num (int): Number of tipracks required during run.
-
-    """
-
-    # Constants
-    CANDIDATE_TIPRACK_SLOTS = ['3', '6', '9', '2', '5', '8', '11']
-    PIPETTE_MOUNT = 'right'
-    MAG_PLATE_TYPE = '4ti-0960_FrameStar'
-    MAG_PLATE_POSITION = '1'
-    TUBE_RACK_TYPE = 'tube-rack_E1415-1500'
-    TUBE_RACK_POSITION = '7'
-    DESTINATION_PLATE_TYPE = 'aluminium-block_4ti-0960_FrameStar'
-    TEMPDECK_SLOT = '4'
-    TEMP = 20
-    TOTAL_VOL = 15
-    PART_VOL = 1.5
-    MIX_SETTINGS = (1, 3)
-
-    # Errors
-    sample_number = len(final_assembly_dict.keys())
-    if sample_number > 96:
-        raise ValueError('Final assembly nummber cannot exceed 96.')
-
-    # Tips and pipette
-    slots = CANDIDATE_TIPRACK_SLOTS[:tiprack_num]
-    tipracks = [labware.load(tiprack_type, slot)
-                for slot in slots]
-    pipette = instruments.P10_Single(mount=PIPETTE_MOUNT, tip_racks=tipracks)
-
-    # Define Labware and set temperature
-    magbead_plate = labware.load(MAG_PLATE_TYPE, MAG_PLATE_POSITION)
-    tube_rack = labware.load(TUBE_RACK_TYPE, TUBE_RACK_POSITION)
-    tempdeck = modules.load('tempdeck', TEMPDECK_SLOT)
-    destination_plate = labware.load(
-        DESTINATION_PLATE_TYPE, TEMPDECK_SLOT, share=True)
-    tempdeck.set_temperature(TEMP)
-    tempdeck.wait_for_temp()
-
-    # Master mix transfers
-    final_assembly_lens = []
-    for values in final_assembly_dict.values():
-        final_assembly_lens.append(len(values))
-    unique_assemblies_lens = list(set(final_assembly_lens))
-    master_mix_well_letters = ['A', 'B', 'C', 'D']
-    for x in unique_assemblies_lens:
-        master_mix_well = master_mix_well_letters[(x - 1) // 6] + str(x - 1)
-        destination_inds = [i for i, lens in enumerate(
-            final_assembly_lens) if lens == x]
-        destination_wells = np.array(
-            [key for key, value in list(final_assembly_dict.items())])
-        destination_wells = list(destination_wells[destination_inds])
-        pipette.pick_up_tip()
-        pipette.transfer(TOTAL_VOL - x * PART_VOL, tube_rack.wells(master_mix_well),
-                         destination_plate.wells(destination_wells),
-                         new_tip='never')
-        pipette.drop_tip()
-
-    # Part transfers
-    for key, values in list(final_assembly_dict.items()):
-        pipette.transfer(PART_VOL, magbead_plate.wells(values),
-                         destination_plate.wells(key), mix_after=MIX_SETTINGS,
-                         new_tip='always')
-
-    tempdeck.deactivate()
-
-
-final_assembly(final_assembly_dict=final_assembly_dict,
-               tiprack_num=tiprack_num)
-
-for c in robot.commands():
-    print(c)
--- a/test-data/dnabot_scripts/output/3_assembly_ot2_APIv2.8.py	Tue Dec 14 14:46:38 2021 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,92 +0,0 @@
-from opentrons import protocol_api
-import numpy as np
-# metadata
-metadata = {
-'protocolName': 'My Protocol',
-'description': 'Simple protocol to get started using OT2',
-'apiLevel': '2.8'
-}
-
-# protocol run function. the part after the colon lets your editor know
-
-
-# test dict can be used for simulation
-#final_assembly_dict={ "A1": ['A7', 'B7', 'C7', 'F7'], "B1": ['A7', 'B7', 'D7', 'G7'], "C1": ['A7', 'B7', 'E7', 'H7']}
-#tiprack_num=1
-
-# __LABWARES is expected to be redefined by "generate_ot2_script" method
-# Test dict
-# __LABWARES={"p20_single": {"id": "p20_single_gen2"}, "p300_multi": {"id": "p300_multi_gen2"}, "mag_deck": {"id": "magdeck"}, "96_tiprack_20ul": {"id": "opentrons_96_tiprack_20ul"}, "96_tiprack_300ul": {"id": "opentrons_96_tiprack_300ul"}, "24_tuberack_1500ul": {"id": "e14151500starlab_24_tuberack_1500ul"}, "96_wellplate_200ul_pcr_step_14": {"id": "4ti0960rig_96_wellplate_200ul"}, "96_wellplate_200ul_pcr_step_23": {"id": "4ti0960rig_96_wellplate_200ul"}, "agar_plate_step_4": {"id": "4ti0960rig_96_wellplate_200ul"}, "12_reservoir_21000ul": {"id": "4ti0131_12_reservoir_21000ul"}, "96_deepwellplate_2ml": {"id": "4ti0136_96_wellplate_2200ul"}}
-
-final_assembly_dict={"A1": ["A7", "B7", "C7", "D7", "E7"], "B1": ["A7", "F7", "G7", "H7", "A8"], "C1": ["A7", "B8", "C8", "D8", "E8"]}
-tiprack_num=1
-__LABWARES={"p20_single": {"id": "p20_single_gen2"}, "p300_multi": {"id": "p300_multi_gen2"}, "mag_deck": {"id": "magdeck"}, "96_tiprack_20ul": {"id": "opentrons_96_tiprack_20ul"}, "96_tiprack_300ul": {"id": "opentrons_96_tiprack_300ul"}, "24_tuberack_1500ul": {"id": "e14151500starlab_24_tuberack_1500ul"}, "96_wellplate_200ul_pcr_step_14": {"id": "4ti0960rig_96_wellplate_200ul"}, "96_wellplate_200ul_pcr_step_23": {"id": "4ti0960rig_96_wellplate_200ul"}, "agar_plate_step_4": {"id": "4ti0960rig_96_wellplate_200ul"}, "12_reservoir_21000ul": {"id": "4ti0131_12_reservoir_21000ul"}, "96_deepwellplate_2ml": {"id": "4ti0136_96_wellplate_2200ul"}}
-
-
-def run(protocol: protocol_api.ProtocolContext):
-    def final_assembly(final_assembly_dict, tiprack_num, tiprack_type=__LABWARES['96_tiprack_20ul']['id']):
-            # Constants, we update all the labware name in version 2
-            #Tiprack
-            CANDIDATE_TIPRACK_SLOTS = ['3', '6', '9', '2', '5', '8', '11']
-            PIPETTE_MOUNT = 'right'
-            #Plate of sample after  purification
-            MAG_PLATE_TYPE = __LABWARES['96_wellplate_200ul_pcr_step_23']['id']
-            MAG_PLATE_POSITION = '1'
-            #Tuberack
-            TUBE_RACK_TYPE = __LABWARES['24_tuberack_1500ul']['id']
-            TUBE_RACK_POSITION = '7'
-            #Destination plate
-            DESTINATION_PLATE_TYPE = __LABWARES['96_wellplate_200ul_pcr_step_23']['id']
-            #Temperature control plate
-            TEMPDECK_SLOT = '4'
-            TEMP = 20
-            TOTAL_VOL = 15
-            PART_VOL = 1.5
-            MIX_SETTINGS = (1, 3)
-            tiprack_num=tiprack_num+1
-            # Errors
-            sample_number = len(final_assembly_dict.keys())
-            if sample_number > 96:
-                raise ValueError('Final assembly nummber cannot exceed 96.')
-
-            slots = CANDIDATE_TIPRACK_SLOTS[:tiprack_num]
-            tipracks = [protocol.load_labware(tiprack_type, slot) for slot in slots]
-            pipette = protocol.load_instrument(__LABWARES['p20_single']['id'], PIPETTE_MOUNT, tip_racks=tipracks)
-
-
-            # Define Labware and set temperature
-            magbead_plate = protocol.load_labware(MAG_PLATE_TYPE, MAG_PLATE_POSITION)
-            tube_rack = protocol.load_labware(TUBE_RACK_TYPE, TUBE_RACK_POSITION)
-            tempdeck = protocol.load_module('tempdeck', TEMPDECK_SLOT)
-            destination_plate = tempdeck.load_labware(
-            DESTINATION_PLATE_TYPE, TEMPDECK_SLOT)
-            tempdeck.set_temperature(TEMP)
-
-             # Master mix transfers
-            final_assembly_lens = []
-            for values in final_assembly_dict.values():
-                final_assembly_lens.append(len(values))
-            unique_assemblies_lens = list(set(final_assembly_lens))
-            master_mix_well_letters = ['A', 'B', 'C', 'D']
-            for x in unique_assemblies_lens:
-                master_mix_well = master_mix_well_letters[(x - 1) // 6] + str(x - 1)
-                destination_inds = [i for i, lens in enumerate(final_assembly_lens) if lens == x]
-                destination_wells = np.array([key for key, value in list(final_assembly_dict.items())])
-                destination_wells = list(destination_wells[destination_inds])
-                for destination_well in destination_wells:# make tube_rack_wells and destination_plate.wells in the same type
-                    pipette.pick_up_tip()
-                    pipette.transfer(TOTAL_VOL - x * PART_VOL, tube_rack.wells(master_mix_well),
-                                     destination_plate.wells(destination_well), new_tip='never')#transfer water and buffer in the pipette
-
-                    pipette.drop_tip()
-
-            # Part transfers
-            for key, values in list(final_assembly_dict.items()):
-                for value in values:# magbead_plate.wells and destination_plate.wells in the same type
-                    pipette.transfer(PART_VOL, magbead_plate.wells(value),
-                                     destination_plate.wells(key), mix_after=MIX_SETTINGS,
-                                     new_tip='always')#transfer parts in one tube
-
-            tempdeck.deactivate() #stop increasing the temperature
-
-    final_assembly(final_assembly_dict=final_assembly_dict, tiprack_num=tiprack_num)
--- a/test-data/dnabot_scripts/output/3_assembly_ot2_Thermocycler_APIv2.8.py	Tue Dec 14 14:46:38 2021 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,107 +0,0 @@
-from opentrons import protocol_api
-import numpy as np
-# metadata
-metadata = {
-'protocolName': 'DNABOT Assembly Thermocycler',
-'description': 'DNABOT Assembly Step3 with Thermocycler',
-'apiLevel': '2.8'
-}
-
-# It is possible to run 88 assemblies with this new module. The heat block module is removed. 
-# Assembly reactions is set up on thermocycler module.
-
-
-# test dictionary can be used for simulation 3 or 88 assemblies
-#final_assembly_dict={"A1": ['A7', 'B7', 'C7', 'F7'], "B1": ['A7', 'B7', 'D7', 'G7'], "C1": ['A7', 'B7', 'E7', 'H7']}
-#tiprack_num=1
-
-#final_assembly_dict={"A1": ["A7", "G7", "H7", "A8", "B8"], "B1": ["A7", "D8", "E8", "F8", "G8"], "C1": ["A7", "D8", "H7", "H8", "B9"], "D1": ["A7", "C9", "E9", "G9", "B8"], "E1": ["A7", "H9", "B10", "E9", "D10"], "F1": ["A7", "C9", "H8", "F10", "D10"], "G1": ["A7", "C9", "H10", "E8", "B9"], "H1": ["A7", "H9", "F8", "H10", "B11"], "A2": ["A7", "G7", "E8", "B10", "G8"], "B2": ["A7", "G7", "D11", "A8", "B9"], "C2": ["A7", "C9", "E9", "G9", "B9"], "D2": ["A7", "G7", "H7", "H8", "B8"], "E2": ["A7", "F11", "H11", "H7", "B12"], "F2": ["A7", "C9", "H8", "H11", "D10"], "G2": ["A7", "G7", "D11", "A8", "B8"], "H2": ["B7", "F11", "B10", "H10", "B11"], "A3": ["B7", "D8", "H7", "H8", "B8"], "B3": ["B7", "C9", "H10", "G9", "B8"], "C3": ["B7", "D12", "H8", "H11", "B11"], "D3": ["B7", "D12", "E9", "E8", "B8"], "E3": ["B7", "D12", "E9", "E8", "B9"], "F3": ["B7", "H9", "B10", "H10", "D10"], "G3": ["B7", "G7", "D11", "H8", "B8"], "H3": ["B7", "D12", "H10", "G9", "B9"], "A4": ["B7", "F11", "F10", "D11", "B12"], "B4": ["B7", "G7", "H7", "A8", "B9"], "C4": ["B7", "G7", "E8", "B10", "B12"], "D4": ["B7", "H9", "H11", "H7", "G8"], "E4": ["B7", "D8", "E8", "F8", "B12"], "F4": ["B7", "D12", "E9", "G9", "B8"], "G4": ["C7", "H9", "B10", "E9", "B11"], "H4": ["C7", "F11", "B10", "H10", "D10"], "A5": ["C7", "H9", "F8", "E9", "B11"], "B5": ["C7", "D12", "H8", "F10", "B11"], "C5": ["C7", "F11", "F8", "H10", "B11"], "D5": ["C7", "F11", "H11", "H7", "G8"], "E5": ["C7", "D8", "D11", "A8", "B9"], "F5": ["C7", "H9", "H11", "H7", "B12"], "G5": ["C7", "C9", "H10", "G9", "B9"], "H5": ["C7", "H9", "F10", "H7", "G8"], "A6": ["C7", "D12", "A8", "H11", "D10"], "B6": ["C7", "C9", "A8", "H11", "B11"], "C6": ["C7", "F11", "H11", "D11", "B12"], "D6": ["C7", "D8", "E8", "B10", "G8"], "E6": ["C7", "C9", "H8", "H11", "B11"], "F6": ["D7", "D8", "G9", "F8", "G8"], "G6": ["D7", "C9", "A8", "F10", "B11"], "H6": ["D7", "F11", "F10", "H7", "B12"], "A7": ["D7", "C9", "A8", "F10", "D10"], "B7": ["D7", "H9", "F8", "E9", "D10"], "C7": ["D7", "G7", "G9", "F8", "B12"], "D7": ["D7", "D12", "A8", "H11", "B11"], "E7": ["D7", "D12", "H10", "G9", "B8"], "F7": ["D7", "H9", "H11", "D11", "B12"], "G7": ["D7", "C9", "H8", "F10", "B11"], "H7": ["D7", "D8", "D11", "H8", "B8"], "A8": ["D7", "C9", "E9", "E8", "B9"], "B8": ["D7", "H9", "F10", "D11", "G8"], "C8": ["D7", "H9", "H11", "D11", "G8"], "D8": ["D7", "D12", "A8", "F10", "D10"], "E8": ["E7", "G7", "G9", "F8", "G8"], "F8": ["E7", "D12", "A8", "F10", "B11"], "G8": ["E7", "H9", "F10", "D11", "B12"], "H8": ["E7", "D8", "E8", "B10", "B12"], "A9": ["E7", "C9", "E9", "E8", "B8"], "B9": ["E7", "F11", "B10", "E9", "D10"], "C9": ["E7", "D12", "H8", "F10", "D10"], "D9": ["E7", "H9", "B10", "H10", "B11"], "E9": ["E7", "D8", "G9", "F8", "B12"], "F9": ["E7", "F11", "B10", "E9", "B11"], "G9": ["E7", "F11", "F8", "E9", "C11"], "H9": ["E7", "G7", "G9", "B10", "B12"], "A10": ["E7", "D8", "G9", "B10", "B12"], "B10": ["E7", "D8", "D11", "A8", "B8"], "C10": ["E7", "F11", "F10", "H7", "G8"], "D10": ["F7", "F11", "F8", "E9", "D10"], "E10": ["F7", "H9", "F10", "H7", "B12"], "F10": ["F7", "D12", "H10", "E8", "B9"], "G10": ["F7", "C9", "H10", "E8", "B8"], "H10": ["F7", "F11", "F8", "H10", "D10"], "A11": ["F7", "D12", "H10", "E8", "B8"], "B11": ["F7", "G7", "H7", "H8", "B9"], "C11": ["F7", "G7", "G9", "B10", "G8"], "D11": ["F7", "D12", "H8", "H11", "D10"], "E11": ["F7", "D9", "A8", "H11", "D10"], "F11": ["F7", "G7", "D11", "H8", "B9"], "G11": ["F7", "F11", "A12", "D11", "G8"], "H11": ["F7", "D8", "D11", "A9", "B9"]}
-#tiprack_num=5
-
-# __LABWARES is expected to be redefined by "generate_ot2_script" method
-# Test dict
-# __LABWARES={"p20_single": {"id": "p20_single_gen2"}, "p300_multi": {"id": "p300_multi_gen2"}, "mag_deck": {"id": "magdeck"}, "96_tiprack_20ul": {"id": "opentrons_96_tiprack_20ul"}, "96_tiprack_300ul": {"id": "opentrons_96_tiprack_300ul"}, "24_tuberack_1500ul": {"id": "e14151500starlab_24_tuberack_1500ul"}, "96_wellplate_200ul_pcr_step_14": {"id": "4ti0960rig_96_wellplate_200ul"}, "96_wellplate_200ul_pcr_step_23": {"id": "4ti0960rig_96_wellplate_200ul"}, "agar_plate_step_4": {"id": "4ti0960rig_96_wellplate_200ul"}, "12_reservoir_21000ul": {"id": "4ti0131_12_reservoir_21000ul"}, "96_deepwellplate_2ml": {"id": "4ti0136_96_wellplate_2200ul"}}
-
-final_assembly_dict={"A1": ["A7", "B7", "C7", "D7", "E7"], "B1": ["A7", "F7", "G7", "H7", "A8"], "C1": ["A7", "B8", "C8", "D8", "E8"]}
-tiprack_num=1
-__LABWARES={"p20_single": {"id": "p20_single_gen2"}, "p300_multi": {"id": "p300_multi_gen2"}, "mag_deck": {"id": "magdeck"}, "96_tiprack_20ul": {"id": "opentrons_96_tiprack_20ul"}, "96_tiprack_300ul": {"id": "opentrons_96_tiprack_300ul"}, "24_tuberack_1500ul": {"id": "e14151500starlab_24_tuberack_1500ul"}, "96_wellplate_200ul_pcr_step_14": {"id": "4ti0960rig_96_wellplate_200ul"}, "96_wellplate_200ul_pcr_step_23": {"id": "4ti0960rig_96_wellplate_200ul"}, "agar_plate_step_4": {"id": "4ti0960rig_96_wellplate_200ul"}, "12_reservoir_21000ul": {"id": "4ti0131_12_reservoir_21000ul"}, "96_deepwellplate_2ml": {"id": "4ti0136_96_wellplate_2200ul"}}
-
-
-def run(protocol: protocol_api.ProtocolContext):
-    def final_assembly(final_assembly_dict, tiprack_num, tiprack_type=__LABWARES['96_tiprack_20ul']['id']):
-            # Constants, we update all the labware name in version 2
-            #Tiprack
-            CANDIDATE_TIPRACK_SLOTS = ['2', '3', '5', '6', '9']
-            PIPETTE_MOUNT = 'right'
-            #Plate of sample after  purification
-            MAG_PLATE_TYPE = __LABWARES['96_wellplate_200ul_pcr_step_23']['id']
-            MAG_PLATE_POSITION = '1'
-            #Tuberack
-            TUBE_RACK_TYPE = __LABWARES['24_tuberack_1500ul']['id']
-            TUBE_RACK_POSITION = '4'
-            #Destination plate
-            DESTINATION_PLATE_TYPE = __LABWARES['96_wellplate_200ul_pcr_step_23']['id']
-            TOTAL_VOL = 15
-            PART_VOL = 1.5
-            MIX_SETTINGS = (1, 3)
-            tiprack_num=tiprack_num+1
-            # Errors
-            sample_number = len(final_assembly_dict.keys())
-            if sample_number > 96:
-                raise ValueError('Final assembly nummber cannot exceed 96.')
-
-            slots = CANDIDATE_TIPRACK_SLOTS[:tiprack_num]
-            tipracks = [protocol.load_labware(tiprack_type, slot) for slot in slots]
-            pipette = protocol.load_instrument(__LABWARES['p20_single']['id'], PIPETTE_MOUNT, tip_racks=tipracks)
-
-            # Define Labware and set temperature
-            magbead_plate = protocol.load_labware(MAG_PLATE_TYPE, MAG_PLATE_POSITION)
-            tube_rack = protocol.load_labware(TUBE_RACK_TYPE, TUBE_RACK_POSITION)
-            
-            
-            #Thermocycler Module
-            tc_mod = protocol.load_module('Thermocycler Module')
-            destination_plate = tc_mod.load_labware(DESTINATION_PLATE_TYPE)
-            tc_mod.set_block_temperature(20)
-
-
-             # Master mix transfers
-            final_assembly_lens = []
-            for values in final_assembly_dict.values():
-                final_assembly_lens.append(len(values))
-            unique_assemblies_lens = list(set(final_assembly_lens))
-            master_mix_well_letters = ['A', 'B', 'C', 'D']
-            
-            for x in unique_assemblies_lens:
-                master_mix_well = master_mix_well_letters[(x - 1) // 6] + str(x - 1)
-                destination_inds = [i for i, lens in enumerate(final_assembly_lens) if lens == x]
-                destination_wells = np.array([key for key, value in list(final_assembly_dict.items())])
-                destination_wells = list(destination_wells[destination_inds])
-                
-                pipette.pick_up_tip()
-                for destination_well in destination_wells:# make tube_rack_wells and destination_plate.wells in the same type
-                    
-                    pipette.transfer(TOTAL_VOL - x * PART_VOL, tube_rack.wells(master_mix_well),
-                                     destination_plate.wells(destination_well), new_tip='never')#transfer water and buffer in the pipette
-
-            pipette.drop_tip()
-
-            # Part transfers
-            for key, values in list(final_assembly_dict.items()):
-                for value in values:# magbead_plate.wells and destination_plate.wells in the same type
-                    pipette.transfer(PART_VOL, magbead_plate.wells(value),
-                                     destination_plate.wells(key), mix_after=MIX_SETTINGS,
-                                     new_tip='always')#transfer parts in one tube
-
-
-
-            #Thermocycler Module
-            tc_mod.close_lid()
-            tc_mod.set_lid_temperature(105)
-            tc_mod.set_block_temperature(50, hold_time_minutes=45, block_max_volume=15)
-            tc_mod.set_block_temperature(4, hold_time_minutes=2, block_max_volume=30)
-            # Increase the hold time at 4 C if necessary
-            tc_mod.set_lid_temperature(37)
-            tc_mod.open_lid()
-
-    final_assembly(final_assembly_dict=final_assembly_dict, tiprack_num=tiprack_num)
--- a/test-data/dnabot_scripts/output/4_transformation_ot2_APIv1.py	Tue Dec 14 14:46:38 2021 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,318 +0,0 @@
-from opentrons import labware, instruments, modules, robot
-import numpy as np
-
-
-spotting_tuples=[(('A1', 'B1', 'C1'), ('A1', 'B1', 'C1'), (5, 5, 5))]
-soc_well='A1'
-
-
-def generate_transformation_wells(spotting_tuples):
-    """Evaluates spotting_tuples and returns transformation wells.
-
-    Args:
-    spotting_tuples (list): Sets of spotting reactions are given 
-        in the form: ((source wells), (target wells), (spotting volumes)). 
-        Each unique transformation well is resuspended once prior to spotting.
-
-    """
-    wells = []
-    for spotting_tuple in spotting_tuples:
-        for source_well in spotting_tuple[0]:
-            wells.append(source_well)
-    transformation_wells = [well for i, well in enumerate(
-        wells) if wells.index(well) == i]
-    return transformation_wells
-
-
-def tiprack_slots(
-        spotting_tuples,
-        max_spot_vol=5):
-    """Calculates p10 and p300 tiprack slots required.
-
-    Args:
-    spotting_tuples (list): Sets of spotting reactions are given 
-        in the form: ((source wells), (target wells), (spotting volumes)). 
-        Each unique transformation well is resuspended once prior to spotting.
-    max_spot_vol (float): Maximum volume that is spotted per spot reaction.
-
-    """
-    # Reactions' number
-    transformation_reactions = len(
-        generate_transformation_wells(spotting_tuples))
-    spotting_reactions = 0
-    for spotting_tuple in spotting_tuples:
-        spots = np.array(spotting_tuple[2])/max_spot_vol
-        np.ceil(spots)
-        spotting_reactions = spotting_reactions + int(np.sum(spots))
-
-    # p10 tiprack slots
-    p10_tips = transformation_reactions + spotting_reactions
-    p10_tiprack_slots = p10_tips // 96 + 1 if p10_tips % 96 > 0 else p10_tips / 96
-
-    # p300 tiprack slots
-    p300_tips = transformation_reactions + spotting_reactions
-    p300_tiprack_slots = p300_tips // 96 + \
-        1 if p300_tips % 96 > 0 else p300_tips / 96
-    return int(p10_tiprack_slots), int(p300_tiprack_slots)
-
-
-def transformation_setup(transformation_wells):
-    """Sets up transformation reactions
-
-    Args:
-    transformation_wells (list). 
-
-    """
-
-    # Constants
-    TEMP = 4  # Incubation temperature.
-    ASSEMBLY_VOL = 5  # Volume of final assembly added to competent cells.
-    MIX_SETTINGS = (4, 5)  # Mix after setting during final assembly transfers.
-    INCUBATION_TIME = 20  # Cells and final assembly incubation time.
-
-    # Set temperature deck to 4 °C and load competent cells
-    tempdeck.set_temperature(TEMP)
-    tempdeck.wait_for_temp()
-    robot.pause()
-    robot.comment('Load competent cells, uncap and resume run')
-
-    # Transfer final assemblies
-    p10_pipette.transfer(ASSEMBLY_VOL,
-                         assembly_plate.wells(transformation_wells),
-                         transformation_plate.wells(
-                             transformation_wells), new_tip='always',
-                         mix_after=(MIX_SETTINGS))
-
-    # Incubate for 20 minutes and remove competent cells for heat shock
-    p10_pipette.delay(minutes=INCUBATION_TIME)
-    robot.pause()
-    robot.comment(
-        'Remove transformation reactions, conduct heatshock and replace.')
-
-
-def phase_switch(comment='Remove final assembly plate. Introduce agar tray and deep well plate containing SOC media. Resume run.'):
-    """Function pauses run enabling addition/removal of labware.
-
-    Args:
-    comment (str): string to be displayed during run following pause.
-
-    """
-    robot.pause()
-    robot.comment(comment)
-
-
-def outgrowth(
-        cols,
-        soc_well):
-    """Outgrows transformed cells.
-
-    Args:
-    cols (list of str): list of cols in transformation plate containing samples.
-    soc_well (str): Well containing SOC media in relevant plate.
-
-    """
-
-    # Constants
-    SOC_VOL = 125
-    SOC_MIX_SETTINGS = (4, 50)
-    TEMP = 37
-    OUTGROWTH_TIME = 60
-    SOC_ASPIRATION_RATE = 25
-    P300_DEFAULT_ASPIRATION_RATE = 150
-
-    # Define wells
-    transformation_cols = transformation_plate.cols(cols)
-    soc = soc_plate.wells(soc_well)
-
-    # Add SOC to transformed cells
-    p300_pipette.set_flow_rate(aspirate=SOC_ASPIRATION_RATE)
-    p300_pipette.transfer(SOC_VOL, soc, transformation_cols,
-                          new_tip='always', mix_after=SOC_MIX_SETTINGS)
-    p300_pipette.set_flow_rate(aspirate=P300_DEFAULT_ASPIRATION_RATE)
-
-    # Incubate for 1 hour at 37 °C
-    tempdeck.set_temperature(TEMP)
-    tempdeck.wait_for_temp()
-    p300_pipette.delay(minutes=OUTGROWTH_TIME)
-    tempdeck.deactivate()
-
-
-def spotting_cols(spotting_tuples):
-    """Evaluates spotting_tuples and returns unique cols (str) 
-    associated with each spotting_tuple's source wells.
-
-    Args:
-    spotting_tuples (list): Sets of spotting reactions are given 
-        in the form: ((source wells), (target wells), (spotting volumes)). 
-        Each unique transformation well is resuspended once prior to spotting.
-
-    """
-    cols_list = []
-    for spotting_tuple in spotting_tuples:
-        source_wells_cols = [source_well[1:]
-                             for source_well in spotting_tuple[0]]
-        unique_cols = [col for i, col in enumerate(
-            source_wells_cols) if source_wells_cols.index(col) == i]
-        cols_list.append(unique_cols)
-    return cols_list
-
-
-def spot_transformations(
-        spotting_tuples,
-        dead_vol=2,
-        spotting_dispense_rate=0.025,
-        stabbing_depth=10,
-        max_spot_vol=5):
-    """Spots transformation reactions.
-
-    Args:
-    spotting_tuples (list): Sets of spotting reactions are given 
-        in the form: ((source wells), (target wells), (spotting volumes)). 
-        Each unique source well is resuspended once prior to spotting.
-    dead_vol (float): Dead volume aspirated during spotting.
-    spotting_dispense_rate (float): Rate p10_pipette dispenses at during spotting.
-    stabbing_depth (float): Depth p10_pipette moves into agar during spotting.
-    max_spot_vol (float): Maximum volume that is spotted per spot reaction. 
-
-    """
-
-    def spot(
-            source,
-            target,
-            spot_vol):
-        """Spots an individual reaction using the p10 pipette.
-
-        Args:
-        source (str): Well containing the transformation reaction to be spotted.
-        target (str): Well transformation reaction is to be spotted to.
-        spot_vol (float): Volume of transformation reaction to be spotted (uL).  
-
-        """
-        # Constants
-        DEFAULT_HEAD_SPEED = {'x': 400, 'y': 400,
-                              'z': 125, 'a': 125}
-        SPOT_HEAD_SPEED = {'x': 400, 'y': 400, 'z': 125,
-                           'a': 125 // 4}
-        DISPENSING_HEIGHT = 5
-        SAFE_HEIGHT = 15  # height avoids collision with agar tray.
-
-        # Spot
-        p10_pipette.pick_up_tip()
-        p10_pipette.aspirate(spot_vol + dead_vol, source)
-        p10_pipette.move_to(target.top(SAFE_HEIGHT))
-        p10_pipette.move_to(target.top(DISPENSING_HEIGHT))
-        p10_pipette.dispense(volume=spot_vol, rate=spotting_dispense_rate)
-        robot.head_speed(combined_speed=max(
-            SPOT_HEAD_SPEED.values()), **SPOT_HEAD_SPEED)
-        p10_pipette.move_to(target.top(-1 * stabbing_depth))
-        robot.head_speed(combined_speed=max(
-            DEFAULT_HEAD_SPEED.values()), **DEFAULT_HEAD_SPEED)
-        p10_pipette.move_to(target.top(SAFE_HEIGHT))
-
-        # Dispose of dead volume and tip
-        p10_pipette.dispense(dead_vol, spotting_waste)
-        p10_pipette.blow_out()
-        p10_pipette.drop_tip()
-
-    def spot_tuple(spotting_tuple):
-        """Spots all reactions defined by the spotting tuple. Requires the function spot.
-
-            Args:
-            spotting_tuple (tuple): Spotting reactions given in the form: (source wells), (target wells), (spotting volumes).
-
-        """
-        source_wells = spotting_tuple[0]
-        target_wells = spotting_tuple[1]
-        spot_vols = list(spotting_tuple[2])
-        while max(spot_vols) > 0:
-            for index, spot_vol in enumerate(spot_vols):
-                if spot_vol == 0:
-                    pass
-                else:
-                    vol = spot_vol if spot_vol <= max_spot_vol else max_spot_vol
-                    spot(transformation_plate.wells(source_wells[index]),
-                         agar_plate.wells(target_wells[index]), vol)
-                    spot_vols[index] = spot_vols[index] - vol
-
-    # Constants
-    TRANSFORMATION_MIX_SETTINGS = [4, 50]
-
-    # Spot transformation reactions
-    for spotting_tuple in spotting_tuples:
-        source_wells_cols = [source_well[1:]
-                             for source_well in spotting_tuple[0]]
-        unique_cols = [col for i, col in enumerate(
-            source_wells_cols) if source_wells_cols.index(col) == i]
-        for col in unique_cols:
-            p300_pipette.pick_up_tip()
-            p300_pipette.mix(TRANSFORMATION_MIX_SETTINGS[0],
-                             TRANSFORMATION_MIX_SETTINGS[1],
-                             transformation_plate.cols(col))
-            p300_pipette.drop_tip()
-        spot_tuple(spotting_tuple)
-
-
-# Run protocol
-
-# Constants
-CANDIDATE_P10_SLOTS = ['9', '2', '5']
-CANDIDATE_P300_SLOTS = ['3', '6']
-P10_TIPRACK_TYPE = 'tiprack-10ul'
-P300_TIPRACK_TYPE = 'opentrons_96_tiprack_300ul'
-P10_MOUNT = 'right'
-P300_MOUNT = 'left'
-ASSEMBLY_PLATE_TYPE = '4ti-0960_FrameStar'
-ASSEMBLY_PLATE_SLOT = '8'
-TEMPDECK_SLOT = '10'
-TRANSFORMATION_PLATE_TYPE = 'Eppendorf_30133366_plate_96'
-SOC_PLATE_TYPE = '4ti0136_96_deep-well'
-SOC_PLATE_SLOT = '7'
-TUBE_RACK_TYPE = 'tube-rack_E1415-1500'
-TUBE_RACK_SLOT = '11'
-SPOTTING_WASTE_WELL = 'A1'
-AGAR_PLATE_TYPE = 'Nunc_Omnitray'
-AGAR_PLATE_SLOT = '1'
-
-# Tiprack slots
-p10_p300_tiprack_slots = tiprack_slots(spotting_tuples)
-p10_slots = CANDIDATE_P10_SLOTS[
-    :p10_p300_tiprack_slots[0]]
-p300_slots = CANDIDATE_P300_SLOTS[
-    :p10_p300_tiprack_slots[1]]
-
-# Define labware
-p10_tipracks = [labware.load(P10_TIPRACK_TYPE, slot)
-                for slot in p10_slots]
-p300_tipracks = [labware.load(P300_TIPRACK_TYPE, slot)
-                 for slot in p300_slots]
-p10_pipette = instruments.P10_Single(
-    mount=P10_MOUNT, tip_racks=p10_tipracks)
-p300_pipette = instruments.P300_Multi(
-    mount=P300_MOUNT, tip_racks=p300_tipracks)
-
-assembly_plate = labware.load(ASSEMBLY_PLATE_TYPE, ASSEMBLY_PLATE_SLOT)
-tempdeck = modules.load('tempdeck', TEMPDECK_SLOT)
-transformation_plate = labware.load(TRANSFORMATION_PLATE_TYPE,
-                                    TEMPDECK_SLOT, share=True)
-soc_plate = labware.load(SOC_PLATE_TYPE, SOC_PLATE_SLOT)
-tube_rack = labware.load(TUBE_RACK_TYPE, TUBE_RACK_SLOT)
-spotting_waste = tube_rack.wells(SPOTTING_WASTE_WELL)
-agar_plate = labware.load(AGAR_PLATE_TYPE, AGAR_PLATE_SLOT)
-
-# Register agar_plate for calibration
-p10_pipette.transfer(1, agar_plate.wells(
-    'A1'), agar_plate.wells('H12'), trash=False)
-p10_pipette.start_at_tip(p10_tipracks[0][0])
-
-# Run functions
-transformation_setup(generate_transformation_wells(spotting_tuples))
-phase_switch()
-spotting_tuples_cols = [col for cols in spotting_cols(
-    spotting_tuples) for col in cols]
-unique_cols = [col for i, col in enumerate(
-    spotting_tuples_cols) if spotting_tuples_cols.index(col) == i]
-outgrowth(unique_cols, soc_well=soc_well)
-spot_transformations(spotting_tuples)
-
-for c in robot.commands():
-    print(c)
\ No newline at end of file
--- a/test-data/dnabot_scripts/output/4_transformation_ot2_APIv2.8.py	Tue Dec 14 14:46:38 2021 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,422 +0,0 @@
-from opentrons import protocol_api
-import numpy as np
-
-
-# Rename to 'purification_template' and paste into 'template_ot2_scripts' folder in DNA-BOT to use
-
-
-metadata = {
-     'apiLevel': '2.8',
-     'protocolName': 'Transformation',
-     'description': 'Transformation reactions using an opentrons OT-2 for BASIC assembly.'}
-
-# Example output produced by DNA-BOT for a single construct, uncomment and run to test the template
-#spotting_tuples=[(('A1','B1','C1'), ('A1','B1', 'C1'), (5,5,5))]
-#soc_well='A1'
-
-# Example output produced by DNA-BOT for 88 constructs, uncomment and run to test the template
-#spotting_tuples=[(('A1', 'B1', 'C1', 'D1', 'E1', 'F1', 'G1', 'H1'), ('A1', 'B1', 'C1', 'D1', 'E1', 'F1', 'G1', 'H1'), (5, 5, 5, 5, 5, 5, 5, 5)), (('A2', 'B2', 'C2', 'D2', 'E2', 'F2', 'G2', 'H2'), ('A2', 'B2', 'C2', 'D2', 'E2', 'F2', 'G2', 'H2'), (5, 5, 5, 5, 5, 5, 5, 5)), (('A3', 'B3', 'C3', 'D3', 'E3', 'F3', 'G3', 'H3'), ('A3', 'B3', 'C3', 'D3', 'E3', 'F3', 'G3', 'H3'), (5, 5, 5, 5, 5, 5, 5, 5)), (('A4', 'B4', 'C4', 'D4', 'E4', 'F4', 'G4', 'H4'), ('A4', 'B4', 'C4', 'D4', 'E4', 'F4', 'G4', 'H4'), (5, 5, 5, 5, 5, 5, 5, 5)), (('A5', 'B5', 'C5', 'D5', 'E5', 'F5', 'G5', 'H5'), ('A5', 'B5', 'C5', 'D5', 'E5', 'F5', 'G5', 'H5'), (5, 5, 5, 5, 5, 5, 5, 5)), (('A6', 'B6', 'C6', 'D6', 'E6', 'F6', 'G6', 'H6'), ('A6', 'B6', 'C6', 'D6', 'E6', 'F6', 'G6', 'H6'), (5, 5, 5, 5, 5, 5, 5, 5)), (('A7', 'B7', 'C7', 'D7', 'E7', 'F7', 'G7', 'H7'), ('A7', 'B7', 'C7', 'D7', 'E7', 'F7', 'G7', 'H7'), (5, 5, 5, 5, 5, 5, 5, 5)), (('A8', 'B8', 'C8', 'D8', 'E8', 'F8', 'G8', 'H8'), ('A8', 'B8', 'C8', 'D8', 'E8', 'F8', 'G8', 'H8'), (5, 5, 5, 5, 5, 5, 5, 5)), (('A9', 'B9', 'C9', 'D9', 'E9', 'F9', 'G9', 'H9'), ('A9', 'B9', 'C9', 'D9', 'E9', 'F9', 'G9', 'H9'), (5, 5, 5, 5, 5, 5, 5, 5)), (('A10', 'B10', 'C10', 'D10', 'E10', 'F10', 'G10', 'H10'), ('A10', 'B10', 'C10', 'D10', 'E10', 'F10', 'G10', 'H10'), (5, 5, 5, 5, 5, 5, 5, 5)), (('A11', 'B11', 'C11', 'D11', 'E11', 'F11', 'G11', 'H11'), ('A11', 'B11', 'C11', 'D11', 'E11', 'F11', 'G11', 'H11'), (5, 5, 5, 5, 5, 5, 5, 5))]
-#soc_well='A1'
-
-# __LABWARES is expected to be redefined by "generate_ot2_script" method
-# Test dict
-# __LABWARES={"p20_single": {"id": "p20_single_gen2"}, "p300_multi": {"id": "p300_multi_gen2"}, "mag_deck": {"id": "magdeck"}, "96_tiprack_20ul": {"id": "opentrons_96_tiprack_20ul"}, "96_tiprack_300ul": {"id": "opentrons_96_tiprack_300ul"}, "24_tuberack_1500ul": {"id": "e14151500starlab_24_tuberack_1500ul"}, "96_wellplate_200ul_pcr_step_14": {"id": "4ti0960rig_96_wellplate_200ul"}, "96_wellplate_200ul_pcr_step_23": {"id": "4ti0960rig_96_wellplate_200ul"}, "agar_plate_step_4": {"id": "4ti0960rig_96_wellplate_200ul"}, "12_reservoir_21000ul": {"id": "4ti0131_12_reservoir_21000ul"}, "96_deepwellplate_2ml": {"id": "4ti0136_96_wellplate_2200ul"}}
-# __PARAMETERS={"purif_magdeck_height": {"value": 20.0}, "purif_wash_time": {"value": 0.5}, "purif_bead_ratio": {"value": 1.8}, "purif_incubation_time": {"value": 5.0}, "purif_settling_time": {"value": 2.0}, "purif_drying_time": {"value": 5.0}, "purif_elution_time": {"value": 2.0}, "transfo_incubation_temp": {"value": 4.0}, "transfo_incubation_time": {"value": 20.0}}
-
-spotting_tuples=[(('A1', 'B1', 'C1'), ('A1', 'B1', 'C1'), (5, 5, 5))]
-soc_well='A1'
-__LABWARES={"p20_single": {"id": "p20_single_gen2"}, "p300_multi": {"id": "p300_multi_gen2"}, "mag_deck": {"id": "magdeck"}, "96_tiprack_20ul": {"id": "opentrons_96_tiprack_20ul"}, "96_tiprack_300ul": {"id": "opentrons_96_tiprack_300ul"}, "24_tuberack_1500ul": {"id": "e14151500starlab_24_tuberack_1500ul"}, "96_wellplate_200ul_pcr_step_14": {"id": "4ti0960rig_96_wellplate_200ul"}, "96_wellplate_200ul_pcr_step_23": {"id": "4ti0960rig_96_wellplate_200ul"}, "agar_plate_step_4": {"id": "4ti0960rig_96_wellplate_200ul"}, "12_reservoir_21000ul": {"id": "4ti0131_12_reservoir_21000ul"}, "96_deepwellplate_2ml": {"id": "4ti0136_96_wellplate_2200ul"}}
-__PARAMETERS={"purif_magdeck_height": {"value": 20}, "purif_wash_time": {"value": 0}, "purif_bead_ratio": {"value": 1}, "purif_incubation_time": {"value": 5}, "purif_settling_time": {"value": 2}, "purif_drying_time": {"value": 5}, "purif_elution_time": {"value": 2}, "transfo_incubation_temp": {"value": 4}, "transfo_incubation_time": {"value": 20}}
-
-
-def run(protocol: protocol_api.ProtocolContext):
-# added run function for API version 2
-
-# Constants
-    CANDIDATE_p20_SLOTS = ['9', '2', '5']
-    CANDIDATE_P300_SLOTS = ['3', '6']
-    p20_TIPRACK_TYPE = __LABWARES['96_tiprack_20ul']['id']
-        # changed from 'tiprack-10ul'
-    P300_TIPRACK_TYPE = __LABWARES['96_tiprack_300ul']['id']
-    P20_MOUNT = 'right'
-    P300_MOUNT = 'left'
-    ASSEMBLY_PLATE_TYPE = __LABWARES['96_wellplate_200ul_pcr_step_14']['id']
-    ASSEMBLY_PLATE_SLOT = '8'
-
-    TRANSFORMATION_PLATE_TYPE = __LABWARES['96_wellplate_200ul_pcr_step_14']['id']
-    SOC_PLATE_TYPE = __LABWARES['96_deepwellplate_2ml']['id']
-    SOC_PLATE_SLOT = '7'
-    TUBE_RACK_TYPE = __LABWARES['24_tuberack_1500ul']['id']
-    TUBE_RACK_SLOT = '11'
-    SPOTTING_WASTE_WELL = 'A1'
-    AGAR_PLATE_TYPE = __LABWARES['agar_plate_step_4']['id']
-        # changed from 'Nunc_Omnitray'
-            # it is a 1 well plate filled with agar;
-            # but for the Opentron to spot in the locations of a 96 wp, it is defined similar to a 96 wp
-            # was previously defined in add.labware.py, API version 2 doesn't support labware.create anymore
-
-
-
-        # custom labware made using Opentron's Labware Creator:
-            # external dimensions:
-                # footprint length = 127.76 mm
-                # footrpint width = 85.48 mm
-                # footprint height = 15.70 mm
-                # taken from Thermofisher's documentation for Nunc Omnitray
-                # https://www.thermofisher.com/document-connect/document-connect.html?url=https%3A%2F%2Fassets.thermofisher.com%2FTFS-Assets%2FLSG%2Fmanuals%2FD03023.pdf&title=VGVjaG5pY2FsIERhdGEgU2hlZXQ6IE51bmMgT21uaXRyYXk=
-            # well measurements
-                # depth = 0.01 mm
-                # diameter =  0.01 mm
-                # in old add.labware.py, they were defined as 0, but Labware Creator requires a value >0
-            # spacing
-                # x-offset = 14.38 mm
-                # y-offset = 11.24 mm
-                # x-spacing = 9.00 mm
-                # y-spacing) = 9.00 mm
-                # taken from Nest 96 well plates
-                # https://labware.opentrons.com/nest_96_wellplate_100ul_pcr_full_skirt/
-        # before using protocol, need to upload the 'nuncomnitray_96_wellplate_0.01ul.json' custom labware file into Opentrons app
-
-    AGAR_PLATE_SLOT = '1'
-
-    TEMPDECK_SLOT = '10'
-    
-
-    
-    def generate_transformation_wells(spotting_tuples):
-        """
-        Evaluates spotting_tuples and returns transformation wells.
-
-        Args:
-        spotting_tuples (list): Sets of spotting reactions are given in the form: ((source wells), (target wells), (spotting volumes)).
-
-        """
-
-        wells = []
-        for spotting_tuple in spotting_tuples:
-            for source_well in spotting_tuple[0]:
-                wells.append(source_well)
-        transformation_wells = [well for i, well in enumerate(
-            wells) if wells.index(well) == i]
-        return transformation_wells
-
-
-    def tiprack_slots(spotting_tuples, max_spot_vol=5):
-        """
-        Calculates p20 and p300 tiprack slots required.
-
-        Args:
-        spotting_tuples (list): Sets of spotting reactions are given in the form: ((source wells), (target wells), (spotting volumes)).
-        max_spot_vol (float): Maximum volume that is spotted per spot reaction.
-
-        """
-
-        # Reactions' number
-        transformation_reactions = len(generate_transformation_wells(spotting_tuples))
-        spotting_reactions = 0
-        for spotting_tuple in spotting_tuples:
-            spots = np.array(spotting_tuple[2])/max_spot_vol
-            np.ceil(spots)
-            spotting_reactions = spotting_reactions + int(np.sum(spots))
-
-        # errrr should be fine lol # REMOVE
-
-        # p20 tiprack slots
-        p20_tips = transformation_reactions + spotting_reactions
-        p20_tiprack_slots = p20_tips // 96 + 1 if p20_tips % 96 > 0 else p20_tips / 96
-
-        # p300 tiprack slots
-        p300_tips = transformation_reactions + spotting_reactions
-        p300_tiprack_slots = p300_tips // 96 + \
-            1 if p300_tips % 96 > 0 else p300_tips / 96
-        return int(p20_tiprack_slots), int(p300_tiprack_slots)
-
-
-    def transformation_setup(transformation_wells):
-        """
-        Sets up transformation reactions
-
-        Args:
-        transformation_wells (list).
-
-        """
-
-        # Constants
-        TEMP = __PARAMETERS['transfo_incubation_temp']['value']  # Incubation temperature.
-        ASSEMBLY_VOL = 5  # Volume of final assembly added to competent cells.
-        MIX_SETTINGS = (4, 5)  # Mix after setting during final assembly transfers.
-        INCUBATION_TIME = __PARAMETERS['transfo_incubation_time']['value']  # Cells and final assembly incubation time.
-
-
-
-        # Set temperature deck to 4 °C and load competent cells
-        tempdeck.set_temperature(TEMP)
-        # removed: tempdeck.wait_for_temp()
-            # API version2 automatically pauses execution until the set temperature is reached
-            # thus it no longer uses .wait_for_temp()
-        protocol.pause('Load competent cells, uncap and resume run')
-
-        # Transfer final assemblies
-        p20_pipette.transfer(ASSEMBLY_VOL,
-                             [assembly_plate.wells_by_name()[well_name] for well_name in transformation_wells],
-                             [transformation_plate.wells_by_name()[well_name] for well_name in transformation_wells],
-                             new_tip='always',
-                             mix_after=(MIX_SETTINGS))
-
-
-        # Incubate for 20 minutes and remove competent cells for heat shock
-        protocol.delay(minutes=INCUBATION_TIME)
-
-
-        protocol.pause('Remove transformation reactions, conduct heatshock and replace.')
-
-
-    def phase_switch():
-        """
-        Function pauses run enabling addition/removal of labware.
-
-        """
-        protocol.pause('Remove final assembly plate. Introduce agar tray and deep well plate containing SOC media. Resume run.')
-
-    def outgrowth(
-            cols,
-            soc_well):
-        """
-        Outgrows transformed cells.
-
-        Args:
-        cols (list of str): list of cols in transformation plate containing samples.
-        soc_well (str): Well containing SOC media in relevant plate.
-
-        """
-
-        # Constants
-        SOC_VOL = 125
-        SOC_MIX_SETTINGS = (4, 50)
-        TEMP = 37
-        OUTGROWTH_TIME = 60
-        SOC_ASPIRATION_RATE = 25
-        P300_DEFAULT_ASPIRATION_RATE = 150
-
-        # Define wells
-        transformation_cols = [transformation_plate.columns_by_name()[column] for column in cols]
-
-        soc = soc_plate.wells(soc_well)
-
-        # Add SOC to transformed cells
-        p300_pipette.flow_rate.aspirate = SOC_ASPIRATION_RATE
-        p300_pipette.transfer(SOC_VOL, soc, transformation_cols,
-                              new_tip='always', mix_after=SOC_MIX_SETTINGS)
-        p300_pipette.flow_rate.aspirate = P300_DEFAULT_ASPIRATION_RATE
-
-        # Incubate for 1 hour at 37 °C
-        tempdeck.set_temperature(TEMP)
-
-        protocol.delay(minutes=OUTGROWTH_TIME)
-
-
-        tempdeck.deactivate()
-
-
-    def spotting_cols(spotting_tuples):
-        """
-        Evaluates spotting_tuples and returns unique cols (str) associated with each spotting_tuple's source wells.
-
-        Args:
-        spotting_tuples (list): Sets of spotting reactions are given in the form: ((source wells), (target wells), (spotting volumes)).
-
-        """
-        cols_list = []
-        for spotting_tuple in spotting_tuples:
-            source_wells_cols = [source_well[1:] for source_well in spotting_tuple[0]]
-            unique_cols = [col for i, col in enumerate(source_wells_cols) if source_wells_cols.index(col) == i]
-            cols_list.append(unique_cols)
-        return cols_list
-
-
-    def spot_transformations(
-            spotting_tuples,
-            dead_vol=1,
-            spotting_dispense_rate=0.025,
-            stabbing_depth=10,
-            max_spot_vol=5):
-        """
-        Spots transformation reactions.
-
-        Args:
-        spotting_tuples (list): Sets of spotting reactions are given in the form: ((source wells), (target wells), (spotting volumes)).
-        dead_vol (float): Dead volume aspirated during spotting.
-        spotting_dispense_rate (float): Rate p20_pipette dispenses at during spotting.
-        stabbing_depth (float): Depth p20_pipette moves into agar during spotting.
-        max_spot_vol (float): Maximum volume that is spotted per spot reaction.
-
-        """
-
-        def spot(
-                source,
-                target,
-                spot_vol):
-            """
-            Spots an individual reaction using the p20 pipette.
-
-            Args:
-            source (str): Well containing the transformation reaction to be spotted.
-            target (str): Well transformation reaction is to be spotted to.
-            spot_vol (float): Volume of transformation reaction to be spotted (uL).
-
-            """
-
-            # Constants
-            DEFAULT_HEAD_SPEED = {'x': 400, 'y': 400,'z': 125, 'a': 125}
-            SPOT_HEAD_SPEED = {'x': 400, 'y': 400, 'z': 125,'a': 125 // 4}
-            DISPENSING_HEIGHT = 5
-            SAFE_HEIGHT = 7  # height avoids collision with agar tray.
-
-            # Spot
-            p20_pipette.pick_up_tip()
-            p20_pipette.aspirate(spot_vol + dead_vol, source[0])
-            # old code:
-                # p20_pipette.aspirate(spot_vol + dead_vol, source)
-                # returned type error because 'source' was a list containing one item (the well location)
-                # source[0] takes the location out of the list
-
-            p20_pipette.move_to(target[0].top(SAFE_HEIGHT))
-            p20_pipette.move_to(target[0].top(DISPENSING_HEIGHT))
-            # old code:
-                # p20_pipette.move_to(target.top(SAFE_HEIGHT))
-                # p20_pipette.move_to(target.top(DISPENSING_HEIGHT))
-                # returned attribute error because 'target' was a list containing one item (the well location)
-                # target[0] takes the location out of the list
-
-            p20_pipette.dispense(volume=spot_vol, rate=spotting_dispense_rate)
-
-            protocol.max_speeds.update(SPOT_HEAD_SPEED)
-            # old code:
-                # robot.head_speed(combined_speed=max(SPOT_HEAD_SPEED.values()), **SPOT_HEAD_SPEED)
-                # robot.head_speed not used in API version 2
-                # replaced with protocol.max_speeds
-            # new code no longer uses the lower value between combined speed or specified speed
-                # just uses each axis' specified speed directly
-            p20_pipette.move_to(target[0].top(-1 * stabbing_depth))
-            # old code:
-                # p20_pipette.move_to(target.top(-1*stabbing_depth))
-                # returns attribute error because 'target' was a list containing one item (the well location)
-            protocol.max_speeds.update(DEFAULT_HEAD_SPEED)
-            # old code:
-                # robot.head_speed(combined_speed=max(DEFAULT_HEAD_SPEED.values()), **DEFAULT_HEAD_SPEED)
-                # robot.head_speed not used in API version 2
-                # replaced with protocol.max_speeds
-            # new code no longer uses the lower value between combined speed or specified speed
-                # just uses each axis' specified speed directly
-            p20_pipette.move_to(target[0].top(SAFE_HEIGHT))
-            # old code:
-                # p20_pipette.move_to(target[0].top(SAFE_HEIGHT))
-                # returns attribute error because 'target' was a list containing one item (the well location)
-
-
-            # the code below makes sure that the transformend cells are efficiently reaching to the agar surface
-
-            p20_pipette.blow_out()
-
-            protocol.delay(seconds=10)
-
-            p20_pipette.blow_out()
-
-            protocol.delay(seconds=10)
-
-            # Dispose of dead volume and tip
-            p20_pipette.dispense(dead_vol, spotting_waste[0])
-
-            p20_pipette.blow_out()
-                # the simple .blow_out command blows out at current position (spotting waste) by defualt
-                # unlike blowout=true in complex commands, which by default will blow out in waste
-
-            p20_pipette.drop_tip()
-
-        def spot_tuple(spotting_tuple):
-            """
-            Spots all reactions defined by the spotting tuple. Requires the function spot.
-
-            Args:
-            spotting_tuple (tuple): Spotting reactions given in the form: (source wells), (target wells), (spotting volumes).
-            Each unique source well is resuspended once prior to spotting.
-
-            """
-            source_wells = spotting_tuple[0]
-            target_wells = spotting_tuple[1]
-            spot_vols = list(spotting_tuple[2])
-            while max(spot_vols) > 0:
-                for index, spot_vol in enumerate(spot_vols):
-                    if spot_vol == 0:
-                        pass
-                    else:
-                        vol = spot_vol if spot_vol <= max_spot_vol else max_spot_vol
-                        spot(source = transformation_plate.wells(source_wells[index]), target = agar_plate.wells(target_wells[index]), spot_vol = vol)
-                        spot_vols[index] = spot_vols[index] - vol
-
-        # Constants
-        TRANSFORMATION_MIX_SETTINGS = [4, 50]
-
-        # Spot transformation reactions
-            # Each unique transformation well is resuspended once prior to spotting.
-
-        for spotting_tuple in spotting_tuples:
-            source_wells_cols = [source_well[1:] for source_well in spotting_tuple[0]]
-            unique_cols = [col for i, col in enumerate(source_wells_cols) if source_wells_cols.index(col) == i]
-            for col in unique_cols:
-                p300_pipette.pick_up_tip()
-                p300_pipette.mix(TRANSFORMATION_MIX_SETTINGS[0], TRANSFORMATION_MIX_SETTINGS[1],transformation_plate.columns_by_name()[col][0])
-                p300_pipette.drop_tip()
-            spot_tuple(spotting_tuple)
-
-     #Tiprack slots
-    p20_p300_tiprack_slots = tiprack_slots(spotting_tuples)
-    p20_slots = CANDIDATE_p20_SLOTS[:p20_p300_tiprack_slots[0]]
-    p300_slots = CANDIDATE_P300_SLOTS[:p20_p300_tiprack_slots[1]]
-    # Define labware
-    p20_tipracks = [protocol.load_labware(p20_TIPRACK_TYPE, slot) for slot in p20_slots]
-        # changed to protocol.load_labware for API version 2
-    p300_tipracks = [protocol.load_labware(P300_TIPRACK_TYPE, slot) for slot in p300_slots]
-        # changed to protocol.load_labware for API version 2
-    p20_pipette = protocol.load_instrument(__LABWARES['p20_single']['id'], P20_MOUNT, tip_racks=p20_tipracks)
-        # changed to protocol.load_instrument for API version 2
-    p300_pipette = protocol.load_instrument(__LABWARES['p300_multi']['id'], P300_MOUNT, tip_racks=p300_tipracks)
-        # changed to protocol.load_instrument for API version 2
-    assembly_plate = protocol.load_labware(ASSEMBLY_PLATE_TYPE, ASSEMBLY_PLATE_SLOT)
-        # changed to protocol.load_labware for API version 2
-    tempdeck = protocol.load_module('tempdeck', TEMPDECK_SLOT)
-    transformation_plate = tempdeck.load_labware(TRANSFORMATION_PLATE_TYPE, TEMPDECK_SLOT)
-        # changed to protocol.load_labware for API version 2
-        # removed share=True, not required in API version 2
-        # removed TEMPDECK_SLOT as it is loaded directly onto temperature module
-    soc_plate = protocol.load_labware(SOC_PLATE_TYPE, SOC_PLATE_SLOT)
-        # changed to protocol.load_labware for API version 2
-    tube_rack = protocol.load_labware(TUBE_RACK_TYPE, TUBE_RACK_SLOT)
-        # changed to protocol.load_labware for API version 2
-    spotting_waste = tube_rack.wells(SPOTTING_WASTE_WELL)
-    agar_plate = protocol.load_labware(AGAR_PLATE_TYPE, AGAR_PLATE_SLOT)
-        # changed to protocol.load_labware for API version 2
-    
-    ### Run protocol
-
-
-    # Register agar_plate for calibration
-    p20_pipette.transfer(1, agar_plate.wells('A1'), agar_plate.wells('H12'), trash=False)
-    # removed:
-        # p20_pipette.start_at_tip(p20_tipracks[0][0])
-        # pipette automatically starts from 'A1' tiprack location
-        # if re-adding, need to use p20.pipette.starting_tip() instead of p20.pipette.start_at_tip()
-
-
-    # Run functions
-    # Run functions
-    transformation_setup(generate_transformation_wells(spotting_tuples))
-    phase_switch()
-    spotting_tuples_cols = [col for cols in spotting_cols(spotting_tuples) for col in cols]
-    unique_cols = [col for i, col in enumerate(spotting_tuples_cols) if spotting_tuples_cols.index(col) == i]
-    outgrowth(cols=unique_cols, soc_well=soc_well)
-    spot_transformations(spotting_tuples)
-    # Spot again to increase the chances of getting more colonies. Second spotting will only work for small number of assemblies where there is enough space on the deck for tipracks.
-    # protocol.pause('Let the spotted cells get dry')
-    # spot_transformations(spotting_tuples)
-    print(unique_cols)
--- a/test-data/dnabot_scripts/output/4_transformation_ot2_Thermocycler_APIv2.8.py	Tue Dec 14 14:46:38 2021 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,500 +0,0 @@
-from opentrons import protocol_api
-import numpy as np
-
-
-# Rename to 'purification_template' and paste into 'template_ot2_scripts' folder in DNA-BOT to use
-# Tip rack positions are limited for this script, up to 48 transformations can be performed.
-
-metadata = {
-     'apiLevel': '2.8',
-     'protocolName': 'Transformation',
-     'description': 'Transformation reactions using an opentrons OT-2 for BASIC assembly.'}
-
-# Example output produced by DNA-BOT for a single construct, uncomment and run to test the template
-#spotting_tuples=[(('A1','B1','C1'), ('A1','B1', 'C1'), (8,8,8))]
-#soc_well='A1'
-
-# Example output produced by DNA-BOT for 88 constructs, uncomment and run to test the template
-#spotting_tuples=[(('A1', 'B1', 'C1', 'D1', 'E1', 'F1', 'G1', 'H1'), ('A1', 'B1', 'C1', 'D1', 'E1', 'F1', 'G1', 'H1'), (5, 5, 5, 5, 5, 5, 5, 5)), (('A2', 'B2', 'C2', 'D2', 'E2', 'F2', 'G2', 'H2'), ('A2', 'B2', 'C2', 'D2', 'E2', 'F2', 'G2', 'H2'), (5, 5, 5, 5, 5, 5, 5, 5)), (('A3', 'B3', 'C3', 'D3', 'E3', 'F3', 'G3', 'H3'), ('A3', 'B3', 'C3', 'D3', 'E3', 'F3', 'G3', 'H3'), (5, 5, 5, 5, 5, 5, 5, 5)), (('A4', 'B4', 'C4', 'D4', 'E4', 'F4', 'G4', 'H4'), ('A4', 'B4', 'C4', 'D4', 'E4', 'F4', 'G4', 'H4'), (5, 5, 5, 5, 5, 5, 5, 5)), (('A5', 'B5', 'C5', 'D5', 'E5', 'F5', 'G5', 'H5'), ('A5', 'B5', 'C5', 'D5', 'E5', 'F5', 'G5', 'H5'), (5, 5, 5, 5, 5, 5, 5, 5)), (('A6', 'B6', 'C6', 'D6', 'E6', 'F6', 'G6', 'H6'), ('A6', 'B6', 'C6', 'D6', 'E6', 'F6', 'G6', 'H6'), (5, 5, 5, 5, 5, 5, 5, 5)), (('A7', 'B7', 'C7', 'D7', 'E7', 'F7', 'G7', 'H7'), ('A7', 'B7', 'C7', 'D7', 'E7', 'F7', 'G7', 'H7'), (5, 5, 5, 5, 5, 5, 5, 5)), (('A8', 'B8', 'C8', 'D8', 'E8', 'F8', 'G8', 'H8'), ('A8', 'B8', 'C8', 'D8', 'E8', 'F8', 'G8', 'H8'), (5, 5, 5, 5, 5, 5, 5, 5)), (('A9', 'B9', 'C9', 'D9', 'E9', 'F9', 'G9', 'H9'), ('A9', 'B9', 'C9', 'D9', 'E9', 'F9', 'G9', 'H9'), (5, 5, 5, 5, 5, 5, 5, 5)), (('A10', 'B10', 'C10', 'D10', 'E10', 'F10', 'G10', 'H10'), ('A10', 'B10', 'C10', 'D10', 'E10', 'F10', 'G10', 'H10'), (5, 5, 5, 5, 5, 5, 5, 5)), (('A11', 'B11', 'C11', 'D11', 'E11', 'F11', 'G11', 'H11'), ('A11', 'B11', 'C11', 'D11', 'E11', 'F11', 'G11', 'H11'), (5, 5, 5, 5, 5, 5, 5, 5))]
-#soc_well='A1'
-
-# __LABWARES is expected to be redefined by "generate_ot2_script" method
-# Test dict
-# __LABWARES={"p20_single": {"id": "p20_single_gen2"}, "p300_multi": {"id": "p300_multi_gen2"}, "mag_deck": {"id": "magdeck"}, "96_tiprack_20ul": {"id": "opentrons_96_tiprack_20ul"}, "96_tiprack_300ul": {"id": "opentrons_96_tiprack_300ul"}, "24_tuberack_1500ul": {"id": "e14151500starlab_24_tuberack_1500ul"}, "96_wellplate_200ul_pcr_step_14": {"id": "4ti0960rig_96_wellplate_200ul"}, "96_wellplate_200ul_pcr_step_23": {"id": "4ti0960rig_96_wellplate_200ul"}, "agar_plate_step_4": {"id": "4ti0960rig_96_wellplate_200ul"}, "12_reservoir_21000ul": {"id": "4ti0131_12_reservoir_21000ul"}, "96_deepwellplate_2ml": {"id": "4ti0136_96_wellplate_2200ul"}}
-# __PARAMETERS={"purif_magdeck_height": {"value": 20.0}, "purif_wash_time": {"value": 0.5}, "purif_bead_ratio": {"value": 1.8}, "purif_incubation_time": {"value": 5.0}, "purif_settling_time": {"value": 2.0}, "purif_drying_time": {"value": 5.0}, "purif_elution_time": {"value": 2.0}, "transfo_incubation_temp": {"value": 4.0}, "transfo_incubation_time": {"value": 20.0}}
-
-spotting_tuples=[(('A1', 'B1', 'C1'), ('A1', 'B1', 'C1'), (5, 5, 5))]
-soc_well='A1'
-__LABWARES={"p20_single": {"id": "p20_single_gen2"}, "p300_multi": {"id": "p300_multi_gen2"}, "mag_deck": {"id": "magdeck"}, "96_tiprack_20ul": {"id": "opentrons_96_tiprack_20ul"}, "96_tiprack_300ul": {"id": "opentrons_96_tiprack_300ul"}, "24_tuberack_1500ul": {"id": "e14151500starlab_24_tuberack_1500ul"}, "96_wellplate_200ul_pcr_step_14": {"id": "4ti0960rig_96_wellplate_200ul"}, "96_wellplate_200ul_pcr_step_23": {"id": "4ti0960rig_96_wellplate_200ul"}, "agar_plate_step_4": {"id": "4ti0960rig_96_wellplate_200ul"}, "12_reservoir_21000ul": {"id": "4ti0131_12_reservoir_21000ul"}, "96_deepwellplate_2ml": {"id": "4ti0136_96_wellplate_2200ul"}}
-__PARAMETERS={"purif_magdeck_height": {"value": 20}, "purif_wash_time": {"value": 0}, "purif_bead_ratio": {"value": 1}, "purif_incubation_time": {"value": 5}, "purif_settling_time": {"value": 2}, "purif_drying_time": {"value": 5}, "purif_elution_time": {"value": 2}, "transfo_incubation_temp": {"value": 4}, "transfo_incubation_time": {"value": 20}}
-
-
-def run(protocol: protocol_api.ProtocolContext):
-# added run function for API version 2
-
-    # Constants
-    CANDIDATE_p20_SLOTS = ['3']
-    CANDIDATE_P300_SLOTS = ['6']
-    P20_TIPRACK_TYPE = __LABWARES['96_tiprack_10ul']['id']
-    P300_TIPRACK_TYPE = __LABWARES['96_tiprack_300ul']['id']
-    P20_MOUNT = 'right'
-    P300_MOUNT = 'left'
-    ASSEMBLY_PLATE_TYPE = __LABWARES['96_wellplate_200ul_pcr_step_14']['id']
-    ASSEMBLY_PLATE_SLOT = '2'
-
-    TRANSFORMATION_PLATE_TYPE = __LABWARES['96_wellplate_200ul_pcr_step_14']['id']
-    SOC_PLATE_TYPE = __LABWARES['96_deepwellplate_2ml']['id']
-        # changed from '4ti0136_96_deep-well'
-    SOC_PLATE_SLOT = '5'
-    TUBE_RACK_TYPE = __LABWARES['24_tuberack_1500ul']['id']
-        # changed from 'tube-rack_E1415-1500'
-    TUBE_RACK_SLOT = '9'
-    SPOTTING_WASTE_WELL = 'A1'
-    AGAR_PLATE_TYPE = __LABWARES['96_wellplate_200ul_pcr_step_14']['id']
-        # changed from 'Nunc_Omnitray'
-            # it is a 1 well plate filled with agar;
-            # but for the Opentron to spot in the locations of a 96 wp, it is defined similar to a 96 wp
-            # was previously defined in add.labware.py, API version 2 doesn't support labware.create anymore
-
-        # !!! CURRENT PLATE IS A PLACEHOLDER FOR RUNNING SIMMULATION WITHOUT CUSTOM LABWARE!!!
-        # !!! name made with Opentron Labware Creator = 'nuncomnitray_96_wellplate_0.01ul' !!!!
-
-
-        # custom labware made using Opentron's Labware Creator:
-            # external dimensions:
-                # footprint length = 127.76 mm
-                # footrpint width = 85.48 mm
-                # footprint height = 15.70 mm
-                # taken from Thermofisher's documentation for Nunc Omnitray
-                # https://www.thermofisher.com/document-connect/document-connect.html?url=https%3A%2F%2Fassets.thermofisher.com%2FTFS-Assets%2FLSG%2Fmanuals%2FD03023.pdf&title=VGVjaG5pY2FsIERhdGEgU2hlZXQ6IE51bmMgT21uaXRyYXk=
-            # well measurements
-                # depth = 0.01 mm
-                # diameter =  0.01 mm
-                # in old add.labware.py, they were defined as 0, but Labware Creator requires a value >0
-            # spacing
-                # x-offset = 14.38 mm
-                # y-offset = 11.24 mm
-                # x-spacing = 9.00 mm
-                # y-spacing) = 9.00 mm
-                # taken from Nest 96 well plates
-                # https://labware.opentrons.com/nest_96_wellplate_100ul_pcr_full_skirt/
-        # before using protocol, need to upload the 'nuncomnitray_96_wellplate_0.01ul.json' custom labware file into Opentrons app
-
-    AGAR_PLATE_SLOT = '1'
-
-    TEMPDECK_SLOT = '4'
-
-    
-    def generate_transformation_wells(spotting_tuples):
-        """
-        Evaluates spotting_tuples and returns transformation wells.
-
-        Args:
-        spotting_tuples (list): Sets of spotting reactions are given in the form: ((source wells), (target wells), (spotting volumes)).
-
-        """
-
-        wells = []
-        for spotting_tuple in spotting_tuples:
-            for source_well in spotting_tuple[0]:
-                wells.append(source_well)
-        transformation_wells = [well for i, well in enumerate(
-            wells) if wells.index(well) == i]
-        return transformation_wells
-
-
-    def tiprack_slots(spotting_tuples, max_spot_vol=5):
-        """
-        Calculates p20 and p300 tiprack slots required.
-
-        Args:
-        spotting_tuples (list): Sets of spotting reactions are given in the form: ((source wells), (target wells), (spotting volumes)).
-        max_spot_vol (float): Maximum volume that is spotted per spot reaction.
-
-        """
-
-        # Reactions' number
-        transformation_reactions = len(generate_transformation_wells(spotting_tuples))
-        spotting_reactions = 0
-        for spotting_tuple in spotting_tuples:
-            spots = np.array(spotting_tuple[2])/max_spot_vol
-            np.ceil(spots)
-            spotting_reactions = spotting_reactions + int(np.sum(spots))
-
-        # errrr should be fine lol # REMOVE
-
-        # p20 tiprack slots
-        p20_tips = transformation_reactions + spotting_reactions
-        p20_tiprack_slots = p20_tips // 96 + 1 if p20_tips % 96 > 0 else p20_tips / 96
-
-        # p300 tiprack slots
-        p300_tips = transformation_reactions + spotting_reactions
-        p300_tiprack_slots = p300_tips // 96 + \
-            1 if p300_tips % 96 > 0 else p300_tips / 96
-        return int(p20_tiprack_slots), int(p300_tiprack_slots)
-
-
-    def transformation_setup(transformation_wells):
-        """
-        Sets up transformation reactions
-
-        Args:
-        transformation_wells (list).
-
-        """
-
-        # Constants
-        TEMP = __PARAMETERS['transfo_incubation_temp']['value']  # Incubation temperature.
-        ASSEMBLY_VOL = 5  # Volume of final assembly added to competent cells.
-        MIX_SETTINGS = (4, 5)  # Mix after setting during final assembly transfers.
-        INCUBATION_TIME = __PARAMETERS['transfo_incubation_time']['value']  # Cells and final assembly incubation time.
-
-
-
-        # Set temperature deck to 4 °C and load competent cells
-        tempdeck.set_temperature(TEMP)
-        # removed: tempdeck.wait_for_temp()
-            # API version2 automatically pauses execution until the set temperature is reached
-            # thus it no longer uses .wait_for_temp()
-        protocol.pause('Load competent cells, uncap and resume run')
-        # old code:
-            # robot.pause()
-            # robot.comment('Load competent cells, uncap and resume run')
-        # API version 2 uses 'protocol.' instead of 'robot.' and combines '.pause' and '.comment'
-
-        # Transfer final assemblies
-        p20_pipette.transfer(ASSEMBLY_VOL,
-                             [assembly_plate.wells_by_name()[well_name] for well_name in transformation_wells],
-                             [transformation_plate.wells_by_name()[well_name] for well_name in transformation_wells],
-                             new_tip='always',
-                             mix_after=(MIX_SETTINGS))
-        # old code:
-            # p20_pipette.transfer(ASSEMBLY_VOL,
-                                 # assembly_plate.wells(transformation_wells),
-                                 # transformation_plate.wells(transformation_wells),
-                                 # new_tip='always',
-                                 # mix_after=(MIX_SETTINGS))
-         # .wells() doesn't take lists as arguements, newer wells_by_name() returns a dictionary
-
-
-        # Incubate for 20 minutes and remove competent cells for heat shock
-        protocol.delay(minutes=INCUBATION_TIME)
-        # old code:
-            # p20_pipette.delay(minutes=INCUBATION_TIME)
-        # API version 2 no longer has .delay() for pipettes, it uses protocol.delay() to pause the entire protocol
-
-        protocol.pause('Get ready for heat shock when thermocycler reaches to 42 C.')
-        # old code:
-            # robot.pause()
-            # robot.comment('Remove transformation reactions, conduct heatshock in the next heat block and and return the plate.')
-        # API version 2 uses 'protocol.' instead of 'robot.' and combines '.pause' and '.comment'
-
-    def heat_shock():
-
-
-        #Thermocycler Module
-        tc_mod = protocol.load_module('Thermocycler Module')
-        # Destination Plates
-        DESTINATION_PLATE_TYPE = __LABWARES['96_wellplate_200ul_pcr_step_14']['id']
-        # Loads destination plate onto Thermocycler Module
-        destination_plate = tc_mod.load_labware(DESTINATION_PLATE_TYPE)
-        tc_mod.set_block_temperature(42, hold_time_minutes=1, block_max_volume=180)
-        protocol.pause('Place the competent cells on thermocycler and resume run to conduct heat shock.')
-        protocol.delay(seconds=45)
-
-
-
-
-    def phase_switch():
-        """
-        Function pauses run enabling addition/removal of labware.
-
-        """
-        protocol.pause('Return the transformants to heat block. Remove final assembly plate. Introduce agar tray and deep well plate containing SOC media. Resume run.')
-        # old code:
-            # def phase_switch(comment='Remove final assembly plate. Introduce agar tray and deep well plate containing SOC media. Resume run.'):
-                # robot.pause()
-                # robot.comment(comment)
-        # API version 2 uses 'protocol.' instead of 'robot.' and combines '.pause' and '.comment'
-
-
-    def outgrowth(
-            cols,
-            soc_well):
-        """
-        Outgrows transformed cells.
-
-        Args:
-        cols (list of str): list of cols in transformation plate containing samples.
-        soc_well (str): Well containing SOC media in relevant plate.
-
-        """
-
-        # Constants
-        SOC_VOL = 125
-        SOC_MIX_SETTINGS = (4, 50)
-        TEMP = 37
-        OUTGROWTH_TIME = 60
-        SOC_ASPIRATION_RATE = 25
-        P300_DEFAULT_ASPIRATION_RATE = 150
-
-        # Define wells
-        transformation_cols = [transformation_plate.columns_by_name()[column] for column in cols]
-        # old code:
-            # transformation_cols = transformation_plate.cols(cols)
-        # API version 2 labware use .columns attribute, not .cols
-        # but .columns() doesn't take lists as arguements, newer columns_by_name() returns a dictionary
-
-        soc = soc_plate.wells(soc_well)
-
-        # Add SOC to transformed cells
-        p300_pipette.flow_rate.aspirate = SOC_ASPIRATION_RATE
-        # old code:
-            # p300_pipette.set_flow_rate(aspirate=SOC_ASPIRATION_RATE)
-            # flow rates are set directly in API version 2, brackets not required
-        p300_pipette.transfer(SOC_VOL, soc, transformation_cols,
-                              new_tip='always', mix_after=SOC_MIX_SETTINGS)
-        p300_pipette.flow_rate.aspirate = P300_DEFAULT_ASPIRATION_RATE
-        # old code:
-            # p300_pipette.set_flow_rate(aspirate=P300_DEFAULT_ASPIRATION_RATE)
-            # API version 2 labware use .columns attribute, not .cols
-
-        # Incubate for 1 hour at 37 °C
-        tempdeck.set_temperature(TEMP)
-        # removed: tempdeck.wait_for_temp()
-            # API version2 automatically pauses execution until the set temperature is reached
-            # thus it no longer uses .wait_for_temp()
-
-        protocol.delay(minutes=OUTGROWTH_TIME)
-        # old code:
-            # p300_pipette.delay(minutes=OUTGROWTH_TIME)
-        # API version 2 no longer has .delay() for pipettes, it uses protocol.delay() to pause the entire protocol
-
-        tempdeck.deactivate()
-
-
-
-
-
-    def spotting_cols(spotting_tuples):
-        """
-        Evaluates spotting_tuples and returns unique cols (str) associated with each spotting_tuple's source wells.
-
-        Args:
-        spotting_tuples (list): Sets of spotting reactions are given in the form: ((source wells), (target wells), (spotting volumes)).
-
-        """
-        cols_list = []
-        for spotting_tuple in spotting_tuples:
-            source_wells_cols = [source_well[1:] for source_well in spotting_tuple[0]]
-            unique_cols = [col for i, col in enumerate(source_wells_cols) if source_wells_cols.index(col) == i]
-            cols_list.append(unique_cols)
-        return cols_list
-
-
-    def spot_transformations(
-            spotting_tuples,
-            dead_vol=1,
-            spotting_dispense_rate=0.025,
-            stabbing_depth=10,
-            max_spot_vol=5):
-        """
-        Spots transformation reactions.
-
-        Args:
-        spotting_tuples (list): Sets of spotting reactions are given in the form: ((source wells), (target wells), (spotting volumes)).
-        dead_vol (float): Dead volume aspirated during spotting.
-        spotting_dispense_rate (float): Rate p20_pipette dispenses at during spotting.
-        stabbing_depth (float): Depth p20_pipette moves into agar during spotting.
-        max_spot_vol (float): Maximum volume that is spotted per spot reaction.
-
-        """
-
-        def spot(
-                source,
-                target,
-                spot_vol):
-            """
-            Spots an individual reaction using the p20 pipette.
-
-            Args:
-            source (str): Well containing the transformation reaction to be spotted.
-            target (str): Well transformation reaction is to be spotted to.
-            spot_vol (float): Volume of transformation reaction to be spotted (uL).
-
-            """
-
-            # Constants
-            DEFAULT_HEAD_SPEED = {'x': 400, 'y': 400,'z': 125, 'a': 125}
-            SPOT_HEAD_SPEED = {'x': 400, 'y': 400, 'z': 125,'a': 125 // 4}
-            DISPENSING_HEIGHT = 5
-            SAFE_HEIGHT = 7  # height avoids collision with agar tray.
-
-            # Spot
-            p20_pipette.pick_up_tip()
-            p20_pipette.aspirate(spot_vol + dead_vol, source[0])
-            # old code:
-                # p20_pipette.aspirate(spot_vol + dead_vol, source)
-                # returned type error because 'source' was a list containing one item (the well location)
-                # source[0] takes the location out of the list
-
-            p20_pipette.move_to(target[0].top(SAFE_HEIGHT))
-            p20_pipette.move_to(target[0].top(DISPENSING_HEIGHT))
-            # old code:
-                # p20_pipette.move_to(target.top(SAFE_HEIGHT))
-                # p20_pipette.move_to(target.top(DISPENSING_HEIGHT))
-                # returned attribute error because 'target' was a list containing one item (the well location)
-                # target[0] takes the location out of the list
-
-            p20_pipette.dispense(volume=spot_vol, rate=spotting_dispense_rate)
-
-            protocol.max_speeds.update(SPOT_HEAD_SPEED)
-            # old code:
-                # robot.head_speed(combined_speed=max(SPOT_HEAD_SPEED.values()), **SPOT_HEAD_SPEED)
-                # robot.head_speed not used in API version 2
-                # replaced with protocol.max_speeds
-            # new code no longer uses the lower value between combined speed or specified speed
-                # just uses each axis' specified speed directly
-            p20_pipette.move_to(target[0].top(-1 * stabbing_depth))
-            # old code:
-                # p20_pipette.move_to(target.top(-1*stabbing_depth))
-                # returns attribute error because 'target' was a list containing one item (the well location)
-            protocol.max_speeds.update(DEFAULT_HEAD_SPEED)
-            # old code:
-                # robot.head_speed(combined_speed=max(DEFAULT_HEAD_SPEED.values()), **DEFAULT_HEAD_SPEED)
-                # robot.head_speed not used in API version 2
-                # replaced with protocol.max_speeds
-            # new code no longer uses the lower value between combined speed or specified speed
-                # just uses each axis' specified speed directly
-
-            #Make sure that the transformed cells drops on the agar plate
-
-            p20_pipette.blow_out()
-
-            protocol.delay(seconds=10)
-
-            p20_pipette.blow_out()
-
-            protocol.delay(seconds=10)
-
-            p20_pipette.blow_out()
-
-            protocol.delay(seconds=10)
-
-            p20_pipette.blow_out()
-
-
-
-            p20_pipette.move_to(target[0].top(SAFE_HEIGHT))
-            # old code:
-                # p20_pipette.move_to(target[0].top(SAFE_HEIGHT))
-                # returns attribute error because 'target' was a list containing one item (the well location)
-
-
-            # the code below makes sure that the transformend cells are efficiently reaching to the agar surface
-
-
-
-            # Dispose of dead volume and tip
-            p20_pipette.dispense(dead_vol, spotting_waste[0])
-            # old code:
-                # p20_pipette.dispense(dead_vol, spotting_waste)
-                # returns type error because 'target' was a list containing one item (the well location)
-
-            p20_pipette.blow_out()
-                # the simple .blow_out command blows out at current position (spotting waste) by defualt
-                # unlike blowout=true in complex commands, which by default will blow out in waste
-
-            p20_pipette.drop_tip()
-
-        def spot_tuple(spotting_tuple):
-            """
-            Spots all reactions defined by the spotting tuple. Requires the function spot.
-
-            Args:
-            spotting_tuple (tuple): Spotting reactions given in the form: (source wells), (target wells), (spotting volumes).
-            Each unique source well is resuspended once prior to spotting.
-
-            """
-            source_wells = spotting_tuple[0]
-            target_wells = spotting_tuple[1]
-            spot_vols = list(spotting_tuple[2])
-            while max(spot_vols) > 0:
-                for index, spot_vol in enumerate(spot_vols):
-                    if spot_vol == 0:
-                        pass
-                    else:
-                        vol = spot_vol if spot_vol <= max_spot_vol else max_spot_vol
-                        spot(source = transformation_plate.wells(source_wells[index]), target = agar_plate.wells(target_wells[index]), spot_vol = vol)
-                        spot_vols[index] = spot_vols[index] - vol
-
-        # Constants
-        TRANSFORMATION_MIX_SETTINGS = [4, 50]
-
-        # Spot transformation reactions
-            # Each unique transformation well is resuspended once prior to spotting.
-
-        for spotting_tuple in spotting_tuples:
-            source_wells_cols = [source_well[1:] for source_well in spotting_tuple[0]]
-            unique_cols = [col for i, col in enumerate(source_wells_cols) if source_wells_cols.index(col) == i]
-            for col in unique_cols:
-                p300_pipette.pick_up_tip()
-                p300_pipette.mix(TRANSFORMATION_MIX_SETTINGS[0], TRANSFORMATION_MIX_SETTINGS[1],transformation_plate.columns_by_name()[col][0])
-                # old code:
-                    # p300_pipette.mix(TRANSFORMATION_MIX_SETTINGS[0], TRANSFORMATION_MIX_SETTINGS[1],transformation_plate.cols(col))
-                    # .columns aka .cols doesn't take lists anymore
-                        # replaced with .columns_by_name
-                    # .mix only takes one location, not several locations
-                        # added [0] to specify only the wells in row A
-                        # is identical for the protocol, as this is using a multi-channel pipette
-                p300_pipette.drop_tip()
-            spot_tuple(spotting_tuple)
-
-
-    # Tiprack slots
-
-    p20_p300_tiprack_slots = tiprack_slots(spotting_tuples)
-    p20_slots = CANDIDATE_p20_SLOTS[:p20_p300_tiprack_slots[0]]
-    p300_slots = CANDIDATE_P300_SLOTS[:p20_p300_tiprack_slots[1]]
-
-    # Define labware
-    p20_tipracks = [protocol.load_labware(P20_TIPRACK_TYPE, slot) for slot in p20_slots]
-        # changed to protocol.load_labware for API version 2
-    p300_tipracks = [protocol.load_labware(P300_TIPRACK_TYPE, slot) for slot in p300_slots]
-        # changed to protocol.load_labware for API version 2
-    p20_pipette = protocol.load_instrument(__LABWARES['p20_single']['id'], P20_MOUNT, tip_racks=p20_tipracks)
-        # changed to protocol.load_instrument for API version 2
-    p300_pipette = protocol.load_instrument(__LABWARES['p300_multi']['id'], P300_MOUNT, tip_racks=p300_tipracks)
-        # changed to protocol.load_instrument for API version 2
-
-    assembly_plate = protocol.load_labware(ASSEMBLY_PLATE_TYPE, ASSEMBLY_PLATE_SLOT)
-        # changed to protocol.load_labware for API version 2
-    tempdeck = protocol.load_module('tempdeck', TEMPDECK_SLOT)
-    transformation_plate = tempdeck.load_labware(TRANSFORMATION_PLATE_TYPE, TEMPDECK_SLOT)
-        # changed to protocol.load_labware for API version 2
-        # removed share=True, not required in API version 2
-        # removed TEMPDECK_SLOT as it is loaded directly onto temperature module
-    soc_plate = protocol.load_labware(SOC_PLATE_TYPE, SOC_PLATE_SLOT)
-        # changed to protocol.load_labware for API version 2
-    tube_rack = protocol.load_labware(TUBE_RACK_TYPE, TUBE_RACK_SLOT)
-        # changed to protocol.load_labware for API version 2
-    spotting_waste = tube_rack.wells(SPOTTING_WASTE_WELL)
-    agar_plate = protocol.load_labware(AGAR_PLATE_TYPE, AGAR_PLATE_SLOT)
-        # changed to protocol.load_labware for API version 2
-
-
-    ### Run protocol
-
-
-
-
-
-    # Run functions
-    transformation_setup(generate_transformation_wells(spotting_tuples))
-    heat_shock()
-    phase_switch()
-    spotting_tuples_cols = [col for cols in spotting_cols(spotting_tuples) for col in cols]
-    unique_cols = [col for i, col in enumerate(spotting_tuples_cols) if spotting_tuples_cols.index(col) == i]
-    outgrowth(cols=unique_cols, soc_well=soc_well)
-    spot_transformations(spotting_tuples)
-    print(unique_cols)
--- a/test-data/dnabot_scripts/output/metainformation/dataset_4472_clip_run_info.csv	Tue Dec 14 14:46:38 2021 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,28 +0,0 @@
-MASTER_MIX
-Component,Volume (uL)
-"Promega T4 DNA Ligase buffer, 10X",45.0
-Water,232.5
-NEB BsaI-HFv2,15.0
-Promega T4 DNA Ligase,7.5
-
-SOURCE_PLATES
-Deck position,Source plate,Path
-2,dataset_4475.dat,/galaxy/database/files/004/dataset_4475.dat
-5,dataset_4476.dat,/galaxy/database/files/004/dataset_4476.dat
-
-CLIP_REACTIONS
-prefixes,parts,suffixes,number,mag_well
-LMS-P,BASIC_SEVA_37_CmR-p15A.1,LMP-S,1,"('A7',)"
-LMP-P,PJ23104_BASIC,U1-S,1,"('B7',)"
-U1-RBS2-P,D5AP78,U3-S,1,"('C7',)"
-U3-RBS3-P,Q1XBU4,U2-S,1,"('D7',)"
-U2-RBS1-P,O66129,LMS-S,1,"('E7',)"
-LMP-P,PJ23101_BASIC,U1-S,1,"('F7',)"
-U1-RBS1-P,D2WKD9,U2-S,1,"('G7',)"
-U2-RBS3-P,O48935,U3-S,1,"('H7',)"
-U3-RBS1-P,O66952,LMS-S,1,"('A8',)"
-LMP-P,PJ23104_BASIC,U2-S,1,"('B8',)"
-U2-RBS2-P,P48537,U3-S,1,"('C8',)"
-U3-RBS2-P,O07333,U1-S,1,"('D8',)"
-U1-RBS2-P,Q9C446,LMS-S,1,"('E8',)"
-
--- a/test-data/dnabot_scripts/output/metainformation/dataset_4472_final_assembly_run_info.csv	Tue Dec 14 14:46:38 2021 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,3 +0,0 @@
-A1,"['A7', 'B7', 'C7', 'D7', 'E7']"
-B1,"['A7', 'F7', 'G7', 'H7', 'A8']"
-C1,"['A7', 'B8', 'C8', 'D8', 'E8']"
--- a/test-data/dnabot_scripts/output/metainformation/dataset_4472_wells.txt	Tue Dec 14 14:46:38 2021 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,2 +0,0 @@
-Magbead ethanol well: A11
-SOC column: 1
\ No newline at end of file