Looking for feedback on upcoming feature: experiment profiles

We are exploring the idea of specifying experiment-protocols-as-files. These files can be edited, shared, and uploaded to your UI. The files contain all the information needed to start and run an experiment. Think of them as an initial “script”, but you can always edit the experiment as it’s progressing. We are calling them Pioreactor experiment profiles.

Users can upload profiles in the UI (for example):

Below are some examples of profiles. We are using yaml syntax, as yaml is user-friendly and precise.


In this example, two pioreactors (woker1 and worker2) are set up to perform stirring. Both pioreactors start stirring with different initial target_rpm values (200 and 300, respectively). After 2 hours, the target_rpm for both pioreactors is updated (to 250 and 350, respectively), and stirring stops after 4 hours.

# multi_pioreactor_stirring.yaml
experiment_name: multi_pioreactor_stirring

metadata:
  author: John Doe
  description: Stirring in multiple pioreactors with target_rpm change midway

aliases:
  worker1: BR-001
  worker2: BR-002

pioreactors:
  BR-001:
    jobs:
      stirring:
        actions:
          - type: start
            duration: 0.0
            parameters:
              target_rpm: 200.0
          - type: update
            duration: 2.0
            parameters:
              target_rpm: 250.0
          - type: stop
            duration: 4.0
  worker2:
    jobs:
      stirring:
        actions:
          - type: start
            duration: 0.0
            parameters:
              target_rpm: 300.0
          - type: update
            duration: 2.0
            parameters:
              target_rpm: 350.0
          - type: stop
            duration: 4.0

Here’s a YAML file for a single pioreactor that starts OD reading, stirring, and later runs a chemostat that doses 1ml every 30 minutes:

# single_bioreactor_chemostat.yaml
experiment_name: single_bioreactor_chemostat

metadata:
  author: Jane Doe
  description: OD reading, stirring, and chemostat in a single bioreactor

pioreactors:
  worker1:
    jobs:
      od_reading:
        actions:
          - type: start
            duration: 0.0
          - type: stop
            duration: 5.0
      stirring:
        actions:
          - type: start
            duration: 0.0
            parameters:
              target_rpm: 200.0
          - type: stop
            duration: 5.0
      dosing_control:
        actions:
          - type: start
            duration: 1.0
            parameters:
              automation_name: chemostat
              volume: 1.0
              duration: 30
          - type: stop
            duration: 5.0

You can specify plugins required, too, example:

plugins:
  - name: dosing_plugin
    version: ">=1.2.0"

To control all Pioreactors, there’s a global_jobs field:


global_jobs:
  od_reading:
    actions:
      - type: start
        duration: 0.0
    stirring:
      actions:
        - type: start
          duration: 0.0
          parameters:
            target_rpm: 200.0

but this is overwritten by Pioreactor-specific jobs.


I’m looking for feedback! What’s missing? What do you find confusing? How else do you want to use Pioreactor experiment profiles?

Some things that are missing / not obvious:

  • how does a user change an LED, or dose manually?
    Technically changing an LED and dosing are jobs, so one could write the following to dose 1ml after 30min and then update LED B & D to 50%:
...
pioreactors:
  worker1:
    jobs:
      stirring:
        actions:
          - type: start
            duration: 0.0
      add_media:
        actions:
          - type: start
            duration: 0.5
            parameters:
                 volume: 1
      led_intensity:
        actions:
          - type: start
            duration: 0.5
            parameters:
                 B: 50
                 D: 50


Instead of a global_jobs field, another idea is to use our internal special name for all pioreactors: $broadcast:

experiment_name: multi_pioreactor_stirring

metadata:
  author: John Doe
  description: Stirring in multiple pioreactors with target_rpm change midway

pioreactors:
  $broadcast: # everyone does this, unless overwritten 
    jobs:
      stirring:
        actions:
          - type: start
            duration: 0.0
            parameters:
              target_rpm: 200.0
          - type: update
            duration: 2.0
            parameters:
              target_rpm: 250.0
          - type: stop
            duration: 4.0
  worker2:
    jobs:
      stirring:
        actions:
          - type: start
            duration: 0.0
            parameters:
              target_rpm: 300.0

duration is already used in Pioreactor’s automations, so we should use a different keyword. Some ideas:

  • time_marker
  • time_elapsed
  • elapsed_time
  • hours_elapsed
  • elapsed_hours

An early beta has shipped in version 23.5.16. See change log for details on how to use it.