<?xml version="1.0" encoding="utf-8"?><!DOCTYPE article  PUBLIC '-//OASIS//DTD DocBook XML V4.4//EN'  'http://www.docbook.org/xml/4.4/docbookx.dtd'><article><articleinfo><title>ScannerSynch</title><revhistory><revision><revnumber>36</revnumber><date>2017-08-08 15:53:15</date><authorinitials>JohanCarlin</authorinitials><revremark>github link</revremark></revision><revision><revnumber>35</revnumber><date>2017-03-17 11:34:11</date><authorinitials>kalm</authorinitials></revision><revision><revnumber>34</revnumber><date>2016-02-23 15:06:25</date><authorinitials>TiborAuer</authorinitials></revision><revision><revnumber>33</revnumber><date>2016-02-23 15:03:40</date><authorinitials>TiborAuer</authorinitials></revision><revision><revnumber>32</revnumber><date>2016-02-23 15:00:02</date><authorinitials>TiborAuer</authorinitials></revision><revision><revnumber>31</revnumber><date>2016-02-23 14:59:35</date><authorinitials>TiborAuer</authorinitials></revision><revision><revnumber>30</revnumber><date>2016-02-23 14:58:35</date><authorinitials>TiborAuer</authorinitials></revision><revision><revnumber>29</revnumber><date>2016-02-23 14:49:35</date><authorinitials>TiborAuer</authorinitials></revision><revision><revnumber>28</revnumber><date>2016-02-23 14:46:45</date><authorinitials>TiborAuer</authorinitials></revision><revision><revnumber>27</revnumber><date>2016-02-23 14:43:55</date><authorinitials>TiborAuer</authorinitials></revision><revision><revnumber>26</revnumber><date>2016-02-23 14:43:09</date><authorinitials>TiborAuer</authorinitials></revision><revision><revnumber>25</revnumber><date>2016-02-23 14:02:40</date><authorinitials>TiborAuer</authorinitials></revision><revision><revnumber>24</revnumber><date>2016-02-23 14:02:03</date><authorinitials>TiborAuer</authorinitials></revision><revision><revnumber>23</revnumber><date>2016-02-23 14:00:13</date><authorinitials>TiborAuer</authorinitials></revision><revision><revnumber>22</revnumber><date>2015-09-15 11:28:16</date><authorinitials>TiborAuer</authorinitials></revision><revision><revnumber>21</revnumber><date>2015-09-15 11:27:36</date><authorinitials>TiborAuer</authorinitials></revision><revision><revnumber>20</revnumber><date>2015-09-15 11:27:18</date><authorinitials>TiborAuer</authorinitials></revision><revision><revnumber>19</revnumber><date>2015-09-15 11:24:57</date><authorinitials>TiborAuer</authorinitials></revision><revision><revnumber>18</revnumber><date>2015-09-15 11:15:45</date><authorinitials>TiborAuer</authorinitials></revision><revision><revnumber>17</revnumber><date>2015-09-15 09:18:38</date><authorinitials>TiborAuer</authorinitials></revision><revision><revnumber>16</revnumber><date>2015-09-15 09:18:08</date><authorinitials>TiborAuer</authorinitials></revision><revision><revnumber>15</revnumber><date>2015-09-15 09:05:12</date><authorinitials>TiborAuer</authorinitials></revision><revision><revnumber>14</revnumber><date>2015-09-15 08:50:39</date><authorinitials>TiborAuer</authorinitials></revision><revision><revnumber>13</revnumber><date>2015-09-15 08:50:28</date><authorinitials>TiborAuer</authorinitials></revision><revision><revnumber>12</revnumber><date>2015-09-15 08:49:35</date><authorinitials>TiborAuer</authorinitials></revision><revision><revnumber>11</revnumber><date>2015-09-14 16:51:59</date><authorinitials>TiborAuer</authorinitials></revision><revision><revnumber>10</revnumber><date>2015-09-14 16:51:49</date><authorinitials>TiborAuer</authorinitials></revision><revision><revnumber>9</revnumber><date>2015-09-14 16:51:28</date><authorinitials>TiborAuer</authorinitials></revision><revision><revnumber>8</revnumber><date>2015-09-14 16:49:38</date><authorinitials>TiborAuer</authorinitials></revision><revision><revnumber>7</revnumber><date>2015-09-14 16:48:20</date><authorinitials>TiborAuer</authorinitials></revision><revision><revnumber>6</revnumber><date>2015-09-14 16:47:40</date><authorinitials>TiborAuer</authorinitials></revision><revision><revnumber>5</revnumber><date>2015-09-14 16:46:07</date><authorinitials>TiborAuer</authorinitials></revision><revision><revnumber>4</revnumber><date>2015-09-14 16:45:41</date><authorinitials>TiborAuer</authorinitials></revision><revision><revnumber>3</revnumber><date>2015-09-14 16:43:52</date><authorinitials>TiborAuer</authorinitials></revision><revision><revnumber>2</revnumber><date>2015-09-14 16:43:07</date><authorinitials>TiborAuer</authorinitials></revision><revision><revnumber>1</revnumber><date>2015-09-14 16:42:27</date><authorinitials>TiborAuer</authorinitials></revision></revhistory></articleinfo><section><title>scansync</title><para>For new projects, we recommend using <ulink url="https://github.com/MRC-CBU/mrisync/blob/master/scansync.m">this simple matlab function</ulink> to synchronise with the scanner pulses. For existing projects we continue to support <ulink url="https://imaging.mrc-cbu.cam.ac.uk/mri/ScannerSynch/mri/ScannerSynchClass#">ScannerSynchClass</ulink>, which is described further below. </para></section><section><title>ScannerSynchClass</title><para>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. </para><para>For more information, type in MATLAB </para><programlisting format="linespecific" language="highlight" linenumbering="unnumbered" startinglinenumber="1"><methodname><![CDATA[help]]></methodname><![CDATA[ ]]><methodname><![CDATA[ScannerSynchClass]]></methodname>
</programlisting><caution><para>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! </para></caution><para>Any problems, report them to <ulink url="http://imaging.mrc-cbu.cam.ac.uk/imaging/JohanCarlin">Johan Carlin</ulink>. </para><section><title>Obtain ScannerSynch</title><para>ScannerSynch is available on all relevant PCs (StimPCs, &quot;mimic&quot; PC). You can check out a local version for testing from <ulink url="https://github.com/MRC-CBU/mrisync">our github repo</ulink>. </para></section><section><title>Using ScannerSynch</title><section><title>Initialise</title><itemizedlist><listitem><para>Default. Use only if device (scanner, pulse emulator) is connected (only in StimPCs and mimic PC)! </para></listitem><listitem override="none"><programlisting format="linespecific" language="highlight" linenumbering="unnumbered" startinglinenumber="1"><methodname><![CDATA[SSO]]></methodname><![CDATA[ = ]]><methodname><![CDATA[ScannerSynchClass]]></methodname><![CDATA[;]]>
</programlisting></listitem><listitem><para>Emulations: </para></listitem><listitem override="none"><programlisting format="linespecific" language="highlight" linenumbering="unnumbered" startinglinenumber="1"><methodname><![CDATA[SSO]]></methodname><![CDATA[ = ]]><methodname><![CDATA[ScannerSynchClass]]></methodname><![CDATA[(1);   ]]><lineannotation><![CDATA[% emulate scanner synch pulse]]></lineannotation>
</programlisting></listitem><listitem override="none"><programlisting format="linespecific" language="highlight" linenumbering="unnumbered" startinglinenumber="1"><methodname><![CDATA[SSO]]></methodname><![CDATA[ = ]]><methodname><![CDATA[ScannerSynchClass]]></methodname><![CDATA[(0,1); ]]><lineannotation><![CDATA[% emulate button box]]></lineannotation>
</programlisting></listitem><listitem override="none"><programlisting format="linespecific" language="highlight" linenumbering="unnumbered" startinglinenumber="1"><methodname><![CDATA[SSO]]></methodname><![CDATA[ = ]]><methodname><![CDATA[ScannerSynchClass]]></methodname><![CDATA[(1,1); ]]><lineannotation><![CDATA[% emulate scanner synch pulse and button box]]></lineannotation>
</programlisting></listitem></itemizedlist></section><section><title>Close</title><para>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: </para><itemizedlist><listitem override="none"><programlisting format="linespecific" language="highlight" linenumbering="unnumbered" startinglinenumber="1"><methodname><![CDATA[SSO]]></methodname><![CDATA[.]]><methodname><![CDATA[delete]]></methodname><![CDATA[;]]>
</programlisting></listitem></itemizedlist></section><section><title>Capture scanner synch pulse</title><itemizedlist><listitem><para>Simple case </para></listitem><listitem override="none"><programlisting format="linespecific" language="highlight" linenumbering="unnumbered" startinglinenumber="1"><methodname><![CDATA[SSO]]></methodname><![CDATA[.]]><methodname><![CDATA[SetSynchReadoutTime]]></methodname><![CDATA[(0.5); ]]><lineannotation><![CDATA[% make sure that you do not detect the same pule twice]]></lineannotation>
<methodname><![CDATA[SSO]]></methodname><![CDATA[.]]><methodname><![CDATA[TR]]></methodname><![CDATA[ = 2;                   ]]><lineannotation><![CDATA[% allows detecting missing pulses]]></lineannotation>
<token><![CDATA[while]]></token><![CDATA[ ]]><methodname><![CDATA[SSO]]></methodname><![CDATA[.]]><methodname><![CDATA[SynchCount]]></methodname><![CDATA[ < 10     ]]><lineannotation><![CDATA[% polls 10 pulses]]></lineannotation>
<![CDATA[    ]]><methodname><![CDATA[SSO]]></methodname><![CDATA[.]]><methodname><![CDATA[WaitForSynch]]></methodname><![CDATA[;]]>
<![CDATA[    ]]><methodname><![CDATA[fprintf]]></methodname><![CDATA[(]]><phrase><![CDATA[']]></phrase><phrase><![CDATA[Pulse %d: %2.3f. Measured TR = %2.3fs\n']]></phrase><![CDATA[,]]><lineannotation><![CDATA[...]]></lineannotation>
<![CDATA[        ]]><methodname><![CDATA[SSO]]></methodname><![CDATA[.]]><methodname><![CDATA[SynchCount]]></methodname><![CDATA[,]]><lineannotation><![CDATA[...]]></lineannotation>
<![CDATA[        ]]><methodname><![CDATA[SSO]]></methodname><![CDATA[.]]><methodname><![CDATA[TimeOfLastPulse]]></methodname><![CDATA[,]]><lineannotation><![CDATA[...]]></lineannotation>
<![CDATA[        ]]><methodname><![CDATA[SSO]]></methodname><![CDATA[.]]><methodname><![CDATA[MeasuredTR]]></methodname><![CDATA[);]]>
<token><![CDATA[end]]></token>
</programlisting></listitem><listitem><para>Chance for missing pulse </para></listitem><listitem override="none"><programlisting format="linespecific" language="highlight" linenumbering="unnumbered" startinglinenumber="1"><methodname><![CDATA[SSO]]></methodname><![CDATA[.]]><methodname><![CDATA[SetSynchReadoutTime]]></methodname><![CDATA[(0.5);  ]]><lineannotation><![CDATA[% make sure that you do not detect the same pule twice]]></lineannotation>
<methodname><![CDATA[SSO]]></methodname><![CDATA[.]]><methodname><![CDATA[TR]]></methodname><![CDATA[ = 2;                    ]]><lineannotation><![CDATA[% allows detecting missing pulses]]></lineannotation>
<token><![CDATA[while]]></token><![CDATA[ ]]><methodname><![CDATA[SSO]]></methodname><![CDATA[.]]><methodname><![CDATA[SynchCount]]></methodname><![CDATA[ < 10      ]]><lineannotation><![CDATA[% until 10 pulses]]></lineannotation>
<![CDATA[    ]]><methodname><![CDATA[WaitSecs]]></methodname><![CDATA[(]]><methodname><![CDATA[Randi]]></methodname><![CDATA[(100)/1000); ]]><lineannotation><![CDATA[% in every 0-100 ms ...]]></lineannotation>
<![CDATA[    ]]><token><![CDATA[if]]></token><![CDATA[ ]]><methodname><![CDATA[SSO]]></methodname><![CDATA[.]]><methodname><![CDATA[CheckSynch]]></methodname><![CDATA[(0.01)    ]]><lineannotation><![CDATA[% ... waits for 10 ms for a pulse]]></lineannotation>
<![CDATA[        ]]><methodname><![CDATA[fprintf]]></methodname><![CDATA[(]]><phrase><![CDATA[']]></phrase><phrase><![CDATA[Pulse %d: %2.3f. Measured TR = %2.3fs. %d synch pulses has/have been missed\n']]></phrase><![CDATA[,]]><lineannotation><![CDATA[...]]></lineannotation>
<![CDATA[            ]]><methodname><![CDATA[SSO]]></methodname><![CDATA[.]]><methodname><![CDATA[SynchCount]]></methodname><![CDATA[,]]><lineannotation><![CDATA[...]]></lineannotation>
<![CDATA[            ]]><methodname><![CDATA[SSO]]></methodname><![CDATA[.]]><methodname><![CDATA[TimeOfLastPulse]]></methodname><![CDATA[,]]><lineannotation><![CDATA[...]]></lineannotation>
<![CDATA[            ]]><methodname><![CDATA[SSO]]></methodname><![CDATA[.]]><methodname><![CDATA[MeasuredTR]]></methodname><![CDATA[,]]><lineannotation><![CDATA[...]]></lineannotation>
<![CDATA[            ]]><methodname><![CDATA[SSO]]></methodname><![CDATA[.]]><methodname><![CDATA[MissedSynch]]></methodname><![CDATA[);]]>
<![CDATA[    ]]><token><![CDATA[end]]></token>
<token><![CDATA[end]]></token>
</programlisting></listitem></itemizedlist></section><section><title>Capture button presses</title><itemizedlist><listitem override="none"><programlisting format="linespecific" language="highlight" linenumbering="unnumbered" startinglinenumber="1"><methodname><![CDATA[SSO]]></methodname><![CDATA[.]]><methodname><![CDATA[SetButtonReadoutTime]]></methodname><![CDATA[(0.5);      ]]><lineannotation><![CDATA[% block individual buttons for 0.5s after button press so we will not detect the same button press twice]]></lineannotation>
<lineannotation><![CDATA[% SSO.SetButtonBoxReadoutTime(0.5); % block the whole buttonbox for 0.5s after button press ]]></lineannotation>
<lineannotation><![CDATA[% SSO.Keys = {'f1','f2','f3','f4'}; % emulation Buttons #1-#4 with F1-F4]]></lineannotation>
<methodname><![CDATA[n]]></methodname><![CDATA[ = 0;]]>
<lineannotation><![CDATA[% SSO.BBoxTimeout = 1.5;            % Wait for button press for 1.5s]]></lineannotation>
<lineannotation><![CDATA[% SSO.BBoxTimeout = -1.5;           % Wait for button press for 1.5s even in case of response]]></lineannotation>
<methodname><![CDATA[SSO]]></methodname><![CDATA[.]]><methodname><![CDATA[ResetClock]]></methodname><![CDATA[;]]>
<token><![CDATA[while]]></token><![CDATA[ ]]><methodname><![CDATA[n]]></methodname><![CDATA[ ~= 10                       ]]><lineannotation><![CDATA[% polls 10 button presses]]></lineannotation>
<![CDATA[    ]]><methodname><![CDATA[SSO]]></methodname><![CDATA[.]]><methodname><![CDATA[WaitForButtonPress]]></methodname><![CDATA[;         ]]><lineannotation><![CDATA[% Wait for any button to be pressed]]></lineannotation>
<![CDATA[    ]]><lineannotation><![CDATA[% SSO.WaitForButtonRelease;       % Wait for any button to be released]]></lineannotation>
<![CDATA[    ]]><lineannotation><![CDATA[% SSO.WaitForButtonPress([],2); % Wait for Button #2]]></lineannotation>
<![CDATA[    ]]><lineannotation><![CDATA[% SSO.WaitForButtonPress(2);    % Wait for any button for 2s (overrides SSO.BBoxTimeout only for this event)]]></lineannotation>
<![CDATA[    ]]><lineannotation><![CDATA[% SSO.WaitForButtonPress(-2);   % Wait for any button for 2s even in case of response (overrides SSO.BBoxTimeout only for this event)]]></lineannotation>
<![CDATA[    ]]><lineannotation><![CDATA[% SSO.WaitForButtonPress(2,2);  % Wait for Button #2 for 2s (overrides SSO.BBoxTimeout only for this event)]]></lineannotation>
<![CDATA[    ]]><lineannotation><![CDATA[% SSO.WaitForButtonPress(-2,2); % Wait for Button #2 for 2s even in case of response (overrides SSO.BBoxTimeout only for this event)]]></lineannotation>
<![CDATA[    ]]><methodname><![CDATA[n]]></methodname><![CDATA[ = ]]><methodname><![CDATA[n]]></methodname><![CDATA[ + 1;]]>
<![CDATA[    ]]><methodname><![CDATA[fprintf]]></methodname><![CDATA[(]]><phrase><![CDATA[']]></phrase><phrase><![CDATA[At %2.3fs, ']]></phrase><![CDATA[,]]><methodname><![CDATA[SSO]]></methodname><![CDATA[.]]><methodname><![CDATA[Clock]]></methodname><![CDATA[);]]>
<![CDATA[    ]]><methodname><![CDATA[fprintf]]></methodname><![CDATA[(]]><phrase><![CDATA[']]></phrase><phrase><![CDATA[Button %d ']]></phrase><![CDATA[,]]><methodname><![CDATA[SSO]]></methodname><![CDATA[.]]><methodname><![CDATA[LastButtonPress]]></methodname><![CDATA[);]]>
<![CDATA[    ]]><methodname><![CDATA[fprintf]]></methodname><![CDATA[(]]><phrase><![CDATA[']]></phrase><phrase><![CDATA[pressed: %2.3fs\n']]></phrase><![CDATA[,]]><methodname><![CDATA[SSO]]></methodname><![CDATA[.]]><methodname><![CDATA[TimeOfLastButtonPress]]></methodname><![CDATA[);]]>
<token><![CDATA[end]]></token>
</programlisting></listitem></itemizedlist></section></section></section></article>