From c0208027fbe771565ea15221672cc2a5196dac19 Mon Sep 17 00:00:00 2001 From: tiborauer <tibor.auer@gmail.com> Date: Tue, 1 Dec 2020 10:02:19 +0000 Subject: [PATCH] NEW: add triggers --- rMtS.py | 33 +++++++++++++++++++++++++++++++-- 1 file changed, 31 insertions(+), 2 deletions(-) diff --git a/rMtS.py b/rMtS.py index 533eb0a..09d2410 100644 --- a/rMtS.py +++ b/rMtS.py @@ -13,6 +13,8 @@ from itertools import product from collections import OrderedDict from pyniexp.scannersynch import scanner_synch from pyniexp.stimulation import Waveform, Stimulator +from pyniexp.triggers import BrainVision +from pyniexp.utils import listSerial from utils import generate_jitter, generate_sample, get_neighbor if __name__ == '__main__': @@ -28,6 +30,7 @@ if __name__ == '__main__': ('match number',2), # number of matches per sample ('scanner mode', False), # Is it inside the scanner ('stimulation', False), # Run tES + ('trigger port', ['none']+listSerial()), ('stimulation intensity [mA]', 1) # desired intensity (mA) ]) dlg = gui.DlgFromDict(dictionary=expInfo, title=expName, sortKeys=False) @@ -90,6 +93,16 @@ if __name__ == '__main__': sampleNum = expInfo['sample size'] # number of circles (cannot be more than half of the number of cells) sampleSize = 0.9 # circle size relative to cell size + TRIGGER = { + 'experiment': 1, + 'sample': 10+sampleNum, + 'mask': 20, + 'testBase': 30, + 'responseBase': 40, + 'responseIncorrect': 50, + 'responseCorrect': 51 + } + tolJitter = 1e-3 # Jitters @@ -198,13 +211,19 @@ if __name__ == '__main__': defWave['phase'] = phaseDiff wave2 = Waveform(**defWave) + # Trigger + doTrigger = False + if expInfo['trigger port'] != 'none': + trigger = BrainVision(expInfo['trigger port']) + doTrigger = trigger.isConnected + # Visual mon = monitors.Monitor(Monitor) # - set fullscr=True for experiment # - for multimonitor: # - set the external screen to primary # - set screen=1 - win = visual.Window([1280,1024],winType='pyglet',screen=0,monitor=mon,units='pix',fullscr=False, autoLog=False, gammaErrorPolicy='ignore') + win = visual.Window([1280,1024],winType='pyglet',screen=1,monitor=mon,units='pix',fullscr=True, autoLog=False, gammaErrorPolicy='ignore') win.mouseVisible = False gridForm = visual.ElementArrayStim(win=win, name='gridForm', nElements=(gridXY+1)*2, sizes=[gridSize,2], xys = gridCoordinates, oris=gridAngles, units='pix', elementTex=ones([16,16]), elementMask=ones([16,16]), colors=colour, colorSpace='rgb', autoLog=False) @@ -246,6 +265,7 @@ if __name__ == '__main__': SSO.reset_clock() expClock.reset() + if doTrigger: trigger.send(TRIGGER['experiment']) frameN = -1 ######## RUN ######## @@ -321,6 +341,7 @@ if __name__ == '__main__': if sampleForm.status == STARTED: sampleForm.draw() + if doTrigger: trigger.send(TRIGGER['sample']) win.flip() interimClock.reset((jitter + sampleDuration) - trialClock.getTime()) @@ -374,9 +395,11 @@ if __name__ == '__main__': if fullForm.status == STARTED: fullForm.draw() + if doTrigger: trigger.send(TRIGGER['mask']) if recallForm.status == STARTED: recallForm.draw() + if doTrigger: trigger.send(TRIGGER['testBase']+loopMatch.thisTrialN+1) win.flip() interimClock.reset((jitter + sampleDuration) - trialClock.getTime()) @@ -407,6 +430,7 @@ if __name__ == '__main__': responseStim.frameNStart = frameN # exact frame index responseStim.setAutoDraw(True) win.logOnFlip(level=logging.EXP, msg='Response - STARTED') + if doTrigger: trigger.send(TRIGGER['responseBase']+loopMatch.thisTrialN+1) SSO.wait_for_button(no_block=True) win.flip() @@ -429,9 +453,13 @@ if __name__ == '__main__': if isMatch and (SSO.buttonpresses[-1][0] == bYes): thisExp.addData('resp.code','hit') + if doTrigger: trigger.send(TRIGGER['responseCorrect']) elif not(isMatch) and (SSO.buttonpresses[-1][0] == bNo): thisExp.addData('resp.code','cr') - else: thisExp.addData('resp.code','false') + if doTrigger: trigger.send(TRIGGER['responseCorrect']) + else: + thisExp.addData('resp.code','false') + if doTrigger: trigger.send(TRIGGER['responseIncorrect']) else: thisExp.addData('resp.code','miss') thisExp.nextEntry() @@ -466,6 +494,7 @@ if __name__ == '__main__': win.flip() SSO = None if doSTIMULATION: BSO = None + if doTrigger: trigger = None ######## EVENTS (BIDS) ######## logging.flush() -- GitLab