Here's a very quick modiication of the self-paced reading script that implements your basic structure:
<usermanual>
___________________________________________________________________________________________________________________
*Self-Paced Reading (Moving Window Paradigm)*
___________________________________________________________________________________________________________________
Script Author: David Nitz (
dave@millisecond.com) for Millisecond Software, LLC
last updated: 02-28-2022 by K. Borchert (
katjab@millisecond.com) for Millisecond Software, LLC
Script Copyright © 02-28-2022 Millisecond Software
___________________________________________________________________________________________________________________
BACKGROUND INFO
___________________________________________________________________________________________________________________
This script implements the Self-Paced Reading procedure described in:
Just, M. A., Carpenter, P. A., & Woolley, J. D. (1982). Paradigms and processes in reading
comprehension. Journal of Experimental Psychology: General, 111(2), 228-238.
Related resources:
Just, M. A., & Carpenter, P. A. (1980). A theory of reading: From eye fixations to
comprehension. Psychological Review, 87(4), 329-354.
Thibadeau, R., Just, M. A., & Carpenter, P. A. (1982). A model of the time course and
content of reading. Cognitive Science, 6, 157-203.
Mitchell, D. C. (2004). On-line methods in language processing: Introduction and historical
review. In M. Carreiras & C.E. Clifton, Eds., The on-line study of sentence comprehension:
Eyetracking, ERP and beyond (pp. 15-32). New York, NY: Psychology Press.
Note: Currently this program only supports left-to-right (LTR) languages.
___________________________________________________________________________________________________________________
TASK DESCRIPTION
___________________________________________________________________________________________________________________
Masked text examples are presented and revealed word by word by Spacebar press.
2 conditions:
cumulative => words already revealed stay revealed
non-cumulative => words that have previously been revealed are masked again when the next word is revealed
___________________________________________________________________________________________________________________
DURATION
___________________________________________________________________________________________________________________
the default set-up of the script takes appr. 4 minutes to complete
___________________________________________________________________________________________________________________
DATA FILE INFORMATION
___________________________________________________________________________________________________________________
The default data stored in the data files are:
(1) Raw data file: 'selfpacedreading_raw*.iqdat' (a separate file for each participant)
build: The specific Inquisit version used (the 'build') that was run
computer.platform: the platform the script was run on (win/mac/ios/android)
date, time: date and time script was run
subject, group: with the current subject/groupnumber
session: with the current session id
blockcode, blocknum: the name and number of the current block (built-in Inquisit variable)
trialcode, trialnum: the name and number of the currently recorded trial (built-in Inquisit variable)
Note: trialnum is a built-in Inquisit variable; it counts all trials run; even those
that do not store data to the data file such as feedback trials. Thus, trialnum
may not reflect the number of main trials run per block.
response: the participant's response
correct: the correctness of the response (1 = correct; 0 = incorrect)
latency: the response latency (in ms)
list.mwstims.nextvalue: current "page" number
wincount: Ordinal number of the currently displayed (target) text segment (window).
windowstring: The current window (always unmasked)
text.mywindow.stimulusonset: returns the stimulus onset time in ms. The onset time is the point at which the stimulus
is presented relative to the start of the trial.
inputend Returns the total number of characters of the current input string
(paragraph or sentence to be displayed in window segments). Used
to determine the end of the paragraph and initiate the selection of
the next stimulus (sentence or paragraph).
winstart Start position of current text segment (window).
winend End position of current text segment (window)
(parameter) cumulative Determines the moving window mode to use. If set to 'true', any
previously displayed window segments will remain visible on the
screen. If set to 'false' any previously displayed window segments will
be remasked (noncumulative mode). Default is 'false'.
(parameter) highlight Determines whether the current window should be displayed in a
different color than the remaining (masked or unmasked) text in
order to make it more salient. The highlighting color can be adjusted
via the '/ txcolor' attribute of 'text.mywindowhl'. Default is 'true'.
(2) Summary data file: 'selfpacedreading_summary*.iqdat' (a separate file for each participant)
inquisit.version: Inquisit version run
computer.platform: the platform the script was run on (win/mac/ios/android)
startdate: date script was run
starttime: time script was started
subjectid: assigned subject id number
groupid: assigned group id number
sessionid: assigned session id number
elapsedtime: time it took to run script (in ms); measured from onset to offset of script
completed: 0 = script was not completed (prematurely aborted);
1 = script was completed (all conditions run)
___________________________________________________________________________________________________________________
EXPERIMENTAL SET-UP
___________________________________________________________________________________________________________________
runs 2 conditions:
Cumulative (revealed words stay revealed) and Non-cumulative (once revealed words get mask again)
___________________________________________________________________________________________________________________
STIMULI
___________________________________________________________________________________________________________________
see section Editable Stimuli
___________________________________________________________________________________________________________________
INSTRUCTIONS
___________________________________________________________________________________________________________________
see section Editable Instructions
___________________________________________________________________________________________________________________
EDITABLE CODE
___________________________________________________________________________________________________________________
check below for (relatively) easily editable parameters, stimuli, instructions etc.
Keep in mind that you can use this script as a template and therefore always "mess" with the entire code
to further customize your experiment.
The parameters you can change are:
windicator A single character that indicates each display segment (window).
Must be set to a character which doesn't occur "naturally" in throughout
the stimulus material (e.g. '|' or '#'). Each stimulus must start and end
with this character. Default is "I".
cumulative Determines the moving window mode to use. If set to 'true', any
previously displayed window segments will remain visible on the
screen. If set to 'false' any previously displayed window segments will
be remasked (noncumulative mode). Default is 'false'.
highlight Determines whether the current window should be displayed in a
different color than the remaining (masked or unmasked) text in
order to make it more salient. The highlighting color can be adjusted
via the '/ txcolor' attribute of 'text.mywindowhl'. Default is 'true'.
ucmaskchar Character used to mask uppercase letters and numbers (as defined in
'list.uppercase'). Suitable characters include (but are not limited to)
"-", "—", "_" or "…". The masking character may not be identical to
the character defined as window indicator (-> 'parameters.windicator')!
Default is "-".
lcmaskchar Character used to mask lowercase letters and interpunctuation
characters (as defined in 'list.lowercase'). Suitable characters
include (but are not limited to) "-", "—", "_" or "…". The masking
character may not be identical to the character defined as window
indicator (-> 'parameters.windicator')! Default is "-".
</usermanual>
**************************************************************************************************************
**************************************************************************************************************
EDITABLE PARAMETERS: change editable parameters here
**************************************************************************************************************
**************************************************************************************************************
<parameters>
/ cumulative = false
/ highlight = true
/ windicator = "|"
/ ucmaskchar = "-"
/ lcmaskchar = "-"
</parameters>
**************************************************************************************************************
**************************************************************************************************************
EDITABLE STIMULI: change editable stimuli here
**************************************************************************************************************
**************************************************************************************************************
Text stimuli containing the window indicator (as defined in 'parameters.windicator') must be
entered here.
<item mwstims>
/ 1 ="THE |BLOKE |HAS |A |HORSE |"
/ 2 = "THE |DOG |BARKS |AT |THE |MAILMAN |"
</item>
**************************************************************************************************************
**************************************************************************************************************
EDITABLE INSTRUCTIONS: change instructions here
**************************************************************************************************************
**************************************************************************************************************
<instruct>
/ fontstyle = ("Arial", 3.00%, false, false, false, false, 5, 1)
/ navigationbuttonfontstyle = ("Arial", 3%, false, false, false, false, 5, 1)
</instruct>
<page intro>
<center><hr><div style='background-color: white'><h2>Welcome to the Self-Paced Reading Task!</h2></div><hr></center><br>
This script implements the "moving window" paradigm introduced by<br>
<pre>
Just, M. A., Carpenter, P. A., & Wooley, J. D. (1982).<br>
Paradigms and processes in reading comprehension.<br>
Journal of Experimental Psychology: General, 111(2),<br>
228-238.</pre><br>
The script supports both "cumulative" and "noncumulative" moving window
procedures and has fully customizable masking and segmenting options.<br><br>
You can even highlight the current window in a different color.<br><br>
The script can be easily adapted to suit your own needs or integrated with
other tasks, such as plausibility or grammaticality judgments.
</page>
<page end>
<br><br><br><br><br>
<center>You have reached the end of the task.<br>
<h1>Thank you!</h1></center>
</page>
<page cumulative>
<br><br><br><br><br>
This block of trials demonstrates the <i>"cumulative"</i> moving window mode.<br><br>
Press the spacebar to advance through the text.
</page>
<page noncumulative>
<br><br><br><br><br>
This block of trials demonstrates the <i>"noncumulative"</i> moving window mode.<br><br>
Press the spacebar to advance through the text.
</page>
**************************************************************************************************************
**************************************************************************************************************
EDITABLE LISTS: change editable lists here
**************************************************************************************************************
**************************************************************************************************************
**************************************************************************************************************
'list.uppercase' contains all characters to be masked by the character defined in
'parameters.ucmaskchar'. Add or remove characters as needed.
**************************************************************************************************************
<list uppercase>
/ items = (
"A","B","C","D","E","F","G","H","I","J","K","L","M",
"N","O","P","Q","R","S","T","U","V","W","X","Y","Z",
"0","1","2","3","4","5","6","7","8","9")
/ selectionmode = sequence
/ selectionrate = always
</list>
**************************************************************************************************************
'list.lowercase' contains all characters to be masked by the character defined in
'parameters.lcmaskchar'. Add or remove characters as needed.
**************************************************************************************************************
<list lowercase>
/ items = (
"a","b","c","d","e","f","g","h","i","j","k","l","m",
"n","o","p","q","r","s","t","u","v","w","x","y","z",
"-","—","_",".",":",",",";","?","!","'","(",")","/","\")
/ selectionmode = sequence
/ selectionrate = always
</list>
**************************************************************************************************************
!!!REMAINING CODE: Customize after careful consideration only!!!
**************************************************************************************************************
**************************************************************************************************************
**************************************************************************************************************
DEFAULTS
**************************************************************************************************************
**************************************************************************************************************
script requires Inquisit 6.5.2.0 or higher
<defaults>
/ canvassize = (100%,100%)
/ canvasaspectratio = (4,3)
/ fontstyle = ("Verdana", 2.50%, false, false, false)
/ minimumversion = "6.5.2.0"
/ inputdevice = keyboard
/ screencolor = white
</defaults>
**************************************************************************************************************
**************************************************************************************************************
DATA
**************************************************************************************************************
**************************************************************************************************************
Note: data file explanations under User Manual Information at the top
********************
raw data
********************
<data>
/ columns = (build, computer.platform, date, time, subject, group, session,
blockcode, blocknum, trialcode, trialnum,
response,correct,latency,
list.mwstims.nextvalue,values.wincount,values.windowstring,text.mywindow.stimulusonset,
expressions.inputend,values.winstart,values.winend,parameters.cumulative,
parameters.highlight)
</data>
********************
summary data
********************
<summarydata>
/ columns = (inquisit.version, computer.platform, script.startdate, script.starttime, script.subjectid, script.groupid, script.sessionid,
script.elapsedtime, script.completed)
</summarydata>
**************************************************************************************************************
**************************************************************************************************************
VALUES: automatically updated
**************************************************************************************************************
**************************************************************************************************************
inputstring Unmasked version of the current text containing the window indicators
('parameters.windicator').
maskstring Masked version of the current text containing the window indicators
('parameters.windicator').
wincount Ordinal number of the currently displayed text segment (window).
winstart Start position of current text segment (window).
winend End position of current text segment (window)
prewindowstring Text preceding the current window. Masked or unmasked according to
'parameters.cumulative'.
windowstring The current window (always unmasked)
postwindowstring Text succeeding the current window (always masked).
outputstring Concetanation of prewindow, window and postwindow strings.
prewindowstringhl Used to implement the window highlighting (-> 'parameters.highlight').
windowstringhl Color-highlighted version of the current window.
postwindowstringhl Used to implement the window highlighting (-> 'parameters.highlight').
outputstringhl Used to implement the window highlighting (-> 'parameters.highlight').
stopblock Switch used to automatically stop the currently running block as soon as
all items have been displayed.
<values taskparams>
/ inputstring = ""
/ maskstring = ""
/ prewindowstring = ""
/ windowstring = ""
/ postwindowstring = ""
/ outputstring = ""
/ maskstringhl = ""
/ prewindowstringhl = ""
/ windowstringhl = ""
/ postwindowstringhl = ""
/ outputstringhl = ""
/ wincount = 0
/ winstart = 0
/ winend = 0
/ stopblock = 0
/ cresp = ""
/ itemnumber = 0
</values>
**************************************************************************************************************
**************************************************************************************************************
EXPRESSIONS
**************************************************************************************************************
**************************************************************************************************************
These expressions parse the input string for any occurence of the window indicator as
defined in 'parameters.windicator'. The input is segmented accordingly into a prewindow string
(either masked or unmasked according to the 'parameters.cumulative' setting), the current window
string (unmasked) and a postwindow string (masked).
inputend Returns the total number of characters of the current input string
(paragraph or sentence to be displayed in window segments). Used
to determine the end of the paragraph and initiate the selection of
the next stimulus (sentence or paragraph).
maskuppercase Replaces all uppercase characters (as defined in 'list.uppercase')
with the masking character defined in 'parameters.ucmaskchar'.
masklowercase Replaces all lowercase characters (as defined in 'list.lowercase')
with the masking character defined in 'parameters.lcmaskchar'.
maskuppercasehl Used to implement the window highlighting (-> 'parameters.highlight').
masklowercasehl Used to implement the window highlighting (-> 'parameters.highlight').
getwinstart Retrieves the start position of the current text segment (window) to
display and stores it to 'values.winstart'.
getwinend Retrieves the end position of the current text segment (window) to
display and stores it to 'values.winend.
getwincount Computes the ordinal number of the currently text segment (window)
and stores it to 'values.wincount'.
getprewindow Extracts the masked or unmasked text preceding the current window
and stores it to 'values.prewindowstring'.
getwindow Extracts the unmasked text for the current window and stores it to
'values.windowstring'.
getpostwindow Extracts the masked text succeeding the current window
and stores it to 'values.postwindowstring'.
getprewindowhl Used to implement the window highlighting (-> 'parameters.highlight').
getwindowhl Used to implement the window highlighting (-> 'parameters.highlight').
getpostwindowhl Used to implement the window highlighting (-> 'parameters.highlight').
stripwindicator Removes the window indicator character ('parameters.windicator') from
prewindow, window and postwindow strings.
getoutputstring Assembles the complete output by joining prewindow, window and
postwindow strings and stores the result to 'values.outputstring'.
getoutputstringhl Assembles the output containining the color-highlighted window and
stores the result to 'values.outputstringhl'.
movingwindow Bundles the expressions 'getwinstart' to 'getoutputstring' and executes
them when referenced by a trial element.
*Please, do not change*
<expressions>
/ inputend = length(values.inputstring)
/ maskuppercase = if(list.uppercase.unselectedcount > 0){
values.maskstring=replaceall(values.maskstring,list.uppercase.nextvalue, parameters.ucmaskchar);
expressions.maskuppercase;
}
/ masklowercase = if(list.lowercase.unselectedcount>0){
values.maskstring = replaceall(values.maskstring,
list.lowercase.nextvalue, parameters.lcmaskchar);
expressions.masklowercase;
}
/ masklowercasehl = values.maskstringhl = replaceall(values.maskstringhl,
parameters.lcmaskchar, " ")
/ maskuppercasehl = values.maskstringhl = replaceall(values.maskstringhl,
parameters.ucmaskchar, " ")
/ getwinstart = values.winstart = values.winend
/ getwinend = values.winend = search(substring(values.inputstring,
values.winstart, length(values.inputstring)-values.winstart), parameters.windicator)
+ length(parameters.windicator) + values.winstart
/ getprewindow = if(parameters.cumulative==true)
values.prewindowstring=substring(values.inputstring, 0, values.winstart) else
values.prewindowstring=substring(values.maskstring, 0, values.winstart)
/ getwindow = values.windowstring = substring(values.inputstring,
values.winstart, abs(values.winstart-values.winend))
/ getpostwindow = values.postwindowstring = substring(values.maskstring,
values.winend, abs(length(values.inputstring)-values.winend))
/ getprewindowhl = values.prewindowstringhl = substring(values.maskstringhl,
0, values.winstart)
/ getwindowhl = values.windowstringhl = substring(values.inputstring,
values.winstart, abs(values.winstart-values.winend))
/ getpostwindowhl = values.postwindowstringhl = substring(values.maskstringhl,
values.winend, abs(length(values.inputstring)-values.winend))
/ stripwindicator = if(parameters.windicator!=" "){
values.prewindowstring = replaceall(values.prewindowstring, parameters.windicator, "");
values.windowstring = replaceall(values.windowstring, parameters.windicator, "");
values.postwindowstring = replaceall(values.postwindowstring, parameters.windicator, "");
values.prewindowstringhl = replaceall(values.prewindowstringhl, parameters.windicator, "");
values.windowstringhl = replaceall(values.windowstringhl, parameters.windicator, "");
values.postwindowstringhl = replaceall(values.postwindowstringhl, parameters.windicator, "");
}
/ getwincount = if(values.windowstring!="")values.wincount+=1
/ getoutputstring = values.outputstring = concat(concat(values.prewindowstring,
values.windowstring),values.postwindowstring)
/ getoutputstringhl = if(parameters.highlight==true)
values.outputstringhl = concat(concat(values.prewindowstringhl,
values.windowstringhl),values.postwindowstringhl) else
values.outputstringhl=""
/ movingwindow = {
expressions.getwinstart; expressions.getwinend;
expressions.getprewindow; expressions.getwindow; expressions.getpostwindow;
expressions.getprewindowhl; expressions.getwindowhl; expressions.getpostwindowhl;
expressions.stripwindicator; expressions.getwincount;
expressions.getoutputstring; expressions.getoutputstringhl;
}
</expressions>
**************************************************************************************************************
**************************************************************************************************************
STIMULI
**************************************************************************************************************
**************************************************************************************************************
**************************************************************************************************************
Standard Window Text
**************************************************************************************************************
Fontstyle must be set to a monospaced font such as "Courier", "Courier New", "Courier New" or
"Lucida Console". "Courier New" should be available on any version of the Windows operating
system.
<text mywindow>
/ items = ("<%values.windowstring%>")
/ fontstyle = ("Courier New", 3.00%, true, false, false)
/ vjustify = center
/ hjustify = center
/ txcolor = black
/ txbgcolor = transparent
/ erase = false
/ size = (100%, 100%)
</text>
**************************************************************************************************************
Highlighted Window Text
**************************************************************************************************************
Settings should be identical to those of 'text.mywindow' save for the '/ txcolor' attribute.
<text mywindowhl>
/ items = ("<%values.outputstringhl%>")
/ fontstyle = ("Courier New", 3.00%, true, false, false)
/ vjustify = center
/ hjustify = left
/ txcolor = blue
/ txbgcolor = transparent
/ erase = false
/ size = (100%, 100%)
</text>
**************************************************************************************************************
Text Elements for Moving Window Stimuli
**************************************************************************************************************
<text mwstims>
/ items = mwstims
</text>
**************************************************************************************************************
Layout Elements
**************************************************************************************************************
<shape background>
/ shape = rectangle
/ color = white
/ erase = false
/ size = (100%, 100%)
</shape>
**************************************************************************************************************
**************************************************************************************************************
LISTS
**************************************************************************************************************
**************************************************************************************************************
**************************************************************************************************************
List Elements (Item Selection)
Adapt as needed by modifying the settings in the '/ select' attribute.
**************************************************************************************************************
<list mwstims>
/ items = (1, 2)
/ selectionmode = random
</list>
**************************************************************************************************************
**************************************************************************************************************
TRIALS
**************************************************************************************************************
**************************************************************************************************************
**************************************************************************************************************
Get Complete Stimulus & Set Up The Mask & Erase Screen
**************************************************************************************************************
<trial getstim>
/ ontrialbegin = [
if(list.mwstims.unselectedcount==0){
values.stopblock=1;
};
values.itemnumber = list.mwstims.nextvalue;
values.inputstring=getitem(text.mwstims, values.itemnumber);
values.maskstring=values.inputstring;
list.uppercase.reset();
list.lowercase.reset();
expressions.maskuppercase;
expressions.masklowercase;
values.maskstringhl=values.maskstring;
expressions.maskuppercasehl;
expressions.masklowercasehl;
values.wincount=0;
values.winstart=0;
values.winend=0;
]
/ validresponse = (noresponse)
/ trialduration = 0
/ branch = [
return trial.fixation;
]
/ recorddata = false
</trial>
<trial fixation>
/ stimulustimes = [0=clearscreen, fixation; 1000=clearscreen]
/ trialduration = 2000
/ validresponse = (0)
/ recorddata = false
/ branch = [
return trial.MWtrial;
]
</trial>
<text fixation>
/ items = ("+")
/ erase = false
</text>
**************************************************************************************************************
Display Moving Window Stimulus
**************************************************************************************************************
<trial MWtrial>
/ ontrialbegin = [expressions.movingwindow]
/ stimulusframes = [1=background, mywindow]
/ validresponse = (" ")
/ branch = [
if(values.winend==expressions.inputend){
return openended.questiontrial;
} else {
return trial.MWtrial;
};
]
</trial>
<openended questiontrial>
/ ontrialbegin = [
values.cresp = item.answeritems.item(values.itemnumber);
]
/ stimulusframes = [1=clearscreen, question]
/ correctresponse = (values.cresp)
/ branch = [
return trial.getstim;
]
</openended>
<text question>
/ items = questionitems
/ select = values.itemnumber
/ position = (50%, 35%)
/ erase = false
</text>
<item questionitems>
/ 1 = "What does the bloke have?"
/ 2 = "Whom did the dog bark at?"
</item>
<item answeritems>
/ 1 = "Horse"
/ 2 = "Mailman"
</item>
**************************************************************************************************************
**************************************************************************************************************
BLOCKS
**************************************************************************************************************
**************************************************************************************************************
**************************************************************************************************************
Cumulative Moving Window Condition
**************************************************************************************************************
<block cumulative>
/ preinstructions = (cumulative)
/ onblockbegin = [
parameters.cumulative=true;
list.mwstims.reset();
]
/ stop = [values.stopblock==1]
/ trials = [1=getstim]
/ onblockend = [
values.stopblock=0;
]
</block>
**************************************************************************************************************
Noncumulative Moving Window Condition
**************************************************************************************************************
<block noncumulative>
/ preinstructions = (noncumulative)
/ onblockbegin = [
parameters.cumulative=false;
list.mwstims.reset();
]
/ stop = [values.stopblock==1]
/ trials = [1=getstim]
/ onblockend = [
values.stopblock=0;
]
</block>
**************************************************************************************************************
**************************************************************************************************************
EXPERIMENT
**************************************************************************************************************
**************************************************************************************************************
<expt MovingWindow>
/ postinstructions = (end)
/ blocks = [
1=cumulative;
]
</expt>
**************************************************************************************************************
End of File
**************************************************************************************************************