Millisecond Online Community

A few things not working properly. And flicker.

rated by 0 users
This post has 10 Replies | 1 Follower

Top 10 Contributor
Posts 139

Hi All,

consider the attached script. There are a few things not functional here.

 

(1) Fixation cross flickers between trials TRIAL_refset and TRIAL_probe.

There is not a single "erase=true" statement in the entire script. However, the fixation cross (or text in this demo script) flickers at the switch between TRIAL_refset and TRIAL_probe. Since we are doing an EEG experiment, the flicker yields EEG activity which we'd rather avoid.

 

(2) A second port stimulus in trial TRIAL_refset has no effect.

Issue (1) could be circumvented by integrating TRIAL_refset and TRIAL_probe into one trial. The latter should look like

<trial TRIAL_refset>
/ iscorrectresponse = [((values.iIdent==0) && (trial.TRIAL_probe.response==203))||((values.iIdent==1) && (trial.TRIAL_probe.response==205))]
/ responseinterrupt = trial
/ responsetime = 2250
/ responsetrial = (anyresponse, TRIAL_response)
/ responsetrial = (noresponse, TRIAL_response)
/ stimulustimes = [0 = SHAPE_blank,PIC_fix,TEXT_debugstring; 1500=PORT_refset,PIC_ref_p01,PIC_ref_p02,PIC_fix; 3000=SHAPE_blank,PIC_fix; 4500=PORT_probe,SHAPE_blank,PIC_ref_p03; 5250=SHAPE_blank]
/ timeout = 8250
/ validresponse = (203,205,noresponse)
</trial>

Unfortunately, PORT_probe is not set in this case.

 

(3) Inquisit allows only for some none-consecutive numbers in an <item>.

The port triggers need to be computed at runtime since they encode some important trial properties. Since I wasn't aware of a way to send integer values to a port, I decided to realize a translation table "integer -> binary" via an item. The various integer codes used throughout the script are not consecutive, hence I originally planned to define the <item> like this:

<item ITEM_portsignals>
/  1 = "00000001"
/  2 = "00000010"
/  3 = "00000011"
/ 11 = "00001011"
/ 12 = "00001100"
/ 13 = "00001101"
/ 14 = "00001110"
/ 15 = "00001111"
/ 16 = "00010000"
/ 21 = "00010101"
/ 22 = "00010110"
/ 23 = "00010111"
/ 24 = "00011000"
/ 25 = "00011001"
/ 26 = "00011010"
/ 31 = "01101111"
/ 32 = "01110000"
/ 33 = "01110001"
/ 34 = "01110010"
/ 35 = "01110011"
/ 36 = "01110100"
/ 41 = "01111001"
/ 42 = "01111010"
/ 43 = "01111011"
/ 44 = "01111100"
/ 45 = "01111101"
/ 46 = "01111110"
</item>

Inquisit does not issue an error when I do so. During runtime, while the following expressions work:

getitem(ITEM_portsignals,1)
getitem(ITEM_portsignals,11)
getitem(
ITEM_portsignals,26)

these do not but issue a script error:

getitem(ITEM_portsignals,31)
getitem(ITEM_portsignals,46)

 

Any clues on any of these?

Bye, Malte.

Top 10 Contributor
Posts 2,021

Blackadder:
(1) Fixation cross flickers between trials TRIAL_refset and TRIAL_probe.

There is not a single "erase=true" statement in the entire script. However, the fixation cross (or text in this demo script) flickers at the switch between TRIAL_refset and TRIAL_probe. Since we are doing an EEG experiment, the flicker yields EEG activity which we'd rather avoid.

There is no TRIAL_refset in the script you attached. Also, I'm not seeing any flickers.

Blackadder:
(2) A second port stimulus in trial TRIAL_refset has no effect.

Issue (1) could be circumvented by integrating TRIAL_refset and TRIAL_probe into one trial. The latter should look like

<trial TRIAL_refset>
/ iscorrectresponse = [((values.iIdent==0) && (trial.TRIAL_probe.response==203))||((values.iIdent==1) && (trial.TRIAL_probe.response==205))]
/ responseinterrupt = trial
/ responsetime = 2250
/ responsetrial = (anyresponse, TRIAL_response)
/ responsetrial = (noresponse, TRIAL_response)
/ stimulustimes = [0 = SHAPE_blank,PIC_fix,TEXT_debugstring; 1500=PORT_refset,PIC_ref_p01,PIC_ref_p02,PIC_fix; 3000=SHAPE_blank,PIC_fix; 4500=PORT_probe,SHAPE_blank,PIC_ref_p03; 5250=SHAPE_blank]
/ timeout = 8250
/ validresponse = (203,205,noresponse)
</trial>

Unfortunately, PORT_probe is not set in this case.

See response to (1). Offhand though, I'd say introducing a proper <port erase> before sending the second trigger could help.

Blackadder:
(3) Inquisit allows only for some none-consecutive numbers in an <item>.

The port triggers need to be computed at runtime since they encode some important trial properties. Since I wasn't aware of a way to send integer values to a port, I decided to realize a translation table "integer -> binary" via an item. The various integer codes used throughout the script are not consecutive, hence I originally planned to define the <item> like this:

<item ITEM_portsignals>
/  1 = "00000001"
/  2 = "00000010"
/  3 = "00000011"
/ 11 = "00001011"
/ 12 = "00001100"
/ 13 = "00001101"
/ 14 = "00001110"
/ 15 = "00001111"
/ 16 = "00010000"
/ 21 = "00010101"
/ 22 = "00010110"
/ 23 = "00010111"
/ 24 = "00011000"
/ 25 = "00011001"
/ 26 = "00011010"
/ 31 = "01101111"
/ 32 = "01110000"
/ 33 = "01110001"
/ 34 = "01110010"
/ 35 = "01110011"
/ 36 = "01110100"
/ 41 = "01111001"
/ 42 = "01111010"
/ 43 = "01111011"
/ 44 = "01111100"
/ 45 = "01111101"
/ 46 = "01111110"
</item>

Inquisit does not issue an error when I do so. During runtime, while the following expressions work:

getitem(ITEM_portsignals,1)
getitem(ITEM_portsignals,11)
getitem(
ITEM_portsignals,26)

these do not but issue a script error:

getitem(ITEM_portsignals,31)
getitem(ITEM_portsignals,46)

AFAIK, the  '/ 1', etc. in your <item> element doesn't actually mean anything to Inquisit's parser -- it will simply construct sequential item indexes based on the total number of item entries contained in the <item> element. This means 'getitem(ITEM_portsignals,4)' will return your '/ 11',  while 'getitem(ITEM_portsignals,11)' will return your '/ 22'. The latter expressions fail because they're out of index (i.e. there is no item no. 46). Workaround: Fill in the blank spots with empty entries.

Cheers,

~Dave

 

"To understand recursion, you must first understand recursion."  - Unknown Zen Master

Top 10 Contributor
Posts 2,021

P.S.: BTW, you do realize that '/ erase = true' is actually the default setting, don't you? I.e. you have to *explicitly* declare '/ erase = false' for all your stims.

~Dave

"To understand recursion, you must first understand recursion."  - Unknown Zen Master

Top 10 Contributor
Posts 139

Script has been fixed, trial TRIAL_refset was erroneously named TRIAL_main.

Top 10 Contributor
Posts 139

Dave, you've once again been helpful. Amending all stimuli (except the <port> stimuli, of course) with /erase=false did the trick - no more flickering.

I am not quite sure, however, what you mean by sending a proper <port erase> command.

 

And for the item issue: filling the item with dummy entries was what I eventually came up with. Thank god lpt is only 8 bits.

 

Bye, Malte.

Top 10 Contributor
Posts 2,021

Blackadder:
Dave, you've once again been helpful

I live to serve...;-)

Blackadder:
I am not quite sure, however, what you mean by sending a proper <port erase> command.

For the case of 'PORT_Probe' not being sent out, I'd try introducing yet another port signal in between 'PORT_refset' and 'PORT_probe' which would set all bits to low again

<port PORT_erase>
/ items = ("00000000")
[...]
</port>

yielding something like

<trial TRIAL_refset>
/ iscorrectresponse = [((values.iIdent==0) && (trial.TRIAL_probe.response==203))||((values.iIdent==1) && (trial.TRIAL_probe.response==205))]
/ responseinterrupt = trial
/ responsetime = 2250
/ responsetrial = (anyresponse, TRIAL_response)
/ responsetrial = (noresponse, TRIAL_response)
/ stimulustimes = [0 = SHAPE_blank,PIC_fix,TEXT_debugstring; 1500=PORT_refset,PIC_ref_p01,PIC_ref_p02,PIC_fix; 3000=SHAPE_blank,PIC_fix,PORT_erase; 4500=PORT_probe,SHAPE_blank,PIC_ref_p03; 5250=SHAPE_blank]
/ timeout = 8250
/ validresponse = (203,205,noresponse)
</trial>

Make sense?

~Dave

"To understand recursion, you must first understand recursion."  - Unknown Zen Master

Top 10 Contributor
Posts 139

Perfectly, I'll try that and let you know. But since this is coming from you, I have good faith Idea

Top 10 Contributor
Posts 2,021

Blackadder:
But since this is coming from you, I have good faith

BAD mistake. Everyone knows I can't be trusted. But seriously, I'm not sure my suggestion will do the trick. Troubleshooting port issues is a major pain, IMO.

~Dave

"To understand recursion, you must first understand recursion."  - Unknown Zen Master

Top 10 Contributor
Posts 2,021

Any progress / new insights regarding the port issue?

~Dave

"To understand recursion, you must first understand recursion."  - Unknown Zen Master

Top 10 Contributor
Posts 139

Hi Dave,

not yet. I got no access to the gadget that's recording the lpt signals and the colleague who has will not be in before Monday, I'll report as soon as I know something. Let's hope the best, I'm off to Serbia until Tuesday.

Bye, Malte.

Top 10 Contributor
Posts 2,021

Blackadder:
Since I wasn't aware of a way to send integer values to a port, [...]

What the hell, we might just come up with a way for the fun of it:

How to convert the answer to life, the universe and everything to 8 bit binary?

*********************************************
* Start Function: Convert Decimal to Binary *
*********************************************

<values>
/ dec = 42
/ bit = 0
/ nbits = 8
/ binarystring = ""
/ loopcount = 0
</values>

<expressions>
/ dec2bin = if(values.dec>=0 && values.loopcount<values.nbits)
    {
    values.loopcount=values.loopcount+1;
    values.bit=values.dec-(2*(ipart(values.dec/2)));
    values.binarystring=concat(values.bit,values.binarystring);
    values.dec=ipart(values.dec/2);
    expressions.dec2bin;
    }
</expressions>

<text mybinarystring>
/ items = ("<%values.binarystring%>")
</text>

<trial mytrial>
/ ontrialbegin = [values.binarystring=""; values.loopcount=0; expressions.dec2bin]
/ stimulusframes = [1=mybinarystring]
/ validresponse = (anyresponse)
</trial>

*******************************************
* End Function: Convert Decimal to Binary *
*******************************************

It's a bit bulky, I know. But hey, it get's the job done... And since I can't let this slide, here's some code for the reverse conversion:

*********************************************
* Start Function: Convert Binary to Decimal *
*********************************************

<values>
/ dec = 0
/ bit = 0
/ binarystring = "00101010"
/ pos = 0
</values>

<expressions>
/ bin2dec = if(values.pos<length(values.binarystring))
    {
    values.bit=substring(values.binarystring,values.pos,1);
    values.dec=values.dec*2+values.bit;
    values.pos=values.pos+1;
    expressions.bin2dec;
    }
</expressions>

<text mydecimal>
/ items = ("<%values.dec%>")
</text>

<trial mytrial>
/ ontrialbegin = [values.dec=0; values.pos=0; expressions.bin2dec]
/ stimulusframes = [1=mydecimal]
/ validresponse = (anyresponse)
</trial>

*******************************************
* End Function: Convert Binary to Decimal *
*******************************************

Cheers,

~Dave

"To understand recursion, you must first understand recursion."  - Unknown Zen Master

Page 1 of 1 (11 items) | RSS
Powered by Community Server (Non-Commercial Edition), by Telligent Systems