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.
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
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.
Script has been fixed, trial TRIAL_refset was erroneously named TRIAL_main.
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.
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?
Perfectly, I'll try that and let you know. But since this is coming from you, I have good faith
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.
Any progress / new insights regarding the port issue?
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.
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 * *******************************************