Commit ba286356 authored by Jay Dubb's avatar Jay Dubb
Browse files

v1.22.7

-- Improve speed of loading when using distributed data storage by avoiding loading and frreing memory for each acquisition file, instead only loading current element's acquisition
-- Simplify code that sets the data storage scheme in DataTreeClass
-- Clean up and simplify code in DataTreeClass that handles loading multiple groups.
-- Add one more config value option for "% Data Storage Scheme" to mean distributed data storage: 'file'
-- Add capability to resetGroupFolder to delete all .mat files from distributed data storage and 'nodatatree' option to avoid loading dataTree if it's not needed such as in a unit test
-- Fix hmrR_StimRejection_Nirs.m to accept empty tIncMan
parent 133f4eff
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -15,12 +15,12 @@ SNIRF
On

% Last Checked For Update
30-Jun-2020 10:48:25
07-Jul-2020 13:07:06

% Check For Updates
on

% Data Storage Scheme
disk
file

% END
+4 −2
Original line number Diff line number Diff line
@@ -5,6 +5,7 @@ classdef FileLoadSaveClass < matlab.mixin.Copyable
        fileformat;
        supportedFomats;
        err;
        options;        
    end
    
    
@@ -19,6 +20,7 @@ classdef FileLoadSaveClass < matlab.mixin.Copyable
                'hdf5', {{'hdf','.hdf','hdf5','.hdf5','hf5','.hf5','h5','.h5'}} ...
                );
            obj.err = 0;
            obj.options = 'memory';            
        end
        
        
@@ -39,7 +41,7 @@ classdef FileLoadSaveClass < matlab.mixin.Copyable
            switch(lower(format))
                case obj.supportedFomats.matlab
                    if ismethod(obj, 'LoadMat')
                        obj.err = obj.LoadMat(filename);
                        obj.err = obj.LoadMat(filename, params);
                    end
                case obj.supportedFomats.hdf5
                    if ismethod(obj, 'LoadHdf5')
+69 −13
Original line number Diff line number Diff line
@@ -17,11 +17,12 @@ classdef NirsClass < AcqDataClass & FileLoadSaveClass
    methods
        
        % ---------------------------------------------------------
        function obj = NirsClass(arg)
        function obj = NirsClass(varargin)
            %
            % Syntax:
            %   obj = NirsClass()
            %   obj = NirsClass(filename);
            %   obj = NirsClass(filename, options);
            %   
            %
            % Example 1:
@@ -56,18 +57,26 @@ classdef NirsClass < AcqDataClass & FileLoadSaveClass
            if nargin==0
                return;
            end
            if nargin==2
                obj.options = varargin{2};
            end
            
            if isa(arg, 'NirsClass')
                obj.Copy(arg);
            if isa(varargin{1}, 'NirsClass')
                obj.Copy(varargin{1});
                return;
            end
            filename = arg;
            filename = varargin{1};
            if ~exist('filename','var') || ~exist(filename,'file')
                obj = NirsClass.empty();
                return;
            end
            obj.filename = filename;
            
            % Conditional loading of snirf file data
            if strcmpi(obj.options, 'memory')
                obj.Load(filename);
            end
        end
        
        
        % -------------------------------------------------------
@@ -90,7 +99,7 @@ classdef NirsClass < AcqDataClass & FileLoadSaveClass
        
        
        % ---------------------------------------------------------
        function err = LoadMat(obj, fname, ~)
        function err = LoadMat(obj, fname, params)
            err = 0;
            
            % Arg 1
@@ -147,16 +156,54 @@ classdef NirsClass < AcqDataClass & FileLoadSaveClass
            
            
            % Optional fields
            if isproperty(fdata,'s')
                obj.s = fdata.s;
            else
                obj.s = [];
            end
            if isproperty(fdata,'aux')
                obj.aux = fdata.aux;
            else
                obj.aux = [];
            end            
            if obj.LoadStims(fname, fdata)<0 
                err = -4;
            end            
        end
        
        
        
        % ---------------------------------------------------------
        function err = LoadStims(obj, fname, fdata)
            err = 0;
            
            if ~exist('fdata','var') || isempty(fdata)
                % Arg 1
                if ~exist('fname','var') || ~exist(fname,'file')
                    fname = '';
                end
                
                % Do some error checking
                if ~isempty(fname)
                    obj.filename = fname;
                else
                    fname = obj.filename;
                end
                if exist(fname, 'file') ~= 2
                    err = -1;
                    return;
                end
                
                % Don't reload if not empty
                if ~obj.IsEmpty()
                    return;
                end
                
                warning('off', 'MATLAB:load:variableNotFound');
                fdata = load(fname,'-mat', 's','CondNames');
            end
               
            
            if isproperty(fdata,'s')
                obj.s = fdata.s;
            else
                obj.s = [];
            end
            if isproperty(fdata,'CondNames')
                obj.CondNames = fdata.CondNames;
            else
@@ -202,8 +249,16 @@ classdef NirsClass < AcqDataClass & FileLoadSaveClass
        end
        
        
        
        % -------------------------------------------------------
        function objnew = CopyMutable(obj, options)
        function objnew = CopyMutable(obj, ~)

            % If we're working off the snirf file instead of loading everything into memory
            % then we have to load stim here from file before accessing it.
            if strcmpi(obj.options, 'file')
                obj.LoadStims(obj.filename);
            end
            
            % Generate new instance of NirsClass
            objnew = NirsClass();
            
@@ -214,6 +269,7 @@ classdef NirsClass < AcqDataClass & FileLoadSaveClass
        end

        
        
        % ---------------------------------------------------------
        function nTrials = InitCondNames(obj)
            if isempty(obj.CondNames)
+129 −68
Original line number Diff line number Diff line
@@ -25,7 +25,11 @@ classdef SnirfClass < AcqDataClass & FileLoadSaveClass
            % Syntax:
            %   obj = SnirfClass()
            %   obj = SnirfClass(filename);
            %   obj = SnirfClass(nirs);
            %   obj = SnirfClass(filename, nirsdatanum);
            %   obj = SnirfClass(filename, nirsdatanum, options);
            %   obj = SnirfClass(filename, options);
            %   obj = SnirfClass(dotnirs);
            %   obj = SnirfClass(dotnirs, numdatabllocks);
            %   obj = SnirfClass(data, stim);
            %   obj = SnirfClass(data, stim, probe);
            %   obj = SnirfClass(data, stim, probe, aux);
@@ -34,7 +38,7 @@ classdef SnirfClass < AcqDataClass & FileLoadSaveClass
            %   
            %   Also for debugging/simulation of time bases 
            % 
            %   obj = SnirfClass(nirs, tfactors);
            %   obj = SnirfClass(dotnirs, tfactors);
            %
            % Example 1:
            %   
@@ -69,99 +73,150 @@ classdef SnirfClass < AcqDataClass & FileLoadSaveClass
            
            % Set class properties NOT part of the SNIRF format
            obj.fileformat = 'hdf5';
            obj.nirsdatanum = 1;
            obj.location = '/nirs';
            obj.nirsdatanum = 1;
            
            % See if we're loading .nirs data format
            if nargin>4
                d         = varargin{1};
                t         = varargin{2}(:);
                SD        = varargin{3};
                aux       = varargin{4};
                s         = varargin{5};
            end
            if nargin>5
                CondNames = varargin{6};
            end
            
            % TBD: Need to find better way of parsing arguments. It gets complicated 
            % because of all the variations of calling this class constructor but 
            % there should be a simpler way to do this 
            %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
            % Between 1 and 4 arguments covers the following syntax variants
            %
            % obj = SnirfClass(filename);
            % obj = SnirfClass(filename, nirsdatanum);
            % obj = SnirfClass(filename, nirsdatanum, options);
            % obj = SnirfClass(filename, options);
            % obj = SnirfClass(dotnirs);
            % obj = SnirfClass(dotnirs, numdatabllocks);
            % obj = SnirfClass(data, stim);
            % obj = SnirfClass(data, stim, probe);
            % obj = SnirfClass(data, stim, probe, aux);
            %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%    
            if nargin>0 && nargin<5
                
            if nargin==1 || (nargin==2 && isa(varargin{2}, 'double'))
                % obj = SnirfClass(filename);
                if isa(varargin{1}, 'SnirfClass')
                    obj.Copy(varargin{1});
                    return;
                end                
                
                %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%    
                % obj = SnirfClass(filename, nirsdatanum);
                % obj = SnirfClass(filename, nirsdatanum, options);
                % obj = SnirfClass(filename, options);
                %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%    
                if ischar(varargin{1})
                    obj.filename = varargin{1};
                    if nargin==2
                    if nargin>1
                        % obj = SnirfClass(filename, nirsdatanum);
                        if isnumeric(varargin{2})
                            obj.nirsdatanum = varargin{2};
                            
                            % obj = SnirfClass(filename, nirsdatanum, options);
                            if nargin>2
                                obj.options = varargin{3};
                            end
                            
                        % obj = SnirfClass(filename, options);
                        elseif ischar(varargin{2})
                            obj.options = varargin{2};
                            
                        end
                    end
                    
                    % Conditional loading of snirf file data
                    if strcmpi(obj.options, 'memory')
                        obj.Load(varargin{1});
                    end
                    
                
                % The basic 5 of a .nirs format in a struct
                %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%    
                % obj = SnirfClass(dotnirs);
                % obj = SnirfClass(dotnirs, numdatabllocks);
                %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%    
                elseif isstruct(varargin{1}) || isa(varargin{1}, 'NirsClass')
                    
                    % obj = SnirfClass(dotnirs);
                    tfactors = 1;    % Debug simulation parameter
    
                    % obj = SnirfClass(dotnirs, numdatabllocks);
                    if nargin==2
                        tfactors = varargin{2};
                    end
                    nirs = varargin{1};
                    obj.GenSimulatedTimeBases(nirs, tfactors);
                    dotnirs = varargin{1};
                    obj.GenSimulatedTimeBases(dotnirs, tfactors);
                    for ii=1:length(tfactors)                        
                        obj.data(ii) = DataClass(obj.nirs_tb(ii).d, obj.nirs_tb(ii).t(:), obj.nirs_tb(ii).SD.MeasList);
                    end
                    
                    for ii=1:size(nirs.s,2)
                        if isfield(nirs, 'CondNames')
                            obj.stim(ii) = StimClass(nirs.s(:,ii), nirs.t(:), nirs.CondNames{ii});
                    for ii=1:size(dotnirs.s,2)
                        if isfield(dotnirs, 'CondNames')
                            obj.stim(ii) = StimClass(dotnirs.s(:,ii), dotnirs.t(:), dotnirs.CondNames{ii});
                        else
                            obj.stim(ii) = StimClass(nirs.s(:,ii), nirs.t(:), num2str(ii));
                            obj.stim(ii) = StimClass(dotnirs.s(:,ii), dotnirs.t(:), num2str(ii));
                        end
                    end
                    obj.probe      = ProbeClass(nirs.SD);
                    for ii=1:size(nirs.aux,2)
                        obj.aux(ii) = AuxClass(nirs.aux(:,ii), nirs.t(:), sprintf('aux%d',ii));
                    obj.probe      = ProbeClass(dotnirs.SD);
                    for ii=1:size(dotnirs.aux,2)
                        obj.aux(ii) = AuxClass(dotnirs.aux(:,ii), dotnirs.t(:), sprintf('aux%d',ii));
                    end
                                       
                    % Add metadatatags
                    obj.metaDataTags   = MetaDataTagsClass();               
                
                end                
            elseif nargin>1 && nargin<5
                %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%    
                % obj = SnirfClass(data, stim);
                % obj = SnirfClass(data, stim, probe);
                % obj = SnirfClass(data, stim, probe, aux);
                %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%    
                elseif isa(varargin{1}, 'DataClass')
                    
                    % obj = SnirfClass(data, stim);
                    data = varargin{1};
                    obj.SetData(data);
                    stim = varargin{2};
                    obj.SetStim(stim);
    
                    % obj = SnirfClass(data, stim, probe);
                    if nargin>2
                        probe = varargin{3};
                        obj.SetSd(probe);
                    end
                    
                    % obj = SnirfClass(data, stim, probe, aux);
                    if nargin>3
                        aux = varargin{4};
                        obj.SetAux(aux);
                    end  
                    
            % The basic 5 of a .nirs format as separate args
            elseif nargin==5
                obj.data(1) = DataClass(d, t(:), SD.MeasList);
                for ii=1:size(s,2)
                    obj.stim(ii) = StimClass(s(:,ii), t(:), num2str(ii));
                end
                obj.probe      = ProbeClass(SD);
                for ii=1:size(aux,2)
                    obj.aux(ii) = AuxClass(aux, t(:), sprintf('aux%d',ii));
                end

                % Add metadatatags
                obj.metaDataTags   = MetaDataTagsClass();
            %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%    
            % Between 5 and 6 arguments covers the following syntax variants
            %
            % obj = SnirfClass(d, t, SD, aux, s);
            % obj = SnirfClass(d, t, SD, aux, s, CondNames);
            %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%    
            elseif nargin>4
                
                % obj = SnirfClass(d, t, SD, aux, s);
                d         = varargin{1};
                t         = varargin{2}(:);
                SD        = varargin{3};
                aux       = varargin{4};
                s         = varargin{5};
                CondNames = {};

                % obj = SnirfClass(d, t, SD, aux, s, CondNames);
                if nargin>5
                    CondNames = varargin{6};
                end
                
            % The basic 5 of a .nirs format plus condition names
            elseif nargin==6
                obj.data(1) = DataClass(d, t(:), SD.MeasList);
                for ii=1:size(s,2)
                    obj.stim(ii) = StimClass(s(:,ii), t(:), CondNames{ii});
                    if nargin==5                        
                        condition = num2str(ii);
                    else
                        condition = CondNames{ii};
                    end
                    obj.stim(ii) = StimClass(s(:,ii), t(:), condition);
                end
                obj.probe      = ProbeClass(SD);
                for ii=1:size(aux,2)
@@ -210,6 +265,12 @@ classdef SnirfClass < AcqDataClass & FileLoadSaveClass
                options = '';
            end
            
            % If we're working off the snirf file instead of loading everything into memory
            % then we have to load stim here from file before accessing it.
            if strcmpi(obj.options, 'file')
                obj.LoadStim(obj.filename);
            end
            
            % Generate new instance of SnirfClass
            objnew = SnirfClass();
                        
@@ -364,7 +425,7 @@ classdef SnirfClass < AcqDataClass & FileLoadSaveClass
        
        
        % -------------------------------------------------------
        function err = LoadHdf5(obj, fileobj, ~)
        function err = LoadHdf5(obj, fileobj, params)
            err = 0;
            
            % Arg 1
+72 −70

File changed.

Preview size limit exceeded, changes collapsed.

Loading