> For the complete documentation index, see [llms.txt](https://zapit.gitbook.io/user-guide/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://zapit.gitbook.io/user-guide/running-experiments/matlab/running-an-experiment-in-matlab.md).

# Running an Experiment in MATLAB

The following example function presents 20 random stimuli using software timing.

```matlab
function myStimPresenter
    
    % Get the API object from the base workspace
    hZP = zapit.utils.getObject;
    if isempty(hZP)
        return
    end

    if hZP.isReadyToStim == false
        fprintf('Zapit is not ready to stimulate.\n')
        return
    end

    % Present 20 random stimuli without waiting for a hardware trigger
    for ii = 1:20
        hZP.sendSamples('hardwareTriggered',false) % Starts right away
        pause(1) % Wait approx 1s 
        hZP.stopOptoStim
        pause(0.3) % Because of https://github.com/Zapit-Optostim/zapit/issues/102
    end

end
```

The following function presents 20 random stimuli using an external hardware trigger:

```matlab
function myStimPresenter
    
    % Get the API object from the base workspace
    hZP = zapit.utils.getObject;
    if isempty(hZP)
        return
    end

    if hZP.isReadyToStim == false
        fprintf('Zapit is not ready to stimulate.\n')
        return
    end

    % Present 20 random 1 second stimuli without waiting for a hardware trigger
    for ii = 1:20
        hZP.sendSamples('hardwareTriggered',true,'stimDurationSeconds',1)
    end
end
```

{% hint style="warning" %}
Note the 0.3 seconds pause after the `stopOptoStim in the first example`. [This is to take into account ](https://github.com/Zapit-Optostim/zapit/issues/102)the laser power ramp-down time which is triggered by stopOptoStim. The system will **not** respond to an external trigger during this period in hardware triggered mode. The pause is almost certainly only needed during demo code. In reality it is unlikely one trial will follow the previous one with a latency of <300 ms. Add a timeout to your behavior code to avoid this should it be a possibility.&#x20;
{% endhint %}
