Experiment flow


Experiment flow is specified in the flow block given after all test/screens specification and it consists of a series of statements for executing a test, showing a screen or repeating a test or a statement block.

Here is an example of how experiment flow may look like:

flow {
    show Intro for 5000
    execute Parity(practice true, random true)

    show Real
    // repeat test 2 times, each repetition will be randomized
    repeat 2 times Parity(random true)
}

Showing screens

In the above example, we see that first the Intro screen is shown to the subject for 5s. for definition is optional and if not given screen will be displayed until the subject provide some input (keypress, mouse click etc.).

We can pass arguments to screen which can be used to introduce variable parts in the screen content. For details see the screens section.

Executing tests

Each test definition may be executed many times during the course of the test. Test is executed with execute statement after which we give the name of the test and optionally argument values. execute is just an alias of

repeat 1 time <test name>

See the looping section for details on the repeat statement.

Passing arguments to tests and screens

As you may have notice in the above example, we may pass arguments to screens and tests. These arguments will be available as variables in the context of the test/screen.

For example:

    execute Parity(practice true, random true, some_param 42)

Argument can have any name and any value type. Two arguments of bool type have special meaning: practice and random. Default values of both those params are false. These params are applicable only to the test execution.

If practice is set to true then the execution will not record any data. If random is set to true then the order of trials in the test will be randomized.

Repeating

A flow definition may contain repeat loops. The repeat loop can be specified for a single test execution or for a block of statements. repeat keyword define the looping statement. There are two form of repeat: repeat <x> times and repeat with.

repeat <x> times

This form of repeat is used to loop a test or a block of statements for the given number of times.

Examples:

repeat 5 times Posner(random true)

repeat 3 times {
    screen Instructions for 10000
    execute Posner
}

repeat blocks can be nested:

repeat 3 times {
    screen Instructions for 10000
    repeat 2 times {
        screen InnerBlockInstructions
        execute Posner
    }
}

repeat with

This form of looping is used when we have a condition table and we want to execute a test or a block of statements for each row of the table. Variables from the table are available inside the looping block.

Example:

repeat {
    show instruction

    // 3 same blocks
    repeat 3 times {
        execute showImages
        show break for 1000
    }
} with
| image_type       | order |
| ---------------- | ----- |
| image_types loop | 1..2  |

In this example we have a repeat with outer loop with a condition table given after the with keyword. image_types is a global variable defined, for example, as:

image_types = [houses, faces]

used here to expand the table.

For each row of the table the block of statement will be executed and variables defined in the table (image_type and order) will be available inside the block. These variables will be propagated to all inner repeat loops and to all execution of tests and screens. This means that we can reference these two variables in the screen content and in the test expressions (e.g. component parameters in test definitions).

For a full experiment specification take a look at the blocking example.