This protocol enables a customizable and automated setup of a 2D dose-response matrix assay using the Opentrons OT-2 robot. Users can specify concentration ranges, number of replicates (maximum 3 per run), and liquid viscosity in the user interface. User-defined parameters will be translated into the Opentrons script as a configuration. Before the actual run, the reservoir carrying the corresponding components has to be set up manually. The robot will first automatically generate the specified dilution series, then distribute each component combination into the appropriate wells. Pipetting flow rates will be adjusted dynamically according to liquid viscosities to minimise pipetting errors. This provides a flexible and robust platform for investigating combinatorial effects and characterizing logic architectures.
This project relies on Conda for dependency management and environment isolation. Please ensure you have Anaconda or Miniconda installed on your system.
- Clone the repo
git clone https://github.com/pacifistsilver/ot4_ssb.git
- Create the environment and install dependencies
conda env create -f environment.yml
- Activate the environment
conda activate opentron
This Opentrons script makes use of custom labware definitions:
4ti0136_96_wellplate_2200ul.costar3370flatbottomtransparent_96_wellplate_200ul.
Ensure these are available in your labware directory prior to uploading your protocol, otherwise it will fail to analyse.
We have used Opentrons API V2.0 at an apiLevel of 2.14 for the Opentrons script.
- Once the "opentrons" environment has been activated, you can run the below command in any suitable terminal or command line:
This will launch the GUI. From here, you can input your parameters and generate a config file for the opentrons protocols.
python main.py
- Default values are loaded initially in the "Input Parameters" tab. Any parameter can be altered under this tab, but the maximum value within the target concentration list must not exceed your inputted target concentration.
- In the tab "Table Preview", the dilution schedule can be viewed.
- If acceptable, you must click "Generate JSON". This will write a config file called
dilution_config.jsonin the local directory of themain.pyscript. This is a required step. - Open the Opentrons GUI and set the directory of your custom labware definitions (
4ti0136_96_wellplate_2200ulandcostar3370flatbottomtransparent_96_wellplate_200ul) under the advanced settings tab under the Opentrons GUI settings. - Load this protocol and begin analysis.
- Assuming all plates and calibrations have been set up, the script can begin execution!
Users should prepare the reservoir according to their experimental design prior to the start of the Opentrons run. In the below run, we set our replicate number to 1. This is what our plate layout looked like:
Figure 1: Opentrons deck layout for a single 2D dose-response matrix assay. Customized labware were used. Two opentrons_96_tiprack_300ul were placed in deck 4 and 7. 4ti0136_96_wellplate_2200ul in deck 5 and 6 were used as the reservoir and source plate respectively. costar3370flatbottomtransparent_96_wellplate_200ul in deck 8 was used as the destination plate.Figure 2: Reservoir layout for a single 2D dose-response matrix assay. Xylene cyanol was used as mimics for inducer A and B. PBS buffer was used as mimics for the diluent and assay substrate. Figure 3: Source plate layout for a single 2D dose-response matrix assay. A two-fold serial dilution of inducer A was performed from column 8 to 1, resulting in an increasing concentration gradient from column 1 to 8. A two-fold serial dilution of inducer B was performed from well H10 to A10, resulting in an increasing concentration gradient from row A to H. Columns 11 and 12 will be used for inducer B serial dilutions if more replicates are required. Figure 4: Destination plate layout for a 2D dose-response matrix assay. Columns 1-4 served as the blank and experimental controls. An increase in the concentration of inducer A from columns 5-12 was expected while an increase in concentration of inducer B from rows A to H was expected. Figure 5: Imaged destination plate for a 2D dose-response matrix assay. Columns 1-4 served as the blank and experimental controls. Columns 5-12 were used for sample dyes. An "L-shaped" colouration can be observed for these samples as these have the highest concentration of dye.
- Be careful with the amount of PBS when the
distribute_pbs()function is called. In the reservoir plate, columns 5, 6, 7, and 8 are reserved for PBS only. We track the volume removed from these wells, so that we can move to the next well when we get close to the max volume (1200 as set by thepbs_max_wellconstant) Regardless, ensure the wells in these columns are filled well. - There may be issues with air gaps when pipetting highly viscous liquids, so be careful when placing these liquids into the reservoir. If issues are encountered, change the
rate_multiplierto a lower value if you are still encountering these issues. - When loading the gradient onto the destination plate from the source plate, the volume within the source well may be insufficient due to viscosity issues. We believed this was due to the
well_bottom_clearanceproperty being set too high, so alter as you so - desire.
- Allow user to run single inducer assays rather than forced to run a single one.
- Automatically handle customised labware.
- Add testing to ensure functions have the correct behaviour.
- Pick and specify specific concentrations for each column/well.
- Pick labware layout GUI.
- Test functionality with real cells and substrates.
Distributed under the MIT license. See LICENSE.txt for more information.
Code contributed by Agnes Cheung, Daniel Luo, Lihao Tao





