including multiple stimuli in a trial


Author
Message
charlottebooth
charlottebooth
Guru (5.2K reputation)Guru (5.2K reputation)Guru (5.2K reputation)Guru (5.2K reputation)Guru (5.2K reputation)Guru (5.2K reputation)Guru (5.2K reputation)Guru (5.2K reputation)Guru (5.2K reputation)
Group: Forum Members
Posts: 45, Visits: 249
Thankyou! This is amazing help :)
charlottebooth
charlottebooth
Guru (5.2K reputation)Guru (5.2K reputation)Guru (5.2K reputation)Guru (5.2K reputation)Guru (5.2K reputation)Guru (5.2K reputation)Guru (5.2K reputation)Guru (5.2K reputation)Guru (5.2K reputation)
Group: Forum Members
Posts: 45, Visits: 249
Thank you so much!
Dave
Dave
Supreme Being (1M reputation)Supreme Being (1M reputation)Supreme Being (1M reputation)Supreme Being (1M reputation)Supreme Being (1M reputation)Supreme Being (1M reputation)Supreme Being (1M reputation)Supreme Being (1M reputation)Supreme Being (1M reputation)
Group: Administrators
Posts: 13K, Visits: 104K
Let's go back to the example code at the end of my previous reply. Now, suppose you want to randomly jitter each x and y position in steps of 1% to dislocate the stimulus by either 1, 2 or 3% from its nominal x and y coordinates (I'm choosing deliberately large values such that the result is obvious on screen). Then you do:

<values>
/ type1pos = 0
/ type1x = 0
/ type1y = 0
/ type2apos = 0
/ type2ax = 0
/ type2ay = 0
/ type2bpos = 0
/ type2bx = 0
/ type2by = 0
/ type2cpos = 0
/ type2cx = 0
/ type2cy = 0
/ jitterstep = 1%
</values>

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

<trial mytrial>
/ ontrialbegin = [values.type1pos=counter.type1positions.selectedvalue;
    values.type1x=counter.type1xpos.selectedvalue;
    values.type1y=counter.type1ypos.selectedvalue;

    values.type1x+=values.jitterstep*counter.randomjitter.selectedvalue;
    values.type1y+=values.jitterstep*counter.randomjitter.selectedvalue;


    values.type2apos=counter.type2positions.selectedvalue;
    values.type2ax=counter.type2xpos.selectedvalue;
    values.type2ay=counter.type2ypos.selectedvalue;

    values.type2ax+=values.jitterstep*counter.randomjitter.selectedvalue;
    values.type2ay+=values.jitterstep*counter.randomjitter.selectedvalue;


    values.type2bpos=counter.type2positions.selectedvalue;
    values.type2bx=counter.type2xpos.selectedvalue;
    values.type2by=counter.type2ypos.selectedvalue;

    values.type2bx+=values.jitterstep*counter.randomjitter.selectedvalue;
    values.type2by+=values.jitterstep*counter.randomjitter.selectedvalue;


    values.type2cpos=counter.type2positions.selectedvalue;
    values.type2cx=counter.type2xpos.selectedvalue;
    values.type2cy=counter.type2ypos.selectedvalue;

    values.type2cx+=values.jitterstep*counter.randomjitter.selectedvalue;
    values.type2cy+=values.jitterstep*counter.randomjitter.selectedvalue;

    ]
/ pretrialpause = 500
/ stimulusframes =  [1=type1,type2a,type2b,type2c]
/ validresponse = (57)
/ ontrialend = [reset(counter.type2positions)]
</trial>

<text type1>
/ items = ("Type 1")
/ hposition = values.type1x
/ vposition = values.type1y
</text>

<text type2a>
/ items = ("Type 2a")
/ hposition = values.type2ax
/ vposition = values.type2ay
</text>

<text type2b>
/ items = ("Type 2b")
/ hposition = values.type2bx
/ vposition = values.type2by
</text>

<text type2c>
/ items = ("Type 2c")
/ hposition = values.type2cx
/ vposition = values.type2cy
</text>

<counter type1positions>
/ items = (1,2,3,4)
/ select = noreplace
/ selectionrate = trial
</counter>

<counter type1xpos>
/ items = (25%, 25%, 75%, 75%)
/ select = current(type1positions)
</counter>

<counter type1ypos>
/ items = (25%, 75%, 25%, 75%)
/ select = current(type1positions)
</counter>

<counter type2positions>
/ items = (1,2,3,4)
/ select = noreplace
/ not = (type1positions)
/ selectionrate = always
</counter>

<counter type2xpos>
/ items = (25%, 25%, 75%, 75%)
/ select = current(type2positions)
/ selectionrate = always
</counter>

<counter type2ypos>
/ items = (25%, 75%, 25%, 75%)
/ select = current(type2positions)
/ selectionrate = always
</counter>

<counter randomjitter>
/ items = (-3,-2,-1, 1, 2, 3)
/ selectionrate = always
/ select = replace
</counter>



charlottebooth
charlottebooth
Guru (5.2K reputation)Guru (5.2K reputation)Guru (5.2K reputation)Guru (5.2K reputation)Guru (5.2K reputation)Guru (5.2K reputation)Guru (5.2K reputation)Guru (5.2K reputation)Guru (5.2K reputation)
Group: Forum Members
Posts: 45, Visits: 249
Oh great! How exactly would you do this? I have now made all of the values for each target/distractor location! :)
Dave
Dave
Supreme Being (1M reputation)Supreme Being (1M reputation)Supreme Being (1M reputation)Supreme Being (1M reputation)Supreme Being (1M reputation)Supreme Being (1M reputation)Supreme Being (1M reputation)Supreme Being (1M reputation)Supreme Being (1M reputation)
Group: Administrators
Posts: 13K, Visits: 104K
> could you suggest the simplest solution for creating a random slight flicker?

I'm not sure what you mean by "flicker". If you actually mean "jitter", look at the code in my previous reply. You have all the coordinates stored in separate variables (<values> entries). Those values are populated /ontrialbegin. To introduce position jitter for each element, you can add or subtract a small, random amount from the respective x and y coordinate values.

charlottebooth
charlottebooth
Guru (5.2K reputation)Guru (5.2K reputation)Guru (5.2K reputation)Guru (5.2K reputation)Guru (5.2K reputation)Guru (5.2K reputation)Guru (5.2K reputation)Guru (5.2K reputation)Guru (5.2K reputation)
Group: Forum Members
Posts: 45, Visits: 249

Hi Dave, thanks again for your great advice.
I think I have followed your instructions here by changing the x coordinates slightly (see below). The program still runs correctly. If this is correct could you suggest the simplest solution for creating a random slight flicker?

<counter targetxpos>
/ items = (29%, 29.0000001%, 29.000001%, 29.00001%, 29.0001%, 29.001%, 35%, 35.0000001%, 35.000001%, 35.00001%, 35.0001%, 35.001%, 41%, 41.0000001%, 41.000001%, 41.00001%, 41.0001%, 41.001%, 47%, 47.0000001%, 47.000001%, 47.00001%, 47.0001%, 47.001%, 53%, 53.0000001%, 53.000001%, 53.00001%, 53.0001%, 53.001%, 59%, 59.0000001%, 59.000001%, 59.00001%, 59.0001%, 59.001%, 65%, 65.0000001%, 65.000001%, 65.00001%, 65.0001%, 65.001%, 71%, 71.0000001%, 71.000001%, 71.00001%, 71.0001%, 71.001%)
/ select = noreplace
/selectionrate = trial
</counter>

<counter targetypos>
/ items = (35%, 41%, 47%, 53%, 59%, 65%, 35%, 41%, 47%, 53%, 59%, 65%, 35%, 41%, 47%, 53%, 59%, 65%, 35%, 41%, 47%, 53%, 59%, 65%, 35%, 41%, 47%, 53%, 59%, 65%, 35%, 41%, 47%, 53%, 59%, 65%, 35%, 41%, 47%, 53%, 59%, 65%, 35%, 41%, 47%, 53%, 59%, 65%)
/ select = current(targetxpos)
</counter>


Dave
Dave
Supreme Being (1M reputation)Supreme Being (1M reputation)Supreme Being (1M reputation)Supreme Being (1M reputation)Supreme Being (1M reputation)Supreme Being (1M reputation)Supreme Being (1M reputation)Supreme Being (1M reputation)Supreme Being (1M reputation)
Group: Administrators
Posts: 13K, Visits: 104K
Again, several issues here. First, you need to introduce some way for Inquisit to be able to distinguish between the various positions that *share the same x* coordinate. If you look back at the example linked in the previous reply, you'll notice that it does this by introducing a slight difference in the fractional part [1].

<counter type1xpos>
/ items = (25.0000%, 25.0001%, 75.0000%, 75.0001%)
/ select = noreplace
/ selectionrate = trial
</counter>

<counter type1ypos>
/ items = (25.0000%, 75.0000%, 25.0000%, 75.0000%)
/ select = current(type1xpos)
</counter>

<counter type2xpos>
/ items = (25.0000%, 25.0001%, 75.0000%, 75.0001%)
/ select = noreplace
/ not = (type1xpos)
/ selectionrate = always
</counter>

<counter type2ypos>
/ items = (25.0000%, 75.0000%, 25.0000%, 75.0000%)
/ select = current(type2xpos)
</counter>

This ensures that the script "knows" that the two 25s and two 75s in fact indicate different positions and only one of those two positions (the one selected for the target; type1) is blocked from being selected for the distractors (type2).

You also need to make sure to *reset* the distractor counter after each trial, again as in the previous example:

<trial mytrial>
/ pretrialpause = 500
/ stimulusframes =  [1=type1,type2a,type2b,type2c]
/ validresponse = (57)
/ ontrialend = [reset(counter.type2xpos)]
</trial>

Otherwise the counter will run out of item in the midst of some trial, reset (because it doesn't have any items left) and then the same positions can be selected again. I.e., one stimulus will obscure another stimulus because both share the same position.

Work that out first, then deal with the jitter. Hope this helps.

[1] There are other ways to do this. You can abstract from the concrete coordinates by doing something like this:

<values>
/ type1pos = 0
/ type1x = 0
/ type1y = 0
/ type2apos = 0
/ type2ax = 0
/ type2ay = 0
/ type2bpos = 0
/ type2bx = 0
/ type2by = 0
/ type2cpos = 0
/ type2cx = 0
/ type2cy = 0
</values>

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

<trial mytrial>
/ ontrialbegin = [values.type1pos=counter.type1positions.selectedvalue;
    values.type1x=counter.type1xpos.selectedvalue;
    values.type1y=counter.type1ypos.selectedvalue;

    values.type2apos=counter.type2positions.selectedvalue;
    values.type2ax=counter.type2xpos.selectedvalue;
    values.type2ay=counter.type2ypos.selectedvalue;

    values.type2bpos=counter.type2positions.selectedvalue;
    values.type2bx=counter.type2xpos.selectedvalue;
    values.type2by=counter.type2ypos.selectedvalue;

    values.type2cpos=counter.type2positions.selectedvalue;
    values.type2cx=counter.type2xpos.selectedvalue;
    values.type2cy=counter.type2ypos.selectedvalue;
    ]
/ pretrialpause = 500
/ stimulusframes =  [1=type1,type2a,type2b,type2c]
/ validresponse = (57)
/ ontrialend = [reset(counter.type2positions)]
</trial>

<text type1>
/ items = ("Type 1")
/ hposition = values.type1x
/ vposition = values.type1y
</text>

<text type2a>
/ items = ("Type 2a")
/ hposition = values.type2ax
/ vposition = values.type2ay
</text>

<text type2b>
/ items = ("Type 2b")
/ hposition = values.type2bx
/ vposition = values.type2by
</text>

<text type2c>
/ items = ("Type 2c")
/ hposition = values.type2cx
/ vposition = values.type2cy
</text>

<counter type1positions>
/ items = (1,2,3,4)
/ select = noreplace
/ selectionrate = trial
</counter>

<counter type1xpos>
/ items = (25%, 25%, 75%, 75%)
/ select = current(type1positions)
</counter>

<counter type1ypos>
/ items = (25%, 75%, 25%, 75%)
/ select = current(type1positions)
</counter>

<counter type2positions>
/ items = (1,2,3,4)
/ select = noreplace
/ not = (type1positions)
/ selectionrate = always
</counter>

<counter type2xpos>
/ items = (25%, 25%, 75%, 75%)
/ select = current(type2positions)
/ selectionrate = always
</counter>

<counter type2ypos>
/ items = (25%, 75%, 25%, 75%)
/ select = current(type2positions)
/ selectionrate = always
</counter>




Edited 9 Years Ago by Dave
charlottebooth
charlottebooth
Guru (5.2K reputation)Guru (5.2K reputation)Guru (5.2K reputation)Guru (5.2K reputation)Guru (5.2K reputation)Guru (5.2K reputation)Guru (5.2K reputation)Guru (5.2K reputation)Guru (5.2K reputation)
Group: Forum Members
Posts: 45, Visits: 249
Thanks Dave that's extremely helpful.

With regard to point (2) about the positions. I get it now that for an 8x6 grid I need to enter every coordinate for the x/y positions. So, I have 48 /items for each <counter> (see below).

<counter targetxpos>
/ items = (29%, 29%, 29%, 29%, 29%, 29%, 35%, 35%, 35%, 35%, 35%, 35%, 41%, 41%, 41%, 41%, 41%, 41%, 47%, 47%, 47%, 47%, 47%, 47%, 53%, 53%, 53%, 53%, 53%, 53%, 59%, 59%, 59%, 59%, 59%, 59%, 65%, 65%, 65%, 65%, 65%, 65%, 71%, 71%, 71%, 71%, 71%, 71%)
/ select = noreplace
/selectionrate = trial
</counter>

<counter targetypos>
/ items = (35%, 41%, 47%, 53%, 59%, 65%, 35%, 41%, 47%, 53%, 59%, 65%, 35%, 41%, 47%, 53%, 59%, 65%, 35%, 41%, 47%, 53%, 59%, 65%, 35%, 41%, 47%, 53%, 59%, 65%, 35%, 41%, 47%, 53%, 59%, 65%, 35%, 41%, 47%, 53%, 59%, 65%, 35%, 41%, 47%, 53%, 59%, 65%)
/ select = current(targetxpos)
</counter>


However, I also want to "jitter" the positions slightly by a small fraction, e.g. 0.2%. I have tried entering another 48 items after the ones shown above (e.g. 29.2%, 29.2%).
This does work, however in some trials some pictures are missing. I am supposed to always have 13 pictures shown, but by trying to create this "jitter" I only have between 11-13 pictures.
I don't understand why some are missing! Any ideas?

Thanks,
Charlotte :) 

Dave
Dave
Supreme Being (1M reputation)Supreme Being (1M reputation)Supreme Being (1M reputation)Supreme Being (1M reputation)Supreme Being (1M reputation)Supreme Being (1M reputation)Supreme Being (1M reputation)Supreme Being (1M reputation)Supreme Being (1M reputation)
Group: Administrators
Posts: 13K, Visits: 104K
Several issues here:

(1) The distractor position <counter>s are not set to the correct /selectionrate. It needs to be *always* as in the previous examples we discussed, because you want to sample *multiple* values from that counter per trial, not just one.

(2) The positions don't make sense -- that's true for both the target and distractor <counter>s

<counter distractorxpos>
/ items = (40%, 50%, 60%)
/ not = (targetxpos)
/ select = noreplace
</counter>

<counter distractorypos>
/items = (40%, 50%, 60%)
/select = current(distractorxpos)
</counter>

defines *3* positions as x/y coordinate pairs; the three pairs are 40%/40%, 50%/50% and 60%/60%. You have 5 objects (1 target, 4 distractors) so you need at least 5 positions. Moreover, *one* of the three positions as taken up by the target, so there are only *two* left for 4 distractors.

Please take another look at https://www.millisecond.com/forums/FindPost10182.aspx which illiustrates how to handle two dimensions. Also: Don't move too fast. First get it to work in *one* dimension. Only then move up to two.


charlottebooth
charlottebooth
Guru (5.2K reputation)Guru (5.2K reputation)Guru (5.2K reputation)Guru (5.2K reputation)Guru (5.2K reputation)Guru (5.2K reputation)Guru (5.2K reputation)Guru (5.2K reputation)Guru (5.2K reputation)
Group: Forum Members
Posts: 45, Visits: 249

Thanks! I have changed it now, but I'm having the same problem - I have changed the script now though to include x/y coordinates - might it be something to do with that?


<picture targets>
/items = ("T_90.jpg", "T_270.jpg")
/select = noreplace
/vposition = counter.targetypos.selectedvalue
/hposition = counter.targetxpos.selectedvalue
</picture>

<picture distractor1>
/items = ("L_90.jpg", "L_270.jpg", "L_0.jpg", "L_180.jpg")
/select = noreplace
/vposition = counter.distractorypos.selectedvalue
/hposition = counter.distractorxpos.selectedvalue
</picture>

<picture distractor2>
/items = ("L_90.jpg", "L_270.jpg", "L_0.jpg", "L_180.jpg")
/select = noreplace
/vposition = counter.distractorypos.selectedvalue
/hposition = counter.distractorxpos.selectedvalue
</picture>

<picture distractor3>
/items = ("L_90.jpg", "L_270.jpg", "L_0.jpg", "L_180.jpg")
/select = noreplace
/vposition = counter.distractorypos.selectedvalue
/hposition = counter.distractorxpos.selectedvalue
</picture>


<picture distractor4>
/items = ("L_90.jpg", "L_270.jpg", "L_0.jpg", "L_180.jpg")
/select = noreplace
/vposition = counter.distractorypos.selectedvalue
/hposition = counter.distractorxpos.selectedvalue
</picture>


<counter targetxpos>
/ items = (40%, 50%, 60%)
/ select = noreplace
/selectionrate = trial
</counter>

<counter targetypos>
/ items = (40%, 50%, 60%)
/ select = current(targetxpos)
</counter>

<counter distractorxpos>
/ items = (40%, 50%, 60%)
/ not = (targetxpos)
/ select = noreplace
</counter>

<counter distractorypos>
/items = (40%, 50%, 60%)
/select = current(distractorxpos)
</counter>



<trial mytrial>
/ stimulusframes = [1=targets,distractor1,distractor2,distractor3,distractor4]
/ validresponse = (anyresponse)
/ ontrialend = [reset(counter.distractorxpos)]
</trial>

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



GO

Merge Selected

Merge into selected topic...



Merge into merge target...



Merge into a specific topic ID...




Reading This Topic

Explore
Messages
Mentions
Search