Still on the RSVP task...


Author
Message
KO
KO
KO
posted 9 Years Ago HOT
Esteemed Member (2.5K reputation)Esteemed Member (2.5K reputation)Esteemed Member (2.5K reputation)Esteemed Member (2.5K reputation)Esteemed Member (2.5K reputation)Esteemed Member (2.5K reputation)Esteemed Member (2.5K reputation)Esteemed Member (2.5K reputation)Esteemed Member (2.5K reputation)
Group: Forum Members
Posts: 18, Visits: 107
Hi Dave,

Thanks for your last post to me previous. As a consequence, as per your suggestion in your last post to me I am coming to you for help with a new question/problem with regard to my RSVP task. :-)

As I said in my previous post, the task as I've set it up works really well. The latest difficulty is that I want it to do something beyond what its been doing, specifically with one of my two word lists within the main task. So what I want it to now/next be able to do is to do with the lags. Because that one word list is really made up of four different word lists, I'm not entirely sure about how to set things up/change the set up such that I can have a certain amount of different lags in each of the four different word lists that are currently making up the one word list.

My thinking is that perhaps this is at least in part about using more <text> sections, maybe as in going from having the one: <text target2>  
to having four:   <text target2_1>
                       <text target2_2>
                       <text target2_3>
                       <text target2_4>
each with its own list of words. The difficulty with this seems to me that then maybe I'm also going to have to use branching somehow so as to move from between the different target 2 word lists? Is that right?
Another issue then is that if it is in fact possible to do it this way then what I'm going to be necessarily doing is going from one word list to the next etc. in succession, whereas my preference is there any way of getting the task to still select at random a word from a different word list - since it's only really the lags that I want greater control over. (But that said, I would still prefer that that the word taken from within a given category of those four categories at any given time is not in a sense designated to a particular type of lag, but instead which lag goes with a given word within the category is randomized - with a certain number of lags allowed for each of the four categories.)

I hope this makes sense. I can try to explain in greater detail if you would like me to, I'm just not certain about how to do that at this moment...

Anyway, I'm hoping that you might help with this and am also hoping that perhaps your ideas are less fiddly than the way I was imagining how I can perhaps potentially put together this version of the task. :-)

And finally, thanks again for your previous help - and nice comments in response to my last post. 


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
Here's what I would do:

- Pair your wordlists with the desired lags similar to what is already the case in the original script. For the sake of example, suppose you have 4 wordlists (1-4) and 3 lag levels (2,4,6), and you want each lag level to occur in each wordlist once (i.e., 4x3 combinations:

<values>
/ wordlist = 0
/ lag = 0
/ listitem = 0
</values>

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

<trial mytrial>
/ ontrialbegin = [values.wordlist=list.wordlist.nextvalue; values.lag=list.lag.nextvalue; ]
/ stimulusframes = [1=mytext]
/ validresponse = (57)
</trial>

<text mytext>
/ items = ("List: <%values.wordlist%> | Lag: <%values.lag%>")
</text>

<list wordlist>
/ items = (1,2,3,4,1,2,3,4,1,2,3,4)
</list>

<list lag>
/ items = (2,2,2,2,4,4,4,4,6,6,6,6)
/ selectionmode = list.wordlist.currentindex
</list>

- Then select your *items* in the subsequent trials based on the value of values.wordlist. To do this set up further lists that hold the item numbers for the items on a given list, e.g.

<list wordlist1items>
/ items = (1,2,3)
</list>

<list wordlist2items>
/ items = (4,5,6)
</list>

<list wordlist3items>
/ items = (7,8,9)
</list>

<item worditems>
/ 1 = "wordlist 1 item 1"
/ 2 = "wordlist 1 item 2"
/ 3 = "wordlist 1 item 3"

/ 4 = "wordlist 2 item 1"
/ 5 = "wordlist 2 item 2"
/ 6 = "wordlist 2 item 3"

/ 7 = "wordlist 3 item 1"
/ 8 = "wordlist 3 item 2"
/ 9 = "wordlist 3 item 3"
</item>

- Sample from the applicable list in your RSVP-stream trials. I.e,

<trial rsvp>
/ ontrialbegin = [if (values.wordlist==1) values.mystimulus = list.wordlist1items.nextvalue; ]
/ ontrialbegin = [if (values.wordlist==2) values.mystimulus = list.wordlist2items.nextvalue; ]
...
/ stimulusframes = [1=stimulus]
</trial>

<text stimulus>
/ items = worditems
/ select = values.mystimulus
...
</text>

KO
KO
Esteemed Member (2.5K reputation)Esteemed Member (2.5K reputation)Esteemed Member (2.5K reputation)Esteemed Member (2.5K reputation)Esteemed Member (2.5K reputation)Esteemed Member (2.5K reputation)Esteemed Member (2.5K reputation)Esteemed Member (2.5K reputation)Esteemed Member (2.5K reputation)
Group: Forum Members
Posts: 18, Visits: 107
Hi Dave,

Thank you very much for all that information. I've been working through it today and have gotten pretty close to getting the modified task set up. I think there's just a bit of a clash happening between bits of the new script and old script at the moment, so I'm currently figuring that out, but once I've either figured that out - or figured out that I definitely can't figure that out without further help - I'll post a proper reply.

In the meantime though, thanks again! :-)

KO
KO
Esteemed Member (2.5K reputation)Esteemed Member (2.5K reputation)Esteemed Member (2.5K reputation)Esteemed Member (2.5K reputation)Esteemed Member (2.5K reputation)Esteemed Member (2.5K reputation)Esteemed Member (2.5K reputation)Esteemed Member (2.5K reputation)Esteemed Member (2.5K reputation)
Group: Forum Members
Posts: 18, Visits: 107
Hi Dave,

So, I have definitely run into a problem at this point. I'll describe what the program is doing first and then I'll include what I hope to be the relevant script.

The script is running the task - a good start - however - the issue I'm now having is that only one word is ever shown from the Target2 word lists - this list being the one that is affected by the changes made to lag. The word that keeps showing is the very first word on the list. My thinking has been that perhaps this is something to do with the conditional statements in one of the main trial sections, but looking at them, I can't really see any issues with them, perhaps you can?
The other thing that seems to be a problem (though is less of a problem in the scheme of things) is that a bit of the additional coding that you had written script for seems to be acting on its own in a sense - with saying the number of lags and something else at the end of the script. I think that's the text.mytext part which I'm not entirely sure of the function of in a general sense in fact... I have tried to put in into one of the other trial sections and take out the text bit thinking that might help, but when I do that I seem to run into other problems with how the script runs, so I'm just going to leave it in its current form for you to look at with the other trial sections.

So these are the trial sections where I think the problem might be coming from:

 <trial mytrial>
/ ontrialbegin = [values.wordlist=list.wordlist.nextvalue; values.t1position=values.t2lag=list.lag.nextvalue; ]
/ stimulusframes = [1=mytext]
/ validresponse = (57)
/ branch = [trial.starttrial]
</trial>


<trial starttrial>
/ ontrialbegin = [values.trialnumber += 1; values.currentposition = 0; values.streamstring = ""; values.t1item = ""; values.t2item = "";
        text.distractor.resetselection();]
/ ontrialbegin = [values.t2position = values.t1position + values.t2lag]
/ stimulusframes = [1=fixation]
/ trialduration = 2000
/ posttrialpause = 250
/ validresponse = (noresponse)
/ recorddata = false
/ branch = [trial.distractortrial]
</trial>


<trial distractortrial>
/ ontrialbegin = [values.currentposition += 1]
/ontrialbegin = [values.t1position==values.currentposition+1 || values.t2position==values.currentposition+1]
/ ontrialend = [values.streamstring = concat(values.streamstring, text.distractor.currentitem)]
/ stimulusframes = [1=distractor]
/ trialduration = 100
/ posttrialpause = 100
/ validresponse = (noresponse)
/ recorddata = false
/ branch = [if (values.currentposition >= values.streamlength) openended.responsetrial]
/ branch = [if (values.t1position == values.currentposition +1) trial.target1trial
                else if (values.t2position == values.currentposition +1) trial.target2trial
                else trial.distractortrial]
</trial>



<trial target1trial>
/ ontrialbegin = [values.currentposition += 1]
/ ontrialend = [values.streamstring = concat(values.streamstring, text.target1.currentitem)]
/ stimulusframes = [1=target1]
/ trialduration = 600
/ posttrialpause = 100
/ validresponse = (noresponse)
/ recorddata = false
/ branch = [if(values.t2position==values.currentposition+1)
    trial.target2trial else trial.distractortrial]
</trial>


<trial target2trial>
/ ontrialbegin = [values.currentposition += 1]
/ ontrialbegin = [if (values.wordlist==2) values.t2lag = list.wordlist1items.nextvalue; ]
/ ontrialbegin = [if (values.wordlist==3) values.t2lag = list.wordlist2items.nextvalue; ]
/ ontrialbegin = [if (values.wordlist==4) values.t2lag = list.wordlist3items.nextvalue; ]
/ ontrialbegin = [if (values.wordlist==5) values.t2lag = list.wordlist4items.nextvalue; ]
/ ontrialend = [values.streamstring = concat(values.streamstring, text.target2.currentitem)]
/ stimulusframes = [1=target2]
/ trialduration = 600
/ posttrialpause = 100
/ validresponse = (noresponse)
/ recorddata = false
/ branch = [trial.distractortrial]
</trial>

( In the above script, I've deliberately slowed down the timing for targets 1 and 2 to check that they are showing up. I did try to use the debugging that you'd set up previously, but targets one and two weren't registering there for some reason. Also, I'm describing the word groups as 2, 3, 4 and 5 because I wasn't sure whether designating one of them as 1 would interfere with some of the other coding - such as:
/ ontrialbegin = [values.currentposition += 1] )



Here are some other changes that I've made major changes on the basis of your previous example:

So here I have 4 t1positions, 4 lags, and 4 word lists, with 64 trials in total

<list t1positionlist>
/ items = (3,4,5,6,3,4,5,6,3,4,5,6,3,4,5,6,
          3,4,5,6,3,4,5,6,3,4,5,6,3,4,5,6,
          3,4,5,6,3,4,5,6,3,4,5,6,3,4,5,6,
          3,4,5,6,3,4,5,6,3,4,5,6,3,4,5,6)
/ selectionmode = random
/ replace = false
</list>


<list wordlist>
/ items = (2,3,4,5,2,3,4,5,2,3,4,5,2,3,4,5,
           2,3,4,5,2,3,4,5,2,3,4,5,2,3,4,5,
           2,3,4,5,2,3,4,5,2,3,4,5,2,3,4,5,
           2,3,4,5,2,3,4,5,2,3,4,5,2,3,4,5)
/ replace = false
</list>

<list lag>
/ items = (1,1,1,1,2,2,2,2,3,3,3,3,8,8,8,8,
           1,1,1,1,2,2,2,2,3,3,3,3,8,8,8,8,
           1,1,1,1,2,2,2,2,3,3,3,3,8,8,8,8,
           1,1,1,1,2,2,2,2,3,3,3,3,8,8,8,8)
/ selectionmode = list.wordlist.currentindex
</list>

<text target2>
/ items = worditems
/ select = values.t2lag
/ select = noreplace
/ fontstyle = ("Verdana", 5%, true)
/ color = red
/txbgcolor = (black)
</text>

<list wordlist1items>
/ items = (1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16)
</list>

<list wordlist2items>
/ items = (17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32)
</list>

<list wordlist3items>
/ items = (33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48)
</list>

<list wordlist4items>
/items = (49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64)
</list>


<text mytext>
/ items = ("List: <%values.wordlist%> | Lag: <%values.t2lag%>")
</text>


If you would like, I could also email you the whole script, I just think at this stage it's fairly likely that the problem is in one or more than one of these areas.

Anyway, I'm really hoping that you can tell me what bits/which bits here are continuing to mess up the program from running as it's intended to.
I would very much appreciate the help. :-)



KO
KO
Esteemed Member (2.5K reputation)Esteemed Member (2.5K reputation)Esteemed Member (2.5K reputation)Esteemed Member (2.5K reputation)Esteemed Member (2.5K reputation)Esteemed Member (2.5K reputation)Esteemed Member (2.5K reputation)Esteemed Member (2.5K reputation)Esteemed Member (2.5K reputation)
Group: Forum Members
Posts: 18, Visits: 107
Hi again,

I thought I'd maybe include the one possibility that had occurred to me as to what text.mytext thing might be for is to act like the debugging in giving you the information so that you can make sure that the lags are consistent across the different word types? Is that right?

Anyway,
Hope to hear from you particularly with regard to how to sort out the main issue.  :-)

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
The code I provided in my previous reply -- specifically the text.mytext / trial.mytrial thing -- was solely supposed to illustrate how to pair things and that you end up with the desired pairings across lists if you run it.

You do not need that specific <trial> or <text> element in your script. You need the corresponding *logic*. I.e., in your "start" trial that initiates / sets up each RSVP stream, you ought to pick the parameters for the subsequent "round" / the following RSVP stream: (1) Which wordlist are you going to sample from for that stream? (2) Which lags to apply to that stream. Then proceed as usual.

As far as I can see from your posted code snippets, you only sample from the different word lists in your two "target" trials. You don't do so in your "distractor" trials. Whether that is intended or not, I do not know.

Further, I don't see where in your code you actually determine the respective target positions within the RSVP stream. (values.t1position, values.t2position). The statement

 <trial mytrial>
/ ontrialbegin = [values.wordlist=list.wordlist.nextvalue; values.t1position=values.t2lag=list.lag.nextvalue; ]
...
</trial>

is invalid syntax. Also, why should values.t1position be equal to values.t2lag? This doesn't make sense to me. Finally, it's unclear whether those statements ever get executed at all, since there is no indication you actually ever *run* <trial mytrial>.

Looking at

<trial target2trial>
/ ontrialbegin = [values.currentposition += 1]
/ ontrialbegin = [if (values.wordlist==2) values.t2lag = list.wordlist1items.nextvalue; ]
/ ontrialbegin = [if (values.wordlist==3) values.t2lag = list.wordlist2items.nextvalue; ]
/ ontrialbegin = [if (values.wordlist==4) values.t2lag = list.wordlist3items.nextvalue; ]
/ ontrialbegin = [if (values.wordlist==5) values.t2lag = list.wordlist4items.nextvalue; ]
...
</trial>

You set values.t2lag to an *item number* from one of the 4 word lists. That also seems wrong to me. Isn't values.t2lag supposed to indicate target2's position within the RSVP stream *relative* to target1's position within the stream?

It may be a good idea to take a step back and re-examine your previous RSVP script. It seems to me that there are a couple of misconceptions left about what the various variables represent / how the script actually works.

If you have trouble making sense of any particular part, I'll happily try to explain.

KO
KO
Esteemed Member (2.5K reputation)Esteemed Member (2.5K reputation)Esteemed Member (2.5K reputation)Esteemed Member (2.5K reputation)Esteemed Member (2.5K reputation)Esteemed Member (2.5K reputation)Esteemed Member (2.5K reputation)Esteemed Member (2.5K reputation)Esteemed Member (2.5K reputation)
Group: Forum Members
Posts: 18, Visits: 107
Hi Dave,

Thanks for your previous post. I wish I could say that the problem is solved, but as yet it is not. I have been working on trying to take a step back to look at my RSVP script today. So I think I understood some aspects of things a little better - but I'm find it difficult to know what to ask about because I guess in a sense I don't know what I don't know.

Before I get to any questions I'll give a bit of an overview of what I was intending the script to do - since I'm not sure I was clear on that in my previous post/s.
I have a separate word list (just the one word list that is) that's in the text section that's for the distractor words :  <text distractor> with all the distractor words in that. And there the words are set up like so:
<text distractor>
/ items = ("word1", "word2", "word3" etc.)
It seems to run fine, so I'm not clear on what you meant in what you said previously.

I have another separate word list (again just the one word list) that is in the text section that's for the target 1 words:  <text target1> which also seems to run fine. It is also set up in the same way.
Then the final word list is comprised of four categories of words which I set up as far as I can tell, the way that you suggested that I should do.

<item worditems>
/ 1 = "word1"
/ 2 = "word2"
(down to 16)

and then the second category of words starts at 17
/ 17 = "word17"
and then I have my two categories of words starting at /33 and /49 of the items respectively. And of course then I also still have a text section with this, which now does not involve trying to make T2lag do more than the function that it already does - my mistake - so I've called it the name that you previously did previously to separate out its function.

<text target2>
/ items = worditems
/ select = values.mystimulus
/select =
/ select = noreplace
/ fontstyle = ("Verdana", 5%, true)
/ color = red
/txbgcolor = (black)
</text>

So now my target2 trial section looks like this:

<trial target2trial>
/ ontrialbegin = [values.currentposition += 1]
/ ontrialbegin = [if (values.wordlist==1) values.mystimulus = list.wordlist1items.nextvalue; ]
/ ontrialbegin = [if (values.wordlist==2) values.mystimulus = list.wordlist2items.nextvalue; ]
/ ontrialbegin = [if (values.wordlist==3) values.mystimulus = list.wordlist3items.nextvalue; ]
/ ontrialbegin = [if (values.wordlist==4) values.mystimulus = list.wordlist4items.nextvalue; ]
/ ontrialend = [values.streamstring = concat(values.streamstring, text.target2.currentitem)]
/ stimulusframes = [1=target2]
/ trialduration = 600
/ posttrialpause = 100
/ validresponse = (noresponse)
/ recorddata = false
/ branch = [trial.distractortrial]
</trial>

Nevertheless, the first target2 word has continued to keep repeating. I still think that maybe I'm missing something from this particular trial, maybe some sort of conditional statement that would make it actually move from the first word to other target 2 words. I gather from what you were saying in your last post that you think so too - where you said that I ought to pick the parameters for the subsequent "round" / the following RSVP stream: (1) Which wordlist are you going to sample from for that stream? (2) Which lags to apply to that stream etc. Although I guess you could also be talking about a broader problem?

I've wondered too if perhaps there should be direct reference to my lists in here - the ones that govern t1position and t2lag but when I put them in - as below - target2 completely stopped appearing. I'm not clear on why. Maybe I'm not linking the right things to each other, as you mentioned in your previous post?

<trial starttrial>
/ ontrialbegin = [values.trialnumber += 1; values.currentposition = 0; values.mystimulus = ""; values.streamstring = ""; values.t1item = ""; values.t2item = "";
        text.distractor.resetselection();]
/ontrialbegin = [values.t1position = list.t1positionlist.nextvalue; values.t2lag = list.t2laglist.nextvalue]
/ ontrialbegin = [values.t2position = values.t1position + values.t2lag]
/ stimulusframes = [1=fixation]
/ trialduration = 2000
/ posttrialpause = 250
/ validresponse = (noresponse)
/ recorddata = false
/ branch = [trial.distractortrial]
</trial>

Anyway, while I'd like to get to more nitty gritty stuff today, I think I've been looking at this stuff a bit too long now, so unfortunately the specific questions will have to wait till my next post when I'll have had a bit more time to think through what I want to ask. If any specific thoughts/feedback come to mind from your end in the meantime though I'd be very happy to hear them! :-)


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
Attach the full script to this thread (click +Insert -> Add File when posting a reply) and I'll give it a look.

KO
KO
Esteemed Member (2.5K reputation)Esteemed Member (2.5K reputation)Esteemed Member (2.5K reputation)Esteemed Member (2.5K reputation)Esteemed Member (2.5K reputation)Esteemed Member (2.5K reputation)Esteemed Member (2.5K reputation)Esteemed Member (2.5K reputation)Esteemed Member (2.5K reputation)
Group: Forum Members
Posts: 18, Visits: 107
Hi Dave,

Think I've uploaded the script successfully.

I have only one vague question to ask at this point - what did you mean by picking "the parameters for the subsequent "round" / the following RSVP stream: (1) Which wordlist are you going to sample from for that stream? (2) Which lags to apply to that stream." When I say that, what I'm really asking is can I have an example of that to be clearer on what it is that you are suggesting that I do in terms of this stuff.

Hoping you have more suggestions in general about changes to make after viewing the script too. Thanks.

Attachments
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
> I have only one vague question to ask at this point - what did you mean by picking "the parameters for the subsequent "round" /
> the following RSVP stream: (1) Which wordlist are you going to sample from for that stream? (2) Which lags to apply to that
> stream." When I say that, what I'm really asking is can I have an example of that to be clearer on what it is that you are
> suggesting that I do in terms of this stuff.

Look at <trial starttrial> in the original RSVP script I gave you ( https://www.millisecond.com/forums/FindPost16005.aspx ):

<trial starttrial>
/ ontrialbegin = [values.trialnumber +=1; values.currentposition = 0; values.streamstring = ""; values.t1item = ""; values.t2item = "";
        text.distractor.resetselection(); text.target.resetselection()]
/ ontrialbegin = [if(script.currentblock=="practiceblock") {values.t1position = list.pt1positionlist.nextvalue; values.t2lag = list.pt2laglist.nextvalue}]
/ ontrialbegin = [if(script.currentblock=="testblock") {values.t1position = list.t1positionlist.nextvalue; values.t2lag = list.t2laglist.nextvalue}]
/ ontrialbegin = [values.t2position = values.t1position + values.t2lag]

/ stimulusframes = [1=fixation, debug]
/ trialduration = 2000
/ posttrialpause = 250
/ validresponse = (noresponse)
/ recorddata = false
/ branch = [trial.distractortrial]
</trial>

What that trial does is gather all the parameters for the RSVP stream that follows. I.e., 1st reset a bunch of variables (from the previous stream, if any). We increase the trial count (values.trialcount), we're in position 0 in the stream (values.currentposition), i.e., we start fresh, our stream string is empty etc.

Then we select the position where target1 should occur in the ensuing RSVP stream (values.t1position) and target2's "lag" relative to that (values.t2lag); target2's ordinal position in the stream is simply target1's position plus the selected lag (values.t2position = values.t1position + values.t2lag).

At this point all the necessary parameters for the RSVP stream are known and we start the stream with a distractor trial (/branch = [trial.distractortrial]).

You need to do the same in your script. In addition to the parameters mentioned above you need to select one of your 4 target wordlists and sample from that wordlist as shown previously. In fact, that's the very 1st thing you want to do, because you want the other parameters (positions / lag levels) *depend* on the chosen wordlist.

Edited 9 Years Ago by Dave
GO

Merge Selected

Merge into selected topic...



Merge into merge target...



Merge into a specific topic ID...




Reading This Topic

Explore
Messages
Mentions
Search