Recycling trials in an adaptive staircase (w/ integrated eye-tracking)

OS: Windows10
PsychoPy version: 2022.2.4
Standard Standalone? (y/n): Y
What are you trying to achieve?:
I am running an adaptive staircase where participants fixate on a central marker and shift covert attention between two locations on the screen. The staircase controls the duration that the stimuli are presented. If participants respond correctly, the duration decreases. If they respond incorrectly the duration increases. I have also integrated the EyeLink 1000 to collect gaze data while participants complete the task.

I’m trying to find out how to recycle trials such that if a participant’s eyes deviate more than a specific distance from the fixation marker during a trial, that trial will be recycled (not scored as correct or incorrect) and the participant will see the same trial again.

I have created an ROI around the fixation marker that tracks how many times the participant’s eyes have looked at the ROI (numLooks). Currently, if numLooks is greater than 1 then I am throwing out the trial. Based on some pilot testing, this is a highly inefficient approach as it is difficult to maintain fixation and I will therefore be discarding many trials. Instead of discarding these trials, I’d like to figure out how to allow participants to have another attempt at trials where gaze leaves the ROI.

What did you try to make it work?:
I’ve looked through the documentation and forums, but haven’t had any luck finding a solution. Any advice is appreciated!

Have a look at my Repeat Subset online demo for a way to give participants a second chance on some trials.

Hi @wakecarter, thanks for the quick reply! That is very helpful and will certainly serve as an interim solution.

For further context, I’m using an interleaved staircase with several conditions and would ideally like to immediately repeat the offending trial instead of repeating it in a separate block. For example, if the current trial runs the parameters pertaining to Condition A (e.g., interstimulus interval = 500 ms) and the participant moves their eyes outside of the ROI, I would like for the next time that Condition A is called by the stair handler to re-run the same Condition A parameters (e.g., ISI = 500 ms), rather than changing the ISI based on the response to the trial where they moved their eyes (e.g., up or down 50 ms depending on correct/incorrect answer). Essentially, I would like to nullify the participant’s first response to the Condition A trial, such that it is like it never happened, and re-run it. Any suggestions on how to do that?

For immediate repetition I would use a second routine within the loop which repeats the trial. You can then skip this routine if the answer was correct.

This is all very helpful, thank you. Would there be a way to repeat the trial but not immediately? For example, I have five conditions (A, B, C, D, and E) each running on its own staircase. Normally, the stairs are shuffled randomly in each repeat such that repeats of the same staircase only occur if it is the last one running.

Let’s say that the stair handler randomly selects condition A on the first trial (I know that conditions B, C, D, and E will be randomly selected for the next trial). However, if a participant’s eyes move out of the ROI for the current condition A trial (triggering numLooks to be > 1), I would like that staircase to be replaced such that conditions A, B, C, D, and E are now possible options for the next trial.

Hope that makes sense. Thanks again for your help.

I found this that is a step closer to what I was looking for but still not it. If called, it reshuffles the staircase back into the currently running staircases. However, it increments the intensity based on the correct/incorrect response rather than maintaining it for the next time the staircase is called.

Any suggestions?