See the exact same rdk again

Hello everyone :slight_smile:

I’m posting on the forum to ask for help because I’m new and I haven’t mastered the tool yet, but mainly because I’ve been stuck on a problem for 2 weeks.

My problem: in my experiment, subjects see rdk and have to point in the direction they think is the right one. However, in 2 out of 3 cases they can (if they want to) see the rdk again to refine their decision.

My experiment works very well, however, after reading several articles (Okazawa et al., 2018; Kiani et al., 2008) I realized that in cases where participants see the stim again, keeping the same coherence and direction is not enough. I need exactly the same rdk with the dots at the same position in every frame (whether informative or noise).

To achieve this, I tried to create a dictionary for which each frame number would be linked to the list of x y coordinates of each point for that frame. I could then reuse this dictionary to determine the position of each point at each frame, in the event that the person wanted to review the stim. However, I don’t know if there’s anything simpler, and don’t know either in which variables the positions of the points are contained and how to reintroduce them afterwards…

# --- Prepare to start Routine "rdk_task" ---
continueRoutine = True
routineForceEnded = False
# update component parameters for each repeat
dots_rdk_task.setDir(direction_dots_rdk_task)
dots_rdk_task.setFieldCoherence(coherence_level_rdk_task)
# keep track of which components have finished
rdk_taskComponents = [dots_rdk_task]
for thisComponent in rdk_taskComponents:
    thisComponent.tStart = None
    thisComponent.tStop = None
    thisComponent.tStartRefresh = None
    thisComponent.tStopRefresh = None
    if hasattr(thisComponent, 'status'):
        thisComponent.status = NOT_STARTED
# reset timers
t = 0
_timeToFirstFrame = win.getFutureFlipTime(clock="now")
frameN = -1

# --- Run Routine "rdk_task" ---
while continueRoutine and routineTimer.getTime() < 1.0:
    # get current time
    t = routineTimer.getTime()
    tThisFlip = win.getFutureFlipTime(clock=routineTimer)
    tThisFlipGlobal = win.getFutureFlipTime(clock=None)
    frameN = frameN + 1  # number of completed frames (so 0 is the first frame)
    # update/draw components on each frame
    
    # *dots_rdk_task* updates
    if dots_rdk_task.status == NOT_STARTED and tThisFlip >= 0.0-frameTolerance:
        # keep track of start time/frame for later
        dots_rdk_task.frameNStart = frameN  # exact frame index
        dots_rdk_task.tStart = t  # local t and not account for scr refresh
        dots_rdk_task.tStartRefresh = tThisFlipGlobal  # on global time
        win.timeOnFlip(dots_rdk_task, 'tStartRefresh')  # time at next scr refresh
        # add timestamp to datafile
        thisExp.timestampOnFlip(win, 'dots_rdk_task.started')
        dots_rdk_task.setAutoDraw(True)
    if dots_rdk_task.status == STARTED:
        # is it time to stop? (based on global clock, using actual start)
        if tThisFlipGlobal > dots_rdk_task.tStartRefresh + 1-frameTolerance:
            # keep track of stop time/frame for later
            dots_rdk_task.tStop = t  # not accounting for scr refresh
            dots_rdk_task.frameNStop = frameN  # exact frame index
            # add timestamp to datafile
            thisExp.timestampOnFlip(win, 'dots_rdk_task.stopped')
            dots_rdk_task.setAutoDraw(False)
    
    # check for quit (typically the Esc key)
    if endExpNow or defaultKeyboard.getKeys(keyList=["escape"]):
        core.quit()
    
    # check if all components have finished
    if not continueRoutine:  # a component has requested a forced-end of Routine
        routineForceEnded = True
        break
    continueRoutine = False  # will revert to True if at least one component still running
    for thisComponent in rdk_taskComponents:
        if hasattr(thisComponent, "status") and thisComponent.status != FINISHED:
            continueRoutine = True
            break  # at least one component has not yet finished
    
    # refresh the screen
    if continueRoutine:  # don't flip if this routine is over or we'll get a blank screen
        win.flip()

I also tried to look at the source code but I must admit I just got lost.

I’d be happy to receive any advice, hints or solutions.

Thank you very much in advance.