Diff for "ScannerSynch" - CBU MRI facility Wiki
location: Diff for "ScannerSynch"
Differences between revisions 1 and 36 (spanning 35 versions)
Revision 1 as of 2015-09-14 16:42:27
Size: 225
Editor: TiborAuer
Comment:
Revision 36 as of 2017-08-08 15:53:15
Size: 4597
Editor: JohanCarlin
Comment: github link
Deletions are marked like this. Additions are marked like this.
Line 1: Line 1:
= ScannerSynch =
ScannerSynch provides an interface for National Instruments PCI 6503 card used to capture all pulses (scanner synch pulse and button pulses alike).
= scansync =
For new projects, we recommend using [[https://github.com/MRC-CBU/mrisync/blob/master/scansync.m|this simple matlab function]] to synchronise with the scanner pulses. For existing projects we continue to support ScannerSynchClass, which is described further below.
Line 4: Line 4:
Any problems, report them to [[TiborAuer|Tibor Auer]]. = ScannerSynchClass =
ScannerSynch provides an interface for National Instruments PCI 6503 card used to capture all pulses (scanner synch pulse and button pulses alike) when using MATLAB.

For more information, type in MATLAB
{{{#!highlight matlab numbers=off
help ScannerSynchClass
}}}

{{{#!wiki caution
N.B.: National Instruments PCI 6503 card does not monitor pulses in the background, so you have to make sure that you wait for any pulse before it comes!
}}}

Any problems, report them to [[http://imaging.mrc-cbu.cam.ac.uk/imaging/JohanCarlin|Johan Carlin]].

<<TableOfContents(3)>>

== Obtain ScannerSynch ==

ScannerSynch is available on all relevant PCs (StimPCs, "mimic" PC). You can check out a local version for testing from [[https://github.com/MRC-CBU/mrisync|our github repo]].

== Using ScannerSynch ==
=== Initialise ===
 * Default. Use only if device (scanner, pulse emulator) is connected (only in StimPCs and mimic PC)!
 . {{{#!highlight matlab numbers=off
SSO = ScannerSynchClass;
}}}
 * Emulations:
 . {{{#!highlight matlab numbers=off
SSO = ScannerSynchClass(1); % emulate scanner synch pulse
}}}
 . {{{#!highlight matlab numbers=off
SSO = ScannerSynchClass(0,1); % emulate button box
}}}
 . {{{#!highlight matlab numbers=off
SSO = ScannerSynchClass(1,1); % emulate scanner synch pulse and button box
}}}

=== Close ===
!ScannerSynchClass has a destructor, which is automatically triggered if the object is deleted (e.g. clear, returning function). If you use a script, however, it does not perform any auto-clear, so you have to destroy the object manually:
 . {{{#!highlight matlab numbers=off
SSO.delete;
}}}

=== Capture scanner synch pulse ===
 * Simple case
 . {{{#!highlight matlab numbers=off
SSO.SetSynchReadoutTime(0.5); % make sure that you do not detect the same pule twice
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
}}}
 * Chance for missing pulse
 . {{{#!highlight matlab numbers=off
SSO.SetSynchReadoutTime(0.5); % make sure that you do not detect the same pule twice
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
}}}

=== Capture button presses ===
 . {{{#!highlight matlab numbers=off
SSO.SetButtonReadoutTime(0.5); % block individual buttons for 0.5s after button press so we will not detect the same button press twice
% SSO.SetButtonBoxReadoutTime(0.5); % block the whole buttonbox for 0.5s after button press
% 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
}}}

scansync

For new projects, we recommend using this simple matlab function to synchronise with the scanner pulses. For existing projects we continue to support ScannerSynchClass, which is described further below.

ScannerSynchClass

ScannerSynch provides an interface for National Instruments PCI 6503 card used to capture all pulses (scanner synch pulse and button pulses alike) when using MATLAB.

For more information, type in MATLAB

help ScannerSynchClass

N.B.: National Instruments PCI 6503 card does not monitor pulses in the background, so you have to make sure that you wait for any pulse before it comes!

Any problems, report them to Johan Carlin.

Obtain ScannerSynch

ScannerSynch is available on all relevant PCs (StimPCs, "mimic" PC). You can check out a local version for testing from our github repo.

Using ScannerSynch

Initialise

  • Default. Use only if device (scanner, pulse emulator) is connected (only in StimPCs and mimic PC)!
  • SSO = ScannerSynchClass;
    
  • Emulations:
  • 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

ScannerSynchClass has a destructor, which is automatically triggered if the object is deleted (e.g. clear, returning function). If you use a script, however, it does not perform any auto-clear, so you have to destroy the object manually:

  • SSO.delete;
    

Capture scanner synch pulse

  • Simple case
  • SSO.SetSynchReadoutTime(0.5); % make sure that you do not detect the same pule twice
    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
    
  • Chance for missing pulse
  • SSO.SetSynchReadoutTime(0.5);  % make sure that you do not detect the same pule twice
    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
    

Capture button presses

  • SSO.SetButtonReadoutTime(0.5);      % block individual buttons for 0.5s after button press so we will not detect the same button press twice
    % SSO.SetButtonBoxReadoutTime(0.5); % block the whole buttonbox for 0.5s after button press 
    % 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
    

None: ScannerSynch (last edited 2017-08-08 15:53:15 by JohanCarlin)