Millisecond Forums

Recording data of stimuli presented from a list

https://forums.millisecond.com/Topic21824.aspx

By jm560@sussex.ac.uk - 6/12/2017

Hi,

My task presents one of three distractors on every trial retrieved from a list. This works well but I am struggling to record which stimulus has been presented on each trial. Currently the task records reaction time for each trial but I need to be able to match that with the distractor type. Any help would be appreciated! Even direction to other resources, I'm not sure how well i understand data recording and 'values' beyond what i've learnt from the online descriptions & simple demos. Relevant code posted below...

<picture food>
/ items = ("food1.png", "food2.png", "food3.png", "food4.png", "food5.png", "food6.png")
/ select = noreplace
/ position = (50%, 50%)
/ size = (1px * values.imagewidth * expressions.ratio_pxpermm, 1 px * values.imageheight * expressions.ratio_pxpermm)
</picture>

<picture nature>
/ items = ("nature1.png", "nature2.png", "nature3.png", "nature4.png", "nature5.png", "nature6.png")
/ select = noreplace
/ size = (1px * values.imagewidth * expressions.ratio_pxpermm, 1 px * values.imageheight * expressions.ratio_pxpermm)
</picture>

<picture blank>
/ items = ("blank.bmp")
/ select =replace
/ position = (50%, 50%)
</picture>

<list Lowdistractor>
/ items = (picture.nature, picture.food, picture.blank)
/ itemprobabilities = (.10, .10, .80)
/ poolsize = 60
</list>

<values>
/distractor = list.Lowdistractor
</values>

<trial lowX1>
/ ontrialbegin = [trial.lowX1.insertstimulustime(list.Lowdistractor.nextvalue,500);]
/ ontrialend = [trial.lowX1.resetstimulusframes(); ]
/ stimulustimes = [1=fixation; 500=sequence (fixationcover, XLD1, Ll2filler, Ll3filler, Ll4filler, Ll5filler, Ll6filler); 600=eraseblank]
/ validresponse = ("0", "2")
/ correctresponse = ("0")
/ response = timeout(2000)
/ beginresponsetime = 500
</trial>

<data>
/ columns = (date, time, group, subject, trialcode, blockcode, correct, stimulusitem, values.distractor)
</data>

Whole script is attached if needed, but obviously will not work without all the stimuli etc.

Thanks!
Jenny
By Dave - 6/13/2017

jm560@sussex.ac.uk - Tuesday, June 13, 2017
Hi,

My task presents one of three distractors on every trial retrieved from a list. This works well but I am struggling to record which stimulus has been presented on each trial. Currently the task records reaction time for each trial but I need to be able to match that with the distractor type. Any help would be appreciated! Even direction to other resources, I'm not sure how well i understand data recording and 'values' beyond what i've learnt from the online descriptions & simple demos. Relevant code posted below...

<picture food>
/ items = ("food1.png", "food2.png", "food3.png", "food4.png", "food5.png", "food6.png")
/ select = noreplace
/ position = (50%, 50%)
/ size = (1px * values.imagewidth * expressions.ratio_pxpermm, 1 px * values.imageheight * expressions.ratio_pxpermm)
</picture>

<picture nature>
/ items = ("nature1.png", "nature2.png", "nature3.png", "nature4.png", "nature5.png", "nature6.png")
/ select = noreplace
/ size = (1px * values.imagewidth * expressions.ratio_pxpermm, 1 px * values.imageheight * expressions.ratio_pxpermm)
</picture>

<picture blank>
/ items = ("blank.bmp")
/ select =replace
/ position = (50%, 50%)
</picture>

<list Lowdistractor>
/ items = (picture.nature, picture.food, picture.blank)
/ itemprobabilities = (.10, .10, .80)
/ poolsize = 60
</list>

<values>
/distractor = list.Lowdistractor
</values>

<trial lowX1>
/ ontrialbegin = [trial.lowX1.insertstimulustime(list.Lowdistractor.nextvalue,500);]
/ ontrialend = [trial.lowX1.resetstimulusframes(); ]
/ stimulustimes = [1=fixation; 500=sequence (fixationcover, XLD1, Ll2filler, Ll3filler, Ll4filler, Ll5filler, Ll6filler); 600=eraseblank]
/ validresponse = ("0", "2")
/ correctresponse = ("0")
/ response = timeout(2000)
/ beginresponsetime = 500
</trial>

<data>
/ columns = (date, time, group, subject, trialcode, blockcode, correct, stimulusitem, values.distractor)
</data>

Whole script is attached if needed, but obviously will not work without all the stimuli etc.

Thanks!
Jenny

<values>
/distractor = list.Lowdistractor
</values>

^this does not make sense and will not work. list.lowdistractor returns nothing. Moreover, you're not updating the value anywhere, whereas you'll want to do that on a trial-by-trial basis. In other words, you'll want to do something like this if you want to capture which distractor <picture> element was selected on a given trial:

<trial lowX1>
/ ontrialbegin = [trial.lowX1.insertstimulustime(list.Lowdistractor.nextvalue,500);]
/ ontrialbegin = [values.distractor = list.Lowdistractor.currentvalue;]
/ ontrialend = [trial.lowX1.resetstimulusframes(); ]
/ stimulustimes = [1=fixation; 500=sequence (fixationcover, XLD1, Ll2filler, Ll3filler, Ll4filler, Ll5filler, Ll6filler); 600=eraseblank]
/ validresponse = ("0", "2")
/ correctresponse = ("0")
/ response = timeout(2000)
/ beginresponsetime = 500
</trial>
By jm560@sussex.ac.uk - 8/8/2017

Dave - Tuesday, June 13, 2017
jm560@sussex.ac.uk - Tuesday, June 13, 2017
Hi,

My task presents one of three distractors on every trial retrieved from a list. This works well but I am struggling to record which stimulus has been presented on each trial. Currently the task records reaction time for each trial but I need to be able to match that with the distractor type. Any help would be appreciated! Even direction to other resources, I'm not sure how well i understand data recording and 'values' beyond what i've learnt from the online descriptions & simple demos. Relevant code posted below...

<picture food>
/ items = ("food1.png", "food2.png", "food3.png", "food4.png", "food5.png", "food6.png")
/ select = noreplace
/ position = (50%, 50%)
/ size = (1px * values.imagewidth * expressions.ratio_pxpermm, 1 px * values.imageheight * expressions.ratio_pxpermm)
</picture>

<picture nature>
/ items = ("nature1.png", "nature2.png", "nature3.png", "nature4.png", "nature5.png", "nature6.png")
/ select = noreplace
/ size = (1px * values.imagewidth * expressions.ratio_pxpermm, 1 px * values.imageheight * expressions.ratio_pxpermm)
</picture>

<picture blank>
/ items = ("blank.bmp")
/ select =replace
/ position = (50%, 50%)
</picture>

<list Lowdistractor>
/ items = (picture.nature, picture.food, picture.blank)
/ itemprobabilities = (.10, .10, .80)
/ poolsize = 60
</list>

<values>
/distractor = list.Lowdistractor
</values>

<trial lowX1>
/ ontrialbegin = [trial.lowX1.insertstimulustime(list.Lowdistractor.nextvalue,500);]
/ ontrialend = [trial.lowX1.resetstimulusframes(); ]
/ stimulustimes = [1=fixation; 500=sequence (fixationcover, XLD1, Ll2filler, Ll3filler, Ll4filler, Ll5filler, Ll6filler); 600=eraseblank]
/ validresponse = ("0", "2")
/ correctresponse = ("0")
/ response = timeout(2000)
/ beginresponsetime = 500
</trial>

<data>
/ columns = (date, time, group, subject, trialcode, blockcode, correct, stimulusitem, values.distractor)
</data>

Whole script is attached if needed, but obviously will not work without all the stimuli etc.

Thanks!
Jenny

<values>
/distractor = list.Lowdistractor
</values>

^this does not make sense and will not work. list.lowdistractor returns nothing. Moreover, you're not updating the value anywhere, whereas you'll want to do that on a trial-by-trial basis. In other words, you'll want to do something like this if you want to capture which distractor <picture> element was selected on a given trial:

<trial lowX1>
/ ontrialbegin = [trial.lowX1.insertstimulustime(list.Lowdistractor.nextvalue,500);]
/ ontrialbegin = [values.distractor = list.Lowdistractor.currentvalue;]
/ ontrialend = [trial.lowX1.resetstimulusframes(); ]
/ stimulustimes = [1=fixation; 500=sequence (fixationcover, XLD1, Ll2filler, Ll3filler, Ll4filler, Ll5filler, Ll6filler); 600=eraseblank]
/ validresponse = ("0", "2")
/ correctresponse = ("0")
/ response = timeout(2000)
/ beginresponsetime = 500
</trial>

Hi, this worked perfectly when I changed it but I think I may need help once more on this script! The script had before had 3 different stimulus categories which were selected from a list. See below

<list Lowdistractor>
/ items = (picture.nature, picture.food, picture.blank)
/ itemprobabilities = (.10, .10, .80)
/ poolsize = 60
</list>

I've had to change the script so that I can have different sizes for each image.

I.e. Separate picture element for each stimulus image so I can change the size easily instead of having images from the same category in the same picture element like before. 

<picture nature5>
/ items = ("nature5.png")
/ select = noreplace
/ size = (1px * values.greenwidth * expressions.ratio_pxpermm, 1 px * values.greenheight * expressions.ratio_pxpermm)
</picture>

Which means the list now looks like this

<list Lowdistractor>
/ items = (picture.nature1, picture.nature2, picture.nature3, picture.nature4, picture.nature5, picture.nature6, picture.food1, picture.food2, picture.food3, picture.food4, picture.food5, picture.food6, shape.blank)
/ itemprobabilities = (.0166666666667, .0166666666667, .0166666666667, .0166666666667, .0166666666667, .0166666666667, .0166666666667, .0166666666667, .0166666666667, .0166666666667, .0166666666667, .0166666666667,.80)
/ poolsize = 60
</list>

This still works fine but I don't want to record each image individually. So I want to record the trials where nature1, 2, 3, 4, 5 and 6 are presented as a combined group I.e. Just an overall Nature category. The same for food. Is there a way of combining these for the data recording?

I thought it might work to have a second superordinate list but i can't get that to work either. I've copied what I tried below...

<list nature>
/ items = (picture.nature1, picture.nature2, picture.nature3, picture.nature4, picture.nature5, picture.nature6)
/ itemprobabilities = (.166666666667, .166666666667, .166666666667, .166666666667, .166666666667, .166666666667)
/ poolsize = 6
</list>

<list food>
/ items = (picture.food1, picture.food2, picture.food3, picture.food4, picture.food5, picture.food6)
/ itemprobabilities = (.166666666667, .166666666667, .166666666667, .166666666667, .166666666667, .166666666667)
/ poolsize = 6
</list>

<list Lowdistractor>
/ items = (list.food, list.nature, shape.blank)
/ itemprobabilities = (.10, .10, .80)
/ poolsize = 60
</list>

Any ideas would be greatly appreciated! 
Thanks,
Jenny



By Dave - 8/8/2017

jm560@sussex.ac.uk - Tuesday, August 8, 2017
Dave - Tuesday, June 13, 2017
jm560@sussex.ac.uk - Tuesday, June 13, 2017
Hi,

My task presents one of three distractors on every trial retrieved from a list. This works well but I am struggling to record which stimulus has been presented on each trial. Currently the task records reaction time for each trial but I need to be able to match that with the distractor type. Any help would be appreciated! Even direction to other resources, I'm not sure how well i understand data recording and 'values' beyond what i've learnt from the online descriptions & simple demos. Relevant code posted below...

<picture food>
/ items = ("food1.png", "food2.png", "food3.png", "food4.png", "food5.png", "food6.png")
/ select = noreplace
/ position = (50%, 50%)
/ size = (1px * values.imagewidth * expressions.ratio_pxpermm, 1 px * values.imageheight * expressions.ratio_pxpermm)
</picture>

<picture nature>
/ items = ("nature1.png", "nature2.png", "nature3.png", "nature4.png", "nature5.png", "nature6.png")
/ select = noreplace
/ size = (1px * values.imagewidth * expressions.ratio_pxpermm, 1 px * values.imageheight * expressions.ratio_pxpermm)
</picture>

<picture blank>
/ items = ("blank.bmp")
/ select =replace
/ position = (50%, 50%)
</picture>

<list Lowdistractor>
/ items = (picture.nature, picture.food, picture.blank)
/ itemprobabilities = (.10, .10, .80)
/ poolsize = 60
</list>

<values>
/distractor = list.Lowdistractor
</values>

<trial lowX1>
/ ontrialbegin = [trial.lowX1.insertstimulustime(list.Lowdistractor.nextvalue,500);]
/ ontrialend = [trial.lowX1.resetstimulusframes(); ]
/ stimulustimes = [1=fixation; 500=sequence (fixationcover, XLD1, Ll2filler, Ll3filler, Ll4filler, Ll5filler, Ll6filler); 600=eraseblank]
/ validresponse = ("0", "2")
/ correctresponse = ("0")
/ response = timeout(2000)
/ beginresponsetime = 500
</trial>

<data>
/ columns = (date, time, group, subject, trialcode, blockcode, correct, stimulusitem, values.distractor)
</data>

Whole script is attached if needed, but obviously will not work without all the stimuli etc.

Thanks!
Jenny

<values>
/distractor = list.Lowdistractor
</values>

^this does not make sense and will not work. list.lowdistractor returns nothing. Moreover, you're not updating the value anywhere, whereas you'll want to do that on a trial-by-trial basis. In other words, you'll want to do something like this if you want to capture which distractor <picture> element was selected on a given trial:

<trial lowX1>
/ ontrialbegin = [trial.lowX1.insertstimulustime(list.Lowdistractor.nextvalue,500);]
/ ontrialbegin = [values.distractor = list.Lowdistractor.currentvalue;]
/ ontrialend = [trial.lowX1.resetstimulusframes(); ]
/ stimulustimes = [1=fixation; 500=sequence (fixationcover, XLD1, Ll2filler, Ll3filler, Ll4filler, Ll5filler, Ll6filler); 600=eraseblank]
/ validresponse = ("0", "2")
/ correctresponse = ("0")
/ response = timeout(2000)
/ beginresponsetime = 500
</trial>

Hi, this worked perfectly when I changed it but I think I may need help once more on this script! The script had before had 3 different stimulus categories which were selected from a list. See below

<list Lowdistractor>
/ items = (picture.nature, picture.food, picture.blank)
/ itemprobabilities = (.10, .10, .80)
/ poolsize = 60
</list>

I've had to change the script so that I can have different sizes for each image.

I.e. Separate picture element for each stimulus image so I can change the size easily instead of having images from the same category in the same picture element like before. 

<picture nature5>
/ items = ("nature5.png")
/ select = noreplace
/ size = (1px * values.greenwidth * expressions.ratio_pxpermm, 1 px * values.greenheight * expressions.ratio_pxpermm)
</picture>

Which means the list now looks like this

<list Lowdistractor>
/ items = (picture.nature1, picture.nature2, picture.nature3, picture.nature4, picture.nature5, picture.nature6, picture.food1, picture.food2, picture.food3, picture.food4, picture.food5, picture.food6, shape.blank)
/ itemprobabilities = (.0166666666667, .0166666666667, .0166666666667, .0166666666667, .0166666666667, .0166666666667, .0166666666667, .0166666666667, .0166666666667, .0166666666667, .0166666666667, .0166666666667,.80)
/ poolsize = 60
</list>

This still works fine but I don't want to record each image individually. So I want to record the trials where nature1, 2, 3, 4, 5 and 6 are presented as a combined group I.e. Just an overall Nature category. The same for food. Is there a way of combining these for the data recording?

I thought it might work to have a second superordinate list but i can't get that to work either. I've copied what I tried below...

<list nature>
/ items = (picture.nature1, picture.nature2, picture.nature3, picture.nature4, picture.nature5, picture.nature6)
/ itemprobabilities = (.166666666667, .166666666667, .166666666667, .166666666667, .166666666667, .166666666667)
/ poolsize = 6
</list>

<list food>
/ items = (picture.food1, picture.food2, picture.food3, picture.food4, picture.food5, picture.food6)
/ itemprobabilities = (.166666666667, .166666666667, .166666666667, .166666666667, .166666666667, .166666666667)
/ poolsize = 6
</list>

<list Lowdistractor>
/ items = (list.food, list.nature, shape.blank)
/ itemprobabilities = (.10, .10, .80)
/ poolsize = 60
</list>

Any ideas would be greatly appreciated! 
Thanks,
Jenny




It seems to me that you should be able to determine the category from the list item selected, store that in a value and then log that value to the data file. In essence:

<list lowdistractor>
/ items = (text.nature1, text.nature2, text.food1, text.food2)
/ itemprobabilities = (0.1, 0.1, 0.4, 0.4)
/ poolsize = 10
</list>

<trial mytrial>
/ ontrialbegin = [
    trial.mytrial.insertstimulusframe(list.lowdistractor.nextvalue, 1)
]
/ ontrialbegin = [
    if (contains(list.lowdistractor.currentvalue, "nature")) values.category = "nature";
    else if (contains(list.lowdistractor.currentvalue, "food")) values.category = "food";
    else values.category = "blank";
]

/ validresponse = (57)
</trial>

<block myblock>
/ trials = [1-10 = mytrial]
</block>

<text nature1>
/ items = ("n1")
/ size = (10%,10%)
</text>

<text nature2>
/ items = ("n2")
/ size = (10%,10%)
</text>

<text food1>
/ items = ("f1")
/ size = (10%,10%)
</text>

<text food2>
/ items = ("f2")
/ size = (10%,10%)
</text>

<values>
/ category = ""
</values>


<data>
/ columns = [
    subject trialnum trialcode list.lowdistractor.currentvalue values.category
]
/ separatefiles = true
</data>

By jm560@sussex.ac.uk - 8/10/2017

Dave - Tuesday, August 8, 2017
jm560@sussex.ac.uk - Tuesday, August 8, 2017
Dave - Tuesday, June 13, 2017
jm560@sussex.ac.uk - Tuesday, June 13, 2017
Hi,

My task presents one of three distractors on every trial retrieved from a list. This works well but I am struggling to record which stimulus has been presented on each trial. Currently the task records reaction time for each trial but I need to be able to match that with the distractor type. Any help would be appreciated! Even direction to other resources, I'm not sure how well i understand data recording and 'values' beyond what i've learnt from the online descriptions & simple demos. Relevant code posted below...

<picture food>
/ items = ("food1.png", "food2.png", "food3.png", "food4.png", "food5.png", "food6.png")
/ select = noreplace
/ position = (50%, 50%)
/ size = (1px * values.imagewidth * expressions.ratio_pxpermm, 1 px * values.imageheight * expressions.ratio_pxpermm)
</picture>

<picture nature>
/ items = ("nature1.png", "nature2.png", "nature3.png", "nature4.png", "nature5.png", "nature6.png")
/ select = noreplace
/ size = (1px * values.imagewidth * expressions.ratio_pxpermm, 1 px * values.imageheight * expressions.ratio_pxpermm)
</picture>

<picture blank>
/ items = ("blank.bmp")
/ select =replace
/ position = (50%, 50%)
</picture>

<list Lowdistractor>
/ items = (picture.nature, picture.food, picture.blank)
/ itemprobabilities = (.10, .10, .80)
/ poolsize = 60
</list>

<values>
/distractor = list.Lowdistractor
</values>

<trial lowX1>
/ ontrialbegin = [trial.lowX1.insertstimulustime(list.Lowdistractor.nextvalue,500);]
/ ontrialend = [trial.lowX1.resetstimulusframes(); ]
/ stimulustimes = [1=fixation; 500=sequence (fixationcover, XLD1, Ll2filler, Ll3filler, Ll4filler, Ll5filler, Ll6filler); 600=eraseblank]
/ validresponse = ("0", "2")
/ correctresponse = ("0")
/ response = timeout(2000)
/ beginresponsetime = 500
</trial>

<data>
/ columns = (date, time, group, subject, trialcode, blockcode, correct, stimulusitem, values.distractor)
</data>

Whole script is attached if needed, but obviously will not work without all the stimuli etc.

Thanks!
Jenny

<values>
/distractor = list.Lowdistractor
</values>

^this does not make sense and will not work. list.lowdistractor returns nothing. Moreover, you're not updating the value anywhere, whereas you'll want to do that on a trial-by-trial basis. In other words, you'll want to do something like this if you want to capture which distractor <picture> element was selected on a given trial:

<trial lowX1>
/ ontrialbegin = [trial.lowX1.insertstimulustime(list.Lowdistractor.nextvalue,500);]
/ ontrialbegin = [values.distractor = list.Lowdistractor.currentvalue;]
/ ontrialend = [trial.lowX1.resetstimulusframes(); ]
/ stimulustimes = [1=fixation; 500=sequence (fixationcover, XLD1, Ll2filler, Ll3filler, Ll4filler, Ll5filler, Ll6filler); 600=eraseblank]
/ validresponse = ("0", "2")
/ correctresponse = ("0")
/ response = timeout(2000)
/ beginresponsetime = 500
</trial>

Hi, this worked perfectly when I changed it but I think I may need help once more on this script! The script had before had 3 different stimulus categories which were selected from a list. See below

<list Lowdistractor>
/ items = (picture.nature, picture.food, picture.blank)
/ itemprobabilities = (.10, .10, .80)
/ poolsize = 60
</list>

I've had to change the script so that I can have different sizes for each image.

I.e. Separate picture element for each stimulus image so I can change the size easily instead of having images from the same category in the same picture element like before. 

<picture nature5>
/ items = ("nature5.png")
/ select = noreplace
/ size = (1px * values.greenwidth * expressions.ratio_pxpermm, 1 px * values.greenheight * expressions.ratio_pxpermm)
</picture>

Which means the list now looks like this

<list Lowdistractor>
/ items = (picture.nature1, picture.nature2, picture.nature3, picture.nature4, picture.nature5, picture.nature6, picture.food1, picture.food2, picture.food3, picture.food4, picture.food5, picture.food6, shape.blank)
/ itemprobabilities = (.0166666666667, .0166666666667, .0166666666667, .0166666666667, .0166666666667, .0166666666667, .0166666666667, .0166666666667, .0166666666667, .0166666666667, .0166666666667, .0166666666667,.80)
/ poolsize = 60
</list>

This still works fine but I don't want to record each image individually. So I want to record the trials where nature1, 2, 3, 4, 5 and 6 are presented as a combined group I.e. Just an overall Nature category. The same for food. Is there a way of combining these for the data recording?

I thought it might work to have a second superordinate list but i can't get that to work either. I've copied what I tried below...

<list nature>
/ items = (picture.nature1, picture.nature2, picture.nature3, picture.nature4, picture.nature5, picture.nature6)
/ itemprobabilities = (.166666666667, .166666666667, .166666666667, .166666666667, .166666666667, .166666666667)
/ poolsize = 6
</list>

<list food>
/ items = (picture.food1, picture.food2, picture.food3, picture.food4, picture.food5, picture.food6)
/ itemprobabilities = (.166666666667, .166666666667, .166666666667, .166666666667, .166666666667, .166666666667)
/ poolsize = 6
</list>

<list Lowdistractor>
/ items = (list.food, list.nature, shape.blank)
/ itemprobabilities = (.10, .10, .80)
/ poolsize = 60
</list>

Any ideas would be greatly appreciated! 
Thanks,
Jenny




It seems to me that you should be able to determine the category from the list item selected, store that in a value and then log that value to the data file. In essence:

<list lowdistractor>
/ items = (text.nature1, text.nature2, text.food1, text.food2)
/ itemprobabilities = (0.1, 0.1, 0.4, 0.4)
/ poolsize = 10
</list>

<trial mytrial>
/ ontrialbegin = [
    trial.mytrial.insertstimulusframe(list.lowdistractor.nextvalue, 1)
]
/ ontrialbegin = [
    if (contains(list.lowdistractor.currentvalue, "nature")) values.category = "nature";
    else if (contains(list.lowdistractor.currentvalue, "food")) values.category = "food";
    else values.category = "blank";
]

/ validresponse = (57)
</trial>

<block myblock>
/ trials = [1-10 = mytrial]
</block>

<text nature1>
/ items = ("n1")
/ size = (10%,10%)
</text>

<text nature2>
/ items = ("n2")
/ size = (10%,10%)
</text>

<text food1>
/ items = ("f1")
/ size = (10%,10%)
</text>

<text food2>
/ items = ("f2")
/ size = (10%,10%)
</text>

<values>
/ category = ""
</values>


<data>
/ columns = [
    subject trialnum trialcode list.lowdistractor.currentvalue values.category
]
/ separatefiles = true
</data>


Thank you so much!