/
FullFieldNoise.m
88 lines (66 loc) · 3.59 KB
/
FullFieldNoise.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
classdef FullFieldNoise < io.github.stage_vss.protocols.StageProtocol
properties
amp % Output amplifier
preTime = 500 % Noise leading duration (ms)
stimTime = 1000 % Noise duration (ms)
tailTime = 500 % Noise trailing duration (ms)
backgroundIntensity = 0.5 % Background light intensity (0-1)
centerOffset = [0, 0] % Noise [x, y] center offset (pixels)
numberOfAverages = uint16(5) % Number of epochs
interpulseInterval = 0 % Duration between noise (s)
end
properties (Hidden)
ampType
end
methods
function didSetRig(obj)
didSetRig@io.github.stage_vss.protocols.StageProtocol(obj);
[obj.amp, obj.ampType] = obj.createDeviceNamesProperty('Amp');
end
function p = getPreview(obj, panel)
if isempty(obj.rig.getDevices('Stage'))
p = [];
return;
end
p = io.github.stage_vss.previews.StagePreview(panel, @()obj.createPresentation(), ...
'windowSize', obj.rig.getDevice('Stage').getCanvasSize());
end
function prepareRun(obj)
prepareRun@io.github.stage_vss.protocols.StageProtocol(obj);
obj.showFigure('symphonyui.builtin.figures.ResponseFigure', obj.rig.getDevice(obj.amp));
obj.showFigure('symphonyui.builtin.figures.MeanResponseFigure', obj.rig.getDevice(obj.amp));
obj.showFigure('io.github.stage_vss.figures.FrameTimingFigure', obj.rig.getDevice('Stage'));
end
function p = createPresentation(obj)
canvasSize = obj.rig.getDevice('Stage').getCanvasSize();
p = stage.core.Presentation((obj.preTime + obj.stimTime + obj.tailTime) * 1e-3);
p.setBackgroundColor(obj.backgroundIntensity);
noise = stage.builtin.stimuli.Rectangle();
noise.size = canvasSize*2;
noise.position = canvasSize/2 + obj.centerOffset;
p.addStimulus(noise);
noiseColor = stage.builtin.controllers.PropertyController(noise, 'color', @(state)rand());
p.addController(noiseColor);
noiseVisible = stage.builtin.controllers.PropertyController(noise, 'visible', @(state)state.time >= obj.preTime * 1e-3 && state.time < (obj.preTime + obj.stimTime) * 1e-3);
p.addController(noiseVisible);
end
function prepareEpoch(obj, epoch)
prepareEpoch@io.github.stage_vss.protocols.StageProtocol(obj, epoch);
device = obj.rig.getDevice(obj.amp);
duration = (obj.preTime + obj.stimTime + obj.tailTime) / 1e3;
epoch.addDirectCurrentStimulus(device, device.background, duration, obj.sampleRate);
epoch.addResponse(device);
end
function prepareInterval(obj, interval)
prepareInterval@io.github.stage_vss.protocols.StageProtocol(obj, interval);
device = obj.rig.getDevice(obj.amp);
interval.addDirectCurrentStimulus(device, device.background, obj.interpulseInterval, obj.sampleRate);
end
function tf = shouldContinuePreparingEpochs(obj)
tf = obj.numEpochsPrepared < obj.numberOfAverages;
end
function tf = shouldContinueRun(obj)
tf = obj.numEpochsCompleted < obj.numberOfAverages;
end
end
end