User Tools

Site Tools


public:data_natneuro_2013_kahn:matlab_scripts:driftcov
driftCov.m
function [evokedSignal, stimContextSeq, coordSeq, stimSeq] = driftCov(dataset, subjectID, elasticityCoefficient, saveBool)
%
%	Create drift covariate with specified elasticityCoefficient, using
%	perceptual space sequences specific to FaceSpace project
%
%   PS: elasticityCoefficient should be between 0 and 100
%   _______________________________________________
%   by Marcelo G Mattar (05/24/2013)
%   mattar@sas.upenn.edu

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% CHECK INPUTS
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

if nargin < 4
    saveBool = false;
end

if nargin < 3
    elasticityCoefficient = 50;
end

% Check whether adaptFactor is integer and within acceptable values
if mod(elasticityCoefficient,1) || elasticityCoefficient<0 || elasticityCoefficient>100
    error('adaptFactor should be an integer between 0 and 100');
end


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% INITIALIZE ALL VARIABLES
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

baseDir = '/jet/aguirre/FaceSpace/';

% Load the numerical sequence
switch dataset
    case 'MDS_RGI'
        REFsdir = [baseDir dataset '/PrepScripts/REFs/'];
        seqFile = [REFsdir 'MDS_RGI_Seq_Numerical.ref'];
        stimSeq = readref(seqFile,2);
        % these were taken directly from 'Eigenvectors and values for one perceptual
        % matrix.xls'
        coordinatelist = [NaN NaN NaN
            -0.43815233	0.043993216	0.000988356
            -0.16477091	-0.048723129	-0.090894096
            -0.24489513	-0.16840255	0.18525238
            -0.45287893	0.11428962	-0.009152772
            -0.1665505	-0.004077156	-0.10680729
            -0.1814501	-0.15005818	0.15631847
            -0.21176483	0.44336182	0.13605036
            0.10204564	0.37570476	0.03404298
            0.04136971	0.18141115	0.23324493
            -0.2850246	-0.020309502	-0.10849088
            0.032296558	-0.18105101	-0.14802057
            0.024659614	-0.30407585	0.13620073
            -0.29424431	0.051400923	-0.088352834
            0.12463116	-0.1310324	-0.10569481
            0.027527177	-0.29119301	0.18201885
            -0.061689789	0.39513857	-0.012518304
            0.30989956	0.22948687	-0.020096972
            0.31145212	0.10152802	0.1321107
            -0.089943402	-0.14891391	-0.15344147
            0.23075579	-0.21014674	-0.16836819
            0.14466016	-0.31300308	0.15095023
            -0.07980242	-0.053859279	-0.19630964
            0.23728748	-0.15372509	-0.14647582
            0.14153114	-0.31762302	0.058781603
            0.20348456	0.26825272	-0.067086623
            0.40232804	0.23268949	-0.11921149
            0.33723857	0.058936748	0.13496217];
    case 'MDS_Multi'
        REFsdir = [baseDir dataset '/PrepScripts/REFs/' subjectID '/'];
        seqFile = [REFsdir 'sequence_numerical.ref'];
        fid = fopen(seqFile);
        temp = textscan(fid,'%s'); % reading in as strings as the # of headerlines is variable
        temp = temp{1}; %textscan outputs a cell
        temp = temp(length(temp)-1623:end);
        for m = 1:length(temp)
            if isempty(strfind(temp{m},';'))
                sequence(m,1) = str2num(temp{m});
            end
        end
        fclose('all');
        stimSeq = sequence;
        % these were taken directly from 'Eigenvectors and values for one perceptual
        % matrix.xls'
        coordinatelist = [NaN NaN NaN
            -0.429506025	0.14859489	0.057221819
            -0.446558075	-0.072662325	0.082842149
            -0.39130837	-0.247629855	0.099019244
            -0.306944082	0.269967421	0.042639309
            -0.433483984	-0.028763763	0.066148744
            -0.093075036	-0.246233099	0.113647528
            -0.082223497	0.304004574	0.19419913
            0.184970441	0.114906441	0.338685284
            0.190919212	-0.130203479	0.237115284
            -0.370009793	0.128845431	-0.044180839
            -0.337408573	-0.147048324	-0.05693726
            -0.234586561	-0.268410842	-0.033561283
            -0.232464348	0.280904757	-0.012625924
            -0.102973475	-0.102022412	-0.065337964
            0.177664453	-0.274895784	-0.022533763
            0.241218979	0.328820781	0.062569699
            0.437924802	0.035934599	0.151015462
            0.34263309	-0.143838716	0.092513187
            -0.17387477	0.207994257	-0.244505531
            -0.181519001	-0.135689451	-0.252204393
            0.080987665	-0.281117325	-0.161772301
            0.074844511	0.302484149	-0.260652118
            0.446598907	-0.030520112	-0.129587393
            0.260651704	-0.243830992	-0.079453789
            0.388182313	0.277024364	-0.103839934
            0.538898617	0.065782352	-0.072075491
            0.450440895	-0.112397537	0.001651143];
end



%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% CREATE CONTEXT SEQUENCE
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

k = elasticityCoefficient/100; % k is the drifting factor, now scaled between 0 and 1

% Create a sequence of 3-dimensional coordinates
coordSeq = [coordinatelist(stimSeq+1,1) coordinatelist(stimSeq+1,2) coordinatelist(stimSeq+1,3)];
seqLen = size(coordSeq,1);
stimContextSeq = zeros(size(coordSeq));

% Start in the state [0 0 0]
stimContextSeq(1,:) = [0 0 0];

% Now, drift in the perceptual space depending on presented stimulus
for i=2:seqLen
    % When the current trial is a NaN (blank) trial
    if any(isnan(coordSeq(i-1,:)))
        % Model in which the context drifts back to the center (prototype)
        %stimContextSeq(i,:) = stimContextSeq(i-1,:) + k*([0 0 0] - stimContextSeq(i-1,:));
        % Model in which the contexts stays where it was
        stimContextSeq(i,:) = stimContextSeq(i-1,:);
    else % When the current trial is a regular (stimulus) trial
        stimContextSeq(i,:) = stimContextSeq(i-1,:) + k*(coordSeq(i-1,:) - stimContextSeq(i-1,:));
    end
end



%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% CREATE EVOKED SIGNAL SEQUENCE
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

coordSeq_noNaNs = coordSeq;
coordSeq_noNaNs(isnan(coordSeq)) = 0;
evokedSignal3D = abs(coordSeq_noNaNs - stimContextSeq);
evokedSignal = sqrt(evokedSignal3D(:,1).^2 + evokedSignal3D(:,2).^2 + evokedSignal3D(:,3).^2);



%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% MEAN-CENTER AND NORMALIZE TO HAVE VARIANCE 1
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% Mean center
evokedSignal = evokedSignal - mean(evokedSignal);
% Correct blank trials to have value of zero
evokedSignal(isnan(coordSeq(:,1))) = 0;

% Normalize evokedSignal
evokedSignal = evokedSignal / std(evokedSignal);



%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% SAVE COVARIATE
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

if saveBool
    driftCovDir = [REFsdir 'driftCovs/'];
    % Create necessary directories
    if ~exist(driftCovDir, 'dir')
        mkdir(driftCovDir);
    end
    
    % Create file ID
    this_filename = [driftCovDir 'driftCov_' sprintf('%03d',elasticityCoefficient) '.ref'];
    driftCov_fileID = fopen(this_filename,'w');
    
    % Populate file
    for trial=1:(seqLen-1)
        fprintf(driftCov_fileID,'%f\n',evokedSignal(trial));
    end
    fprintf(driftCov_fileID,'%f',evokedSignal(seqLen));
    
    fclose('all');
end
public/data_natneuro_2013_kahn/matlab_scripts/driftcov.txt · Last modified: 2013/10/30 22:47 by mattar