By luis - 2/1/2016
Hi, I would appreciate your help. I'm trying something apparently quite simple: to program a series of Stroop trials without feature repetitions (and without extensive preparation of the sequences beforehand). That program should be easy to achieve with the aid of the /not() and /select= replacenot() atributes from the counter element. However, I'm afraid that I'm not being able to make it work. As an example, if I use the following code to program the incongruent trials, thus forcing the selection of the word-item to be different from that used for the inkcolor, sometimes I found that the selected word coincides with the selected inkcolor. What am I doing wrong? Thanks Luis.
<counter inkcolor> / select = replacenorepeat / items = ("rojo","verde","azul","negro") / selectionrate = trial </counter>
<text wordINC> /select = replacenot(inkcolor) / items = ("rojo","verde","azul","negro") / txcolor =(expressions.codR;expressions.codv;expressions.coda) / fontstyle = ("Arial", 44pt, true) </text>
|
By Dave - 2/1/2016
That code excerpt is too incomplete to say anything meaningful. For example, it is entirely unclear what
<text wordINC> /select = replacenot(inkcolor) / items = ("rojo","verde","azul","negro") / txcolor =(expressions.codR;expressions.codv;expressions.coda) / fontstyle = ("Arial", 44pt, true) </text>
what those expressions do (they are not included), and the syntax in the /txcolor attribute may actually be invalid. Moreover, the code snippet does not make clear at all *when* any selection for <counter inkcolor> actually happens -- if any happens at all. The latter -- that selection happens not when you think it does -- may very well be the cause for the color (mis-)matches. To be clear: For this to work, in any given trial the selection of an item from the <counter> element *must* precede the selection of an item from the <text> element. If this is not the case, i.e., if selection from the <counter> happens *after* selection from the <text> element in the trial, this setup will necessarily fail at times.
Please provide a more complete example, i.e., something that can actually be run.
|
By luis - 2/1/2016
Hi Dave,
a sample of the code follows... So you say that the problem has to do with the moment at which the inkcolor happens within a trial... I'm using counter.inkcolor to select the color RGB codes. I don't know if this happens before the text is selected....
Thanks Luis -------------------------
<values> /codRCON=0 /codVCON=0 /codACON=0 </values>
<expressions> /codR= if ( counter.inkcolor.selectedvalue=="rojo") 255 else 0 /codV= if ( counter.inkcolor.selectedvalue=="verde") 255 else 0 /codA= if ( counter.inkcolor.selectedvalue=="azul") 255 else 0 </expressions>
<counter inkcolor> / select = replacenorepeat / items = ("rojo","verde","azul","negro") / selectionrate = trial </counter>
<counter respuesta> / items= (44,45,49,50) /select = current(inkcolor) / selectionrate = trial </counter>
<text wordINC> / txcolor =(expressions.codR;expressions.codv;expressions.coda) /select = replacenot(inkcolor) / items = ("rojo","verde","azul","negro") / fontstyle = ("Arial", 44pt, true) </text>
<trial trialINC> / ontrialbegin = [expressions.codr;expressions.codv;expressions.coda] / stimulusframes = [1=wordINC] / validresponse =(44,45,49,50) / iscorrectresponse = [trial.trialINC.response==counter.respuesta.selectedvalue] </trial>
<block myblock> / trials=[1-30=replace(trialINC)] </block>
<expt> / blocks=[1=myblock] </expt>
<data>/ columns=[subject, blockcode, trialcode, trialnum, latency, response, correct, stimulusitem, counter.inkcolor]</data>
|
By Dave - 2/2/2016
Thanks for the script, that's very helpful. Selection happens at the right point in time, so that's not the problem. The issue, I think, comes down to there not being a clear separation between an item and item's index for <counter> elements. Working with item numbers directly and using an additional <counter> for item selection in the <text> element should avoid any such problems:
<values> /codRCON=0 /codVCON=0 /codACON=0 / inkcolor = 0 </values>
<expressions> /codR= if ( counter.inkcolor.selectedvalue == 1) 255 else 0 /codV= if ( counter.inkcolor.selectedvalue == 2) 255 else 0 /codA= if ( counter.inkcolor.selectedvalue == 3) 255 else 0 </expressions>
<counter inkcolor> / items = (1,2,3,4) / select = replacenorepeat / selectionrate = trial </counter>
<counter respuesta> / items= (44,45,49,50) / select = current(inkcolor) / selectionrate = trial </counter>
<counter colorwordINC> / items = (1,2,3,4) / select = replace / not = (inkcolor) </counter>
<text wordINC> / txcolor =(expressions.codr;expressions.codv;expressions.coda) / select = colorwordINC / items = ("rojo","verde","azul","negro") / fontstyle = ("Arial", 44pt, true) </text>
<trial trialINC> / ontrialbegin = [expressions.codr; expressions.codv; expressions.coda] / ontrialbegin = [values.inkcolor = getitem(text.wordINC, counter.inkcolor.selectedvalue); ] / stimulusframes = [1=wordINC] / validresponse =(44,45,49,50) / iscorrectresponse = [trial.trialINC.response==counter.respuesta.selectedvalue] </trial>
<block myblock> / trials=[1-30=replace(trialINC)] </block>
<expt> / blocks=[1=myblock] </expt>
<data> / columns=[subject, blockcode, trialcode, trialnum, latency, response, correct, stimulusitem, values.inkcolor, stimulusnumber, counter.inkcolor, expressions.codr, expressions.coda, expressions.codv] / separatefiles = true </data>
|
By luis - 2/2/2016
Thank you, Dave. Now it works perfect... (Tricky thing these <counter> elements).
Luis
|
By luis - 2/2/2016
But... (If I may abuse of your time)
The next step in my project is even more tricky, and I think it shows a limit of the joint use of /select and /not:
If you want to avoid repetitions of *any* of the features of the previous trial (i.e., neither the text nor the ink can be repeated), I guess that one way to go is to build a dummy stimulus made up of two counters which instantiate the features of the previous trial. Then, adding the values of these "previous" counters to the /not=() instruction, you should get a selection that does not repeat features. However, it doesn't work: as soon as you put these conditions, the "replacenorepeat" stops working, and the program gets errors (even though, with four possible elements, there is always a logical alternative)...
Here I am appending the script, hoping again that I am missing some obvious detail:
Thanks again Luis .............
<values> /codRCON=0 /codVCON=0 /codACON=0 / inkcolor = 0 / inkprevio = 0 / colorprevio = 0 </values>
<expressions> /codR= if ( counter.inkcolor.selectedvalue == 1) 255 else 0 /codV= if ( counter.inkcolor.selectedvalue == 2) 255 else 0 /codA= if ( counter.inkcolor.selectedvalue == 3) 255 else 0
/codRprevio= if ( counter.inkprevio.selectedvalue == 1) 255 else 0 /codVprevio= if ( counter.inkprevio.selectedvalue == 2) 255 else 0 /codAprevio= if ( counter.inkprevio.selectedvalue == 3) 255 else 0 </expressions>
<counter inkcolor> / items = (1,2,3,4) / select = replacenorepeat / selectionrate = trial / not = (colorprevio)
</counter>
<counter respuesta> / items= (44,45,49,50) / select = current(inkcolor) / selectionrate = trial </counter>
<counter colorwordINC> / items = (1,2,3,4) / select = replacenorepeat / not = (inkcolor) / not=(inkprevio) / not=(colorprevio) </counter>
<counter colorprevio> / items = (1,2,3,4) / select = values.colorprevio </counter>
<counter inkprevio> / items = (1,2,3,4) / select = values.inkprevio </counter>
<text wordINC> / txcolor =(expressions.codr;expressions.codv;expressions.coda) / select = colorwordINC / items = ("rojo","verde","azul","negro") / fontstyle = ("Arial", 44pt, true) </text>
<text dummprevio> / txcolor =(expressions.codrprevio;expressions.codvprevio;expressions.codaprevio) / hposition = 10 /vposition = 10 / select = colorprevio / items = ("rojo","verde","azul","negro") / fontstyle = ("Arial", 44pt, true) </text>
<trial trialINC> / ontrialbegin = [expressions.codr; expressions.codv; expressions.coda;expressions.codrprevio; expressions.codvprevio; expressions.codaprevio] / ontrialbegin = [values.inkcolor = getitem(text.wordINC, counter.inkcolor.selectedvalue); ] / stimulusframes = [1=wordINC,dummprevio] / validresponse =(44,45,49,50) / iscorrectresponse = [trial.trialINC.response==counter.respuesta.selectedvalue] / ontrialend = [values.inkprevio = counter.inkcolor.currentitemnumber; ] / ontrialend = [values.colorprevio = counter.colorwordINC.currentitemnumber; ]
</trial>
<block myblock> / trials=[1-30=sequence(trialINC)] </block>
<expt> / blocks=[1=myblock] </expt>
<data> / columns=[subject, blockcode, trialcode, trialnum, latency, response, correct, stimulusitem, values.inkcolor, stimulusnumber, values.inkprevio, values.colorprevio, expressions.codr, expressions.coda, expressions.codv] / separatefiles = true </data>
|
By Dave - 2/2/2016
It should be possible to store the previous wordcolor in a variable (<values> entry) and then have the current trial select a different one in case of an initial match using an expression. Something along the lines of:
<values> /codRCON=0 /codVCON=0 /codACON=0 / inkcolor = 0 / previouswordcolor = "" / wordcolor = 0 </values>
<expressions> /codR= if ( counter.inkcolor.selectedvalue == 1) 255 else 0 /codV= if ( counter.inkcolor.selectedvalue == 2) 255 else 0 /codA= if ( counter.inkcolor.selectedvalue == 3) 255 else 0 / selectwordcolor = if (values.wordcolor == values.previouswordcolor) {values.wordcolor = counter.colorwordINC.selectedvalue; expressions.selectwordcolor} </expressions>
<counter inkcolor> / items = (1,2,3,4) / select = replacenorepeat / selectionrate = trial </counter>
<counter respuesta> / items= (44,45,49,50) / select = current(inkcolor) / selectionrate = trial </counter>
<counter colorwordINC> / items = (1,2,3,4) / select = replace / not = (inkcolor) / selectionrate = always </counter>
<text wordINC> / txcolor =(expressions.codr;expressions.codv;expressions.coda) / select = values.wordcolor / items = ("rojo","verde","azul","negro") / fontstyle = ("Arial", 44pt, true) </text>
<trial trialINC> / ontrialbegin = [expressions.codr; expressions.codv; expressions.coda] / ontrialbegin = [values.inkcolor = getitem(text.wordINC, counter.inkcolor.selectedvalue); ] / ontrialbegin = [values.wordcolor = counter.colorwordINC.selectedvalue; expressions.selectwordcolor] / ontrialend = [values.previouswordcolor = text.wordINC.currentitemnumber] / stimulusframes = [1=wordINC] / validresponse =(44,45,49,50) / iscorrectresponse = [trial.trialINC.response==counter.respuesta.selectedvalue] </trial>
<block myblock> / trials=[1-30=replace(trialINC)] </block>
<expt> / blocks=[1=myblock] </expt>
<data> / columns=[subject, blockcode, trialcode, trialnum, latency, response, correct, stimulusitem, values.inkcolor, values.previouswordcolor, stimulusnumber, counter.inkcolor, expressions.codr, expressions.coda, expressions.codv] / separatefiles = true </data>
|
|