In simple terms
In this experiment designed by Vanessa Loiza and colleagues (2024), people were asked to remember several shapes for a short time. Some of the shapes were concrete, like familiar everyday objects, while others were abstract, meaning meaningless scrambled versions of objects. People usually do better with concrete shapes, because they can connect them to long-term memory (for example, you can label a “chair” in your mind, but you can’t easily label a random squiggle).
The key twist in this task is the retro-cue. After the shapes disappeared, a brief cue appeared telling participants which shape would be tested. This cue doesn’t show new information; instead, it directs attention to one item already in memory. By focusing mental resources on the cued item, people can “refresh” it and remember it more accurately later.
The results showed two things.
-
People could hold more concrete shapes in mind than abstract ones, confirming that long-term memory helps working memory overall.
-
More importantly for this study than finding one, the retro-cue improved memory for both concrete and abstract shapes equally. That means the act of focusing attention in working memory works just as well whether the item is something you already know or something completely unfamiliar.
Research history
Psychologists have long debated how working memory (WM) and long-term memory (LTM) are related. We know that LTM generally improves WM performance—for example, people remember familiar objects or words more easily than unfamiliar ones. But it has been unclear whether LTM specifically helps with refreshing information in WM, that is, bringing items back into focus when they are no longer visible. Some studies suggested that familiar information gets a bigger boost from attention (retro-cues), while others found retro-cue benefits regardless of familiarity.
In this study, they found that retro-cues help regardless of familiarity. |
This debate matters because it touches on the basic architecture of memory. If WM is simply an “activated part” of LTM, then attention-based refreshing should depend on prior knowledge. If WM and LTM are separate systems, then retro-cues should work the same way no matter what the items are. This study builds on that debate by carefully testing both familiar (concrete) and unfamiliar (abstract) shapes, controlling performance at baseline, and asking whether LTM changes the size of the retro-cue effect.
Critical discussion
The authors interpret their results as support for the idea that working memory (WM) and long-term memory (LTM) are distinct systems. Because retro-cues improved memory equally for both familiar and unfamiliar shapes, they argue that LTM does not directly influence the mechanism of refreshing in WM.
One can argue, however, that this conclusion depends on a specific interpretation of what retro-cues are doing. Retro-cues are usually thought to “refresh” items by reactivating them, but they may instead work by strengthening items that are already active, by protecting them from interference, or simply by guiding attention to the right place at test. If so, the finding of no difference between concrete and abstract shapes does not necessarily prove that WM and LTM are separate. It may just show that retro-cues are a powerful attentional tool that helps regardless of prior knowledge.
This means the study adds strong evidence that retro-cues consistently help memory, but whether that settles the larger theoretical debate about WM and LTM remains open.
Task design
Trial timeline (Experiment 1 of the study):
-
Fixation (0.5 s): A cross appears.
-
Memory array (1.0 s): Several shapes are shown—either concrete (familiar, nameable) or abstract (scrambled, meaningless) depending on the block.
-
Retention interval (2.25 s): Screen is blank.
-
Test prompt: One of the shapes appears at screen center; participants report its color using a continuous color wheel with the mouse. Responses are untimed, but participants are encouraged to answer quickly and accurately; recall error (distance between target color and response) is recorded (degrees)
-
Intertrial interval (1.0 s): Next trial begins.
Conditions:
Factor 1 is shape type (concrete or abstract) Factor 2 is the type of cue (no cue or a cue)
These two factors form a 2x2 design with four conditions: Condition 1: Concrete shapes with cue Condition 2: Concrete shapes without cue Condition 3: Abstract shapes with cue Condition 4: Abstract shapes without cue
Abstract shapes here means simply objects that look like nothing you know, they are sort of random line drawings. |
About our implementation
We followed the paper carefully, but we added a few features.
-
We added a practise block with unique shapes, just so people understand the basics of the task. If you do not want this, you can remove this from the task by removing the trainingblock.
-
After people responded, we gave detailed feedback, that is, we showed the original location and shape and color, and also where people clicked and how far away it was from the required response. We also show a running score on the screen to encourage participants.
Run the demo
Data output file
You do not need this information, unless you want to understand the output data file. You can ignore this if you just want to find out your own score. This is only necessary if you want to carry out the experiment with multiple participants. |
In PsyToolkit, the data output file is simply a textfile. The save line of the PsyToolkit experiment script determines what is being saved in the data output file. Typically, for each experimental trial, you would have exactly one line in your text file, and each number/word on that line gives you the information you need for your data analysis, such as the condition, response speed, and whether an error was made. |
Meaning of the columns in the output datafile. You need this information for your data analysis.
Colum |
Meaning save BLOCKNUMBER &setSize &conditionAC &rotationWheel &targetAngle &chosenAngle &diffScore RT &targetR &targetG &targetB MOUSE_R MOUSE_G MOUSE_B |
1 |
Block number |
2 |
The number of objects in the memory array |
3 |
Type of shapes: 0) training shapes, 1) concrete shapes, 2) abstract shapes |
4 |
Retro-cue present: 1) Yes, 2) No cue |
5 |
Rotation of colorwheel (reported, but not really useful for analysis) |
6 |
Angle of the target |
7 |
Angle chosen by participant |
8 |
The score (difference between the two angles) |
9 |
Reaction time |
10 |
The red channel value of the target stimulus (0-255) |
11 |
The green channel value of the target stimulus (0-255) |
12 |
The blue channel value of the target stimulus (0-255) |
13 |
The red channel value the participant picked (0-255) |
14 |
The green channel value the participant picked (0-255) |
15 |
The blue channel value the participant picked (0-255) |
How to analyze data from experiments
When you embed the retrocue experiment in your survey, you need (as always), make sure you set the "analyze" parameters of your experiment. In this case, it is very simple, for the dependent variable you just use value 8 (the score, lower values are better). For groups you use the conditions (3 and 4)
This way, you get the response time for all the conditions. For more sophisticated analyses, we recommened to use R and the PsyToolkit R pacakge.
PsyToolkit code
Click to expand the PsyToolkit script code (part of zip file below)
options
#--basic parameters---------------------------------------
set &stimulus_width 147 # needed for the background image to color stimuli, note the images are 148px, but reduce by one to remove outline
set &encoding_timeTraining 3000 # used for training
set &encoding_timeNormal 1000 # in paper it is 1000ms, but for testing can try more
set &errorCutOff 40 ## 40 degrees in moving window
set &movingWindow 4 ## how many trials back for calculating error rate
set &totalTrialsTodo 130 # this is just for the feedback to participants and is constant
#---------------------------------------------------------
mouse on
resolution 1920 1080 # this is standard HD
fullscreen
scale
background color 128 128 128 # grey background
bitmapdir stimuli
set &&xpos 0 200 100 -100 -200 # for positioning in memory display
set &&ypos -170 -100 150 150 -100
#
set &&abstractBitmaps range 2 504 # we will refer to these bitmaps using their numbers
set &&concreteBitmaps range 505 1008 # we will refer to these bitmaps using their numbers
set &&trainingBitmaps range 1009 1018 # we will refer to these bitmaps using their numbers
#
# following are CIELAB color values for each degree of the color wheel (these are file rgbvalues.txt)
# there are exactly 360 lines, one color for each degree
set &&reds file rgbvalues.txt 2 # column 2 of file
set &&greens file rgbvalues.txt 3 # column 3 of file
set &&blues file rgbvalues.txt 4 # column 2 of file
#
set &showScores 1 # 0: do not show, 1: do show
include bitmaps.txt
svgs
feedback # used for creating feedback screen at end
## ---------------------------------------------------------------------------------------------
## "part" (sort of inline function) to draw connecting dots between two angles
## uses $tmpAngle1 , $tmpAngle2
part connectAngles
draw off
set $diffAngles1 expression $tmpAngle1 - $tmpAngle2
set $diffAngles2 expression $tmpAngle2 - $tmpAngle1
if $diffAngles1 >= 0 and $diffAngles1 <= 1800 # angle2 < angle1, so just go from angle 2 to angle1
for $i in $tmpAngle2 to $tmpAngle1 by 25
set &&tmpCoordinates circle 0 0 325 $i
show circle &&tmpCoordinates[1] &&tmpCoordinates[2] 3 black
for-end
fi
if $diffAngles2 >= 0 and $diffAngles2 <= 1800 # angle1 < angle2, so just go from angle 2 to angle1
for $i in $tmpAngle1 to $tmpAngle2 by 25
set &&tmpCoordinates circle 0 0 325 $i
show circle &&tmpCoordinates[1] &&tmpCoordinates[2] 3 black
for-end
fi
if $diffAngles1 >= 1800
set $tmpAngle2 increase 3600
for $i in $tmpAngle1 to $tmpAngle2 by 25
set &&tmpCoordinates circle 0 0 325 $i
show circle &&tmpCoordinates[1] &&tmpCoordinates[2] 3 black
for-end
fi
if $diffAngles2 >= 1800
set $tmpAngle1 increase 3600
for $i in $tmpAngle2 to $tmpAngle1 by 25
set &&tmpCoordinates circle 0 0 325 $i
show circle &&tmpCoordinates[1] &&tmpCoordinates[2] 3 black
for-end
fi
draw on
# -------------------------------------------------------------------------------------------------------------------------
task retrocue
set &trialCounter increase
## -- begin official trial ---------------------------------------
show bitmap fixpoint
delay 500
clear -1
## -- choose 5 random bitmaps (abstract or concrete) and put in &&myBitmaps
if &conditionAC = 0 # this is training
set &&myBitmaps sample &setSize from &&trainingBitmaps # this is a random sample of all available images (we will not remove them)
fi
if &conditionAC = 1 # this is concrete
set &&myBitmaps draw &setSize from &&concreteBitmaps # this is a random draw of all available images (they are removed once used)
fi
if &conditionAC = 2 # this is abstract
set &&myBitmaps draw &setSize from &&abstractBitmaps # this is a random draw of all available images (they are removed once used)
fi
## ---------------------------------------------------------------
## now choose one of &&myBitmaps and make that the target (the stimulus to respond to)
set &targetItem &&myBitmaps use random # this is the bitmap number
set &targetItemNum &&myBitmaps locate &targetItem ## needed for later matching with targetcolors
## -- now choose random colors from the CIELAB palet
# for the first color, we choose a value between 1 and 71, and then add 72 for next colors to make sure they are spread out
# &color1 etc are just indices on all the R/G/B values in the 359 item long palettes
set &&randomColors clear # for each stimulus in the &&myBitmaps you need a color, they need to be cleared each trial
set &colorDistance expression 360 / &setSize ## colors are spread out over a range, it must be 360 and not 3600 because colors are in arrays of 360 values
set &colorDistance round # we need to make sure this is rounded to a whole number (this might not be needed, need to check)
set &tmpColor random 1 &colorDistance # WHY THIS??? AH THAT SHOULD BE
for $i in 1 to &setSize
set &&randomColors append &tmpColor
set &tmpColor increase &colorDistance
for-end
set &&randomColors shuffle # this makes colors are not always in same place
#-- store the RGB of the target ------------------------------------------------------------------------------------
set &targetR &&reds[&&randomColors[&targetItemNum]] ## targetItemNum is value between 1 and &setSize
set &targetG &&greens[&&randomColors[&targetItemNum]]
set &targetB &&blues[&&randomColors[&targetItemNum]]
#-- memory display -------------------------------------------------------------------------------------------------
# to make sure the same sort of colors are not always on same position, we need to further sample those
# now apply the colors
set &&xpos clear ## this is just for storing xy positions
set &&ypos clear ## this is just for storing xy positions
set &&memDisplayStimuliNumbers clear # clear array that contains stimuli numbers, needed for clearing stimuli later
draw off # just draw without actually drawing on screen until all items are ready
if &conditionAC = 0
text align center
show text "Memorize color of each image" 0 -290
set &&memDisplayStimuliNumbers append SHOW_COUNTER
fi
set &angleCounter random 1 &colorDistance ## colorDistance is in angles (because color arrays have 360 values)
set &angleCounter expression &angleCounter * 10 # need to multiple x10 because we work with colors in arrays of 360 values
for &counter in 1 to &setSize
set &&xyPos circle 0 0 200 &angleCounter
set &&xpos append &&xyPos[1] # for later use (to show correct stimulus at end of trial)
set &&ypos append &&xyPos[2] # for later use (to show correct stimulus at end of trial)
# save &counter &angleCounter &&xyPos
show rectangle &&xyPos[1] &&xyPos[2] 147 147 &&reds[&&randomColors[&counter]] &&greens[&&randomColors[&counter]] &&blues[&&randomColors[&counter]] # 2
set &&memDisplayStimuliNumbers append SHOW_COUNTER
show bitmap &&myBitmaps[&counter] &&xyPos[1] &&xyPos[2]
set &&memDisplayStimuliNumbers append SHOW_COUNTER
set &angleCounter expression &angleCounter + &colorDistance * 10
for-end
draw on # now show everything you just added to the stimulus stack
#-------------------------------------------------------------------------------------------------------------------
delay &encoding_time ## encoding time is 1s, but during training1 it is 5 seconds
clear &&memDisplayStimuliNumbers # remove the items after showing. For testing or training, you can still show them
#-- now show cue in this task if needed
if &conditionCue = 1
show rectangle 0 0 &stimulus_width &stimulus_width white
show bitmap &targetItem
delay 250
clear -1 -2
delay 750
else
delay 1000
fi
##-- now show color wheel and test ------------------------------------------------------------------------------------
set &&memDisplayStimuliNumbers clear ## clear this again for next set of stimuli (for later clearing from screen)
set &rotationWheel random 0 3590 # rotate (tenths of degrees)
draw off
if &conditionAC = 0
text align center
show text "Move mouse over colors until" 0 -280
set &&memDisplayStimuliNumbers append SHOW_COUNTER
show text "it matches the color you remembered for this object." 0 -250
set &&memDisplayStimuliNumbers append SHOW_COUNTER
show text "When you are happy, click the mouse button." 0 -220
set &&memDisplayStimuliNumbers append SHOW_COUNTER
fi
rotate next &rotationWheel
show bitmap wheel ## with cue, this is stimulus #14, otherwise #12
set &stimulusCountWheel SHOW_COUNTER
show rectangle 0 0 &stimulus_width &stimulus_width black # start with black until people move mouse over color wheel (this is as in official experiment)
set &stimulusCountRect SHOW_COUNTER
show bitmap &targetItem
draw on
readmouse l &stimulusCountWheel 999999 range &stimulusCountWheel &stimulusCountWheel
hovercode begin
if MOUSE_R != 128 or MOUSE_G != 128 or MOUSE_B != 128 # update unless grey
update rectangle &stimulusCountRect 0 0 &stimulus_width &stimulus_width MOUSE_R MOUSE_G MOUSE_B
# now make copy of these colors (because sometimes if people click to choose outside colorwheel, these value would contain grey
set $chosenRed MOUSE_R
set $chosenGreen MOUSE_G
set $chosenBlue MOUSE_B
fi
hovercode end
if &conditionAC = 0 #only in training, now remove training help text
clear &&memDisplayStimuliNumbers
fi
##
## now we have had the response, and now we need to calculate score and give some feedback
##
## --- analyse results ------------------------------------------------------------------------------------------------
## participant clicked somewhere on color wheel and we know RGB, values. Now we need to find what the angle was exactly
## find the angle based on the target's colors (the correct angle) and then after that the users chosen angle
set &count 1 # this is a temporary counter for later match to the 360 RGB triplets
set &found 0 # this is just a help variable to check in the while loop if we found the RGB value
set &targetAngle -1 # set to -1, just to report if not angle was found
while &found = 0 and &count < 360
if &targetR = &&reds[&count] and &targetG = &&greens[&count] and &targetB = &&blues[&count]
set &found 1
set &targetAngle &count
fi
set &count increase
while-end
## find the angle of the chosen colors (based on the RGB values under mouseclick before)
set &count 1
set &found 0
set &chosenAngle -1 # set to -1, just to report if no angle was found
while &found = 0 && &count < 360
if $chosenRed = &&reds[&count] and $chosenGreen = &&greens[&count] and $chosenBlue = &&blues[&count]
set &found 1
set &chosenAngle &count
fi
set &count increase
while-end
## -- scoring ----------------------------------------------------------------------
set &diffScore1 expression abs ( &targetAngle - &chosenAngle ) ## the difference between the two angles
set &diffScore2 expression 360 - abs ( &targetAngle - &chosenAngle )
set &&tmpArray &diffScore1 &diffScore2
set &diffScore &&tmpArray min ## there are two possible scores, we need of course the smallest of the two; &diffScore is the actual score
## -- direct feedback --------------------------------------------------------------
## first we show the target item in the original set size (this is not per se necessary, but it is nice feedback) CHECK: IS THIS IN PAPER OR NOT?
show rectangle &&xpos[&targetItemNum] &&ypos[&targetItemNum] &stimulus_width &stimulus_width &targetR &targetG &targetB
show bitmap &targetItem &&xpos[&targetItemNum] &&ypos[&targetItemNum] ## show original item at original position
#
## next, we show arrow pointers where you clicked and where you should have clicked the wheel
#
## -- show angle as overlay, this is not in original study ----------------
if &chosenAngle >= 0 ## it can be less than zero if there was response
draw off
# 1. show arrows ("you" and "correct")
# 2. show dots connecting the two dots
# --- where you chose to click
set $tmpAngle1 expression &rotationWheel + &chosenAngle * 10
if $tmpAngle1 > 3600
set $tmpAngle1 decrease 3600
fi
if $tmpAngle1 < 1800 # depending on angle, the word is shown so it is convenient to read
rotate next $tmpAngle1
show bitmap overlayYouRight 0 0
else
rotate next $tmpAngle1
show bitmap overlayYouLeft 0 0
fi
# --- where original color was
set $tmpAngle2 expression &rotationWheel + &targetAngle * 10
if $tmpAngle2 > 3600
set $tmpAngle2 decrease 3600
fi
if $tmpAngle2 < 1800 # depending on angle, the word is shown so it is convenient to read
rotate next $tmpAngle2
show bitmap overlayCorrectRight 0 0
else
rotate next $tmpAngle2
show bitmap overlayCorrectLeft 0 0
fi
draw on
## --- now connecting dots ------------------------
part connectAngles ## this is just for nicer display, not in original, requires $tmpAngle1 and $tmpAngle2, which are positions on screen where clicked
fi
## ---------------------------------------------------------------
## next we write out the score in bottom right of screen
if &conditionAC = 0
show bitmap scoreExplained 650 0
fi
if &showScores = 1 # you can set this in "options"
set %trialCountFeedback "Trial number " &trialCounter " out of " &totalTrialsTodo
text align left
show text %trialCountFeedback 550 300 black
set %yourScore "Your score in this trial = " &diffScore
text align left
show text %yourScore 550 330 black
fi
text align left
show rectangle 715 420 350 60 yellow
show text "Click anywhere to continue" 550 420 black
## -- store feedback according to the 4 conditions for later task "feedback" at end of experiment
if &conditionAC = 1 and &conditionCue = 1
set &&scoresCoCue append &diffScore
fi
if &conditionAC = 1 and &conditionCue = 2
set &&scoresCoUnc append &diffScore
fi
if &conditionAC = 2 and &conditionCue = 1
set &&scoresAbCue append &diffScore
fi
if &conditionAC = 2 and &conditionCue = 2
set &&scoresAbUnc append &diffScore
fi
## -- keep data for error over moving window --------------------------------------------
set &&trackPerformance append &diffScore
set &trackPerformanceN &&trackPerformance size
if &trackPerformanceN > 4 ## if more than four, remove the oldest (i.e, first)
set &&trackPerformance remove first
set &trackPerformanceN &&trackPerformance size
fi
## -- determine set size for next trial if you have at least 4 trials --------------------
if &trackPerformanceN = 4
set &averageScoreWindow &&trackPerformance roundmean
if &averageScoreWindow < 40 and &setSize < 9
set &setSize increase
set &&trackPerformance clear
fi
if &averageScoreWindow > 40 and &setSize > 2
set &setSize decrease
set &&trackPerformance clear
fi
set %aws "Average score: " &averageScoreWindow # aws:average window score
fi
## -- report average score if needed, even if fewer than 4 trials
set &trackPerformanceN &&trackPerformance size
if &trackPerformanceN > 0 and &trackPerformanceN < 4
set &tmpAverageScoreWindow &&trackPerformance roundmean
set %aws "Average score: " &tmpAverageScoreWindow # aws:average window score
fi
if &showScores = 1
text align left
show text %aws 550 360 blue
fi
readmouse l 14 999999 ## there is no time limit for reading the feedback/scores
## -- if in training, make memorisation time slightly faster ----------------------------
if &conditionAC = 0
if &encoding_time > &encoding_timeNormal
set &encoding_time decrease 250 # reduce with 250 ms each trial, this would bring you to normal time in 8 trials, and there are 10 training trials
if &encoding_time < &encoding_timeNormal
set &encoding_time &encoding_timeNormal
fi
fi
fi
## -- end of task and save for datafile -------------------------------------------------
clear screen
save BLOCKNUMBER &setSize &conditionAC &conditionCue &rotationWheel &targetAngle &chosenAngle &diffScore RT &targetR &targetG &targetB $chosenRed $chosenGreen $chosenBlue
#------------------------------------------------------------------------------------------
# for feedback block we make fancy feedback screen
# we only call this one time at end of experiment
task showfeedback
## -- calculate scores -------------------------------
set &concreteCuedAvgScore &&scoresCoCue roundmean
set &concreteUncuedAvgScore &&scoresCoUnc roundmean
set &abstractCuedAvgScore &&scoresAbCue roundmean
set &abstractUncuedAvgScore &&scoresAbUnc roundmean
## -- render the scores to an SVG file ---------------
svg create myFeedback from feedback
svg replace "CO_CUE" &concreteCuedAvgScore
svg replace "CO_UNC" &concreteUncuedAvgScore
svg replace "AB_CUE" &abstractCuedAvgScore
svg replace "AB_UNC" &abstractUncuedAvgScore
svg render
delay 100
show bitmap myFeedback
readmouse l 1 9999999
#------------------------------------------------------------------------------------------
block screensize
message instructionFullScreen mouse
block trainingBlock
set &&trackPerformance clear # keeps data of moving window of 4 trials
set &encoding_time &encoding_timeTraining
set &setSize 3 # this is the starting setsize for training
message instructionTraining mouse
set &conditionAC 0 # 0: training
set &conditionCue 1 # 1: is cue, 2: no cue, we train with cue first
task retrocue 10
block concreteCued
# set &trialCounter 0 # after training, you can possibly set this back to 0
set &encoding_time &encoding_timeNormal
set &setSize 5 # this is the starting setsize
message instructionConcreteCued mouse
set &conditionAC 1 # 1: concrete, 2: abstract
set &conditionCue 1 # 1: is cue, 2: no cue
task retrocue 40
block concreteUncued
set &encoding_time &encoding_timeNormal
set &setSize 5 # this is the starting setsize
message instructionConcreteUncued mouse
set &conditionAC 1 # 1: concrete, 2: abstract
set &conditionCue 2 # 1: is cue, 2: no cue
task retrocue 40
block abstractCued
set &encoding_time &encoding_timeNormal
set &setSize 5 # this is the starting setsize
message instructionAbstractCued mouse
set &conditionAC 2 # 1: concrete, 2: abstract
set &conditionCue 1 # 1: is cue, 2: no cue
task retrocue 40
block abstractUncued
set &encoding_time &encoding_timeNormal
set &setSize 5 # this is the starting setsize
message instructionAbstractUncued mouse
set &conditionAC 2 # 1: concrete, 2: abstract
set &conditionCue 2 # 1: is cue, 2: no cue
task retrocue 40
block feedback
task showfeedback 1
Download
If you have a PsyToolkit account, you can upload the zipfile directly to your PsyToolkit account. |
If you want to upload the zipfile into your PsyToolkit account, make sure the file is not automatically uncompressed (some browsers, especially Mac Safari, by default uncompress zip files). Read here how to easily deal with this.
Further reading
-
Loaiza, V. M., Cheung, H. W., & Goldenhaus-Manning, D. T. (2024). What you don’t know can’t hurt you: Retro-cues benefit working memory regardless of prior knowledge in long-term memory. Psychonomic Bulletin & Review, 31(3), 1-12. Open access