Millisecond Forums

counterbalancing with lists

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

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

Hi,

I have a counterbalancing problem on my visual search task I am not sure how to fix.

My task has 12 different types of trials in a block (two different target letters each in 6 possible positions). The trials must be randomly selected (which they are). The unselected other 5 locations are filled by filler letters - picked from 5 lists. Two of the filler letters are actual letters and three are small O's. The filler letters are counterbalanced with each other so there are 48 combinations each - this is done by randomly selecting the first letter and then the other lists select from list.1.currentindex.

But I made a mistake as the filler letter identity and positions are not connected to the position of the target letter (the trial). I need the filler letters to  be next to the target letter I.e if the target is in pos 1 then filler letter 1 will be in pos 2 and filler letter 2 will be in pos 3 (so they are both next to the target letter and not separated by small O filler letters). I also need the trial to be linked to the filler letter order.

So that on list s3filler1 below. Every 6th letter is presented on trial.set3X1 (also below) (so the 1st, 6th, 13th and so on) and this letter is always presented in position 2.

<list s3filler1>
/ items = (picture.H1, picture.Z1, picture.O1, picture.M1, picture.K1, picture.O1, picture.W1, picture.H1, picture.O1, picture.Z1, picture.K1, picture.O1, picture.M1, picture.W1, picture.O1, picture.H1, picture.Z1, picture.O1, picture.M1, picture.K1,
picture.O1, picture.W1, picture.H1, picture.O1, picture.Z1, picture.K1, picture.O1, picture.M1, picture.W1, picture.O1, picture.H1, picture.Z1, picture.O1, picture.M1, picture.K1, picture.O1, picture.W1, picture.H1, picture.O1, picture.Z1, picture.K1,
picture.O1, picture.M1, picture.W1, picture.O1, picture.Z1, picture.K1, picture.O1)
/ select = random
</list>

<trial set3X1>
/ ontrialbegin = [
values.valid = 0;
values.validcorrect = 0;
values.trialcount += 1]
/ ontrialbegin = [trial.set3X1.insertstimulustime(list.s3filler1.nextvalue,500);]
/ ontrialbegin = [trial.set3X1.insertstimulustime(list.s3filler2.nextvalue,500);]
/ ontrialbegin = [trial.set3X1.insertstimulustime(list.s3filler3.nextvalue,500);]
/ ontrialbegin = [trial.set3X1.insertstimulustime(list.s3filler4.nextvalue,500);]
/ ontrialbegin = [trial.set3X1.insertstimulustime(list.s3filler5.nextvalue,500);]
/ ontrialbegin = [values.fillerhpos1 = expressions.hp2]
/ ontrialbegin = [values.fillerhpos2 = expressions.hp3]
/ ontrialbegin = [values.fillerhpos3 = expressions.hp4]
/ ontrialbegin = [values.fillerhpos4 = expressions.hp5]
/ ontrialbegin = [values.fillerhpos5 = expressions.hp6]
/ ontrialbegin = [values.fillervpos1 = expressions.vp2]
/ ontrialbegin = [values.fillervpos2 = expressions.vp3]
/ ontrialbegin = [values.fillervpos3 = expressions.vp4]
/ ontrialbegin = [values.fillervpos4 = expressions.vp5]
/ ontrialbegin = [values.fillervpos5 = expressions.vp6]
/ ontrialbegin = [trial.set3X1.insertstimulustime(list.distractorX1.nextvalue,500);]
/ ontrialbegin = [values.distractor = list.distractorX1.currentvalue;]
/ ontrialbegin = [
if (contains(list.distractorX1.currentvalue, ".X")) expressions.category = "congruent"
  else if (contains(list.distractorX1.currentvalue, ".N")) expressions.category = "incongruent";
]
/ ontrialbegin = [
if (expressions.category== "congruent") values.count_congruent += 1;
  else if (expressions.category== "incongruent") values.count_incongruent += 1;
]
/ ontrialend = [trial.set3X1.resetstimulusframes(); ]
/ stimulustimes = [1=fixation; 500=sequence (fixationcover, XLD1); 600=sequence (eraser1, eraser2, eraser3, eraser4, eraser5, eraser6, eraserleft, eraserright)]
/ validresponse = ("J", "I")
/ correctresponse = ("J")
/ response = timeout(2000)
/ beginresponsetime = 500
/ ontrialend = [
if (trial.set3X1.latency >= parameters.minimum_latency)
values.valid = 1;
if (values.valid == 1) {
if (trial.set3X1.correct) {
values.validcorrect = 1;
values.sumcorrect += 1;
values.sumrt += trial.set3X1.latency
if (expressions.category == "congruent") {
values.sumcorrect_congruent += 1;
values.sumrt_congruent += trial.set3X1.latency;
list.latencies_congruent.insertitem(trial.set3X1.latency, 1);
list.latencies.insertitem(trial.set3X1.latency, 1);
} else {
values.sumcorrect_incongruent += 1;
values.sumrt_incongruent += trial.set3X1.latency;
list.latencies_incongruent.insertitem(trial.set3X1.latency, 1);
list.latencies.insertitem(trial.set3X1.latency, 1);
}
}
} ;
list.accuracy.insertitem(values.validcorrect, 1);
values.testeracc = list.accuracy.currentindex
if (expressions.category == "congruent") {
list.accuracy_congruent.insertitem(values.validcorrect, 1);
} else {
list.accuracy_incongruent.insertitem(values.validcorrect, 1);
};
]
</trial>

If there a way of using more lists to link these together?

I have attached the whole script too (with supporting files)

Thanks
By Dave - 10/2/2017

jm560@sussex.ac.uk - Monday, October 2, 2017
Hi,

I have a counterbalancing problem on my visual search task I am not sure how to fix.

My task has 12 different types of trials in a block (two different target letters each in 6 possible positions). The trials must be randomly selected (which they are). The unselected other 5 locations are filled by filler letters - picked from 5 lists. Two of the filler letters are actual letters and three are small O's. The filler letters are counterbalanced with each other so there are 48 combinations each - this is done by randomly selecting the first letter and then the other lists select from list.1.currentindex.

But I made a mistake as the filler letter identity and positions are not connected to the position of the target letter (the trial). I need the filler letters to  be next to the target letter I.e if the target is in pos 1 then filler letter 1 will be in pos 2 and filler letter 2 will be in pos 3 (so they are both next to the target letter and not separated by small O filler letters). I also need the trial to be linked to the filler letter order.

So that on list s3filler1 below. Every 6th letter is presented on trial.set3X1 (also below) (so the 1st, 6th, 13th and so on) and this letter is always presented in position 2.

<list s3filler1>
/ items = (picture.H1, picture.Z1, picture.O1, picture.M1, picture.K1, picture.O1, picture.W1, picture.H1, picture.O1, picture.Z1, picture.K1, picture.O1, picture.M1, picture.W1, picture.O1, picture.H1, picture.Z1, picture.O1, picture.M1, picture.K1,
picture.O1, picture.W1, picture.H1, picture.O1, picture.Z1, picture.K1, picture.O1, picture.M1, picture.W1, picture.O1, picture.H1, picture.Z1, picture.O1, picture.M1, picture.K1, picture.O1, picture.W1, picture.H1, picture.O1, picture.Z1, picture.K1,
picture.O1, picture.M1, picture.W1, picture.O1, picture.Z1, picture.K1, picture.O1)
/ select = random
</list>

<trial set3X1>
/ ontrialbegin = [
values.valid = 0;
values.validcorrect = 0;
values.trialcount += 1]
/ ontrialbegin = [trial.set3X1.insertstimulustime(list.s3filler1.nextvalue,500);]
/ ontrialbegin = [trial.set3X1.insertstimulustime(list.s3filler2.nextvalue,500);]
/ ontrialbegin = [trial.set3X1.insertstimulustime(list.s3filler3.nextvalue,500);]
/ ontrialbegin = [trial.set3X1.insertstimulustime(list.s3filler4.nextvalue,500);]
/ ontrialbegin = [trial.set3X1.insertstimulustime(list.s3filler5.nextvalue,500);]
/ ontrialbegin = [values.fillerhpos1 = expressions.hp2]
/ ontrialbegin = [values.fillerhpos2 = expressions.hp3]
/ ontrialbegin = [values.fillerhpos3 = expressions.hp4]
/ ontrialbegin = [values.fillerhpos4 = expressions.hp5]
/ ontrialbegin = [values.fillerhpos5 = expressions.hp6]
/ ontrialbegin = [values.fillervpos1 = expressions.vp2]
/ ontrialbegin = [values.fillervpos2 = expressions.vp3]
/ ontrialbegin = [values.fillervpos3 = expressions.vp4]
/ ontrialbegin = [values.fillervpos4 = expressions.vp5]
/ ontrialbegin = [values.fillervpos5 = expressions.vp6]
/ ontrialbegin = [trial.set3X1.insertstimulustime(list.distractorX1.nextvalue,500);]
/ ontrialbegin = [values.distractor = list.distractorX1.currentvalue;]
/ ontrialbegin = [
if (contains(list.distractorX1.currentvalue, ".X")) expressions.category = "congruent"
  else if (contains(list.distractorX1.currentvalue, ".N")) expressions.category = "incongruent";
]
/ ontrialbegin = [
if (expressions.category== "congruent") values.count_congruent += 1;
  else if (expressions.category== "incongruent") values.count_incongruent += 1;
]
/ ontrialend = [trial.set3X1.resetstimulusframes(); ]
/ stimulustimes = [1=fixation; 500=sequence (fixationcover, XLD1); 600=sequence (eraser1, eraser2, eraser3, eraser4, eraser5, eraser6, eraserleft, eraserright)]
/ validresponse = ("J", "I")
/ correctresponse = ("J")
/ response = timeout(2000)
/ beginresponsetime = 500
/ ontrialend = [
if (trial.set3X1.latency >= parameters.minimum_latency)
values.valid = 1;
if (values.valid == 1) {
if (trial.set3X1.correct) {
values.validcorrect = 1;
values.sumcorrect += 1;
values.sumrt += trial.set3X1.latency
if (expressions.category == "congruent") {
values.sumcorrect_congruent += 1;
values.sumrt_congruent += trial.set3X1.latency;
list.latencies_congruent.insertitem(trial.set3X1.latency, 1);
list.latencies.insertitem(trial.set3X1.latency, 1);
} else {
values.sumcorrect_incongruent += 1;
values.sumrt_incongruent += trial.set3X1.latency;
list.latencies_incongruent.insertitem(trial.set3X1.latency, 1);
list.latencies.insertitem(trial.set3X1.latency, 1);
}
}
} ;
list.accuracy.insertitem(values.validcorrect, 1);
values.testeracc = list.accuracy.currentindex
if (expressions.category == "congruent") {
list.accuracy_congruent.insertitem(values.validcorrect, 1);
} else {
list.accuracy_incongruent.insertitem(values.validcorrect, 1);
};
]
</trial>

If there a way of using more lists to link these together?

I have attached the whole script too (with supporting files)

Thanks

I'm not sure I understand the desired position-setup from your description, but of course you can simply put the desired positions in additional <list>s and link those to the other / existing lists as needed.
By Dave - 10/2/2017

Dave - Monday, October 2, 2017
jm560@sussex.ac.uk - Monday, October 2, 2017
Hi,

I have a counterbalancing problem on my visual search task I am not sure how to fix.

My task has 12 different types of trials in a block (two different target letters each in 6 possible positions). The trials must be randomly selected (which they are). The unselected other 5 locations are filled by filler letters - picked from 5 lists. Two of the filler letters are actual letters and three are small O's. The filler letters are counterbalanced with each other so there are 48 combinations each - this is done by randomly selecting the first letter and then the other lists select from list.1.currentindex.

But I made a mistake as the filler letter identity and positions are not connected to the position of the target letter (the trial). I need the filler letters to  be next to the target letter I.e if the target is in pos 1 then filler letter 1 will be in pos 2 and filler letter 2 will be in pos 3 (so they are both next to the target letter and not separated by small O filler letters). I also need the trial to be linked to the filler letter order.

So that on list s3filler1 below. Every 6th letter is presented on trial.set3X1 (also below) (so the 1st, 6th, 13th and so on) and this letter is always presented in position 2.

<list s3filler1>
/ items = (picture.H1, picture.Z1, picture.O1, picture.M1, picture.K1, picture.O1, picture.W1, picture.H1, picture.O1, picture.Z1, picture.K1, picture.O1, picture.M1, picture.W1, picture.O1, picture.H1, picture.Z1, picture.O1, picture.M1, picture.K1,
picture.O1, picture.W1, picture.H1, picture.O1, picture.Z1, picture.K1, picture.O1, picture.M1, picture.W1, picture.O1, picture.H1, picture.Z1, picture.O1, picture.M1, picture.K1, picture.O1, picture.W1, picture.H1, picture.O1, picture.Z1, picture.K1,
picture.O1, picture.M1, picture.W1, picture.O1, picture.Z1, picture.K1, picture.O1)
/ select = random
</list>

<trial set3X1>
/ ontrialbegin = [
values.valid = 0;
values.validcorrect = 0;
values.trialcount += 1]
/ ontrialbegin = [trial.set3X1.insertstimulustime(list.s3filler1.nextvalue,500);]
/ ontrialbegin = [trial.set3X1.insertstimulustime(list.s3filler2.nextvalue,500);]
/ ontrialbegin = [trial.set3X1.insertstimulustime(list.s3filler3.nextvalue,500);]
/ ontrialbegin = [trial.set3X1.insertstimulustime(list.s3filler4.nextvalue,500);]
/ ontrialbegin = [trial.set3X1.insertstimulustime(list.s3filler5.nextvalue,500);]
/ ontrialbegin = [values.fillerhpos1 = expressions.hp2]
/ ontrialbegin = [values.fillerhpos2 = expressions.hp3]
/ ontrialbegin = [values.fillerhpos3 = expressions.hp4]
/ ontrialbegin = [values.fillerhpos4 = expressions.hp5]
/ ontrialbegin = [values.fillerhpos5 = expressions.hp6]
/ ontrialbegin = [values.fillervpos1 = expressions.vp2]
/ ontrialbegin = [values.fillervpos2 = expressions.vp3]
/ ontrialbegin = [values.fillervpos3 = expressions.vp4]
/ ontrialbegin = [values.fillervpos4 = expressions.vp5]
/ ontrialbegin = [values.fillervpos5 = expressions.vp6]
/ ontrialbegin = [trial.set3X1.insertstimulustime(list.distractorX1.nextvalue,500);]
/ ontrialbegin = [values.distractor = list.distractorX1.currentvalue;]
/ ontrialbegin = [
if (contains(list.distractorX1.currentvalue, ".X")) expressions.category = "congruent"
  else if (contains(list.distractorX1.currentvalue, ".N")) expressions.category = "incongruent";
]
/ ontrialbegin = [
if (expressions.category== "congruent") values.count_congruent += 1;
  else if (expressions.category== "incongruent") values.count_incongruent += 1;
]
/ ontrialend = [trial.set3X1.resetstimulusframes(); ]
/ stimulustimes = [1=fixation; 500=sequence (fixationcover, XLD1); 600=sequence (eraser1, eraser2, eraser3, eraser4, eraser5, eraser6, eraserleft, eraserright)]
/ validresponse = ("J", "I")
/ correctresponse = ("J")
/ response = timeout(2000)
/ beginresponsetime = 500
/ ontrialend = [
if (trial.set3X1.latency >= parameters.minimum_latency)
values.valid = 1;
if (values.valid == 1) {
if (trial.set3X1.correct) {
values.validcorrect = 1;
values.sumcorrect += 1;
values.sumrt += trial.set3X1.latency
if (expressions.category == "congruent") {
values.sumcorrect_congruent += 1;
values.sumrt_congruent += trial.set3X1.latency;
list.latencies_congruent.insertitem(trial.set3X1.latency, 1);
list.latencies.insertitem(trial.set3X1.latency, 1);
} else {
values.sumcorrect_incongruent += 1;
values.sumrt_incongruent += trial.set3X1.latency;
list.latencies_incongruent.insertitem(trial.set3X1.latency, 1);
list.latencies.insertitem(trial.set3X1.latency, 1);
}
}
} ;
list.accuracy.insertitem(values.validcorrect, 1);
values.testeracc = list.accuracy.currentindex
if (expressions.category == "congruent") {
list.accuracy_congruent.insertitem(values.validcorrect, 1);
} else {
list.accuracy_incongruent.insertitem(values.validcorrect, 1);
};
]
</trial>

If there a way of using more lists to link these together?

I have attached the whole script too (with supporting files)

Thanks

I'm not sure I understand the desired position-setup from your description, but of course you can simply put the desired positions in additional <list>s and link those to the other / existing lists as needed.

To clarify a bit, when you have

<list s3filler1>
/ items = (picture.H1, picture.Z1, picture.O1, picture.M1, picture.K1, picture.O1, picture.W1, picture.H1, picture.O1, picture.Z1, picture.K1, picture.O1, picture.M1, picture.W1, picture.O1, picture.H1, picture.Z1, picture.O1, picture.M1, picture.K1,
picture.O1, picture.W1, picture.H1, picture.O1, picture.Z1, picture.K1, picture.O1, picture.M1, picture.W1, picture.O1, picture.H1, picture.Z1, picture.O1, picture.M1, picture.K1, picture.O1, picture.W1, picture.H1, picture.O1, picture.Z1, picture.K1,
picture.O1, picture.M1, picture.W1, picture.O1, picture.Z1, picture.K1, picture.O1)
/ select = random
</list>

and you -- hypothetically -- want to have the 1stitem in that list be located in position #2, the 2nd in position #4,, etc. you'd define

<list s3filler1_h>
/ items = (expressions.hp2, expressions.hp4, ...)
/ select = list.s3filler1.currentindex
</list>

<list s3filler1_v>
/ items = (expressions.vp2, expressions.vp4, ...)
/ select = list.s3filler1.currentindex
</list>

with

<trial set3X1>
/ ontrialbegin = [
values.valid = 0;
values.validcorrect = 0;
values.trialcount += 1]
...
/ ontrialbegin = [values.fillerhpos1 = list.s3filler1_h.nextvalue]
...
/ ontrialbegin = [values.fillervpos1 =  list.s3filler1_v.nextvalue]
...
</trial>

Does that make it clearer?
By jm560@sussex.ac.uk - 10/2/2017

Dave - Monday, October 2, 2017
Dave - Monday, October 2, 2017
jm560@sussex.ac.uk - Monday, October 2, 2017
Hi,

I have a counterbalancing problem on my visual search task I am not sure how to fix.

My task has 12 different types of trials in a block (two different target letters each in 6 possible positions). The trials must be randomly selected (which they are). The unselected other 5 locations are filled by filler letters - picked from 5 lists. Two of the filler letters are actual letters and three are small O's. The filler letters are counterbalanced with each other so there are 48 combinations each - this is done by randomly selecting the first letter and then the other lists select from list.1.currentindex.

But I made a mistake as the filler letter identity and positions are not connected to the position of the target letter (the trial). I need the filler letters to  be next to the target letter I.e if the target is in pos 1 then filler letter 1 will be in pos 2 and filler letter 2 will be in pos 3 (so they are both next to the target letter and not separated by small O filler letters). I also need the trial to be linked to the filler letter order.

So that on list s3filler1 below. Every 6th letter is presented on trial.set3X1 (also below) (so the 1st, 6th, 13th and so on) and this letter is always presented in position 2.

<list s3filler1>
/ items = (picture.H1, picture.Z1, picture.O1, picture.M1, picture.K1, picture.O1, picture.W1, picture.H1, picture.O1, picture.Z1, picture.K1, picture.O1, picture.M1, picture.W1, picture.O1, picture.H1, picture.Z1, picture.O1, picture.M1, picture.K1,
picture.O1, picture.W1, picture.H1, picture.O1, picture.Z1, picture.K1, picture.O1, picture.M1, picture.W1, picture.O1, picture.H1, picture.Z1, picture.O1, picture.M1, picture.K1, picture.O1, picture.W1, picture.H1, picture.O1, picture.Z1, picture.K1,
picture.O1, picture.M1, picture.W1, picture.O1, picture.Z1, picture.K1, picture.O1)
/ select = random
</list>

<trial set3X1>
/ ontrialbegin = [
values.valid = 0;
values.validcorrect = 0;
values.trialcount += 1]
/ ontrialbegin = [trial.set3X1.insertstimulustime(list.s3filler1.nextvalue,500);]
/ ontrialbegin = [trial.set3X1.insertstimulustime(list.s3filler2.nextvalue,500);]
/ ontrialbegin = [trial.set3X1.insertstimulustime(list.s3filler3.nextvalue,500);]
/ ontrialbegin = [trial.set3X1.insertstimulustime(list.s3filler4.nextvalue,500);]
/ ontrialbegin = [trial.set3X1.insertstimulustime(list.s3filler5.nextvalue,500);]
/ ontrialbegin = [values.fillerhpos1 = expressions.hp2]
/ ontrialbegin = [values.fillerhpos2 = expressions.hp3]
/ ontrialbegin = [values.fillerhpos3 = expressions.hp4]
/ ontrialbegin = [values.fillerhpos4 = expressions.hp5]
/ ontrialbegin = [values.fillerhpos5 = expressions.hp6]
/ ontrialbegin = [values.fillervpos1 = expressions.vp2]
/ ontrialbegin = [values.fillervpos2 = expressions.vp3]
/ ontrialbegin = [values.fillervpos3 = expressions.vp4]
/ ontrialbegin = [values.fillervpos4 = expressions.vp5]
/ ontrialbegin = [values.fillervpos5 = expressions.vp6]
/ ontrialbegin = [trial.set3X1.insertstimulustime(list.distractorX1.nextvalue,500);]
/ ontrialbegin = [values.distractor = list.distractorX1.currentvalue;]
/ ontrialbegin = [
if (contains(list.distractorX1.currentvalue, ".X")) expressions.category = "congruent"
  else if (contains(list.distractorX1.currentvalue, ".N")) expressions.category = "incongruent";
]
/ ontrialbegin = [
if (expressions.category== "congruent") values.count_congruent += 1;
  else if (expressions.category== "incongruent") values.count_incongruent += 1;
]
/ ontrialend = [trial.set3X1.resetstimulusframes(); ]
/ stimulustimes = [1=fixation; 500=sequence (fixationcover, XLD1); 600=sequence (eraser1, eraser2, eraser3, eraser4, eraser5, eraser6, eraserleft, eraserright)]
/ validresponse = ("J", "I")
/ correctresponse = ("J")
/ response = timeout(2000)
/ beginresponsetime = 500
/ ontrialend = [
if (trial.set3X1.latency >= parameters.minimum_latency)
values.valid = 1;
if (values.valid == 1) {
if (trial.set3X1.correct) {
values.validcorrect = 1;
values.sumcorrect += 1;
values.sumrt += trial.set3X1.latency
if (expressions.category == "congruent") {
values.sumcorrect_congruent += 1;
values.sumrt_congruent += trial.set3X1.latency;
list.latencies_congruent.insertitem(trial.set3X1.latency, 1);
list.latencies.insertitem(trial.set3X1.latency, 1);
} else {
values.sumcorrect_incongruent += 1;
values.sumrt_incongruent += trial.set3X1.latency;
list.latencies_incongruent.insertitem(trial.set3X1.latency, 1);
list.latencies.insertitem(trial.set3X1.latency, 1);
}
}
} ;
list.accuracy.insertitem(values.validcorrect, 1);
values.testeracc = list.accuracy.currentindex
if (expressions.category == "congruent") {
list.accuracy_congruent.insertitem(values.validcorrect, 1);
} else {
list.accuracy_incongruent.insertitem(values.validcorrect, 1);
};
]
</trial>

If there a way of using more lists to link these together?

I have attached the whole script too (with supporting files)

Thanks

I'm not sure I understand the desired position-setup from your description, but of course you can simply put the desired positions in additional <list>s and link those to the other / existing lists as needed.

To clarify a bit, when you have

<list s3filler1>
/ items = (picture.H1, picture.Z1, picture.O1, picture.M1, picture.K1, picture.O1, picture.W1, picture.H1, picture.O1, picture.Z1, picture.K1, picture.O1, picture.M1, picture.W1, picture.O1, picture.H1, picture.Z1, picture.O1, picture.M1, picture.K1,
picture.O1, picture.W1, picture.H1, picture.O1, picture.Z1, picture.K1, picture.O1, picture.M1, picture.W1, picture.O1, picture.H1, picture.Z1, picture.O1, picture.M1, picture.K1, picture.O1, picture.W1, picture.H1, picture.O1, picture.Z1, picture.K1,
picture.O1, picture.M1, picture.W1, picture.O1, picture.Z1, picture.K1, picture.O1)
/ select = random
</list>

and you -- hypothetically -- want to have the 1stitem in that list be located in position #2, the 2nd in position #4,, etc. you'd define

<list s3filler1_h>
/ items = (expressions.hp2, expressions.hp4, ...)
/ select = list.s3filler1.currentindex
</list>

<list s3filler1_v>
/ items = (expressions.vp2, expressions.vp4, ...)
/ select = list.s3filler1.currentindex
</list>

with

<trial set3X1>
/ ontrialbegin = [
values.valid = 0;
values.validcorrect = 0;
values.trialcount += 1]
...
/ ontrialbegin = [values.fillerhpos1 = list.s3filler1_h.nextvalue]
...
/ ontrialbegin = [values.fillervpos1 =  list.s3filler1_v.nextvalue]
...
</trial>

Does that make it clearer?

Yes this is great, thank you!