Open Matlab and check that the ScannerSynchClass is on the path, e.g. using:
which ScannerSynchClass
This should return the path to the ScannerSynchClass.m file. On the stim machines, this should be C:\Program Files\MATLAB\R2014a\toolbox\CBSU.
If you get an error message like "ScannerSynchClass not found", try:
addpath('C:\Program Files\MATLAB\R2014a\toolbox\CBSU')Once the ScannerSynchClass is available, create an instance of the class:
SSO=ScannerSynchClass
Once the instance has been created, you can use the class properties and methods to collect pulses and button box responses:
== Properties (internal variables) ==
IsValid = device set and operational
TR = set a non-zero value (in seconds) for emulation mode (will not detect "real" pulses)
Keys = set a cell of key names for emulation mode. For key names look for KbName.m.
N.B.: Requires PTB.
N.B.: Suppress passing keypresses to MATLAB during the whole experiment
Clock = interal clock (seconds past since the first scanner pulse or clock reset)
Synch = current state of the scanner synch pulse
TimeOfLastPulse = time (according to the internal clock) of the last pulse
MeasuredTR = estimated TR
SynchCount = number of scanner synch pulses
MissedSynch = number of missed scanner synch pulses
EmulSynch = is scanner synch pulse emulated
EmulButtons = is button box emulated
%
Buttons = current state of the any button
LastButtonPress = index/indices of the last button(s) pressed
TimeOfLastButtonPress = time (according to the internal clock) of the last button press (any)
BBoxTimeout = set a non-Inf value (in seconds) to wait for button press only = set a negative value (in seconds) to wait even in case of response
== Methods (internal functions) ==
ScannerSynchClass = constructor
delete = destructor
ResetClock = reset internal clock
ResetSynchCount = reset scanner synch pulse counter
SetSynchReadoutTime(t) = blocks scanner synch pulse readout after a pulse for 't' seconds
WaitForSynch = wait until a scanner synch pulse arrives
CheckSynch(t) = wait for a scanner synch pulse for 't' seconds or unitl a scanner synch pulse arrives (whichever first) and returns whether a scanner synch pulse was detected
SetButtonReadoutTime(t) = blocks individual button readout after a button press for 't' seconds (detection of other buttons is still possible)
SetButtonBoxReadoutTime(t) = blocks the whole button box readout after a button press for 't' seconds (detection of other buttons is also not possible)
WaitForButtonPress = wait until a button is pressed
WaitForButtonRelease = wait until a button is released
%
% USAGE
%
% Initialise:
% SSO = ScannerSynchClass;
% % SSO = ScannerSynchClass(1); % emulate scanner synch pulse
% % SSO = ScannerSynchClass(0,1); % emulate button box
% % SSO = ScannerSynchClass(1,1); % emulate scanner synch pulse and button box
%
% Close:
% SSO.delete;
%
% Example for scanner synch pulse #1: - Simple case
% SSO.SetSynchReadoutTime(0.5);
% SSO.TR = 2; % allows detecting missing pulses
% while SSO.SynchCount < 10 % polls 10 pulses
% SSO.WaitForSynch;
% fprintf('Pulse %d: %2.3f. Measured TR = %2.3fs\n',...
% SSO.SynchCount,...
% SSO.TimeOfLastPulse,...
% SSO.MeasuredTR);
% end
%
% Example for scanner synch pulse #2 - Chance for missing pulse
% SSO.SetSynchReadoutTime(0.5);
% SSO.TR = 2; % allows detecting missing pulses
% while SSO.SynchCount < 10 % until 10 pulses
% WaitSecs(Randi(100)/1000); % in every 0-100 ms ...
% if SSO.CheckSynch(0.01) % ... waits for 10 ms for a pulse
% fprintf('Pulse %d: %2.3f. Measured TR = %2.3fs. %d synch pulses has/have been missed\n',...
% SSO.SynchCount,...
% SSO.TimeOfLastPulse,...
% SSO.MeasuredTR,...
% SSO.MissedSynch);
% end
% end
%
% Example for buttons:
% SSO.SetButtonReadoutTime(0.5); % block individual buttons
% % SSO.SetButtonBoxReadoutTime(0.5); % block the whole buttonbox
% % SSO.Keys = {'f1','f2','f3','f4'}; % emulation Buttons #1-#4 with F1-F4
% n = 0;
% % SSO.BBoxTimeout = 1.5; % Wait for button press for 1.5s
% % SSO.BBoxTimeout = -1.5; % Wait for button press for 1.5s even in case of response
% SSO.ResetClock;
% while n ~= 10 % polls 10 button presses
% SSO.WaitForButtonPress; % Wait for any button to be pressed
% SSO.WaitForButtonRelease; % Wait for any button to be released
% % SSO.WaitForButtonPress([],2); % Wait for Button #2
% % SSO.WaitForButtonPress(2); % Wait for any button for 2s (overrides SSO.BBoxTimeout only for this event)
% % SSO.WaitForButtonPress(-2); % Wait for any button for 2s even in case of response (overrides SSO.BBoxTimeout only for this event)
% % SSO.WaitForButtonPress(2,2); % Wait for Button #2 for 2s (overrides SSO.BBoxTimeout only for this event)
% % SSO.WaitForButtonPress(-2,2); % Wait for Button #2 for 2s even in case of response (overrides SSO.BBoxTimeout only for this event)
% n = n + 1;
% fprintf('At %2.3fs, ',SSO.Clock);
% fprintf('Button %d ',SSO.LastButtonPress);
% fprintf('pressed: %2.3fs\n',SSO.TimeOfLastButtonPress);
% end