How to let a block go on until participant reaches a certain percentage correct or a certain speed level, or a a percentage correct in each condition?

This is a somewhat more advanced topic. It is assumed that you already understand the basics of PsyToolkit experiment scripts (such as stimulus presentation, response measurement, and condition tables). |

Here you learn how to do this.

## Background

In cognitive psychological experiments, participants typically need to do things they have not done before. This takes some training. Sometimes you want to let the training go on until people can do one of the following:

1) Can do a task for a certain number of trials in a row without making an error. 2) Have a certain percentage correct in general 3) Have a certain percentage correct in each of the different conditions.

Number 1) is really simple to do in PsyToolkit, you can just specify
the number of correct people should be doing at least in the
**tasklist** statement, as
explained here.

Numbers 2) and 3) are slightly more complicated, but can easily be
used. The trick is to keep track of people’s performance in the **task**
section and use the **end tasklist** statement when people have reached a
certain level of performance.

## Example code 1 — running until percentage correct

In this example, the block runs until the following two conditions have been satisfied:

1) The participant has done at least 20 trials 2) The participant performs at 95% correct or better

First run the example below to see what happend. The actual performance level is presented on screen while doing the task.

And here is the explanation.

```
bitmaps
intro
left
right
fix
mistake
fonts
arial 18
```**(1)**
table simontasktable # table with four rows, each trial one row is randomly chosen
#-name of condition--------------position--stimulus--response
"left leftresponse compatible 1" -200 left 1
"right leftresponse incompatible 2" 200 left 1
"right rightresponse compatible 1" 200 right 2
"left rightresponse incompatible 2" -200 right 2
task simon
table simontasktable
set &number_of_trials increase **(2)**
keys a l
draw off
show text "Percentage correct:" -200 -200 **(3)**
show text &task_perc_correct 0 -200
show text "Trial number:" -200 -150
show text &number_of_trials 0 -150
draw on
delay 300
show bitmap fix
delay 300
show bitmap @3 @2 0
readkey @4 5000
clear -1 -2
if STATUS == CORRECT
set &correct_count increase **(4)**
fi
set &task_perc_correct expression ( &correct_count / &number_of_trials ) * 100 **(5)**
draw off
clear 2
show text &task_perc_correct 0 -200
draw on
if STATUS != CORRECT
show bitmap mistake
delay 1000
clear -1
fi
if &number_of_trials > 19 && &task_perc_correct >= 95 **(6)**
end tasklist **(7)**
fi
delay 500
save BLOCKNAME @1 STATUS RT
block test
message intro
tasklist
simon 100 ## run task up to maximally 100 trials
end

1 |
You use text in this experiment, therefore you need to specify a font (read more). |

2 |
We use a 'global' variable to keep track of number of trials. Note, global variable names start with & sign. The increase function just increases the variable by one (read here more). |

3 |
As part of this demo, we show how many trials done, etc. In real experiments, you would probably not do this. |

4 |
We use another 'global' variable to keep track of the number correct trials so far |

5 |
We calculate the current percentage correct (note PsyToolkit only works with whole numbers). Read more. |

6 |
We check if the criterial have been fulfilled. We want that the participant has done at least 20 trials, no matter what, and second, we want that the percentage correct is over 95%. Note that && stands for "and" (logical and). Read more. |

7 |
If the condition has been fulfilled, tell PsyToolkit to end the current tasklist (i.e., block). Read more. |

## Example code 2 — running until percentage correct and speed level had been reached

In this example, the block runs until the following three conditions have been satisfied:

1) The participant has done at least 20 trials 2) The participant performs at 95% correct or better 3) The participant performs on average faster than 1000 ms (i.e., 1 second).

First run the example below to see what happens. The actual performance level is presented on screen while doing the task.

And here is the explanation.

```
bitmaps
intro
left
right
fix
mistake
fonts
arial 18
table simontasktable # table with four rows, each trial one row is randomly chosen
#-name of condition--------------position--stimulus--response
"left leftresponse compatible 1" -200 left 1
"right leftresponse incompatible 2" 200 left 1
"right rightresponse compatible 1" 200 right 2
"left rightresponse incompatible 2" -200 right 2
task simon
set &number_of_trials increase
table simontasktable
keys a l
draw off
show text "Percentage correct:" -200 -200
show text &task_perc_correct 0 -200
show text "Trial number:" -200 -150
show text &number_of_trials 0 -150
show text "Mean RT:" -200 -100
show text &mean_rt 0 -100
draw on
delay 300
show bitmap fix
delay 300
show bitmap @3 @2 0
readkey @4 5000
clear -1 -2
if STATUS == CORRECT
set &correct_count increase
set &sum_rt increase RT
```**(1)**
set &mean_rt expression &sum_rt / &correct_count
fi
set &task_perc_correct expression ( &correct_count / &number_of_trials ) * 100
draw off
clear 2 6
show text &task_perc_correct 0 -200
show text &mean_rt 0 -100
draw on
if STATUS != CORRECT
show bitmap mistake
delay 1000
clear -1
fi
if &number_of_trials > 19 && &task_perc_correct >= 95 && &mean_rt < 1000 **(2)**
end tasklist **(3)**
fi
delay 500
save BLOCKNAME @1 STATUS RT
block test
message intro
tasklist
simon 100 ## run task up to maximally 100 trials
end

1 |
In addition to keep track of numbers correct, we also keep track of the average RT using global variables |

2 |
We check if the criterion has been reached. Note that this if asks for 3 different things to check. |

3 |
If criterion has been reached, finish tasklist (i.e., block) |

## Example code 3 — running until percentage correct in each condition has been reached

In this example, the block runs until the following two conditions have been satisfied:

1) The participant has done at least 20 trials
2) The participant performs at 95% correct or better **in each condition**

Example 3 is just an extension of Example 1. Now we keep track of the numbers of trials in each condition.

First run the example below to see what happens. The actual performance level is presented on screen while doing the task.

And here is the explanation.

```
bitmaps
intro
left
right
fix
mistake
fonts
arial 18
table simontasktable # table with four rows, each trial one row is randomly chosen
#-name of condition--------------position--stimulus--response
"left leftresponse compatible 1" -200 left 1
"right leftresponse incompatible 2" 200 left 1
"right rightresponse compatible 1" 200 right 2
"left rightresponse incompatible 2" -200 right 2
task simon
table simontasktable
keys a l
set &number_of_trials increase
if TABLEROW == 1
```**(1)**
set &number_of_trials_c1 increase
fi
if TABLEROW == 2
set &number_of_trials_c2 increase
fi
if TABLEROW == 3
set &number_of_trials_c3 increase
fi
if TABLEROW == 4
set &number_of_trials_c4 increase
fi
text align left
draw off
show text "Percentage correct in each condition:" -390 -200
show text &task_perc_correct_c1 50 -200
show text &task_perc_correct_c2 100 -200
show text &task_perc_correct_c3 150 -200
show text &task_perc_correct_c4 200 -200
show text "Trial number in each condition:" -390 -150
show text &number_of_trials_c1 50 -150
show text &number_of_trials_c2 100 -150
show text &number_of_trials_c3 150 -150
show text &number_of_trials_c4 200 -150
draw on
delay 300
show bitmap fix
delay 300
show bitmap @3 @2 0
readkey @4 5000
clear -1 -2
if STATUS == CORRECT
if TABLEROW == 1
set &correct_count_c1 increase
set &task_perc_correct_c1 expression ( &correct_count_c1 / &number_of_trials_c1 ) * 100
fi
if TABLEROW == 2
set &correct_count_c2 increase
set &task_perc_correct_c2 expression ( &correct_count_c2 / &number_of_trials_c2 ) * 100
fi
if TABLEROW == 3
set &correct_count_c3 increase
set &task_perc_correct_c3 expression ( &correct_count_c3 / &number_of_trials_c3 ) * 100
fi
if TABLEROW == 4
set &correct_count_c4 increase
set &task_perc_correct_c4 expression ( &correct_count_c4 / &number_of_trials_c4 ) * 100
fi
fi
draw off
clear 2 3 4 5
show text "Percentage correct in each condition:" -390 -200
show text &task_perc_correct_c1 50 -200
show text &task_perc_correct_c2 100 -200
show text &task_perc_correct_c3 150 -200
show text &task_perc_correct_c4 200 -200
draw on
if STATUS != CORRECT
show bitmap mistake
delay 1000
clear -1
fi
if &number_of_trials > 19 && &task_perc_correct_c1 >= 95 && &task_perc_correct_c2 >= 95 && &task_perc_correct_c3 >= 95 && &task_perc_correct_c4 >= 95
end tasklist
fi
delay 500
save BLOCKNAME @1 STATUS RT
block test
message intro
tasklist
simon 100 ## run task up to maximally 100 trials
end

1 |
The TABLEROW is the table row chosen from the table with the 4 conditions. Thus, when TABLEROW is 1, it means the computer has currently chosen the first row of the table. The standard way of doing things is that PsyToolkit randomly choses a row, although this can be changed as well (read hear how to). |