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