State Matrix

What's that?

Each Bpod trial is programmed as a virtual finite state machine. This ensures precise timing of events - for any state machine you program, state transitions will be completed in less than 100 microseconds - so inefficient coding won't reduce the precision of events in your data.

Introduction to the Bpod state machine

  • Each state describes Bpod's outputs (Valves, LEDs, BNC channels, wire terminals, serial ports, etc.).

  • Events detected by Bpod's inputs can be set to trigger transitions between specific states.

Here is a simple finite state machine, describing a binary switch that controls a bulb with variable brightness:

  • Each state contains a name ("On state" or "Off state"), a hardware description ("Brightness: X"), and transition events ("Switched on/off")

Here is the same diagram presented as a state matrix, written in proper syntax for Bpod:

sma = NewStateMatrix(); % Initializes a new, empty state matrix, and assigns it to the % variable "sma".

sma = AddState(sma, 'Name', 'OnState', ... % Adds a new state called "OnState" to the matrix.

'Timer', 0,... % Sets the internal timer of "On state" to 0 seconds.

'StateChangeConditions', {'Port1In', 'OffState'},... % Causes a transition to "Off state" (not yet defined) % if a "Port1In" event occurs.

'OutputActions', {'PWM1', 255}); % Outputs for "On state". PWM1 is Port 1's PWM channel,

% value set to max LED brightness (range = 0-255).

sma = AddState(sma, 'Name', 'OffState', ... % Adds a state called "Off state". PWM1 = 0, "Port1Out" returns to % first state.

'Timer', 0,...

'StateChangeConditions', {'Port1Out', 'OnState'},...

'OutputActions', {'PWM1', 0});