Commit 4e55f850 authored by jayd1860's avatar jayd1860
Browse files

v1.80.3

Utils, v1.7.2
-- Add ability to simulate workflow data with generateSimDataset() function:
1. probe.SD
2. probe.SD with spring registration
3. probe.SD with spring registration + data
4. digpts + probe.SD
5. digpts + probe.SD + data
3. data with landmark registration
parent e5a5a8ae
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
1.7.1
 No newline at end of file
1.7.2
 No newline at end of file
+196 −18
Original line number Diff line number Diff line
function nirs = generateSimDataset(dirname, nSubj, nSess, nRuns, options)

function out = generateSimDataset(dirname, nSubj, nSess, nRuns, options)
%

nirs = [];
% Syntax:
%   out = generateSimDataset()
%   out = generateSimDataset(dirname)
%   out = generateSimDataset(dirname, nSubj)
%   out = generateSimDataset(dirname, nSubj, nSess)
%   out = generateSimDataset(dirname, nSubj, nSess, nRuns)
%   out = generateSimDataset(dirname, nSubj, nSess, nRuns, options)
%
% Description:
%   options - { {'probe'|'digpts}, 'springs', 'data' }  
%
% Examples:
%   out = generateSimDataset();
%   out = generateSimDataset(pwd);
%   out = generateSimDataset(pwd, [],[],[],'probe');
%   out = generateSimDataset(pwd, 3,3,3,'probe:data');
%   out = generateSimDataset(pwd, [],[],[],'probe:springs');
%   out = generateSimDataset(pwd, [],[],[],'probe:landmarks:data');
%   out = generateSimDataset(pwd, [],[],[],'probe:landmarks:data');
%   out = generateSimDataset(pwd, [],[],[],'digpts');
%   out = generateSimDataset(pwd, [],[],[],'digpts:data');
%
global atlasViewer
atlasViewer = [];
out = [];

t0 = tic;


if ~exist('dirname','var')
    dirname = filesepStandard(pwd);
if ~exist('dirname','var') || isempty(dirname)
    dirname = pwd;
end
if ~exist('nSubj','var')
if ~exist('nSubj','var') || isempty(nSubj)
    nSubj = 3;
end
if ~exist('nSess','var')
if ~exist('nSess','var') || isempty(nSess)
    nSess = 3;
end
if ~exist('nRuns','var')
if ~exist('nRuns','var') || isempty(nRuns)
    nRuns = 3;
end
if ~exist('options','var')
    options = 'probe:springs';
    options = 'probe:springs:data';
end

dirname = filesepStandard(dirname);

% Reset folder to known state
resetDataset();

% Create template data
setNamespace('AtlasViewerGUI');
dirnameAtlas = getAtlasDir();
@@ -31,7 +57,34 @@ if ~ispathvalid(dirnameAtlas)
end
refpts = initRefpts();
refpts = getRefpts(refpts, dirnameAtlas);
SD = genProbeFromRefpts(refpts, 36, 2, options);

if optionExists(options, 'probe')
    genProbeFromRefpts(refpts, 36, 2, options);
elseif optionExists(options, 'digpts')
    genDigptsFromRefpts(refpts, 36, 2);
end

if optionExists(options, 'data')
    digpts = initDigpts();
    digpts = getDigpts(digpts);
    probe  = initProbe();
    probe  = getProbe(probe, dirname, digpts);
    genSimData(probe, dirname, nSubj, nSess, nRuns, t0);
    subjDirs = dir('sub-*');
    for ii = 1:length(subjDirs)
        digptsNew = movePts(digpts, randNearZero(1,3,t0), randNearOne(1,3,t0), randNearZero(1,3,t0));
        digptsNew.pathname = [filesepStandard(pwd), subjDirs(ii).name];
        saveDigpts(digptsNew);
    end
    delete('./digpts*.txt');
end




% ----------------------------------------------
function genSimData(probe, dirname, nSubj, nSess, nRuns, t0)
SD = convertProbe2SD(probe);
nirs = NirsClass(SD);

% Generate stims
@@ -48,10 +101,14 @@ for iC = 1:ncond
    offset = offset+50;
end


%
% Generate data
for iSubj = 1:nSubj
    sname = sprintf('subj-%d', iSubj);
    if iSubj < 10
        iSubjName = sprintf('0%d', iSubj);
    else
        iSubjName = sprintf('%d', iSubj);
    end
    sname = sprintf('sub-%s', iSubjName);
    if ispathvalid([dirname, sname])
        rmdir([dirname, sname], 's')
    end
@@ -72,3 +129,124 @@ for iSubj = 1:nSubj
    end
end



% -----------------------------------------------------------------
function resetDataset(dirname)
if ~exist('dirname','var')
    dirname = filesepStandard(pwd);
end

currdir = filesepStandard(pwd);
cd(dirname);

files = dir('*');
for ii = 1:length(files)
    if strcmpi(files(ii).name, '.')
        continue
    end
    if strcmpi(files(ii).name, '..')
        continue
    end
    if strcmpi(files(ii).name, 'anatomical')
        continue
    end
    if files(ii).isdir
        rmdir(files(ii).name,'s')
    else
        delete(files(ii).name)
    end
end
cd(currdir);




% -----------------------------------------------
function digpts = movePts(digpts, r, s, t)
if ~exist('r','var')
    r = [0,0,0];
end
if ~exist('s','var')
    s = [1,1,1];
end
if ~exist('t','var')
    t = [0,0,0];
end

alpha = deg2rad(r(1));
beta  = deg2rad(r(2));
theta = deg2rad(r(3));

A = [ ...
    1            0             0    0;
    0   cos(alpha)   -sin(alpha)    0;
    0   sin(alpha)    cos(alpha)    0;
    0            0             0    1;
    ];

B = [ ...
    cos(beta)    0     sin(beta)     0;
    0            1             0     0;
   -sin(beta)    0     cos(beta)     0;
    0            0             0     1;
    ];

C = [ ...
    cos(theta)   -sin(theta)   0     0;
    sin(theta)    cos(theta)   0     0;
    0            0             1     0;
    0            0             0     1;
    ];

D = [ ...
    1            0             0     t(1);
    0            1             0     t(2);
    0            0             1     t(3);
    0            0             0     1;
    ];

S = [ ...
  s(1)           0             0     0;
    0           s(2)           0     0;
    0            0           s(3)    0;
    0            0             0     1;
    ];

T = S*D*C*B*A;

digpts.srcpos = xform_apply(digpts.srcpos, T);
digpts.detpos = xform_apply(digpts.detpos, T);
digpts.refpts.pos = xform_apply(digpts.refpts.pos, T);



% ----------------------------------------------------------------
function r = randNearOne(w, h, t0)
generateRandNumSeed(t0);
r = ones(w,h) + (rand(w,h) - 0.5) / 2;



% ----------------------------------------------------------------
function r = randNearZero(w, h, t0)
generateRandNumSeed(t0);
r = (rand(w,h) - 0.5) / 2;



% ---------------------------------------------------
function generateRandNumSeed(time0)
if time0 == 0
    x = uint32(100*rand);
    rng(x);
    y = uint32(100*rand);
    rng(y);
else
    s = 0;
    while s==0
        s = uint64(1e4*toc(time0));
    end    
    rng(s);
end
+1 −1
Original line number Diff line number Diff line
1.80.2
 No newline at end of file
1.80.3
 No newline at end of file