Skip to main content
  • Home
  • Development
  • Documentation
  • Donate
  • Operational login
  • Browse the archive

swh logo
SoftwareHeritage
Software
Heritage
Archive
Features
  • Search

  • Downloads

  • Save code now

  • Add forge now

  • Help

Revision 4dbf0ec391b877f21402aed9e8351fe8f7468d14 authored by D019 Rig on 19 December 2019, 23:25:22 UTC, committed by D019 Rig on 19 December 2019, 23:25:22 UTC
Update Calibration
1 parent 4cac1d4
  • Files
  • Changes
  • cb6e09d
  • /
  • Tools
  • /
  • VOR_Analysis
  • /
  • VORstim.m
Raw File Download

To reference or cite the objects present in the Software Heritage archive, permalinks based on SoftWare Hash IDentifiers (SWHIDs) must be used.
Select below a type of object currently browsed in order to display its associated SWHID and permalink.

  • revision
  • directory
  • content
revision badge
swh:1:rev:4dbf0ec391b877f21402aed9e8351fe8f7468d14
directory badge Iframe embedding
swh:1:dir:f5b842836a02193b4b53d8570e1b32a462cadd75
content badge Iframe embedding
swh:1:cnt:cb14ff937dd11ce8d53dbb4a1e9644fef25337ca

This interface enables to generate software citations, provided that the root directory of browsed objects contains a citation.cff or codemeta.json file.
Select below a type of object currently browsed in order to generate citations for them.

  • revision
  • directory
  • content
Generate software citation in BibTex format (requires biblatex-software package)
Generating citation ...
Generate software citation in BibTex format (requires biblatex-software package)
Generating citation ...
Generate software citation in BibTex format (requires biblatex-software package)
Generating citation ...
VORstim.m
function R = VORstim(data, tstart, tstop, freq, labels, timepts,velthresh, pulseDur, ploton,mask)
% VORstepfit.m
% Input:
% data      - dat structure with channels
%   'htvel'
%   'hhvel'
%   'hepos'
%   'vepos'
%   'stim pul'
% tstart     - time window start times
% tstop     - time wndow stop times
% sinefreq  - frequency of stimulus for each segment
% labels    - label for each segment
% timepts   - time label for each segment (optional)
% velthres  - velocity threshold
%
% Output: R.data structure with data and header

%% Get sampling rate
samplerate = data(1).samplerate;
stimL = 'TTL3';
stimR = 'TTL4';
[~, filename] = fileparts(pwd);


%% Set up cell structure to hold all R.data
nsegs = length(tstart);
header = {'timept','start','end','saccadeFrac','nGoodCycles'};
nCols = length(header);
R.data = NaN(length(tstart),nCols); % Main array for storing R.data
R.header = header;
R.labels = labels;
R.means{nsegs} = [];

if exist('timepts','var')
    R.data(:,strcmpi(header,'timept')) = timepts;
else
    R.data(:,strcmpi(header,'timept')) = mean([tstart tstop],2);
end

%% Default parameters
if ~exist('velthresh','var')
    velthresh = 100;
    oldSaccade = 0;
end

if ~exist('ploton','var')
    ploton = 1;
end
if isempty(pulseDur)
   pulseDur = 1./(freq*2);
   pulseDur = .5*ones(1,nsegs);
end

%% define time before and after saccade to remove
presaccade = 0.1;
postsaccade = 0.3;

fprintf('Threshold = %g\n',velthresh)
fprintf('Presaccade = %g ms\n',presaccade)
fprintf('Postsaccade = %g ms\n',postsaccade)

presaccadeN = round(presaccade*samplerate); %convert back to # of datapoints
postsaccadeN = round(postsaccade*samplerate); %convert back to # of datapoints

%% Cycle through each segment
for count = 1:nsegs
    
    % Skip segments where frequency is given (analyze separately)
    if ~mask(count)
        continue
    end
    
    % Get the current times, label
    timestart = tstart(count);
    timeend = tstop(count);
    datatype = labels{count};
    
    % fill data matrix with file information
    R.data(count,strcmpi(header,'start'))= timestart;
    R.data(count,strcmpi(header,'end'))= timeend;
    
    % Segment data to current time segment
    dataseg = datseg(data, [tstart(count) tstop(count)]);
    
    % Read in data
    eyeposH         = datchan(dataseg,'hepos');
    eyevelH         = datchan(dataseg,'hevel');
    
    % Determine left or right or both
    Rside = ~isempty(strfind(datatype, 'R'));
    Lside = ~isempty(strfind(datatype, 'L'));
    
    tBefore = .1;  % Time before stim start to plot
%     tAfter = .5;  % Time after stim end to plot
    tAfter = .2;  % Time after stim end to plot
    
    if Rside && ~Lside
        stimChan = stimR;
    else
        stimChan = stimL;
    end
    
    stimPlus = datchandata(dataseg,[stimChan '+']);
    stimMinus = datchandata(dataseg,[stimChan '-']);
%     stimon = datchandata(dataseg,[stimChan '+']);
%     stimoff = datchandata(dataseg,[stimChan '-']);
    if stimMinus(1) < stimPlus(1)
        stimMinus(1) = []; end
    if stimPlus(end) > stimMinus(end)
        stimPlus(end) = [];
    end
        
%     figure; plot(stimPlus,ones(size(stimPlus)),'+r',stimMinus,ones(size(stimMinus)),'+b')

    % Deal with multi-pulse trains of stim
    isi = diff(stimPlus);
    isithresh = .2 % Minimum distance between stims to consider separate pulse (eg. 10 Hz = 100 ms)
    stimon = stimPlus(find(isi>isithresh)+1); stimon(end)=[];
    stimoff = stimMinus(isi>isithresh); stimoff(1)=[];
%     figure; plot(stimon,ones(size(stimon)),'+r',stimoff,ones(size(stimoff)),'+b')

    shortisi = isi(isi<isithresh); 
    stimfreq = mean(1./shortisi)
    
    nstims = length(stimon);   
    
    period = mean(diff(stimon))
    duration = mode(stimoff-stimon)
    
    if Rside && Lside
        T = period;
    elseif Lside || Rside
        T = tBefore + duration + tAfter;
    else
        T = period;
    end
    
    %% Calculate the eye velocity signal from the eye position signal
    % by differentiating eye position signal
    %     smoothfactor = 50;
    %     eyevelH =eyeposH; eyevelH.chanlabel = 'hevel'; eyevelH.units = 'deg/s';
    %     eyevelH.data =[diff(smooth(eyeposH.data,1)); 0]*samplerate;
    %     eyevelH =  smooth(filt100Hz(eyevelH),smoothfactor);
    
    %% Find saccades in eye movement and blank out an interval on either side
    eyevelDesaccadeRaw = desaccadeVel(eyevelH.data, velthresh, presaccadeN, postsaccadeN);
    omitH = isnan(eyevelDesaccadeRaw);
    
    % Fraction saccades
    R.data(count,strcmp(header,'saccadeFrac')) = mean(omitH);
    
    % Add channel heposDes with NaNs for saccades
    eyeposDesaccade = eyeposH;
    eyeposDesaccade.data(omitH) = NaN;
    eyeposDesaccade.chanlabel = 'heposDes';
    dataseg(end+1) = eyeposDesaccade;
    
    % Add channel hevelDes with NaNs for saccades
    eyevelDesaccade = eyevelH;
    eyevelDesaccade.data(omitH) = NaN;
    eyevelDesaccade.chanlabel = 'hevelDes';
    dataseg(end+1) = eyevelDesaccade;
    
    dataseg(datchanind(dataseg,{'hepos1','hepos2'})) = [];    
    
    %% Calculate means    
    [segMeansCycle, nGoodCycles] = datsegmeans(dataseg,stimon,[-tBefore T-tBefore],0,1); % 1 = shiftsegs; 1 = ignore segs with NaNs
    segSemsCycle = datsegsems(dataseg,stimon,[-tBefore T-tBefore],0,1); % 1 = shiftsegs; 1 = ignore segs with NaNs
    [segMeans, nCycles] = datsegmeans(dataseg,stimon,[-tBefore T-tBefore],0,0); % 1 = shiftsegs; 0 = NaNs %*** changes shiftsegs to 0 3/17/14
    segSems = datsegsems(dataseg,stimon,[-tBefore T-tBefore],0,0); % 1 = shiftsegs; 0 = NaNs %*** changes shiftsegs to 0 3/17/14    
   
    %% Make stim chans for plotting: TTL1 high ==> +1; TTL2 high ==> -1; else 0
    stimData1 = cumsum(datchandata(segMeansCycle,[stimL '+']) -datchandata(segMeansCycle,[stimL '-']) );
    stimData1 = stimData1>mean(stimData1);
    
    stimData2 = cumsum(datchandata(segMeansCycle,[stimR '+']) -datchandata(segMeansCycle,[stimR '-']) );
    stimData2 = stimData2>mean(stimData2);
    
    stimdat = datchan(segMeansCycle,[stimL '+']);
    stimdat.data = stimData1-stimData2; stimdat.chanlabel = 'stim';
    
    segMeansCycle(end+1) = stimdat;
    segMeans(end+1) = stimdat;    
    
    % Store the current means
    R.meansCycle{count} = segMeansCycle; % Cuts out entire cycle with saccade, better option
    R.means{count} = segMeans;
    R.data(count,strcmp(header,'nGoodCycles')) = nGoodCycles;
    R.semsCycle{count} = segSemsCycle;
    R.sems{count} = segSems;

    
    %% Plot data
    if ploton
        % Plot eye velocity trace with/without saccades
        figure(count); pause(.01);clf
        plot([eyevelDesaccade,eyevelH],'Overlaid',1); ylim([-100 100])
        title(datatype)
        xlim([eyevelDesaccade.tstart eyevelDesaccade.tend])
        pause(.01);
        
        % Plot the cycle means
        figure(count+100); pause(.01); clf
        if ~all(isnan(datchandata(segMeansCycle,'heposDes')))
%             plot(datchan(segMeans,{'stim','hevelDes','hepos'}),'Color',[.5 .5 .5]); hold on
            plot(datchan(segMeansCycle,{'stim','hevelDes','heposDes'}),'Color','k')
        end
        subplot(3,1,1);
        title(sprintf('%s %s %.1f',filename,datatype, timepts(count)),'interpreter','none')
        subplot(3,1,2);
        title(sprintf('%i/%i good cycles',nGoodCycles,nCycles))
        print(gcf,['resultfig' datatype '.jpg'],'-djpeg')
        pause(.01)

%% Plot SEM for entire cycle v. pointbnypoint desaccading only - velocity
% tt = dattime(segMeans(1));
% figure(count+300); clf;
% subplot(2,1,1); title([sprintf('%s %s %.1f\n',filename,datatype, timepts(count))...
%     sprintf('Cycle means, n = %i\n',nGoodCycles)],'interpreter','none' )
% fillerror(tt,datchandata(segMeansCycle,'hevelDes'),datchandata(segSemsCycle,'hevelDes'),'k',1);
% xlim([tt(1) tt(end)])
% subplot(2,1,2); title(sprintf('Desaccaded means, n = %i',nCycles))
% fillerror(tt,datchandata(segMeans,'hevelDes'),datchandata(segSems,'hevelDes'),'k',1);
% 
% xlim([tt(1) tt(end)])
%     export_fig(sprintf('%s %s %.1f',filename,datatype, timepts(count)), '-painters', '-pdf')


        
    end
end
The diff you're trying to view is too large. Only the first 1000 changed files have been loaded.
Showing with 0 additions and 0 deletions (0 / 0 diffs computed)
swh spinner

Computing file changes ...

back to top

Software Heritage — Copyright (C) 2015–2025, The Software Heritage developers. License: GNU AGPLv3+.
The source code of Software Heritage itself is available on our development forge.
The source code files archived by Software Heritage are available under their own copyright and licenses.
Terms of use: Archive access, API— Content policy— Contact— JavaScript license information— Web API